当前位置:   article > 正文

深度解析Istio系列之Istio-proxy初始化篇

istio开启proxy protocol支持

注:以下讲述的按理环境场景是基于Kubernetes环境基础上部署的Istio环境。

涉及到Envoy概念介绍请参考深度解析Istio系列之流量控制篇。本文重点针对Envoy初始化场景进行拆解。

Istio-proxy(Envoy)作为Istio数据平面的重要组件,基于sidecar方式与业务应用混合部署到同一pod,为应用提供代理服务。Pilot作为控制平面组件,基于元数据的抽象层,屏蔽底层具体容器环境(Kubernetes或者docker),同时为Envoy的策略执行提供有效的数据支撑。那么Envoy如何获取Pilot所在地址的信息呢?

下面通过官网BookInfo案例中Productpage服务的配置文件来说明。

Pod容器说明

执行kubectl get deploy productpage-v1 -o yaml,获取productpage部署模板,如下所示:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. annotations:
  5. deployment.kubernetes.io/revision: "2"
  6. kubectl.kubernetes.io/last-applied-configuration: |
  7. {"apiVersion":"extensions/v1beta1","kind":"Deployment","metadata":{"annotations":{},"creationTimestamp":null,"name":"productpage-v1","namespace":"default"},"spec":{"replicas":1,"strategy":{},"template":{"metadata":{"annotations":{"sidecar.istio.io/status":"{\"version\":\"50128f63e7b050c58e1cdce95b577358054109ad2aff4bc4995158c06924a43b\",\"initContainers\":[\"istio-init\"],\"containers\":[\"istio-proxy\"],\"volumes\":[\"istio-envoy\",\"istio-certs\"],\"imagePullSecrets\":null}"},"creationTimestamp":null,"labels":{"app":"productpage","version":"v1"}},"spec":{"containers":[{"image":"istio/examples-bookinfo-productpage-v1:1.8.0","imagePullPolicy":"IfNotPresent","name":"productpage","ports":[{"containerPort":9080}],"resources":{}},{"args":["proxy","sidecar","--configPath","/etc/istio/proxy","--binaryPath","/usr/local/bin/envoy","--serviceCluster","productpage","--drainDuration","45s","--parentShutdownDuration","1m0s","--discoveryAddress","istio-pilot.istio-system:15007","--discoveryRefreshDelay","1s","--zipkinAddress","zipkin.istio-system:9411","--connectTimeout","10s","--proxyAdminPort","15000","--controlPlaneAuthPolicy","NONE"],"env":[{"name":"POD_NAME","valueFrom":{"fieldRef":{"fieldPath":"metadata.name"}}},{"name":"POD_NAMESPACE","valueFrom":{"fieldRef":{"fieldPath":"metadata.namespace"}}},{"name":"INSTANCE_IP","valueFrom":{"fieldRef":{"fieldPath":"status.podIP"}}},{"name":"ISTIO_META_POD_NAME","valueFrom":{"fieldRef":{"fieldPath":"metadata.name"}}},{"name":"ISTIO_META_INTERCEPTION_MODE","value":"REDIRECT"},{"name":"ISTIO_METAJSON_LABELS","value":"{\"app\":\"productpage\",\"version\":\"v1\"}\n"}],"image":"docker.io/istio/proxyv2:1.0.5","imagePullPolicy":"IfNotPresent","name":"istio-proxy","ports":[{"containerPort":15090,"name":"http-envoy-prom","protocol":"TCP"}],"resources":{"requests":{"cpu":"10m"}},"securityContext":{"readOnlyRootFilesystem":true,"runAsUser":1337},"volumeMounts":[{"mountPath":"/etc/istio/proxy","name":"istio-envoy"},{"mountPath":"/etc/certs/","name":"istio-certs","readOnly":true}]}],"initContainers":[{"args":["-p","15001","-u","1337","-m","REDIRECT","-i","*","-x","","-b","9080","-d",""],"image":"docker.io/istio/proxy_init:1.0.5","imagePullPolicy":"IfNotPresent","name":"istio-init","resources":{},"securityContext":{"capabilities":{"add":["NET_ADMIN"]},"privileged":true}}],"volumes":[{"emptyDir":{"medium":"Memory"},"name":"istio-envoy"},{"name":"istio-certs","secret":{"optional":true,"secretName":"istio.default"}}]}}},"status":{}}
  8. creationTimestamp: 2018-12-18T01:51:18Z
  9. generation: 2
  10. labels:
  11. app: productpage
  12. version: v1
  13. name: productpage-v1
  14. namespace: default
  15. resourceVersion: "17402700"
  16. selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/productpage-v1
  17. uid: 695ba22c-0267-11e9-8475-0050569c62d0
  18. spec:
  19. progressDeadlineSeconds: 600
  20. replicas: 1
  21. revisionHistoryLimit: 10
  22. selector:
  23. matchLabels:
  24. app: productpage
  25. version: v1
  26. strategy:
  27. rollingUpdate:
  28. maxSurge: 1
  29. maxUnavailable: 1
  30. type: RollingUpdate
  31. template:
  32. metadata:
  33. annotations:
  34. sidecar.istio.io/status: '{"version":"50128f63e7b050c58e1cdce95b577358054109ad2aff4bc4995158c06924a43b","initContainers":["istio-init"],"containers":["istio-proxy"],"volumes":["istio-envoy","istio-certs"],"imagePullSecrets":null}'
  35. creationTimestamp: null
  36. labels:
  37. app: productpage
  38. version: v1
  39. spec:
  40. containers:
  41. - image: istio/examples-bookinfo-productpage-v1:1.8.0
  42. imagePullPolicy: IfNotPresent
  43. name: productpage
  44. ports:
  45. - containerPort: 9080
  46. protocol: TCP
  47. resources: {}
  48. terminationMessagePath: /dev/termination-log
  49. terminationMessagePolicy: File
  50. - args:
  51. - proxy
  52. - sidecar
  53. - --configPath
  54. - /etc/istio/proxy
  55. - --binaryPath
  56. - /usr/local/bin/envoy
  57. - --serviceCluster
  58. - productpage
  59. - --drainDuration
  60. - 45s
  61. - --parentShutdownDuration
  62. - 1m0s
  63. - --discoveryAddress
  64. - istio-pilot.istio-system:15007
  65. - --discoveryRefreshDelay
  66. - 1s
  67. - --zipkinAddress
  68. - zipkin.istio-system:9411
  69. - --connectTimeout
  70. - 10s
  71. - --proxyAdminPort
  72. - "15000"
  73. - --controlPlaneAuthPolicy
  74. - NONE
  75. env:
  76. - name: POD_NAME
  77. valueFrom:
  78. fieldRef:
  79. apiVersion: v1
  80. fieldPath: metadata.name
  81. - name: POD_NAMESPACE
  82. valueFrom:
  83. fieldRef:
  84. apiVersion: v1
  85. fieldPath: metadata.namespace
  86. - name: INSTANCE_IP
  87. valueFrom:
  88. fieldRef:
  89. apiVersion: v1
  90. fieldPath: status.podIP
  91. - name: ISTIO_META_POD_NAME
  92. valueFrom:
  93. fieldRef:
  94. apiVersion: v1
  95. fieldPath: metadata.name
  96. - name: ISTIO_META_INTERCEPTION_MODE
  97. value: REDIRECT
  98. - name: ISTIO_METAJSON_LABELS
  99. value: |
  100. {"app":"productpage","version":"v1"}
  101. image: docker.io/istio/proxyv2:1.0.5
  102. imagePullPolicy: IfNotPresent
  103. name: istio-proxy
  104. ports:
  105. - containerPort: 15090
  106. name: http-envoy-prom
  107. protocol: TCP
  108. resources:
  109. requests:
  110. cpu: 10m
  111. securityContext:
  112. readOnlyRootFilesystem: true
  113. runAsUser: 1337
  114. terminationMessagePath: /dev/termination-log
  115. terminationMessagePolicy: File
  116. volumeMounts:
  117. - mountPath: /etc/istio/proxy
  118. name: istio-envoy
  119. - mountPath: /etc/certs/
  120. name: istio-certs
  121. readOnly: true
  122. dnsPolicy: ClusterFirst
  123. initContainers:
  124. - args:
  125. - -p
  126. - "15001"
  127. - -u
  128. - "1337"
  129. - -m
  130. - REDIRECT
  131. - -i
  132. - '*'
  133. - -x
  134. - ""
  135. - -b
  136. - "9080"
  137. - -d
  138. - ""
  139. image: docker.io/istio/proxy_init:1.0.5
  140. imagePullPolicy: IfNotPresent
  141. name: istio-init
  142. resources: {}
  143. securityContext:
  144. capabilities:
  145. add:
  146. - NET_ADMIN
  147. privileged: true
  148. terminationMessagePath: /dev/termination-log
  149. terminationMessagePolicy: File
  150. restartPolicy: Always
  151. schedulerName: default-scheduler
  152. securityContext: {}
  153. terminationGracePeriodSeconds: 30
  154. volumes:
  155. - emptyDir:
  156. medium: Memory
  157. name: istio-envoy
  158. - name: istio-certs
  159. secret:
  160. defaultMode: 420
  161. optional: true
  162. secretName: istio.default
  163. status:
  164. availableReplicas: 1
  165. conditions:
  166. - lastTransitionTime: 2018-12-18T01:51:19Z
  167. lastUpdateTime: 2018-12-18T01:51:19Z
  168. message: Deployment has minimum availability.
  169. reason: MinimumReplicasAvailable
  170. status: "True"
  171. type: Available
  172. - lastTransitionTime: 2018-12-18T01:51:18Z
  173. lastUpdateTime: 2018-12-18T03:48:52Z
  174. message: ReplicaSet "productpage-v1-7b96bbf89f" has successfully progressed.
  175. reason: NewReplicaSetAvailable
  176. status: "True"
  177. type: Progressing
  178. observedGeneration: 2
  179. readyReplicas: 1
  180. replicas: 1
  181. updatedReplicas: 1

