Job
,DaemonSet
,ReplicaSet
,Pod
,Deployment
等, 對這些工做負載的要求以下:
Service
對象中的 Port
部分必須以 "協議名" 爲前綴,目前支持的協議名包括 http
,http2
,mongo
,redis
與 grpc
;app
與 version
,分別標註應用名稱與版本,雖僅是個建議,但 istio 不少默認策略會引用這兩個標籤,若是沒有會引起不少沒必要要的麻煩。# 準備測試用 yaml 文件 cd ~ git clone https://github.com/fleeto/flaskapp.git cd ~/flaskapp # istioctl kube-inject 會將 istio 相關容器注入應用,"-o" 參數將注入結果生成 yaml 文件 ,方便觀察使用此命令與 "kubectl apply -f" 的區別; # 新的 yaml 文件中多出了 "Sidecar" 容器, 而且出現了1個初始化容器 (initContainers) "istio-init" ,初始化容器即用來劫持應用通訊到 "Sidecar" 容器的工具; # 可直接 "kubectl apply -f" 生成的 yaml 文件 istioctl kube-inject -f flask.istio.yaml -o flask.istio.injected.yaml
values.yaml
文件調整。# istio-1.1.7/install/kubernetes/helm/istio/values.yaml sidecarInjectorWebhook: # 開啓 "Sidecar" 自動注入特性 enabled: true replicaCount: 1 image: sidecar_injector # "true":爲全部命名空間開啓自動注入功能 # "false":只有標籤爲 "istio-injection: enabled" 的命名空間開啓自動注入功能 # 默認值:"false" enableNamespacesBydefault: false ... global: proxy: # 啓動自動注入功能後,對於指定命名空間內新建 Pod 是否進行自動注入; # "enabled":命名空間內的 Pod 只要沒有被註解爲 'sidecar.istio.io/inject: "false"',就會自動完成注入; # "disabled":須要爲 Pod 註解 'sidecar.istio.io/inject: "true"',纔會進行注入; # "sidecar.istio.io/inject" 沒有所謂的默認值,未註解時,取決於 "autoInject" 的設置,"enabled" 則注入,"disabled" 則不注入 autoInject: enabled
kubectl create ns auto kubectl create ns manually # 爲命名空間 auto 注入標籤 kubectl label namespaces auto istio-injection=enabled # 在兩個命名空間建立工做負載 cd ~ git clone https://github.com/fleeto/sleep.git cd ~/sleep kubectl apply -f sleep.yaml -n auto kubectl apply -f sleep.yaml -n manually # 查看命名空間 auto 是否有自動注入 kubectl get pod -n auto kubectl get pod -n manually
istio-system
命名空間中名爲 istio-sidecar-injector
的 ConfigMap
資源,來影響注入效果;涉及兩個標籤(與 policy
同級):neverInjectSelector:無論命名空間及策略如何,對符合標籤選擇器要求的 Pod 都不進行注入;git
# 如下兩個元素之間是 "或" 關係 neverInjectSelector: - matchExpressions: - {key: openshift.io/build.name, operator: Exists} - matchExpressions: - {key: openshift.io/deployer-pod--for.name, operator: Exists}
alwaysInjectSelector:對符合標籤選擇器要求的 Pod ,無論全局策略如何,都會被注入 Sidecar。github
istioctl 根據 ConfigMap
獲取注入內容,即執行 istioctl
的用戶必須可以訪問安裝了 istio 的 Kubernetes 集羣中的這個 ConfigMap
;redis
# 若是因某些緣由不能訪問,能夠在 "istioctl" 中使用本地的配置文件; # 採用具有 "ConfigMap" 獲取權限的用戶身份執行如下命令 kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yaml # 可對文件進行修改,並在 "istioctl" 中使用 istioctl kube-inject --injectConfigFile inject-config.yaml
sidecar.istio.io/inject: "true/false"
,則會被優先處理) --> neverInjectSelector --> alwaysInjectSelector --> 命名空間策略。命名空間,istio-injection=enabled | autoInject | Pod,sidecar.istio.io/inject | 是否注入 |
---|---|---|---|
是 | enabled | true | 是 |
是 | enabled | false | 否 |
是 | enabled | 未註解 | 是 |
是 | disabled | true | 是 |
是 | disabled | false | 否 |
是 | disabled | 未註解 | 否 |
否 | enabled | true | 否 |
否 | enabled | false | 否 |
否 | enabled | 未註解 | 否 |
否 | disabled | true | 否 |
否 | disabled | false | 否 |
否 | disabled | 未註解 | 否 |
查看 sidecar-injector
Pod 資源日誌;json
kubectl logs -f $(kubectl get pods -n istio-system -l istio=sidecar-injector -o jsonpath='{.items[0].metadata.name}') -n istio-system
sidecar-injector
Deployment對象,爲其添加 args
參數 --log_output_level=default:debug
;若是在 sidecar-injector
Pod 資源日誌仍是未找到發生問題的緣由,則表明 sidecar-injector
沒有收到 Pod 建立的通知,也就不會觸發自動注入操做,這多是由於命名空間沒有正確設置標籤致使的,須要檢查命名空間的標籤及 MutatingWebhookConfiguration
中的配置:flask
# 命名空間默認設置 "istio-injection=anabled" 標籤; # 能夠檢查其中的 "namespaceSelector" 字段與內容 kubectl edit MutatingWebhookConfiguration istio-sidecar-injector -n istio-system