istio sidecar自動註入過程分析

来源:https://www.cnblogs.com/mathli/archive/2018/11/13/9952483.html
-Advertisement-
Play Games

istio sidecar自動註入過程分析 sidecar自動註入檢查 istio通過 "mutating webhook admission controller" 機制實現sidecar的自動註入.istio sidecard在每個服務創建pod時都會被自動註入. 檢查kube apiserve ...


istio sidecar自動註入過程分析

sidecar自動註入檢查

istio通過mutating webhook admission controller機制實現sidecar的自動註入.istio sidecard在每個服務創建pod時都會被自動註入.

檢查kube-apiserver

webhook支持需要Kubernets1.9或者更高的版本,使用以下命令查看

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

同時檢查kube-apiserver有沒加入參數MutatingAdmissionWebhookValidatingAdmissionWebhook

檢查sidecar-injector的configmap

在sidecar-injector的configmap中設置policy=enabled欄位來查看是否啟用自動註入

[root@test1 ~]# kubectl describe cm istio-sidecar-injector -n istio-system
Name:         istio-sidecar-injector
Namespace:    istio-system
Labels:       app=istio
              chart=istio-1.0.3
              heritage=Tiller
              istio=sidecar-injector
              release=istio
...
Data
====
config:
----
policy: enabled

檢查namespace標簽

為需要自動註入的namespace打上標簽istio-injection: enabled

[root@test1 ~]# kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    3d        enabled
istio-system   Active    3d        
kube-public    Active    3d        
kube-system    Active    3d 

kubectl label namespace default istio-injection=enabled

sidecar自動註入過程

webhook過程

查看sidecar的webhook

[root@test1 ~]# kubectl get MutatingWebhookConfiguration -n istio-system
NAME                     CREATED AT
istio-sidecar-injector   2018-11-12T09:14:44Z

[root@test1 ~]# kubectl describe MutatingWebhookConfiguration istio-sidecar-injector -n istio-system
Name:         istio-sidecar-injector
Namespace:    
Labels:       app=istio-sidecar-injector
              chart=sidecarInjectorWebhook-1.0.3
              heritage=Tiller
              release=istio
... ...
Webhooks:
Client Config:
    ... ...
    Service:
      Name:        istio-sidecar-injector
      Namespace:   istio-system
      Path:        /inject
  Failure Policy:  Fail
  Name:            sidecar-injector.istio.io
  Namespace Selector:
    Match Labels:
      Istio - Injection:  enabled
  Rules:
    API Groups:
      
    API Versions:
      v1
    Operations:
      CREATE
    Resources:
      pods

由上面可以看出創建pod時會調用sidecar的webhook,接著向istio-sidecar-injector的服務發送inject註冊(post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s).

查看istio-sidecar-injector的日誌

[root@test-1 ~]# kubectl get pods -n istio-system | grep istio-sidecar
istio-sidecar-injector-d96cd9459-lbf66      1/1       Running       0          13d

