k8s通过service标签实现蓝绿发布

k8s通过service标签实现蓝绿发布

    • [通过`k8s service label`标签实现`蓝绿发布`](#通过k8s service label标签实现蓝绿发布)
    • 方法1:使用kubelet完成蓝绿切换
      • [1. 创建绿色版本](#1. 创建绿色版本)
        • [1.1 创建绿色版本 Deployment](#1.1 创建绿色版本 Deployment)
        • [1.2 创建绿色版本 Service](#1.2 创建绿色版本 Service)
      • [2. 创建蓝色版本](#2. 创建蓝色版本)
        • [2.1 创建蓝色版本 Deployment](#2.1 创建蓝色版本 Deployment)
        • [2.2 创建蓝色版本 Service](#2.2 创建蓝色版本 Service)
      • [3. 创建`蓝绿切换SVC` (用于外部访问)](#3. 创建蓝绿切换SVC (用于外部访问))
      • [4. 创建 Ingress](#4. 创建 Ingress)
      • [5. 切换蓝绿版本](#5. 切换蓝绿版本)
        • [5.1 将 `app-svc` 指向绿色版本:](#5.1 将 app-svc 指向绿色版本:)
        • [5.2 将 `app-svc` 切换到蓝色版本:](#5.2 将 app-svc 切换到蓝色版本:)
      • 总结
    • [方法2:k8s 蓝绿yaml 配置](#方法2:k8s 蓝绿yaml 配置)

通过k8s service label标签实现蓝绿发布

  • 两个版本deploysvc,
  • svc版本标签,
  • 然后选择Service Label标签对应的deploy版本

方法1:使用kubelet完成蓝绿切换

在 Kubernetes 中,使用 kubectl 命令完成蓝绿部署.

1. 创建绿色版本

1.1 创建绿色版本 Deployment
bash 复制代码
# 创建一个名为 "yewu-app-green-deploy" 的 Deployment
kubectl create deployment yewu-app-green-deploy \
  --image=yewu-app:v2  # 使用镜像 "yewu-app:v2" 部署应用
1.2 创建绿色版本 Service
bash 复制代码
# 将名为 "yewu-app-green-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=green-svc 指定 Service 的名称为 "green-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-green-deploy --type=ClusterIP --name=green-svc --port=80 --target-port=8080 --save-config

2. 创建蓝色版本

2.1 创建蓝色版本 Deployment
bash 复制代码
# 创建一个名为 "yewu-app-blue-deploy" 的 Deployment
kubectl create deployment yewu-app-blue-deploy \
  --image=yewu-app:v1  # 使用镜像 "yewu-app:v1" 部署应用
2.2 创建蓝色版本 Service
bash 复制代码
# 将名为 "yewu-app-blue-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=blue-svc 指定 Service 的名称为 "blue-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-blue-deploy --type=ClusterIP --name=blue-svc --port=80 --target-port=8080 --save-config

3. 创建蓝绿切换SVC (用于外部访问)

创建一个外部 Service,用于切换蓝绿版本:

bash 复制代码
# 创建一个 ClusterIP 类型的 Service,名称为 "app-svc"
kubectl create service clusterip app-svc \
  --tcp=80:80  # 将 Service 的端口 80 映射到后端 Pod 的端口 80

4. 创建 Ingress

创建 Ingress 资源以暴露服务:

bash 复制代码
# 使用 kubectl 创建一个 Ingress 资源
kubectl create ingress app-ingress \
  --rule="your-domain.com/*=app-svc:80"
  # --rule 参数定义了 Ingress 的规则:
  # - your-domain.com 是主机名
  # - /* 表示匹配所有路径
  # - app-svc:80 表示将流量转发到名为 app-svc 的 Service 的 80 端口

5. 切换蓝绿版本

5.1 将 app-svc 指向绿色版本:
bash 复制代码
# 更新名为 "app-svc" 的 Service 的 selector,使其指向绿色版本的 Deployment
kubectl patch svc app-svc \
  -p '{"spec":{"selector":{"app":"yewu-app-green-deploy"}}}'
  # -p 参数指定了一个 JSON 格式的部分更新内容
  # 将 Service 的 selector 更新为匹配标签 "app=yewu-app-green-deploy"
5.2 将 app-svc 切换到蓝色版本:
bash 复制代码
# 更新名为 "app-svc" 的 Service 的 selector,使其指向蓝色版本的 Deployment
kubectl patch svc app-svc \
  -p '{"spec":{"selector":{"app":"yewu-app-blue-deploy"}}}'
  # -p 参数指定了一个 JSON 格式的部分更新内容
  # 将 Service 的 selector 更新为匹配标签 "app=yewu-app-blue-deploy"

总结

先完成蓝绿部署,然后通过修改 app-svcselector 来切换流量。

方法2:k8s 蓝绿yaml 配置

service.yaml 文件

yaml 复制代码
# 定义 API 版本为 v1
apiVersion: v1
# 定义资源类型为 Service
kind: Service
# 定义 Service 的元数据
metadata:
  # 定义 Service 的名称为 demo
  name: demo
  # 定义 Service 所在的命名空间为 default
  namespace: default
  # 定义 Service 的标签,app 标签值为 demo
  labels:
    app: demo
# 定义 Service 的规格
spec:
  # 定义 Service 的端口配置
  ports:
    # 定义一个端口配置
    - # 定义端口为 80
      port: 80
      # 定义目标端口为 http
      targetPort: http
      # 定义协议为 TCP
      protocol: TCP
      # 定义端口名称为 http
      name: http
  # 注意这里我们匹配 app 和 version 标签,当要切换流量的时候,我们更新 version 标签的值,比如:v2
  # 定义 Service 的选择器
  selector:
    # 定义选择器的 app 标签值为 demo
    app: demo
    # 定义选择器的 version 标签值为 v1
    version: v1

deploy.yaml 文件

v1-deploy.yaml 文件
yaml 复制代码
# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:
  # 定义 Deployment 的名称为 demo1-deployment
  name: demo1-deployment
  # 定义 Deployment 所在的命名空间为 default
  namespace: default
  # 定义 Deployment 的标签,app 标签值为 demo
  labels:
    # 定义 app 标签值为 demo
    app: demo
    # 定义 version 标签值为 v1
    version: v1
# 定义 Deployment 的规格
spec:
  # 定义副本数量为 1
  replicas: 1
  # 定义修订历史限制为 3
  revisionHistoryLimit: 3
  # 定义更新策略
  strategy:
    # 定义滚动更新策略
    rollingUpdate:
      # 定义最大 surge 百分比为 30%
      maxSurge: 30%
      # 定义最大不可用百分比为 30%
      maxUnavailable: 30%
  # 定义选择器
  selector:
    # 定义选择器的标签匹配规则
    matchLabels:
      # 定义 app 标签值为 demo
      app: demo
      # 定义 version 标签值为 v1
      version: v1
  # 定义 Pod 模板
  template:
    # 定义 Pod 的元数据
    metadata:
      # 定义 Pod 的标签
      labels:
        # 定义 app 标签值为 demo
        app: demo
        # 定义 version 标签值为 v1
        version: v1
    # 定义 Pod 的规格
    spec:
      # 定义容器列表
      containers:
        # 定义一个容器
        - # 定义容器名称为 demo1
          name: demo1
          # 定义容器使用的镜像为 mritd/demo
          image: mritd/demo
          # 定义存活探针
          livenessProbe:
            # 定义 HTTP GET 请求
            httpGet:
              # 定义请求路径为 /
              path: /
              # 定义请求端口为 80
              port: 80
              # 定义请求协议为 HTTP
              scheme: HTTP
            # 定义初始延迟秒数为 30
            initialDelaySeconds: 30
            # 定义超时秒数为 5
            timeoutSeconds: 5
            # 定义周期秒数为 30
            periodSeconds: 30
            # 定义成功阈值为 1
            successThreshold: 1
            # 定义失败阈值为 5
            failureThreshold: 5
          # 定义就绪探针
          readinessProbe:
            # 定义 HTTP GET 请求
            httpGet:
              # 定义请求路径为 /
              path: /
              # 定义请求端口为 80
              port: 80
              # 定义请求协议为 HTTP
              scheme: HTTP
            # 定义初始延迟秒数为 30
            initialDelaySeconds: 30
            # 定义超时秒数为 5
            timeoutSeconds: 5
            # 定义周期秒数为 10
            periodSeconds: 10
            # 定义成功阈值为 1
            successThreshold: 1
            # 定义失败阈值为 5
            failureThreshold: 5
          # 定义容器端口列表
          ports:
            # 定义一个端口
            - # 定义端口名称为 http
              name: http
              # 定义容器端口为 80
              containerPort: 80
              # 定义协议为 TCP
              protocol: TCP
绿v2-deploy.yaml文件
yaml 复制代码
# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:
  # 定义 Deployment 的名称为 demo1-deployment
  name: demo1-deployment
  # 定义 Deployment 所在的命名空间为 default
  namespace: default
  # 定义 Deployment 的标签,app 标签值为 demo
  labels:
    # 定义 app 标签值为 demo
    app: demo
    # 定义 version 标签值为 v1
    version: v1
# 定义 Deployment 的规格
spec:
  # 定义副本数量为 1
  replicas: 1
  # 定义修订历史限制为 3
  revisionHistoryLimit: 3
  # 定义更新策略
  strategy:
    # 定义滚动更新策略
    rollingUpdate:
      # 定义最大 surge 百分比为 30%
      maxSurge: 30%
      # 定义最大不可用百分比为 30%
      maxUnavailable: 30%
  # 定义选择器
  selector:
    # 定义选择器的标签匹配规则
    matchLabels:
      # 定义 app 标签值为 demo
      app: demo
      # 定义 version 标签值为 v1
      version: v1
  # 定义 Pod 模板
  template:
    # 定义 Pod 的元数据
    metadata:
      # 定义 Pod 的标签
      labels:
        # 定义 app 标签值为 demo
        app: demo
        # 定义 version 标签值为 v1
        version: v1
    # 定义 Pod 的规格
    spec:
      # 定义容器列表
      containers:
        # 定义一个容器
        - # 定义容器名称为 demo1
          name: demo1
          # 定义容器使用的镜像为 mritd/demo
          image: mritd/demo
          # 定义存活探针
          livenessProbe:
            # 定义 HTTP GET 请求
            httpGet:
              # 定义请求路径为 /
              path: /
              # 定义请求端口为 80
              port: 80
              # 定义请求协议为 HTTP
              scheme: HTTP
            # 定义初始延迟秒数为 30
            initialDelaySeconds: 30
            # 定义超时秒数为 5
            timeoutSeconds: 5
            # 定义周期秒数为 30
            periodSeconds: 30
            # 定义成功阈值为 1
            successThreshold: 1
            # 定义失败阈值为 5
            failureThreshold: 5
          # 定义就绪探针
          readinessProbe:
            # 定义 HTTP GET 请求
            httpGet:
              # 定义请求路径为 /
              path: /
              # 定义请求端口为 80
              port: 80
              # 定义请求协议为 HTTP
              scheme: HTTP
            # 定义初始延迟秒数为 30
            initialDelaySeconds: 30
            # 定义超时秒数为 5
            timeoutSeconds: 5
            # 定义周期秒数为 10
            periodSeconds: 10
            # 定义成功阈值为 1
            successThreshold: 1
            # 定义失败阈值为 5
            failureThreshold: 5
          # 定义容器端口列表
          ports:
            # 定义一个端口
            - # 定义端口名称为 http
              name: http
              # 定义容器端口为 80
              containerPort: 80
              # 定义协议为 TCP
              protocol: TCP
  • 上面定义的资源对象中,最重要的就是Service 中 label selector的定义:
yaml 复制代码
  selector:
    app: demo
    version: v1

部署与测试

  • 部署v1 v2 deploy服务 和 service服务
shell 复制代码
# 使用 kubectl 工具应用多个 YAML 配置文件
# -f service.yaml: 应用服务配置文件
# -f v1-deploy.yaml: 应用版本1的部署配置文件
# -f v2-deploy.yaml: 应用版本2的部署配置文件
kubectl apply -f service.yaml -f v1-deploy.yaml -f v2-deploy.yaml
测试流量是否到v1版本
shell 复制代码
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done

# 输出日志
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
切换入口流量从v1 到 v2
shell 复制代码
# 使用 kubectl 工具更新服务的配置
# patch service demo: 对名为 demo 的服务进行补丁操作
# -p '{"spec":{"selector":{"version":"v2"}}}': 指定补丁内容,将服务的选择器更新为 version=v2
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'
测试流量是否到v2版本
shell 复制代码
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done

# 输出日志
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2
相关推荐
chuanauc5 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉5 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信5 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花5 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay5 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu5 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记9 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样14 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家14 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook