天天看點

istio 之 sidecar 注入 Webhook

Istio通過對serviceMesh中的每個pod注入sidecar,來實作無侵入式的服務治理能力。

sidecar的注入是其能力實作的重要一環(在kubernetes叢集中的注入方式)。sidecar注入有兩種方式,

一是通過建立webhook資源,利用k8s的webhook能力實作pod的自動注入,

二是通過istioctl工具,對yaml檔案進行手動注入。

https://istio.io/zh/docs/setup/kubernetes/additional-setup/sidecar-injection/
           

Pod 的必要功能

Pod 具備運作 Istio 初始化容器的權限;否則必須進行Service Account 賦權。
需要給端口正确命名: 服務端口必須進行命名
Pod 端口: Pod 必須包含每個容器将監聽的明确端口清單
關聯服務:Pod 不論是否公開端口,都必須關聯到至少一個 Kubernetes 服務上,如果一個 Pod 屬于多個服務,這些服務不能在同一端口上使用不同協定
Deployment 應帶有 app 以及 version 标簽
           

一、手動注入

就是在部署前修改yaml檔案,在其中加入sidecar的配置,然後部署到kubernetes中去

### 檢視原始内容-nginx.yaml  ###
#apiVersion: v1
#kind: ServiceAccount
#metadata:
#  name: nginx-web

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
  labels:
    app: nginx-web
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 31000
  selector:
    app: nginx-web
  type: NodePort

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-web-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-web
        version: v1
    spec:
     # serviceAccountName: nginx-web
      containers:
      - name: nginx-web
        image: registry.cn-hangzhou.aliyuncs.com/ccgg/nginx:v2
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        env:
        - name: version
          value: v1

### 将 Sidecar 注入到 Deployment 中部署到kubernetes上
istioctl kube-inject -f nginx-web.yaml | kubectl apply -f - 

###觀察pod狀态,可以看到pod的容器數由1變為2;pod中有兩個容器:nginx和istio-proxy,手動注入成功。 ###
kubectl get pods

### 檢視pod詳細内容 ###
kubectl describe pod nginx-web-v1-69577869dd-dr5fv

           

二、webhook自動注入

https://preliminary.istio.io/zh/docs/ops/setup/injection/

### 準備條件 ###
  自動注入功能需要kubernetes 1.9或更高版本;
  kubernetes環境需支援MutatingAdmissionWebhook;

$ kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1

需要在kube-apiserver的啟動參數中加入;
--admission-control=MutatingAdmissionWebhook,ValidatingAdmissionWebhook

###  自動注入控制###
在sidecar-injector的configmap中設定policy:disabled字段來設定是否啟用自動注入(此處為全局控制是否啟用自動注入功能);
//enabeld為開啟,disabeld為關閉

kubectl describe cm istio-sidecar-injector -n istio-system | grep policy
policy: enabled

### 保sidecar-inject安裝完成 ###
kubectl get po -n istio-system | grep sidecar-injector
istio-sidecar-injector-b88dfb954-gc4xz   1/1       Running     0          

為需要自動注入的namespace打上标簽istio-injection: enabled
###  檢視 ###
kubectl get namespace -L istio-injection

### 打标簽 ###
kubectl label namespace default istio-injection=enabled

### 删除标簽 ###
kubectl label namespace default istio-injection-


同時也可以在deployment中通過設定annotation,sidecar.istio.io/inject=true來控制pod級别的自動注入。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: my-nginx
        version: v1
      annotations:
        sidecar.istio.io/inject: "true"
    // true為啟用自動注入,false為關閉自動注入
           

繼續閱讀