蓝绿发布简介
蓝绿发布是一种部署策略,它允许两个生产环境(蓝色环境和绿色环境)同时存在。蓝色环境运行当前稳定版本的应用,而绿色环境则用于部署新版本。通过将流量从一个环境切换到另一个环境,蓝绿发布能够最小化更新过程中对用户的影响。
为什么选择 Kubernetes 进行蓝绿发布?
Kubernetes 提供了丰富的特性和工具,使得蓝绿发布变得简单而高效。通过 Kubernetes 的 Deployment、Service 和 Ingress 资源,您可以轻松地管理多个版本的应用,实现平滑的流量切换和快速回滚。
k8s-master | 192.168.8.125 |
k8s-node1 | 192.168.8.126 |
k8s-node2 | 192.168.8.127 |
harbor | 192.168.8.99 |
我们就简单模拟一下蓝绿发布的流程。
一: 准备环境
准备两个镜像
这个其实就是基于nginx镜像,写的dockerfile把里面的网页换了重新封装的镜像
Dockerfile 文件内容:
FROM nginx:1.24 #官网基于nginx镜像
COPY index.html /usr/share/nginx/html/index.html #将定义的网页copy到容器中网页根目录下面
EXPOSE 80 #暴露80端口
CMD ["nginx","-g","daemon off;"] #前台运行nginx
执行build封装镜像
docker build -t nginx:green . # .代表当前目录
目录结构就是这样的:
[root@125master1 ~]# tree test
test
├── lan
│ ├── Dockerfile
│ └── index.html
└── lv
├── Dockerfile
└── index.html
2 directories, 4 files
自己定义的网页为了大家更好的区分我就直接换成蓝色绿色了。
把镜像推送到harbor
docker tag nginx:green 192.168.8.99/web/green:test #给镜像打标签推送到harbor
docker tag nginx:blue 192.168.8.99/web/blue:test
docker login 192.168.8.99 #登录harbor
docker push 192.168.8.99/web/green:test #push 推送
docker push 192.168.8.99/web/blue:test
登录harbor查看web项目下有没有镜像
注: 大家如果没有搭建harbor的话就直接docker save 将dockerfile封装的两个镜像打包成tar包就行
docker save -o nginx-lv.tar nginx:green
docker save -o nginx-lan.tar nginx:blue
然后把这两个包传到node节点上面将镜像导入containerd
ctr -n k8s.io image import nginx-lan.tar
ctr -n k8s.io image import nginx-lv.tar
之后用crictl images ls 查看镜像
二:编写deployment
kubectl create ns web #创建命名空间
蓝色环境:
apiVersion: apps/v1 # API 版本
kind: Deployment # 资源类型
metadata:
name: lan # Deployment 名称
namespace: web # 命名空间
spec:
replicas: 2 # Pod 副本数
selector:
matchLabels:
app: lan-container # 用于选择 Pod 的标签
template: # Pod 模板
metadata:
labels:
app: lan-container # Pod 标签
spec:
containers:
- name: nginx-con # 容器名称
image: 192.168.8.99/web/blue:test # 容器镜像
imagePullPolicy: Always # 镜像拉取策略
ports:
- containerPort: 80 # 容器端口
绿色环境:
apiVersion: apps/v1 # API 版本
kind: Deployment # 资源类型
metadata:
name: lv # Deployment 名称
namespace: web # 命名空间
spec:
replicas: 2 # Pod 副本数
selector:
matchLabels:
app: lv-container # 用于选择 Pod 的标签
template: # Pod 模板
metadata:
labels:
app: lv-container # Pod 标签
spec:
containers:
- name: nginx-con # 容器名称
image: 192.168.8.99/web/green:test # 容器镜像
imagePullPolicy: Always # 镜像拉取策略
ports:
- containerPort: 80 # 容器端口
注意: 如果是用ctr 导入的镜像的话
这两个位置就更换为crictl images ls 查看的镜像名字
imagepullpolicy这里就改成Nevel或者IfNotPresent
#imagepullpolicy一共有三种策略
Alway: 总是拉取镜像
Never: node节点中容器运行时里面的本地镜像
IfNotPresent:如何本地没有想要的镜像就会去镜像仓库拉取
三:创建service
apiVersion: v1 # 指定使用的 Kubernetes API 版本
kind: Service # 定义资源类型为 Service
metadata:
name: test # Service 的名称
namespace: web # 指定的命名空间
spec:
selector:
app: lan-container # 定义 Service 如何选择 Pod,通过匹配 Pod 的标签
type: NodePort # Service 类型,NodePort 表示在集群的所有节点上暴露服务
ports:
- targetPort: 80 # 容器内部监听的端口
port: 88 # Service #监听的端口
nodePort: 30010 # 节点上的静态端口号,集群外可以通过 <NodeIP>:30010 访问服务
四: 测试
测试实际上非常简单,就只需要把service中定义pod标签匹配相互换一下就可以
现在我们的service定义的选择lan这个pod的标签,所以他就会代理到定义了蓝色网页的pod
所以我们访问 集群ip:30010
就是请求的蓝色,现在切换成绿色
apiVersion: v1 # 指定使用的 Kubernetes API 版本
kind: Service # 定义资源类型为 Service
metadata:
name: test # Service 的名称
namespace: web # 指定的命名空间
spec:
selector:
app: lv-container # 定义 Service 如何选择 Pod,通过匹配 Pod 的标签
type: NodePort # Service 类型,NodePort 表示在集群的所有节点上暴露服务
ports:
- targetPort: 80 # 容器内部监听的端口
port: 88 # Service #监听的端口
nodePort: 30010 # 节点上的静态端口号,集群外可以通过 <NodeIP>:30010 访问服务
就是把service中的selector换了一下,之后kubectl apply -f service
再访问
现在就实现了蓝绿发布。
如果在新环境通过一些监控工具发现了问题的话就要及时的回滚到旧版本上面去,回滚的话就是将selector改回原来那套环境的pod标签
测试
k8sdeployment
---------------------
我们利用Kubernetes 的 Deployment 和 Service 对象,我们可以轻松地管理多个版本的应用,实现平滑的流量切换和回滚,并且deployment对象也可以建立多个对象,实现故障自修复,自动扩缩容等功能。