k8s-Deployment 实现蓝绿发布

蓝绿发布简介

蓝绿发布是一种部署策略,它允许两个生产环境(蓝色环境和绿色环境)同时存在。蓝色环境运行当前稳定版本的应用,而绿色环境则用于部署新版本。通过将流量从一个环境切换到另一个环境,蓝绿发布能够最小化更新过程中对用户的影响。

为什么选择 Kubernetes 进行蓝绿发布?

Kubernetes 提供了丰富的特性和工具,使得蓝绿发布变得简单而高效。通过 Kubernetes 的 Deployment、Service 和 Ingress 资源,您可以轻松地管理多个版本的应用,实现平滑的流量切换和快速回滚。

k8s-master 192.168.8.125
k8s-node1192.168.8.126
k8s-node2192.168.8.127
harbor192.168.8.99

我们就简单模拟一下蓝绿发布的流程。

一: 准备环境

准备两个镜像

2b56a225b9cb481686981cd4f03ac52e.png

这个其实就是基于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
自己定义的网页为了大家更好的区分我就直接换成蓝色绿色了。

79fa0a1a143d4d00a9e268a757bd31ae.png

把镜像推送到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项目下有没有镜像

7dd45c4f87604930bdea51684f1cfb4d.png注:  大家如果没有搭建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 查看镜像4f64075c53d345c6a7e8d5ff301cf806.png

二:编写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 导入的镜像的话07ce0fd4a3ee4674b8ac30dcf070d8db.png

这两个位置就更换为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

83a65e7b44da434db5d7473f61a92cc2.png就是请求的蓝色,现在切换成绿色

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

再访问

c29bd2062ec74dd6b1885da0abc29398.png

现在就实现了蓝绿发布。

如果在新环境通过一些监控工具发现了问题的话就要及时的回滚到旧版本上面去,回滚的话就是将selector改回原来那套环境的pod标签

测试

k8sdeployment

---------------------

我们利用Kubernetes 的 Deployment 和 Service 对象,我们可以轻松地管理多个版本的应用,实现平滑的流量切换和回滚,并且deployment对象也可以建立多个对象,实现故障自修复,自动扩缩容等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Source、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值