注入 Istio sidecar


注入 Istio sidecar

網格中的每個 Pod 都必須伴隨一個 Istio 兼容的 Sidecar 一同運行。

下文中將會介紹兩種把 Sidecar 注入到 Pod 中的方法:使用 istioctl 客戶端工具進行注入,或者使用 Istio sidecar injector 自動完成注入過程。

手工注入過程會修改控制器(例如 Deployment)的配置。這種注入方法會修改 Pod template,把 Sidecar 注入到目標控制器生成的所有 Pod 之中。要加入、更新或者移除 Sidecar,就需要修改整個控制器。

自動注入過程會在 Pod 的生成過程中進行注入,這種方法不會更改控制器的配置。手工刪除 Pod 或者使用滾動更新都可以選擇性的對 Sidecar 進行更新。

手工或自動注入都會從 istio-system 命名空間的 istio-sidecar-injector 以及 istio ConfigMap 中獲取配置信息。手工注入方式還可以選擇從本地文件中讀取配置。

Sidecar 的自動注入

使用 Kubernetes 的 mutating webhook admission controller,可以進行 Sidecar 的自動注入。Kubernetes 1.9 以后的版本才具備這一能力。使用這一功能之前首先要檢查 kube-apiserver 的進程,是否具備 admission-control 參數,並且這個參數的值中需要包含 MutatingAdmissionWebhook 以及 ValidatingAdmissionWebhook 兩項,並且按照正確的順序加載,這樣才能啟用 admissionregistration API:

[root@cn-hongkong ~]# kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1

 注意,跟手工注入不同的是,自動注入過程是發生在 Pod 級別的。因此是不會看到 Deployment 本身發生什么變化的。但是可以使用 kubectl describe 來觀察單獨的 Pod,在其中能看到注入 Sidecar 的相關信息。

應用部署

部署 sleep 應用,檢查一下是不是只產生了一個容器。

kubectl apply -f samples/sleep/sleep.yaml
kubectl get deployment -o wide

default 命名空間設置標簽:istio-injection=enabled注意是只要運行在這個namespace下都pod都會自動注入Sidecar.

kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection

這樣就會在 Pod 創建時觸發 Sidecar 的注入過程了。刪掉運行的 Pod,會產生一個新的 Pod,新 Pod 會被注入 Sidecar。原有的 Pod 只有一個容器,而被注入 Sidecar 的 Pod 會有兩個容器:

禁用 default 命名空間的自動注入功能,然后檢查新建 Pod 是不是就不帶有 Sidecar 容器了:

kubectl label namespace default istio-injection-
kubectl delete pod sleep-776b7bcdcd-bhn9m
kubectl get pod

排除pod注入

同時也可以在deployment中通過設置annotation,sidecar.istio.io/inject=true來控制pod級別的自動注入。

[root@cn-hongkong k8s_yaml]# cat httpd.yaml 
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 2
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80

 Sidecar 手動注入

a) 下載istioctl工具並拷貝至環境,鏈接https://github.com/istio/istio/releases/

b) 將istioctl二進制拷貝至/usr/local/bin目錄下

mv -f istioctl /usr/local/bin

c)安裝Istio控制面,確認注入相關configmap已創建成功

$ kubectl get cm -n istio-system | grep istio-sidecar-injector
istio-sidecar-injector                  1         15h

d)准備需要注入的文件test.yaml

e) 將istioctl處理之后的內容部署到kubernetes上

$kubectl apply -f <(istioctl kube-inject -f test.yaml)
或者
$istioctl kube-inject -f test.yaml | kubectl apply -f -

 f)  可以通過k8s命令查看pod詳細內容

$kubectl describe pod test-c9f4b55c7-np4cf

 故障排查

現象:當啟動了基於namespace或者手動出入sidecar時,發現pod無法起來。

排查方法:

1.kubectl describe rs httpd

發現日志顯示istio-sidecar-injector連接超時。

解決方法:

kubectl delete pod istio-sidecar-injector-6fd47fb7c8-mr9kp -n istio-system


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM