istio的sidecar原理学习
阅读原文时间:2021年12月27日阅读:3

目的

从内嵌到应用的SDK模式转成istio servicemesh,再到最新提出来的proxyless可谓是发展太快了。刚开始我只是围绕着服务注册和发现是怎么转变来展开研究,但是发现这个话题有点大,还是得一步步来:

  • sidecar如何接管流量?

  • 如果不考虑现有的微服务体系,注册和发现怎么实现,有几种方式?

  • 结合现有的微服务体系,注册和发现该如何融合?

先一步步研究吧,抓着这个主方向不断地探寻,肯定有所收获。

今天和大家分享第一个,sidecar如何接管流量

整个istio的bookinfo环境搭建如下

按照官网

  • 首先安装k8s(我用minikube)

  • 再安装istio

  • 开启默认namespace:default的sidecar注入然后跑samples的bookinfo

image

下图是使用 Istio 管理的 bookinfo 示例的访问请求路径图

image

sidecar注入

先开启sidecar注入

kubectl label namespace default istio-injection=enabled

部署bookinfo

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

成功后

  • 会创建svc:

image

  • 和创建pods:

image

sidecar注入是依赖k8s的webhook功能来实现的,在创建pod的Crd资源增加了istio的配置

pod资源被webhook修改成啥样了

先来分析下productpage

##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      labels:
        app: productpage
        version: v1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {}
---    

对应productpage镜像的DockerFile:

image

productpage是一个Flask写的python应用

image

通过命令查看sidecar注入后的productpage配置是怎么样的

kubectl describe pod -l app=productpage




Name:         productpage-v1-6b746f74dc-59t8d
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 25 Dec 2021 16:53:08 +0800
Labels:       app=productpage
              pod-template-hash=6b746f74dc
              security.istio.io/tlsMode=istio
              service.istio.io/canonical-name=productpage
              service.istio.io/canonical-revision=v1
              version=v1