模板中可见,除业务应用外,还包括istio-init,istio-proxy两个容器。istio-init作为Init Container类型,在应用容器启动之前启动,用来执行初始化任务。Istio-init主要初始化iptables规则,用于服务间调用时的请求拦截及转发。Istio-proxy是代理容器(即Envoy),容器中包含两个进程,分别是Pilot-agent进程和Envoy进程。前者负责生成Envoy启动所需的配置文件,启动Envoy进程。后者在服务调用发生时负责具体的策略执行。

Envoy配置信息详解

Envoy启动后,执行kubectl exec -it productpage-v1-7b96bbf89f-pj28l -c istio-proxy /bin/sh,进入istio-proxy容器内部,在/etc/istio/proxy目录下存在envoy-rev0.json配置文件,如图2所示:

深度解析Istio系列之Istio-proxy初始化篇

该文件是Pilot是Pilot-agent进程根据服务启动参数以及Kubernetes Server API的信息生成,配置文件框架如图3所示:

深度解析Istio系列之Istio-proxy初始化篇

Node包含的信息如图4所示:

深度解析Istio系列之Istio-proxy初始化篇

这里重点说明cluster属性,该属性值为productpage,说明当前的istio-proxy服务为productpage应用的代理服务,iptables将调用productpage服务请求拦截后,直接转发到该istio-proxy进行处理。

