经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
istio sidecar自动注入过程分析
来源:cnblogs  作者:mathli  时间:2018/11/14 9:58:54  对本文有异议

istio sidecar自动注入过程分析

sidecar自动注入检查

istio通过mutating webhook admission controller机制实现sidecar的自动注入.istio sidecard在每个服务创建pod时都会被自动注入.

检查kube-apiserver

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

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

同时检查kube-apiserver有没加入参数MutatingAdmissionWebhookValidatingAdmissionWebhook

检查sidecar-injector的configmap

在sidecar-injector的configmap中设置policy=enabled字段来查看是否启用自动注入

  1. [root@test1 ~]# kubectl describe cm istio-sidecar-injector -n istio-system
  2. Name: istio-sidecar-injector
  3. Namespace: istio-system
  4. Labels: app=istio
  5. chart=istio-1.0.3
  6. heritage=Tiller
  7. istio=sidecar-injector
  8. release=istio
  9. ...
  10. Data
  11. ====
  12. config:
  13. ----
  14. policy: enabled

检查namespace标签

为需要自动注入的namespace打上标签istio-injection: enabled

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

kubectl label namespace default istio-injection=enabled

sidecar自动注入过程

webhook过程

查看sidecar的webhook

  1. [root@test1 ~]# kubectl get MutatingWebhookConfiguration -n istio-system
  2. NAME CREATED AT
  3. istio-sidecar-injector 2018-11-12T09:14:44Z
  4. [root@test1 ~]# kubectl describe MutatingWebhookConfiguration istio-sidecar-injector -n istio-system
  5. Name: istio-sidecar-injector
  6. Namespace:
  7. Labels: app=istio-sidecar-injector
  8. chart=sidecarInjectorWebhook-1.0.3
  9. heritage=Tiller
  10. release=istio
  11. ... ...
  12. Webhooks:
  13. Client Config:
  14. ... ...
  15. Service:
  16. Name: istio-sidecar-injector
  17. Namespace: istio-system
  18. Path: /inject
  19. Failure Policy: Fail
  20. Name: sidecar-injector.istio.io
  21. Namespace Selector:
  22. Match Labels:
  23. Istio - Injection: enabled
  24. Rules:
  25. API Groups:
  26. API Versions:
  27. v1
  28. Operations:
  29. CREATE
  30. Resources:
  31. pods

由上面可以看出创建pod时会调用sidecar的webhook,接着向istio-sidecar-injector的服务发送inject注册(post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s).

查看istio-sidecar-injector的日志

  1. [root@test-1 ~]# kubectl get pods -n istio-system | grep istio-sidecar
  2. istio-sidecar-injector-d96cd9459-lbf66 1/1 Running 0 13d
  3. [root@test-1 ~]# kubectl logs istio-sidecar-injector-d96cd9459-lbf66 -n istio-system
  4. 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[]}
  5. 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具体信息

  1. [root@test-1 ~]#kubectl describe pod nginx-dm-fff68d674-9tv9w
  2. Name: nginx-dm-fff68d674-9tv9w
  3. Namespace: default
  4. Node: 10.0.3.126/10.0.3.126
  5. Start Time: Fri, 09 Nov 2018 14:40:53 +0800
  6. Labels: name=nginx
  7. pod-template-hash=999248230
  8. Annotations: sidecar.istio.io/status={"version":"5aa52d92ced8dab93e04a5a4701773b2f3d78968c04b05bb430f32e80a4d9be1","initContainers":["istio-init"],"containers":["istio-proxy"],...
  9. Status: Running
  10. IP: 172.30.2.21
  11. Controlled By: ReplicaSet/nginx-dm-fff68d674
  12. Init Containers:
  13. istio-init:
  14. Container ID: docker://43668b6cf4bb331542b8d98348a7670dad99b735aa0ef0ca572bf4ee1966538b
  15. Image: docker.io/istio/proxy_init:1.0.0
  16. Image ID: docker-pullable://istio/proxy_init@sha256:345c40053b53b7cc70d12fb94379e5aa0befd979a99db80833cde671bd1f9fad
  17. Port: <none>
  18. Host Port: <none>
  19. Args:
  20. -p
  21. 15001
  22. ... ...
  23. Containers:
  24. Containers:
  25. nginx:
  26. Container ID: docker://d917ffa9282bc4f82a0af1c8cbd6b51c0392fca6a85de6f8db6da128700db204
  27. Image: nginx:alpine
  28. Image ID:
  29. Port: 80/TCP
  30. Host Port: 0/TCP
  31. istio-proxy:
  32. Container ID: docker://932a8bc6b85f1106cde057bd55598337bf7f9963fc4e796d3d88907d717a8eff
  33. Image: docker.io/istio/proxyv2:1.0.0
  34. Image ID: docker-pullable://istio/proxyv2@sha256:77915a0b8c88cce11f04caf88c9ee30300d5ba1fe13146ad5ece9abf8826204c
  35. Port: <none>
  36. Host Port: <none>
  37. Args:
  38. proxy
  39. sidecar
  40. --configPath
  41. /etc/istio/proxy
  42. --binaryPath
  43. /usr/local/bin/envoy
  44. --serviceCluster
  45. ... ...

由具体信息可知,pod除了自身的容器外,还额外注入了两个容器.这就是由istio-sidecar-injector完成的.

proxy_init

proxy_init是一个Init Containers.Init Containers用于pod中执行初始化的任务,执行完毕退出后,才会执行后面的containers.

  1. [root@test-1 ~]# docker inspect docker.io/istio/proxy_init:1.0.0
  2. [
  3. {
  4. "RepoTags": [
  5. "istio/proxy_init:1.0.0",
  6. "gcr.io/istio-release/proxy_init:1.0.0"
  7. ],
  8. "ContainerConfig": {
  9. ...
  10. "Cmd": [
  11. "/bin/sh",
  12. "-c",
  13. "#(nop) ",
  14. "ENTRYPOINT [\"/usr/local/bin/istio-iptables.sh\"]"
  15. ],
  16. ...
  17. },
  18. ]

如上Cmd可以知道,这个容器主要执行的是istio-iptables.sh的脚本.

查看脚本内容

  1. ...
  2. while getopts ":p:u:g:m:b:d:i:x:h" opt; do
  3. case ${opt} in
  4. p)
  5. PROXY_PORT=${OPTARG}
  6. ;;
  7. u)
  8. ...

该脚本通过配置iptable来劫持pod中的流量.结合前面的-p 15001可知pod的数据流量被转发向envoy的15001端口.

proxyv2

查看pod内istio-proxy的进程

  1. [root@test-1 ~]# kubectl exec nginx-dm-fff68d674-9tv9w -c istio-proxy -- ps -ef
  2. UID PID PPID C STIME TTY TIME CMD
  3. 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
  4. 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/

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号