[root@test-1 ~]# kubectl logs istio-sidecar-injector-d96cd9459-lbf66 -n istio-system
2018-11-09T06:40:53.895979Z info  AdmissionReview for Kind=/v1, Kind=Pod Namespace=default Name= () UID=67d96021-e3ea-11e8-a721-00163e0c1d10 Rfc6902PatchOperation=CREATE UserInfo={system:unsecured  [system:masters system:authenticated] map[]}
2018-11-09T06:40:53.897821Z info  AdmissionResponse: patch=[{"op":"add","path":"/spec/initContainers","value":[{"name":"istio-init","image":"docker.io/istio/proxy_init:1.0.0","args":["-p","15001","-u","1337","-m","REDIRECT","-i","10.0.0.1/24","-x","","-b","80,","-d",""] ... ...},{"op":"add","path":"/spec/containers/-","value":{"name":"istio-proxy","image":"docker.io/istio/proxyv2:1.0.0","args":["proxy","sidecar",... ...\"initContainers\":[\"istio-init\"],\"containers\":[\"istio-proxy\"],\"volumes\":[\"istio-envoy\",\"istio-certs\"],\"imagePullSecrets\":null}"}}]

hook發送inject後,sidecar會返回兩個container,istio-init和istio-proxy.下麵我們來具體分析下.

獲取pod具體信息

[root@test-1 ~]#kubectl describe pod nginx-dm-fff68d674-9tv9w 
Name:           nginx-dm-fff68d674-9tv9w
Namespace:      default
Node:           10.0.3.126/10.0.3.126
Start Time:     Fri, 09 Nov 2018 14:40:53 +0800
Labels:         name=nginx
                pod-template-hash=999248230
Annotations:    sidecar.istio.io/status={"version":"5aa52d92ced8dab93e04a5a4701773b2f3d78968c04b05bb430f32e80a4d9be1","initContainers":["istio-init"],"containers":["istio-proxy"],...
Status:         Running
IP:             172.30.2.21
Controlled By:  ReplicaSet/nginx-dm-fff68d674
Init Containers:
  istio-init:
    Container ID:  docker://43668b6cf4bb331542b8d98348a7670dad99b735aa0ef0ca572bf4ee1966538b
    Image:         docker.io/istio/proxy_init:1.0.0
    Image ID:      docker-pullable://istio/proxy_init@sha256:345c40053b53b7cc70d12fb94379e5aa0befd979a99db80833cde671bd1f9fad
    Port:          <none>
    Host Port:     <none>
    Args:
      -p
      15001
      ... ...

Containers:
  Containers:
  nginx:
    Container ID:   docker://d917ffa9282bc4f82a0af1c8cbd6b51c0392fca6a85de6f8db6da128700db204
    Image:          nginx:alpine
    Image ID:       
    Port:           80/TCP
    Host Port:      0/TCP

  istio-proxy:
    Container ID:  docker://932a8bc6b85f1106cde057bd55598337bf7f9963fc4e796d3d88907d717a8eff
    Image:         docker.io/istio/proxyv2:1.0.0
    Image ID:      docker-pullable://istio/proxyv2@sha256:77915a0b8c88cce11f04caf88c9ee30300d5ba1fe13146ad5ece9abf8826204c
    Port:          <none>
    Host Port:     <none>
    Args:
      proxy
      sidecar
      --configPath
      /etc/istio/proxy
      --binaryPath
      /usr/local/bin/envoy
      --serviceCluster
      ... ...

由具體信息可知,pod除了自身的容器外,還額外註入了兩個容器.這就是由istio-sidecar-injector完成的.

proxy_init

proxy_init是一個Init Containers.Init Containers用於pod中執行初始化的任務,執行完畢退出後,才會執行後面的containers.

[root@test-1 ~]# docker inspect  docker.io/istio/proxy_init:1.0.0
[
    {
        "RepoTags": [
            "istio/proxy_init:1.0.0",
            "gcr.io/istio-release/proxy_init:1.0.0"
        ],
        "ContainerConfig": {
            ...
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "ENTRYPOINT [\"/usr/local/bin/istio-iptables.sh\"]"
            ],
            ...
        },
]

如上Cmd可以知道,這個容器主要執行的是istio-iptables.sh的腳本.

查看腳本內容

...
while getopts ":p:u:g:m:b:d:i:x:h" opt; do
  case ${opt} in
    p)
      PROXY_PORT=${OPTARG}
      ;;
    u)
    ...

該腳本通過配置iptable來劫持pod中的流量.結合前面的-p 15001可知pod的數據流量被轉發向envoy的15001埠.

proxyv2

查看pod內istio-proxy的進程

[root@test-1 ~]# kubectl exec nginx-dm-fff68d674-9tv9w -c istio-proxy -- ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
istio-p+     1     0  0 Nov09 ?        00:00:12 /usr/local/bin/pilot-agent proxy sidecar --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --serviceCluster istio-proxy --drainDuration 45s --parentShutdownDuration 1m0s --discoveryAddress istio-pilot.istio-system:15007 --discoveryRefreshDelay 1s --zipkinAddress zipkin.istio-system:9411 --connectTimeout 10s --statsdUdpAddress istio-statsd-prom-bridge.istio-system:9125 --proxyAdminPort 15000 --controlPlaneAuthPolicy NONE
istio-p+    24     1  0 Nov09 ?        00:42:50 /usr/local/bin/envoy -c /etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --parent-shutdown-time-s 60 --service-cluster istio-proxy --service-node sidecar~172.30.2.21~nginx-dm-fff68d674-9tv9w.default~default.svc.cluster.local --max-obj-name-len 189 -l warn --v2-config-only

上面有兩個進程pilot-agent和envoy.
pilot-agent根據k8s api生成配置信息,並負責管理(啟動,熱更新,關閉等)整個envoy.生成的配置信息在 /etc/istio/proxy/envoy-rev0.json,具體內容可自己查看.

envoy由pilot-agent進程啟動,Envoy讀取Pilot-agent為它生成的配置文件(envoy-rev0.json),然後根據該文件的配置獲取到Pilot的地址,通過數據面標準API的xDS介面從pilot拉取動態配置信息.

參考文檔:
1.https://istio.io/docs/setup/kubernetes/sidecar-injection/
2.https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、flex佈局 1.1 容器指定為flex佈局 .box{display: flex;} 1.2 行元素指定flex佈局 .box{display:inline-flex} 2、容器的屬性 2.1、flex-direction 2.2、flex-wrap 2.3、flex-flow 2.4、jus ...
  • *.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video*.ac3 audio/ac3 AC3 Audio*.asf allpication/vnd.ms-asf Advanced Streaming Format*.au audio/basic AU Audio ...
  • 前幾天給了個需求對瀏覽器網頁進行截圖,把網頁統計數據圖形表等截圖保存至用戶本地。 首先對於網頁截圖,我用的是canvas實現,獲取你需要截圖的模塊的div,從而使用canvas對你需要的模塊進行截圖。 我們先來引入canvas的js文件,js文件獲取地址官網主頁:http://html2canvas ...
  • 項目中遇到的問題,需要表頭固定,給表主體設置滾動條。搜了很多種方法,bootstrap table也研究了一下。 下麵是我們使用的方法。 表頭放在div1中,表主體放在div2中,給div2設置固定高度,加樣式overflow:auto,這樣在數據多的時候會出現滾動條,數據少的時候滾動條會消失。 如 ...
  • <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><!-- 步驟分析 1.確定事件:點擊事件:onclick事件 2.事件要觸發函數selectOne 3.selectOne要做一些操作 ...
  • @media screen and (max-width: 300px) { //當視口寬度小於等於300px時生效 } max-width 相當於 <= @media screen and (min-width: 300px) { //當視口寬度大於等於300px時生效 } max-width 相 ...
  • 本文作者:陳明傑(sandyskies) Tars是騰訊從2008年到今天一直在使用的後臺邏輯層的統一應用框架,目前支持C++,Java,PHP,Nodejs,Golang語言。該框架為用戶提供了涉及到開發、運維、以及測試的一整套解決方案,幫助一個產品或者服務快速開發、部署、測試、上線。 它集可擴展 ...
  • 抽象工廠模式簡介,介紹了抽象工廠模式意圖,結構,產品族以及產品等級的概念,並且提供了代碼示例java版抽象工廠模式,抽象工廠模式與工廠模式的對比差異 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...