參考
本文為 istio 快速入門部署,一般用於演示環境。
1. 准備工作
- k8s集群要支持istio自動注入,需要檢查api server的啟動參數,確保
admission control
部分按順序啟用MutatingAdmissionWebhook
與ValidatingAdmissionWebhook
; - 通過
kube-apiserver -h | grep enable-admission-plugins
查看已啟用的admission control
- Which plugins are enabled by default
2. 下載
# 下載1.1.7版本
wget https://github.com/istio/istio/releases/download/1.1.7/istio-1.1.7-linux.tar.gz
# 解壓
tar -zxvf istio-1.1.7-linux.tar.gz
3. 實施
cd istio-1.1.7
kubectl apply -f install/kubernetes/istio-demo.yaml
# "-w" 參數用於持續查詢pod狀態變化;
# pod狀態為 "Completed" 時, 表示執行 "Job" 留下的pod, "Completed" 狀態說明 "Job" 執行成功
kubectl get pod -n istio-system -w
4. 應用示例
4.1 部署應用
git clone https://github.com/fleeto/flaskapp.git
cd flaskapp
cat flask.istio.yaml
apiVersion: v1
kind: Service
metadata:
name: flaskapp
labels:
app: flaskapp
spec:
# "selector" 僅使用1個標簽,則 "Service" 對兩個 "Deployment" 均有效
selector:
app: flaskapp
ports:
# 根據istio規范對端口進行命名
- name: http
port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v1
spec:
replicas: 1
template:
metadata:
# 兩個標簽,其中以不同的 "version" 標簽進行區分;
# istio中通常使用這兩個標簽作為應用與版本的標識
labels:
app: flaskapp
version: v1
spec:
containers:
- name: flaskapp
# image一致
image: dustise/flaskapp
imagePullPolicy: Always
# 注冊一個名為 "version" 的環境變量,兩個應用取值不同
env:
- name: version
value: v1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v2
spec:
replicas: 1
template:
metadata:
labels:
app: flaskapp
version: v2
spec:
containers:
- name: flaskapp
image: dustise/flaskapp
imagePullPolicy: Always
env:
- name: version
value: v2
# 部署應用
kubectl apply -f flask.istio.yaml
4.2 部署istio
- 使用
istioctl
進行注入, 其修改Deployment
, 在Pod中注入Sidecar
容器; - 本節采用手工注入,實際生產環境中一般會打開pod的自動注入功能。
# 注入 "sidecar"
istioctl kube-inject -f flask.istio.yaml | kubectl apply -f -
# 查看pod
# pod中容器數量從"1"變為"2"
kubectl get pod -w
# 注入容器 "istio-proxy" ;
# 另有初始化劫持容器 "istio-init"
kubectl describe pod flaskapp-v1-66b59cdfc6-zk9sz
4.3 部署客戶端服務
git clone https://github.com/fleeto/sleep.git
cd sleep/kubernetes/
# 雖然客戶端服務不需要提供對外服務能力, 但 "sleep.yaml" 仍然需要創建 "Service" 資源對象;
# istio注入要求: 沒有 "Service" 的 "Deployment" 無法被istio發現並進行操作
istioctl kube-inject -f sleep.yaml | kubectl apply -f -
# 驗證
kubectl get pod -w
4.4 驗證服務
# 重復獲取 "http://flaskapp/env/version" 的內容;
# 返回結果:"v2" 與 "v1" 結果隨機出現,大約各一半
kubectl exec -it sleep-5f47f5c866-9xtsf -c sleep bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp/env/version ; done
4.5 創建目標規則與默認路由
4.5.1 目標規則
# 使用 Pod 標簽將 "flaskapp" 服務分成兩個 "subset"
cat flaskapp/flaskapp-destinationrule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: flaskapp
spec:
host: flaskapp
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
4.5.2 默認路由
建議:無論是否進行進一步的流量控制,都建議為網格中的服務創建默認的路由規則,以防發生意料之外的訪問結果。
# "VirtualService" 資源對象,接管對 "flaskapp" 主機名的訪問,將所有流量轉發到 "DestinationRule" 資源對象定義的 "v2 subset"
cat flaskapp/flaskapp-default-vs-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp-default-v2
spec:
hosts:
- flaskapp
http:
- route:
- destination:
host: flaskapp
subset: v2
4.5.3 驗證
# 重復獲取 "http://flaskapp/env/version" 的內容;
# 返回結果:只有 "v2" 返回,默認路由已生效
kubectl exec -it sleep-5f47f5c866-9xtsf -c sleep bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp/env/version ; done
5. 總結
典型流程:注入-->部署-->創建目標規則-->創建默認路由。