集群istio组件灰度升级

作者:吴官宝,中国移动云能力中心软件研发工程师,专注于云原生、微服务、算力网络等

背景

提升资源的使用效率是永远的话题,共享集群便是众多公司都会使用的一种部署方案。由于共享集群的使用业务方众多,对于基础组件的管理、升级维护等就带来了新的挑战。

就如服务网格组件istio如何去解决基础版本的灰度升级、版本切换等问题。也许有人会说直接参考官网的upgrade就可以了,那是理想情况直接升级,难以解决以下实际场景:

场景1:业务A使用istio版本1,业务B使用istio版本2

场景2:业务C目前没人力支持升级验证,需沿用istio老版本,后续再升级

此文就带你详细的了解如何丝滑的灰度升级。

灰度升级原理

要实现灰度升级就需要负载按需的使用不同版本的istio,需要解决如下问题:

1、根据条件给负载注入需要版本的istio-proxy sidecar容器

2、istio-proxy sidecar容器连接到对应的istiod控制面

负载是如何注入istio-proxy sidecar容器

istio使用 MutatingAdmissionWebhooks 自动将 Sidecar 代理注入至用户 Pod。 来自 Kubernetes 准入控制机制:

准入 Webhook 是 HTTP 方式的回调,接收准入请求并对其进行相关操作。 可定义两种类型的准入 Webhook,Validating 准入 Webhook 和 Mutating 准入 Webhook。使用 Validating Webhook,可以通过自定义的准入策略来拒绝请求; 使用 Mutating Webhook,可以通过自定义默认值来修改请求。

MutatingAdmissionWebhooks 主要通过namespaceSelectorobjectSelector选择器来选择负载需要执行的 webhookservice,也就是调用 istiod 服务的/inject接口注入istio-proxy sidecar容器

             ┌─────────────────┐            ┌──────────────────────────────────┐
 (1)apply    │                 │ (2)read    │  mutatingwebhookconfiguration    │
────────────►│    api-server   │◄───────────┤  - istio-sidecar-injector        │
             │                 │            │  - istio-sidecar-injector-1.19.1 │
             └────────┬────────┘            └──────────────────────────────────┘
                      │                     
                      │  (3)选择器匹配webhookservice
                      │  - namespaceSelector规则匹配
                      │  - objectSelector规则匹配
                      │
                      │  (4)回调
           ┌──────────▼───────────┐
           │                      │              
  ┌────────▼────────┐    ┌────────▼────────┐
  │  webhookservice │    │ webhookservice  │
  │  - istiod       │    │ - istiod-1.19.1 │
  └─────────────────┘    └─────────────────┘

istio-proxy sidecar容器是如何连接对应的istiod控制面

1、istio-proxy sidecar容器会通过环境变量CA_ADDR的istiod的地址连接对应的istiod,获取相关的配置。
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx
    sidecar.istio.io/inject: "true"
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ...
  - args:
    - proxy
    - sidecar
    ...
    env:
    - name: JWT_POLICY
      value: third-party-jwt
    - name: PILOT_CERT_PROVIDER
      value: istiod
    - name: CA_ADDR
      value: istiod.istio-system.svc:15012
 ...
2、CA_ADDR地址可通过 istio 的配置项 mesh.discoveryAddress统一配置
apiVersion: v1
data:
  mesh: |-
    defaultConfig:
      discoveryAddress: istiod.istio-system.svc:15012
      ...
    trustDomain: cluster.local
    ...
  meshNetworks: 'networks: {}'
kind: ConfigMap
metadata:
  name: istio
  namespace: istio-system

MutatingWebhookConfiguration规则梳理

默认版本istio-sidecar-injector梳理

kubectl get MutatingWebhookConfiguration istio-sidecar-injector -o yaml
  • namespaceSelector 有明确的注入标签【istio-injection或istio.io/rev】且objectSelector没有明确的不注入的标签【sidecar.istio.io/inject】
  • namespaceSelector 没有明确的不注入标签【istio-injection】且objectSelector有明确的注入的标签【sidecar.istio.io/inject或istio.io/rev】

新增版本如1.19.1的:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  labels:
    app: sidecar-injector
    istio.io/rev: 1.19.1
    release: istio-system-istiod-1.19.1
  name: istio-sidecar-injector-1.19.1
webhooks:
- admissionReviewVersions:
...
  namespaceSelector:
    matchExpressions:
    - key: istio.io/rev
      operator: In
      values:
      - "1.19.1"
    - key: istio-injection
      operator: DoesNotExist
  objectSelector:
    matchExpressions:
    - key: sidecar.istio.io/inject
      operator: NotIn
      values:
      - "false"
...
- admissionReviewVersions:
...
  namespaceSelector:
    matchExpressions:
    - key: istio.io/rev
      operator: DoesNotExist
    - key: istio-injection
      operator: DoesNotExist
  objectSelector:
    matchExpressions:
    - key: sidecar.istio.io/inject
      operator: NotIn
      values:
      - "false"
    - key: istio.io/rev
      operator: In
      values:
      - "1.19.1"
...

安装新版本istio时,注意正确配置revision,给namespace打上istio.io/rev=1.19.1新版本istio的标签,重启namespace下的副本,验证是否注入新版本的istio。

小结

1、建议使用 istio 的业务 namespaces 添加标签istio.io/rev明确使用 istio 版本。

2、推荐新的 istiod 安装在 istio-system,采用不同的版本名称,使用相同的根证书。

3、下发的istio资源对不同版本的istiod都是生效的,可通过meshConfig.discoverySelectors限定。

4、记得验证使用新老版本istio的服务之间的通信情况。

本文由mdnice多平台发布

你可能感兴趣的:(后端)