Annotations:  kubectl.kubernetes.io/default-container: productpage
              kubectl.kubernetes.io/default-logs-container: productpage
              prometheus.io/path: /stats/prometheus
              prometheus.io/port: 15020
              prometheus.io/scrape: true
              sidecar.istio.io/status:
                {"initContainers":["istio-init"],"containers":["istio-proxy"],"volumes":["istio-envoy","istio-data","istio-podinfo","istio-token","istiod-...
Status:       Running
IP:           172.17.0.7
IPs:
  IP:           172.17.0.7
Controlled By:  ReplicaSet/productpage-v1-6b746f74dc
Init Containers:
  istio-init:
    Container ID:  docker://81d9c7297737675de742388e54de51d21598da8e6a63b81d293c69b848e92ba7
    Image:         docker.io/istio/proxyv2:1.12.1
    Image ID:      docker-pullable://istio/proxyv2@sha256:4704f04f399ae24d99e65170d1846dc83d7973f186656a03ba70d47bd1aba88f
&nbsp;&nbsp;&nbsp;&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<none>
&nbsp;&nbsp;&nbsp;&nbsp;Host&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<none>
&nbsp;&nbsp;&nbsp;&nbsp;Args:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;istio-iptables
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15001
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-z
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15006
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-u
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1337
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-m
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REDIRECT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-i
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-x

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-d
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15090,15021,15020
&nbsp;&nbsp;&nbsp;&nbsp;State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Terminated
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Completed
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;Code:&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Started:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sun,&nbsp;26&nbsp;Dec&nbsp;2021&nbsp;14:23:05&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finished:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sun,&nbsp;26&nbsp;Dec&nbsp;2021&nbsp;14:23:05&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;Ready:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True
&nbsp;&nbsp;&nbsp;&nbsp;Restart&nbsp;Count:&nbsp;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;Limits:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memory:&nbsp;&nbsp;1Gi
&nbsp;&nbsp;&nbsp;&nbsp;Requests:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10m
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memory:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40Mi
&nbsp;&nbsp;&nbsp;&nbsp;Environment:&nbsp;&nbsp;<none>
&nbsp;&nbsp;&nbsp;&nbsp;Mounts:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/run/secrets/kubernetes.io/serviceaccount&nbsp;from&nbsp;kube-api-access-clsdq&nbsp;(ro)
Containers:
&nbsp;&nbsp;productpage:
&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;ID:&nbsp;&nbsp;&nbsp;docker://421334a3a5262bdbb29158c423cce3464e19ac3267c7c6240ca5d89a1d38962a
&nbsp;&nbsp;&nbsp;&nbsp;Image:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;ID:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker-pullable://istio/examples-bookinfo-productpage-v1@sha256:63ac3b4fb6c3ba395f5d044b0e10bae513afb34b9b7d862b3a7c3de7e0686667
&nbsp;&nbsp;&nbsp;&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9080/TCP
&nbsp;&nbsp;&nbsp;&nbsp;Host&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0/TCP
&nbsp;&nbsp;&nbsp;&nbsp;State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Running
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Started:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sun,&nbsp;26&nbsp;Dec&nbsp;2021&nbsp;14:23:11&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;Last&nbsp;State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Terminated
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Completed
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;Code:&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Started:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sat,&nbsp;25&nbsp;Dec&nbsp;2021&nbsp;16:56:01&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finished:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sat,&nbsp;25&nbsp;Dec&nbsp;2021&nbsp;22:51:12&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;Ready:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True
&nbsp;&nbsp;&nbsp;&nbsp;Restart&nbsp;Count:&nbsp;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;Environment:&nbsp;&nbsp;&nbsp;&nbsp;<none>
&nbsp;&nbsp;&nbsp;&nbsp;Mounts:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/tmp&nbsp;from&nbsp;tmp&nbsp;(rw)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/run/secrets/kubernetes.io/serviceaccount&nbsp;from&nbsp;kube-api-access-clsdq&nbsp;(ro)
&nbsp;&nbsp;istio-proxy:
&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;ID:&nbsp;&nbsp;docker://c3d8a9d57e632112f86441fafad64eb73df3ea4f7317dbfb72152107c493866b
&nbsp;&nbsp;&nbsp;&nbsp;Image:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker.io/istio/proxyv2:1.12.1
&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;ID:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker-pullable://istio/proxyv2@sha256:4704f04f399ae24d99e65170d1846dc83d7973f186656a03ba70d47bd1aba88f
&nbsp;&nbsp;&nbsp;&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15090/TCP
&nbsp;&nbsp;&nbsp;&nbsp;Host&nbsp;Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0/TCP
&nbsp;&nbsp;&nbsp;&nbsp;Args:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sidecar
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--domain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(POD_NAMESPACE).svc.cluster.local
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--proxyLogLevel=warning
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--proxyComponentLogLevel=misc:error
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--log_output_level=default:info
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--concurrency
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Running
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Started:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sun,&nbsp;26&nbsp;Dec&nbsp;2021&nbsp;14:23:13&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;Last&nbsp;State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Terminated
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Completed
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;Code:&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Started:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sat,&nbsp;25&nbsp;Dec&nbsp;2021&nbsp;16:56:01&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finished:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sat,&nbsp;25&nbsp;Dec&nbsp;2021&nbsp;22:51:15&nbsp;+0800
&nbsp;&nbsp;&nbsp;&nbsp;Ready:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True
&nbsp;&nbsp;&nbsp;&nbsp;Restart&nbsp;Count:&nbsp;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;Limits:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memory:&nbsp;&nbsp;1Gi
&nbsp;&nbsp;&nbsp;&nbsp;Requests:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10m
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memory:&nbsp;&nbsp;&nbsp;40Mi
&nbsp;&nbsp;&nbsp;&nbsp;Readiness:&nbsp;&nbsp;http-get&nbsp;http://:15021/healthz/ready&nbsp;delay=1s&nbsp;timeout=3s&nbsp;period=2s&nbsp;#success=1&nbsp;#failure=30
&nbsp;&nbsp;&nbsp;&nbsp;Environment:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JWT_POLICY:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;third-party-jwt
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PILOT_CERT_PROVIDER:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;istiod
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CA_ADDR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;istiod.istio-system.svc:15012
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POD_NAME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productpage-v1-6b746f74dc-59t8d&nbsp;(v1:metadata.name)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POD_NAMESPACE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;(v1:metadata.namespace)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSTANCE_IP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(v1:status.podIP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SERVICE_ACCOUNT:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(v1:spec.serviceAccountName)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HOST_IP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(v1:status.hostIP)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROXY_CONFIG:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_POD_PORTS:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"containerPort":9080,"protocol":"TCP"}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_APP_CONTAINERS:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productpage
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_CLUSTER_ID:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kubernetes
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_INTERCEPTION_MODE:&nbsp;&nbsp;REDIRECT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_WORKLOAD_NAME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productpage-v1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_OWNER:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kubernetes://apis/apps/v1/namespaces/default/deployments/productpage-v1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISTIO_META_MESH_ID:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cluster.local
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUST_DOMAIN:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cluster.local
&nbsp;&nbsp;&nbsp;&nbsp;Mounts:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/etc/istio/pod&nbsp;from&nbsp;istio-podinfo&nbsp;(rw)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/etc/istio/proxy&nbsp;from&nbsp;istio-envoy&nbsp;(rw)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/lib/istio/data&nbsp;from&nbsp;istio-data&nbsp;(rw)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/run/secrets/istio&nbsp;from&nbsp;istiod-ca-cert&nbsp;(rw)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/run/secrets/kubernetes.io/serviceaccount&nbsp;from&nbsp;kube-api-access-clsdq&nbsp;(ro)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/run/secrets/tokens&nbsp;from&nbsp;istio-token&nbsp;(rw)
省略

可以看出来多了2个东西的配置

  • istio-init

  • istio-proxy

istio-init

init容器 给pod配置iptables 让流量进入pod和出pod都重定向sidecar指定端口

用的镜像:docker.io/istio/proxyv2:1.12.1

新版本的istio已经用go语言重写了,以前老版本是一个sh脚本来配置iptables的

看老本也许更容易明白 https://github.com/istio/istio/blob/0.5.0/tools/deb/istio-iptables.sh

启动参数:

&nbsp;istio-iptables
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-p&nbsp;15001&nbsp;//&nbsp;出站流量都重定向到此端口
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-z&nbsp;15006&nbsp;//&nbsp;进站流量都重定向到此端口
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-u&nbsp;1337
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-m&nbsp;REDIRECT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-i&nbsp;*&nbsp;-x&nbsp;""&nbsp;-b&nbsp;*&nbsp;//&nbsp;匹配全部的IP地址范围和端口列表
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-d&nbsp;15090,15021,15020&nbsp;//这些内部用的端口排除不拦截(下表)&nbsp;

image

istio-proxy

启动sidecar

用的镜像:docker.io/istio/proxyv2:1.12.1

&nbsp;proxy
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sidecar
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--domain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(POD_NAMESPACE).svc.cluster.local
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--proxyLogLevel=warning
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--proxyComponentLogLevel=misc:error
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--log_output_level=default:info
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--concurrency

查看iptales是怎么配置的

//进入minikube
minikube&nbsp;ssh

//切换为&nbsp;root&nbsp;用户,minikube&nbsp;默认用户为&nbsp;docker
sudo&nbsp;-i

//拿到这个istio_proxy的启动的进程(一个是pilot-agent&nbsp;一个是envoy)
docker&nbsp;top&nbsp;`docker&nbsp;ps|grep&nbsp;"istio-proxy_productpage"|cut&nbsp;-d&nbsp;"&nbsp;"&nbsp;-f1`&nbsp;
&nbsp;
&nbsp;
//进入上条命令打印的PID(随意哪个)
nsenter&nbsp;-n&nbsp;--target&nbsp;5141

image

被istio注入后pod下参与的容器如下:

  • k8s_infra(也叫pause容器 把它理解为pod的底)

  • istio_init(配置IpTables)

  • app(应用容器)

  • istio_proxy (启动pilot-agentenvoy如下图)

我理解的启动顺序也是按照从上到下的顺序,因为同一个pod下想要网络栈共享,必须得有一个底容器来兜底,其他容器指定-net=兜底容器id加入网络栈,所以我认为infra是最先启动才对

到底是init容器先启动,还是infra先启动,这块我没有找到相关资料,如果我理解有误望大佬教育!

总结

istio的sidecar注入,把pod的流量的出入用iptables的方式拦截了到了Envoy,

回到productpage的代码

//product_id默认为0
def&nbsp;getProductReviews(product_id,&nbsp;headers):
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Do&nbsp;not&nbsp;remove.&nbsp;Bug&nbsp;introduced&nbsp;explicitly&nbsp;for&nbsp;illustration&nbsp;in&nbsp;fault&nbsp;injection&nbsp;task
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;TODO:&nbsp;Figure&nbsp;out&nbsp;how&nbsp;to&nbsp;achieve&nbsp;the&nbsp;same&nbsp;effect&nbsp;using&nbsp;Envoy&nbsp;retries/timeouts
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;_&nbsp;in&nbsp;range(2):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;reviews['name']&nbsp;+&nbsp;"/"&nbsp;+&nbsp;reviews['endpoint']&nbsp;+&nbsp;"/"&nbsp;+&nbsp;str(product_id)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;requests.get(url,&nbsp;headers=headers,&nbsp;timeout=3.0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;BaseException:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;None
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;res&nbsp;and&nbsp;res.status_code&nbsp;==&nbsp;200:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;200,&nbsp;res.json()
&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;res.status_code&nbsp;if&nbsp;res&nbsp;is&nbsp;not&nbsp;None&nbsp;and&nbsp;res.status_code&nbsp;else&nbsp;500
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;status,&nbsp;{'error':&nbsp;'Sorry,&nbsp;product&nbsp;reviews&nbsp;are&nbsp;currently&nbsp;unavailable&nbsp;for&nbsp;this&nbsp;book.'}

image

访问的reviews的url:http://reviews:9080/reviews/0

那么流量被sidecar拦截之后的流程如下图:

image

这里你肯定有一个疑问,

http://reviews:9080/reviews/0

这种域名式的访问是如何被envoy知道具体的请求地址的?是用kube-proxy吗? 下次再讲把!

感谢我的好朋友Raphael.Goh和istio大神dozer给予技术指导,让我慢慢走进内部去欣赏它的美!