作者:吴官宝,中国移动云能力中心软件研发工程师,专注于云原生、微服务、算力网络等
提升资源的使用效率是永远的话题,共享集群便是众多公司都会使用的一种部署方案。由于共享集群的使用业务方众多,对于基础组件的管理、升级维护等就带来了新的挑战。
就如服务网格组件istio如何去解决基础版本的灰度升级、版本切换等问题。也许有人会说直接参考官网的upgrade就可以了,那是理想情况直接升级,难以解决以下实际场景:
场景1:业务A使用istio版本1,业务B使用istio版本2
场景2:业务C目前没人力支持升级验证,需沿用istio老版本,后续再升级
此文就带你详细的了解如何丝滑的灰度升级。
要实现灰度升级就需要负载按需的使用不同版本的istio,需要解决如下问题:
1、根据条件给负载注入需要版本的istio-proxy sidecar容器
2、istio-proxy sidecar容器连接到对应的istiod控制面
istio使用 MutatingAdmissionWebhooks 自动将 Sidecar 代理注入至用户 Pod。 来自 Kubernetes 准入控制机制:
准入 Webhook 是 HTTP 方式的回调,接收准入请求并对其进行相关操作。 可定义两种类型的准入 Webhook,Validating 准入 Webhook 和 Mutating 准入 Webhook。使用 Validating Webhook,可以通过自定义的准入策略来拒绝请求; 使用 Mutating Webhook,可以通过自定义默认值来修改请求。
MutatingAdmissionWebhooks 主要通过namespaceSelector
和objectSelector
选择器来选择负载需要执行的 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 │
└─────────────────┘ └─────────────────┘
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
...
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
默认版本istio-sidecar-injector梳理
kubectl get MutatingWebhookConfiguration istio-sidecar-injector -o yaml
新增版本如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多平台发布