stats_config包含的信息如图5所示:

深度解析Istio系列之Istio-proxy初始化篇

static_config重点设定部分属性的命名规则。

admin包含的信息如图6所示:

深度解析Istio系列之Istio-proxy初始化篇

admin类似Envoy内部的一个管理器,暴露出的15000端口只能在容器内部被访问。

通过curl http://127.0.0.1:15000/help访问能获取其他接口信息,如下图7所示

深度解析Istio系列之Istio-proxy初始化篇

dynamic_resources包含的信息如图8所示:

深度解析Istio系列之Istio-proxy初始化篇

dynamic_resources中记录pilot调取XDS接口采用ADS聚合发现服务,这种方式能更好的保证从pilot上获取到的数据的一致性。

static_resources包含的部分信息如图9所示:

深度解析Istio系列之Istio-proxy初始化篇

static_resources name属性值为xds-grpc,与上述dynamic_resources模块的信息里cluster_name的值一致。同时xds-grpc对象信息中包括pilot组件的服务地址“istio-pilot.istio-system:15010”,即为istio-proxy从pilot获取动态信息的服务地址。Istio-proxy(Envoy)通过该地址调取XDS接口,获取服务信息。除此之外,static_resources中提供zipkin服务的地址,zipkin是用于服务分布式跟踪。

综上可知Envoy启动时,pilot-agent进程生成Envoy启动所需的配置文件,Envoy基于配置文件中携带的pilot地址信息动态获取服务信息,并且基于pilot提供的XDS接口,动态获取服务的listener,cluster,endpoint和route信息。

转载于:https://blog.51cto.com/11976981/2365758

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/915676
推荐阅读
相关标签
  

闽ICP备14008679号