什么是Istio
istio是一個開源的實現了服務網格的平台,基於k8s平台,具有負載均衡、服務間認證、監控等功能,為業務應用服務。
安裝Istio
istio的安裝是基於k8s平台的,本地測試可以使用minikube搭建k8s本平台,具體看我的minikube安裝 https://github.com/qq1141000259/k8s-learning/tree/master/Minikube
-
通過istioctl 安裝
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.5.1 sh 下載
istioctl profile list 查看安裝規則一般選擇 demo,istioctl manifest apply --set profile=demo
你能夠看到很多服務組件都是安裝在 namespace istio-system下
查看安裝的服務
kubectl get svc -n istio-system
安裝kiali
-
修改kiali
kubectl edit svc kiali -n istio-system
將type: clustIP 改為 type: NodePort,這樣更好測試訪問
-
給kiali添加密碼,其實就是給kilia service掛載一個Secret
USERNAME=$(echo -n 'admin' | base64)
PASSPHRASE=$(echo -n 'admin' | base64)
NAMESPACE=istio-system
kubectl create namespace $NAMESPACE
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: $NAMESPACE
labels:
app: kiali
type: Opaque
data:
username: $USERNAME
passphrase: $PASSPHRASE
EOF -
查看kiali映射在宿主機的端口
k describe svc kiali -n istio-system
找到 NodePort(這個端口號是變換的)NodePort: http-kiali 30717/TCP
-
安裝應用 bookinfo
這是一個 istio的應用范例
-
我們在默認的namespace下創建我們的應用, 給default添加標簽
kubectl label namespace default istio-injection=enabled
-
到istio的安裝包下安裝bookinfo的應用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
這些應用安裝在default下:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
查看安裝: kubectl get gateway
查看網關:
其中 80:30833對應的就是的外網訪問端口
訪問bookinfo http://本機IP:30833/productpage
在kiali中你能看到每個應用的調用關系
Itsio的路由過程
1. 在簡單的搭建好一個服務網格的系統之后,我們接下來就主要關注於在這個網格里,是如何上線一個應用的
首先實現外部請求訪問服務網格的應用,本質就是實現外部訪問k8s,在上述例子中使用的其實是Istio部署的LoadBalancer服務
執行kubectl get svc -n istio-system -l istio=ingressgateway -o yaml
查看這個服務詳情
apiVersion: v1 items: - apiVersion: v1 kind: Service metadata: ... spec: clusterIP: 10.96.121.156 externalTrafficPolicy: Cluster ports: - name: status-port nodePort: 32362 port: 15020 protocol: TCP targetPort: 15020 - name: http2 nodePort: 30833 port: 80 protocol: TCP targetPort: 80 ... selector: app: istio-ingressgateway
你好,歡迎使用kubectl NAME READY STATUS RESTARTS AGE istio-ingressgateway-649f9646d4-m2cz2 1/1 Running 0 5d2h
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: ... spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
你好,歡迎使用kubectl NAME READY STATUS RESTARTS AGE istio-ingressgateway-649f9646d4-m2cz2 1/1 Running 0 5d4h
3.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
你好,歡迎使用kubectl NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE productpage ClusterIP 10.96.41.204 <none> 9080/TCP 4d22h
你好,歡迎使用kubectl NAME READY STATUS RESTARTS AGE productpage-v1-596598f447-wkvxj 2/2 Running 0 5d1h
>>> res = requests.get("http://reviews:9080/reviews/1") >>> res <Response [200]> >>> res.text '{"id": "1","reviews": [{ "reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!", "rating": {"stars": 5, "color": "black"}},{ "reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare.", "rating": {"stars": 4, "color": "black"}}]}'
再回到宿主機,我們來查看另外三個服務
kubectl get svc 你好,歡迎使用kubectl NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.96.132.128 <none> 9080/TCP 5d1h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d17h productpage ClusterIP 10.96.41.204 <none> 9080/TCP 4d23h ratings ClusterIP 10.96.95.141 <none> 9080/TCP 5d1h reviews ClusterIP 10.96.235.173 <none> 9080/TCP 5d1h
其中kubernetes 是minikube所生成的,在看它們作用的pod
kubectl get pods 你好,歡迎使用kubectl NAME READY STATUS RESTARTS AGE details-v1-78d78fbddf-p98fn 2/2 Running 0 5d1h productpage-v1-596598f447-wkvxj 2/2 Running 0 5d1h ratings-v1-6c9dbf6b45-v8nqg 2/2 Running 0 5d1h reviews-v1-7bb8ffd9b6-hsdb7 2/2 Running 0 5d1h reviews-v2-d7d75fff8-2hw7m 2/2 Running 0 5d1h reviews-v3-68964bc4c8-6hllk 2/2 Running 0 5d1h
我們會發現這個reviews居然有三個pod,還分成了1,2,3版本。這里其實是對review這個應用起了三個deployment來管理三個版本的pod
kubek get deployment 你好,歡迎使用kubectl NAME READY UP-TO-DATE AVAILABLE AGE details-v1 1/1 1 1 5d1h productpage-v1 1/1 1 1 5d1h ratings-v1 1/1 1 1 5d1h reviews-v1 1/1 1 1 5d1h reviews-v2 1/1 1 1 5d1h reviews-v3 1/1 1 1 5d1h
V1: 在productpage頁面不會顯示評分信息
V2: 在productpage頁面顯示1到5個黑色評分信息
V3: 在productpage頁面顯示1到5個紅色評分信息
在默認的情況下,你對 reviews服務發起請求,將會被均勻的分配在這三個版本的應用上,你不斷在http://9.134.114.175:30833/productpage 這個頁面刷新觀察評分就能看到這樣的效果。
但是,如果我想取消掉某個應用的請求,或分配權重,我們可以通過給reviews服務增加virtualService + DestinationRule來控制轉發,
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v2 weight: 50 - destination: host: reviews subset: v3 weight: 50
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3
kubectl get pods -l app=reviews --show-labels 你好,歡迎使用kubectl NAME READY STATUS RESTARTS AGE LABELS reviews-v1-7bb8ffd9b6-hsdb7 2/2 Running 0 5d1h app=reviews,pod-template-hash=7bb8ffd9b6,security.istio.io/tlsMode=istio,version=v1 reviews-v2-d7d75fff8-2hw7m 2/2 Running 0 5d1h app=reviews,pod-template-hash=d7d75fff8,security.istio.io/tlsMode=istio,version=v2 reviews-v3-68964bc4c8-6hllk 2/2 Running 0 5d1h app=reviews,pod-template-hash=68964bc4c8,security.istio.io/tlsMode=istio,version=v3
k apply -f destination-rule-reviews.yaml
和
k get virtual-service 你好,歡迎使用kubectl NAME GATEWAYS HOSTS AGE bookinfo [bookinfo-gateway] [*] 5d1h reviews [reviews] 16s k get destinationrule 你好,歡迎使用kubectl NAME HOST AGE reviews reviews 5s
至此整個路由關系已經打通了
附上我的k8s學習項目- https://github.com/qq1141000259/k8s-learning