前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Istio sidecar 注入分析

Istio sidecar 注入分析

作者头像
腾讯云原生
发布2020-02-14 15:32:22
1.4K0
发布2020-02-14 15:32:22
举报

今天我们来分析istio中注入组件istio-sidecar-injector:

用户空间Pod要想加入服务网格, 首先需要注入sidecar container, istio 提供了2种方式实现注入:

  1. 自动注入方式: 利用 Kubernetes Dynamic Admission Webhooks 对 新建的pod 进行注入: initContainer + sidecar
  2. 手动注入方式: 使用命令`istioctl kube-inject ...`

「注入」的本质是修改Pod的资源定义, 添加相应的sidecar container定义, 内容包括2个新容器:

  • name为istio-init的initContainer: 通过配置iptables来劫持Pod中的流量
  • name为istio-proxy的sidecar容器: 两个进程pilot-agent和envoy, pilot-agent 进行初始化并启动envoy

1. 准入控制: Dynamic Admission Control

kubernetes Admission Control (准入控制)有2种:

  1. Built in Admission Control: 这些Admission模块可以选择性地编译进api server, 因此需要修改和重启kube-apiserver
  2. Dynamic Admission Control: 可以部署在kube-apiserver之外, 同时无需修改或重启kube-apiserver.

其中, Dynamic Admission Control 包含2种:

  1. Admission Webhooks: 该controller 提供http server, 被动接受kube-apiserver分发的准入请求.
  2. Initializers: 该controller主动list and watch 关注的资源对象, 对watch到的未初始化对象进行相应的改造.

其中, Admission Webhooks 又包含2种准入控制:

ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook

istio 使用了MutatingAdmissionWebhook来实现 sidecar 注入, 首先需要保证以下条件满足:

  • 确保 kube-apiserver 启动参数 开启了 MutatingAdmissionWebhook
  • 给namespace 增加 label: kubectl label namespace default istio-injection=enabled
  • 同时还要保证 kube-apiserver 的 aggregator layer 开启: --enable-aggregator-routing=true 且证书和api server连通性正确设置.

kube-apiserver 还需要一个配置对象来获取istio关心的资源对象类型, 以及webhook的服务地址. 如果你是使用helm安装的istio, 配置对象已经添加好了, 查阅MutatingWebhookConfiguration:

代码语言:javascript
复制
- apiVersion: admissionregistration.k8s.io/v1beta1
  kind: MutatingWebhookConfiguration
  metadata:
    name: istio-sidecar-injector
  webhooks:
    - clientConfig:
      service:
        name: istio-sidecar-injector
        namespace: istio-system
        path: /inject
    name: sidecar-injector.istio.io
    namespaceSelector:
      matchLabels:
        istio-injection: enabled
    rules:
    - apiGroups:
      - ""
      apiVersions:
      - v1
      operations:
      - CREATE
      resources:
      - pods

该配置告诉kube-apiserver: 命名空间istio-system 中的服务 istio-sidecar-injector(默认端口443), 通过路由/inject, 处理v1/pods的CREATE, 同时pod需要满足命名空间istio-injection: enabled, 当有符合条件的pod被创建时, kube-apiserver就会对该服务发起调用, 服务返回的内容正是添加了sidecar注入的pod定义.


2. Sidecar 容器注入内容浅析

查看Pod istio-sidecar-injector 定义:

代码语言:javascript
复制
% kubectl -n istio-system get pod istio-sidecar-injector-sdfssddf-fsdfsd -oyaml
...(略)...
    volumeMounts:
    - mountPath: /etc/istio/inject
      name: inject-config
      readOnly: true
  volumes:
  - configMap:
      items:
      - key: config
        path: config
      name: istio-sidecar-injector
    name: inject-config

可以看到该Pod利用projected volume 把istio-sidecar-injector这个config map 的config挂到了自己容器路径/etc/istio/inject/config, config map 内容正是注入用户空间pod所需的模板.

如果是使用helm安装istio, 该 configMap 模板github源码位于:

https://github.com/istio/istio/blob/master/install/kubernetes/helm/istio/templates/sidecar-injector-configmap.yaml.

该config map 是在安装istio时添加的, kubernetes 会自动维护 projected volume的更新,所以容器 sidecar-injector只需要从本地文件直接读取所需配置.

用户可以按需修改该模板内容:

代码语言:javascript
复制
% kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}'

查看该configMap, 其中 data.config包含以下内容(简化版):

代码语言:javascript
复制
policy: enabled // 是否开启自动注入
template: |-
  initContainers:
  [[ if ne (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) "NONE" ]]
  - name: istio-init
    image: "docker.io/istio/proxy_init:1.1.0"
    .....
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
    .....
  containers:
  - name: istio-proxy
    args:
    - proxy
    - sidecar
    .....
    image: [[ annotation .ObjectMeta `sidecar.istio.io/proxyImage`  "docker.io/istio/proxyv2:1.1.0"  ]]
    .....
    readinessProbe:
      httpGet:
        path: /healthz/ready
        port: [[ annotation .ObjectMeta `status.sidecar.istio.io/port`  0  ]]
    .....
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
      runAsGroup: 1337
  .....
    volumeMounts:
    .....
    - mountPath: /etc/istio/proxy
      name: istio-envoy
    - mountPath: /etc/certs/
      name: istio-certs
      readOnly: true
      .....
  volumes:
  .....
  - emptyDir:
      medium: Memory
    name: istio-envoy
  - name: istio-certs
    secret:
      optional: true
      [[ if eq .Spec.ServiceAccountName "" -]]
      secretName: istio.default
      [[ else -]]
      secretName: [[ printf "istio.%s" .Spec.ServiceAccountName ]]
      .....

另外istio-sidecar-injector还给容器istio-proxy挂了2个volumes:

  • name为istio-envoy的emptydir volume, 挂载到容器目录/etc/istio/proxy, 作为envoy的配置文件目录
  • name为istio-certs的secret volume, 默认secret名为istio.default, 挂载到容器目录/etc/certs/, 存放相关的证书, 包括服务端证书, 和可能的mtls客户端证书
代码语言:javascript
复制
% kubectl exec productpage-v1-sdffsds-fdsfs -c istio-proxy -- ls /etc/certs/
cert-chain.pem
key.pem
root-cert.pem

后续文章将会对sidecar istio-proxy进一步分析.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云容器团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准入控制: Dynamic Admission Control
  • 2. Sidecar 容器注入内容浅析
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档