參考
1. Sidecar注入
1.1 對工作負載的一些要求
- 支持的工作負載類型:
Job
,DaemonSet
,ReplicaSet
,Pod
,Deployment
等, 對這些工作負載的要求如下:
- 要正確命名服務端口:
Service
對象中的 Port
部分必須以 "協議名" 為前綴,目前支持的協議名包括 http
,http2
,mongo
,redis
與 grpc
;
- istio 會命名來確定為端口提供什么樣的服務,不符合命名規范的端口會被當做 TCP 服務器,其功能支持范圍會大幅縮小。
- 工作負載的 Pod 必須有關聯的 Service:
- 為滿足服務發現的需要,所有 Pod 都必須有關聯的服務;
- 官方建議為 Pod 模板加入兩個標簽:
app
與 version
,分別標注應用名稱與版本,雖僅是個建議,但 istio 很多默認策略會引用這兩個標簽,如果沒有會引發很多不必要的麻煩。
1.2 手工注入
# 准備測試用 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
1.3 自動注入
1.3.1 配置自動注入
- istio 的自動注入屬性可通過
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
1.3.2 測試
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
1.3.3 ConfigMap istio-sidecar-injector
1.3.3.1 ConfigMap istio-sidecar-injector
1.3.3.2 修改 istio-sidecar-injector
1.3.4 自動注入的優先級
- 自動注入的評估順序:
Pod 注解(優先級最高,如 Pod 中含注解 sidecar.istio.io/inject: "true/false"
,則會被優先處理) --> neverInjectSelector --> alwaysInjectSelector --> 命名空間策略。
- autoInject,命名空間,Pod 注解的關聯關系如下表:
命名空間,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 |
未注解 |
否 |
1.3.5 Sidecar 注入故障排查
- 查看
sidecar-injector
Pod 資源日志;kubectl logs -f $(kubectl get pods -n istio-system -l istio=sidecar-injector -o jsonpath='{.items[0].metadata.name}') -n istio-system
- 創建業務 Pod ,查看日志輸出;
- 更詳細的日志,可以編輯
sidecar-injector
Deployment對象,為其添加 args
參數 --log_output_level=default:debug
;
- 如果在
sidecar-injector
Pod 資源日志還是未找到發生問題的原因,則代表 sidecar-injector
沒有收到 Pod 創建的通知,也就不會觸發自動注入操作,這可能是因為命名空間沒有正確設置標簽導致的,需要檢查命名空間的標簽及 MutatingWebhookConfiguration
中的配置:# 命名空間默認設置 "istio-injection=anabled" 標簽;
# 可以檢查其中的 "namespaceSelector" 字段與內容
kubectl edit MutatingWebhookConfiguration istio-sidecar-injector -n istio-system