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

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

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

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

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


1. 创建绿色版本


1.1 创建绿色版本 Deployment
# 创建一个名为 "yewu-app-green-deploy" 的 Deployment
kubectl create deployment yewu-app-green-deploy \
  --image=yewu-app:v2  # 使用镜像 "yewu-app:v2" 部署应用

1.2 创建绿色版本 Service
# 将名为 "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
# 创建一个名为 "yewu-app-blue-deploy" 的 Deployment
kubectl create deployment yewu-app-blue-deploy \
  --image=yewu-app:v1  # 使用镜像 "yewu-app:v1" 部署应用

2.2 创建蓝色版本 Service
# 将名为 "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,用于切换蓝绿版本:

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

4. 创建 Ingress

创建 Ingress 资源以暴露服务:

# 使用 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 指向绿色版本:
# 更新名为 "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 切换到蓝色版本:
# 更新名为 "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 文件

# 定义 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 文件
# 定义 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文件
# 定义 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的定义:
  selector:
    app: demo
    version: v1

部署与测试

  • 部署v1 v2 deploy服务 和 service服务
# 使用 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版本
# 登陆任意一个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
# 使用 kubectl 工具更新服务的配置
# patch service demo: 对名为 demo 的服务进行补丁操作
# -p '{"spec":{"selector":{"version":"v2"}}}': 指定补丁内容,将服务的选择器更新为 version=v2
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'

测试流量是否到v2版本
# 登陆任意一个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
### 实现Kubernetes (k8s) 和 Spring Boot之间的持续集成和持续交付(CI/CD) #### 使用GitOps模型 为了在Kubernetes集群上部署Spring Boot应用程序,采用GitOps是一种最佳实践。通过这种方式,基础设施即代码(IaC)被存储于版本控制系统中,如GitHub仓库。每当有新的提交到主分支时,CI工具会触发构建流程并更新镜像标签[^1]。 #### 自动化测试环境配置 创建专门用于运行自动化测试的命名空间,在此环境中执行单元测试、集成测试以及端到端(E2E) 测试来验证应用的功能性和稳定性。这有助于确保只有经过充分检验的应用程序才能进入生产阶段。 #### 部署策略的选择 对于Spring Boot项目来说,蓝绿部署(Blue-Green Deployment) 或者滚动更新(Rolling Update)都是不错的选择。前者可以提供零停机时间的服务切换;后者则允许逐步替换旧实例而不影响用户体验。 #### 利用Helm简化安装过程 考虑到The Observability Stack for Kubernetes(TOBS), 可以利用Helm图表快速搭建完整的可观测性栈至K8S集群内。这对于监控Spring Boot微服务至关重要,因为良好的观测能力能够帮助及时发现潜在问题所在。 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-app-deployment spec: replicas: 3 selector: matchLabels: app: springbootapp template: metadata: labels: app: springbootapp spec: containers: - name: springboot-container image: your- containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: spring-boot-service spec: type: LoadBalancer selector: app: springbootapp ports: - protocol: TCP port: 80 targetPort: 8080 ``` 上述YAML文件定义了一个简单的Kubernetes资源清单,它描述了如何在一个K8S集群内部署三个副本的Spring Boot Web应用程序,并暴露给外部访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

教Linux的李老师

赞赏是第一生产力

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

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

打赏作者

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

抵扣说明:

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

余额充值