系列文章:linux
總目錄索引:九析帶你輕鬆完爆 istio 服務網格系列教程nginx
目錄docker
1 流量管理vim
2 建立命名空間windows
3 資源文件準備api
3.1 建立網關文件瀏覽器
3.2 建立虛擬服務文件tomcat
3.3 建立 k8s service 文件安全
3.4 建立 k8s deployment 文件:網絡
3.5 修改 istio-ingressgateway deployment
4 嘗試網關路由功能
4.1 肯定 INGRESS_HOST
4.2 編輯瀏覽器所在主機 hosts 文件
4.3 訪問 tomcat
5 小節
1 流量管理(traffic management)
若是你對博客有任何疑問,請告訴我。
istio 四大特性是流量管理(traffic management)、安全(security)、策略(policies)和遙測(observability)。
本節重點介紹 istio 流量管理。流量管理的本質是對網絡流量的路由和控制。生活中常常有這樣的例子,好比下雨塌方,交警會疏導新的交通路線,這即是路由;好比景區週末實行單雙號限行,這即是流量控制。
在介紹流量管理以前,首先介紹一下網絡流向,介紹一個 http 請求在安裝了 istio 的 k8s 中都通過哪些點,有了這個介紹以後,再談流量管理將是水到渠成的事情。
下圖即是網絡流向圖:
當用戶使用瀏覽器發起一個請求( http://jiuxi.com/xxx )進入 k8s 中的 istio-ingressgateway,由於在 istio-ingressgateway 上設置了 istio 的 gateway,並且此 gateway 又綁定了 virtual service,在 virtual service 設置了 2 條路由規則,分別指向 tomcat 和 nginx 這 2 個 k8s service,而每一個 service 又關聯到各自的 pod,因而此請求最終可根據 url 觸達到 pod 內的容器。
瞭解了請求流向的整個流程,下面介紹如何操做。前提是你已經安裝好了 k8s 和 istio。關於如何安裝和配置 istio,能夠查看本人的系列文章第一章。
2 建立命名空間
kubectl create ns jiuxi
istio 默認安裝在 jiuxi 這個命名空間下,而且設置在 jiuxi 命名空間自動注入 sidecar。相關操做請參考本人系列文章的第一章。
3 資源文件準備
從上圖可知,共須要 4 個資源文件(yaml):
1 jiuxi-gateway.yaml
2 jiuxi-virtual-svc.yaml
3 jiuxi-svc.yaml( tomcat 和 nginx 的 service 寫在一個文件)
4 jiuxi-deploy.yaml(tomcat 和 nginx 的 deployment 寫在一個文件)
3.1 建立網關文件
網關文件 jiuxi-gateway.yaml 文件內容以下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: jiuxi-gateway
namespace: jiuxi
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- jiuxi.com
port:
number: 80
name: http
protocol: HTTP
建立資源:
kubectl apply -f jiuxi-gateway.yaml
3.2 建立虛擬服務文件
虛擬服務文件 jiuxi-virtual-svc.yaml 文件內容以下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-virtual-svc
namespace: jiuxi
spec:
gateways:
- jiuxi-gateway
hosts:
- jiuxi.com
http:
- route:
- destination:
host: tomcat-svc
port:
number: 8080
weight: 50
- destination:
host: nginx-svc
port:
number: 80
weight: 50
建立資源:
kubectl apply -f jiuxi-virtual-svc.yaml
3.3 建立 k8s service 文件
服務文件 jiuxi-svc.yaml 文件內容以下:
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: jiuxi
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-pod
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: jiuxi
spec:
ports:
- name: port
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: tomcat-pod
建立資源:
kubectl apply -f jiuxi-svc.yaml
3.4 建立 k8s deployment 文件
jiuxi-deploy 文件內容以下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
namespace: jiuxi
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: port
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat-deploy
name: tomcat-deploy
namespace: jiuxi
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-pod
template:
metadata:
labels:
app: tomcat-pod
spec:
containers:
- image: docker.io/kubeguide/tomcat-app:v1
imagePullPolicy: Always
name: tomcat
ports:
- containerPort: 8080
name: port
protocol: TCP
建立資源:
kubectl apply -f jiuxi-deploy.yaml
3.5 修改 istio-ingressgateway deployment
這一步很是重要,由於默認狀況下 istio-ingressgateway 對應的容器並無暴露在服務網格以外,因此咱們須要將其暴露出來。編輯 istio-system 命名空間下的 istio-ingressgateway deployment:
kubectl edit deployment -n istio-system istio-ingressgateway
修改內容以下截圖所示:
4 嘗試網關路由功能
4.1 肯定 INGRESS_HOST
kubectl get pod -n istio-system -o wide
執行結果以下圖所示,本人的 INGRESS_HOST 就是 10.110.101.205。
4.2 編輯瀏覽器所在主機 hosts 文件
vim /etc/hosts # linux
c:/windows/system32/drivers/etc/hosts # windows
添加 DNS 記錄:
10.110.101.205 jiuxi.com # 根據我的實際狀況改寫
4.3 訪問 tomcat
瀏覽器輸入 http://jiuxi.com,幫嘗試多刷新幾回,你就會看到流量分別路由到 tomcat 和 nginx 服務去了,而且流量上基本達到了均分,各 50%。
5 小節
自此咱們使用了 istio 的 gateway 和 virtual service 實現了流量管理的功能。下面咱們還會繼續庖丁解牛 istio 其餘強大的特性。