共计 4412 个字符,预计需要花费 12 分钟才能阅读完成。
如何在 TKE 集群中实现简单的蓝绿发布和灰度发布,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
原理介绍
我们通常使用 Deployment、StatefulSet 等 Kubernetes 自带的工作负载来部署业务,每个工作负载都管理一组 Pod,以 Deployment 为例:
通常还会为每个工作负载创建对应的 Service,Service 通过 selector 来匹配后端 Pod,其它服务或者外部通过访问 Service 即可访问到后端 Pod 提供的服务。要对外暴露可以直接将 Service 类型设置为 LoadBalancer,LB 插件会自动为其创建 CLB (腾讯云负载均衡器) 作为流量入口。
如何实现蓝绿发布?以 Deployment 为例,集群中部署两个不同版本的 Deployment,它们的 Pod 拥有共同的 label,但有一个 label 的值不同,用于区分不同的版本,Service 使用 selector 选中了其中一个版本的 Deployment 的 Pod,通过修改 Service 的 selector 中决定 服务版本的 label 的值来改变 Service 后端对应的 Deployment,实现让服务从一个版本直接切换到另一个版本,即蓝绿发布:
如何实现灰度发布?虽然我们通常会为每个工作负载都创建一个 Service,但 Kubernetes 并没有限制 Service 一定要与工作负载一一对应,因为 Service 是通过 selector 来匹配后端 Pod 的,只要不同工作负载的 Pod 都能被相同 selector 选中,就可以实现一个 Service 对应多个版本的工作负载的效果,调整不同版本工作负载的副本数就相当于调整不同版本服务的权重,实现灰度发布:
使用 YAML 创建资源
本文的示例将使用 yaml 的方式部署工作负载和创建 Service,有两种操作方式。
方式一:在 TKE 或 EKS 控制台右上角点击 YAML 创建资源,然后将本文示例的 yaml 粘贴进去:
方式二:将示例的 yaml 保存成文件,然后使用 kubectl 指定 yaml 文件来创建,如: kubectl apply -f xx.yaml。
部署多版本工作负载
要实现蓝绿发布或灰度发布,首先我们需要在集群中部署多个版本的工作负载,这里以简单的 nginx 为例,部署第一个版本:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
version: v1
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- name: nginx
image: openresty/openresty:centos
ports:
- name: http
protocol: TCP
containerPort: 80
volumeMounts:
- mountPath: /usr/local/openresty/nginx/conf/nginx.conf
name: config
subPath: nginx.conf
volumes:
- name: config
configMap:
name: nginx-v1
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx
version: v1
name: nginx-v1
data:
nginx.conf: |-
worker_processes 1;
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 1024;
}
http {
ignore_invalid_headers off;
server {
listen 80;
location / {
access_by_lua
local header_str = ngx.say(nginx-v1)
}
}
}
再部署第二个版本:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v2
spec:
replicas: 3
selector:
matchLabels:
app: nginx
version: v2
template:
metadata:
labels:
app: nginx
version: v2
spec:
containers:
- name: nginx
image: openresty/openresty:centos
ports:
- name: http
protocol: TCP
containerPort: 80
volumeMounts:
- mountPath: /usr/local/openresty/nginx/conf/nginx.conf
name: config
subPath: nginx.conf
volumes:
- name: config
configMap:
name: nginx-v2
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx
version: v2
name: nginx-v2
data:
nginx.conf: |-
worker_processes 1;
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 1024;
}
http {
ignore_invalid_headers off;
server {
listen 80;
location / {
access_by_lua
local header_str = ngx.say(nginx-v2)
}
}
}
可以在控制台看到部署的情况:
实现蓝绿发布
为我们部署的 Deployment 创建 LoadBalancer 类型的 Service 对外暴露服务,指定使用 v1 版本的服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
name: http
selector:
app: nginx
version: v1
测试访问:
$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
全是 v1 版本的响应,现在我们切到 v2 版本,修改 Service 的 selector,让它选中 v2 版本的服务,如果在控制台改,先找到对应 Service,点击 编辑 YAML:
修改 selector 部分:
selector:
app: nginx
version: v2
或者也可以直接用 kubectl 修改:
kubectl patch service nginx -p {spec :{ selector :{ version : v2}}}
再次测试访问:
$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
全是 v2 版本的响应,成功实现了蓝绿发布。
实现灰度发布
相比蓝绿发布,我们为不给 Service 指定使用 v1 版本的服务,从 selector 中删除 version 标签,让 Service 同时选中两个版本的 Deployment 的 Pod:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
name: http
selector:
app: nginx
测试访问:
$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址
nginx-v1
nginx-v1
nginx-v2
nginx-v2
nginx-v2
nginx-v1
nginx-v1
nginx-v1
nginx-v2
nginx-v2
可以看到,一半是 v1 版本的响应,另一半是 v2 版本的响应。现在我们来调节 v1 和 v2 版本的 Deployment 的副本,将 v1 版本调至 1 个副本,v2 版本调至 4 个副本。
可以通过控制台操作:
也可以通过 kubectl 操作:
kubectl scale deployment/nginx-v1 --replicas=1
kubectl scale deployment/nginx-v2 --replicas=4
然后再次进行访问测试:
$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址 nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址
nginx-v2
nginx-v1
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v1
nginx-v2
nginx-v2
nginx-v2
可以看到,10 次访问中只有 2 次返回了 v1 版本,v1 与 v2 的响应比例与其副本数比例一致,为 1:4,通过控制不同版本服务的副本数就实现了灰度发布。
关于如何在 TKE 集群中实现简单的蓝绿发布和灰度发布问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。