1. 创建初始 Deployment 和 Service:

    • 首先,创建一个基本的 Deployment,它包含旧版本的应用容器。同时创建一个对应的 Service,将流量路由到这个 Deployment。
    • 例如:
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: my-app
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: my-app
     template:
       metadata:
         labels:
           app: my-app
       spec:
         containers:
         - name: my-app-container
           image: old-version-image
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: my-app-service
   spec:
     selector:
       app: my-app
     ports:
     - protocol: TCP
       port: 80
       targetPort: 8080
  1. 创建新的 Deployment 进行金丝雀发布:

  • 创建一个新的 Deployment,其中包含新版本的应用容器。可以设置较少的副本数,比如 1 个副本,作为金丝雀版本。
  • 例如:
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: my-app-canary
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: my-app-canary
     template:
       metadata:
         labels:
           app: my-app-canary
       spec:
         containers:
         - name: my-app-container
           image: new-version-image
  1. 修改 Service 以包含金丝雀 Deployment:

  • 修改 Service 的 selector,使其同时选择旧版本和金丝雀版本的 Pod。这样,一部分流量会被路由到金丝雀版本的 Pod。
  • 例如:
   apiVersion: v1
   kind: Service
   metadata:
     name: my-app-service
   spec:
     selector:
       app: my-app
     ports:
     - protocol: TCP
       port: 80
       targetPort: 8080

修改为:

   apiVersion: v1
   kind: Service
   metadata:
     name: my-app-service
   spec:
     selector:
       app: my-app | app: my-app-canary
     ports:
     - protocol: TCP
       port: 80
       targetPort: 8080
  1. 监控和评估:

  • 通过监控工具观察金丝雀版本的性能、错误率等指标。如果金丝雀版本表现良好,可以逐渐增加金丝雀版本的副本数,同时减少旧版本的副本数,直到完全切换到新版本。