YAZONG 我的开源

Kubernetes(十)服务调度与编排(10.4)部署策略详解---重建、滚动、蓝绿、金丝雀

  , , ,
0 评论0 浏览

#这里讲了用原生的K8S进行部署的时候,都有什么选择:重新创建Recreate、滚动更新部署Rolling update、蓝绿部署、金丝雀部署。

这些用原生K8S就可以做到。

有些人可能觉得比较粗糙,没那么强大。

关于A/B测试和流量分发可以使用esure工具,可以完成更好的工作。

使用esure工作多、功能多、比较重量型,现在的方案比太简单,不过也很好用的,一些情况也是比较有优势的选择。

image.png

最基本最常见的滚动更新部署Rolling update:前面更新服务的方式:修改deployment的yaml配置文件、kubectl apply。

重新创建Recreate:先要停止旧的服务,都停掉之后,再启动一批新的服务。

----上面俩:K8S层面支持的不同的重启策略

蓝绿部署:利用了service的selector,选择不同版本的服务

金丝雀部署:前面通过ingress同时去轮询不同的两个后端服务。

----上面俩:利用K8S的service的特征label selector机制,结合deployment一起去完成的部署方式。

重新创建Recreate

案例1:多副本

[root@node-1 ~]# cd deep-in-kubernetes/
[root@node-1 deep-in-kubernetes]# mkdir 6-deployment
[root@node-1 deep-in-kubernetes]# cd 6-deployment

[root@node-1 6-deployment]# cat web-recreate.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-recreate
  namespace: dev
spec:
  #策略
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: web-recreate
  #副本:2
  replicas: 2
  template:
    metadata:
      labels:
        app: web-recreate
    spec:
      containers:
      - name: web-recreate
        image: hub.mooc.com/kubernetes/web:v1
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 2
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /examples/index.html
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 5
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-recreate
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-recreate
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-recreate
  namespace: dev
spec:
  rules:
  - host: web-recreate.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-recreate
          servicePort: 80
#编辑win10的 C:\Windows\System32\drivers\etc\hosts 文件加入。执行ipconfig /flushdns。
10.0.0.22 web-recreate.mooc.com

#三个节点也加入
[root@node-1/2/3 nginx]# cat /etc/hosts
10.0.0.22 web-recreate.mooc.com
[root@node-1 6-deployment]# kubectl apply -f web-recreate.yaml 
deployment.apps/web-recreate created
service/web-recreate created
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions/web-recreate created
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
web-recreate-68d64f7755-dr4mf   1/1     Running   0          6m20s   10.200.139.72   node-3   <none>           <none>
web-recreate-68d64f7755-z4sv7   1/1     Running   0          6m20s   10.200.139.67   node-3   <none>           <none>

image.png

案例2:多副本、type

不管有几个实例,要把旧实例全部停掉,停掉之后,再同时启动新的实例。

特点:服务是有间断的,因为服务要先全部停止。这种方式使用场景并不多。比如资源并不充足,某个节点多个服务,测试时为快速重启,就使用这种方式。

image.png

[root@node-1 6-deployment]# cat web-recreate2.yaml  
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-recreate
  namespace: dev
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: web-recreate
  replicas: 2
  template:
    metadata:
      labels:
        app: web-recreate
        type: webapp
    spec:
      containers:
      - name: web-recreate
        image: hub.mooc.com/kubernetes/web:v1
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 2
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /examples/index.html
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 5
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-recreate
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-recreate
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-recreate
  namespace: dev
spec:
  rules:
  - host: web-recreate.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-recreate
          servicePort: 80

[root@node-1 6-deployment]# kubectl apply -f web-recreate2.yaml 
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide   
NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
web-recreate-546f4f9874-7tsz5   1/1     Running   0          92s   10.200.139.75   node-3   <none>           <none>
web-recreate-546f4f9874-nwltn   1/1     Running   0          92s   10.200.139.74   node-3   <none>           <none>

[root@node-1 6-deployment]# kubectl delete -f web-recreate2.yaml 
[root@node-1 6-deployment]# kubectl get pods -n dev
No resources found in dev namespace.

滚动更新部署Rolling update

[root@node-1 configs]# kubectl get deploy springboot-web-demo -o yaml
#如果没配置策略strategy时,默认滚动更新的值
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
#编辑win10的 C:\Windows\System32\drivers\etc\hosts 文件加入。执行ipconfig /flushdns。
10.0.0.22 web-rollingupdate.mooc.com

#三个节点也加入
[root@node-1/2/3 nginx]# cat /etc/hosts
10.0.0.22  web-rollingupdate.mooc.com

案例:百分比、springboot-web镜像

[root@node-1 6-deployment]# cat web-rollingupdate.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  #策略
  strategy:
    rollingUpdate:
	  #最大可以超出这个实例数的百分比
	  #比如带着百分号,1,每次最多可能多启动一个实例
	  #比如不带百分号,可以配置maxSurge:1,表示最大可以超出一个实例
      maxSurge: 25%
	  #最大不可用的这个实例数的百分比
	  #比如带着百分号,有四个实例,必须有三个实例保证可用状态
      maxUnavailable: 25%
	#类型  
    type: RollingUpdate
  selector:
    matchLabels:
      app: web-rollingupdate
  #副本:2
  replicas: 2
  template:
    metadata:
      labels:
        app: web-rollingupdate
    spec:
      containers:
      - name: web-rollingupdate
        image: hub.mooc.com/kubernetes/springboot-web:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 1024Mi
            cpu: 500m
          limits:
            memory: 2048Mi
            cpu: 2000m
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /hello?name=test
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-rollingupdate
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  rules:
  - host: web-rollingupdate.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-rollingupdate
          servicePort: 80
[root@node-1 6-deployment]# kubectl apply -f web-rollingupdate.yaml 
[root@node-1 6-deployment]# kubectl get pods -n dev
NAME                                 READY   STATUS    RESTARTS   AGE
web-rollingupdate-7b4b64f679-npqr4   1/1     Running   0          68s
web-rollingupdate-7b4b64f679-xhcmc   1/1     Running   0          68s

image.png

案例:百分比、升级springboot-web2镜像

#模拟升级过程

[root@node-1 6-deployment]# cat web-rollingupdate2.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: web-rollingupdate
  replicas: 2
  template:
    metadata:
      labels:
        app: web-rollingupdate
    spec:
      containers:
      - name: web-rollingupdate
        image: hub.mooc.com/kubernetes/springboot-web2:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 1024Mi
            cpu: 500m
          limits:
            memory: 2048Mi
            cpu: 2000m
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /hello?name=test
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-rollingupdate
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-rollingupdate
  namespace: dev
spec:
  rules:
  - host: web-rollingupdate.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-rollingupdate
          servicePort: 80
[root@node-1 6-deployment]# kubectl apply -f web-rollingupdate2.yaml

[root@node-1 6-deployment]# kubectl get pods -n dev -o wide                   
NAME                                 READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
web-rollingupdate-7b4b64f679-twk5t   1/1     Running   0          50s   10.200.139.87   node-3   <none>           <none>
web-rollingupdate-7b4b64f679-zcbzc   1/1     Running   0          50s   10.200.139.88   node-3   <none>           <none>

image.png

[root@node-1 6-deployment]# kubectl delete -f web-rollingupdate2.yaml  
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
No resources found in dev namespace.

滚动部署特征

#再开一个窗口,观察升级过程。下述是滚动部署的特征。

image.png

[root@node-1 6-deployment]# while sleep 0.2;do curl "http://web-rollingupdate.mooc.com/hello?name=world";echo "";done

#刚开始还是旧服务运行时输出

image.png

#升级过程中,应间隔输出新旧服务的切换输出内容

image.png

#最终只有新服务运行时输出

image.png

暂停pause、恢复resume与回滚undo

(pause和resume是一对!!)

#此时更改成springboot-web:v1镜像后apply

#可以使deploy处于一个暂停状态,先停下,暂时不要动。

[root@node-1 6-deployment]# kubectl rollout pause deploy web-rollingupdate -n dev
deployment.apps/web-rollingupdate paused

这样就间接了访问了两个服务。

image.png

这个给了我们测试的机会,比如有10个实例,再滚动部署第一个实例之后,暂停掉,就可以简单的测试有无问题。

如果没有问题,那么可以继续。

如何继续呢?resume恢复回来。

[root@node-1 6-deployment]# kubectl rollout resume deploy web-rollingupdate -n dev   
deployment.apps/web-rollingupdate resumed

现在发现都是更新的这版服务,springboot的版本就完全看不到了。

image.png

#那么如果此时做一下测试,发现新版本确实有问题,未测仔细。

#回到上一个版本去,执行回滚undo

#回滚的过程和升级的过程一样,按比例升级,不能超出过大和过小的范围。

[root@node-1 6-deployment]# kubectl rollout undo deploy web-rollingupdate -n dev
deployment.apps/web-rollingupdate rolled back

image.png

回滚过程完成,访问的都是以前的服务了。

蓝绿部署(流量分发)

上面都是一个deployment,修改deployment的配置,利用deployment自己支持的配置方式,比如rollingupdate、recreate,都是在deployment中配置的。

蓝绿部署:保持原有的deployment方式不动,也可以是rollingupdate和recreate,在原有的deployment方式之上新建一个deployment,比如原有的是绿色的,新建一个蓝色的,等蓝色的所有的POD都启动之后,通过某种方式去测试一下新的POD,等所有的POD都正常之后,可以通过修改service和selector,让流量切换到新部署的deployment上来。

蓝绿部署意思是说:原来版本蓝色版本,现在版本绿色版本,两个版本是交替的,如果发现新版本有问题,可以修改service的yaml文件的版本,就会立刻切换回来。

在蓝绿部署上线时,一般旧版本要随着新版本运行一段时间,如果新版本确定没问题了,那么才可以把旧版本删掉,甚至可以旧版本一直运行,直到下上线个新版本的时候,才把这个旧版本替换掉。

更形象一些,命名规则:

比如,web-blungreen.yaml中metadata的name,这次上线叫web-blue,下次上线叫做web-green,下次再上线叫web-blue,这样交替的替换,时刻保持线上有两个版本的deployment,来回的替换。

#编辑win10的 C:\Windows\System32\drivers\etc\hosts 文件加入。执行ipconfig /flushdns。
10.0.0.22 web-bluegreen.mooc.com
#三个节点也加入
[root@node-1/2/3 nginx]# cat /etc/hosts
10.0.0.22 web-bluegreen.mooc.com

#下述的”web-bluegreen.yaml”中只有deployment,没有service和ingress。

案例1:web-bluegreen.yaml

[root@node-1 6-deployment]# cat web-bluegreen.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  #策略
  strategy:
    rollingUpdate:
	  #最大可以超出这个实例数的百分比
	  #比如带着百分号,1,每次最多可能多启动一个实例
	  #比如不带百分号,可以配置maxSurge:1,表示最大可以超出一个实例
      maxSurge: 25%
	  #最大不可用的这个实例数的百分比
	  #比如带着百分号,有四个实例,必须有三个实例保证可用状态
      maxUnavailable: 25%
	#类型
    type: RollingUpdate
  selector:
    matchLabels:
      app: web-bluegreen
  #副本:2
  replicas: 2
  template:
    metadata:
      labels:
        app: web-bluegreen
		#这里跟其他部署策略不同的是加了version
        version: v1.0
    spec:
      containers:
      - name: web-bluegreen
        image: hub.mooc.com/kubernetes/springboot-web:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 1024Mi
            cpu: 500m
          limits:
            memory: 2048Mi
            cpu: 2000m
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /hello?name=test
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5

案例1:bluegreen-service.yaml

[root@node-1 6-deployment]# cat bluegreen-service.yaml 
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-bluegreen
	#这里要选择app=web-bluegreen并且version=v1.0的POD
	version: v1.0
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  rules:
  - host: web-bluegreen.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-bluegreen
          servicePort: 80

案例1:测试

[root@node-1 6-deployment]# kubectl apply -f bluegreen-service.yaml 
[root@node-1 6-deployment]# kubectl apply -f web-bluegreen.yaml 
[root@node-1 6-deployment]# kubectl get pods -n dev
NAME                             READY   STATUS    RESTARTS   AGE
web-bluegreen-79d6d89cc6-dzj4t   1/1     Running   0          40s
web-bluegreen-79d6d89cc6-mrbsg   1/1     Running   0          40s
#注意这里不要执行delete操作。

image.png

案例2(升级镜像,切流量步骤1:还是原服务):web-bluegreen2.yaml

#注意上述没有执行delete操作。

[root@node-1 6-deployment]# cat web-bluegreen2.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  #加入v2版本后缀
  name: web-bluegreen-v2
  namespace: dev
spec:
  #策略
  strategy:
    rollingUpdate:
	  #最大可以超出这个实例数的百分比
	  #比如带着百分号,1,每次最多可能多启动一个实例
	  #比如不带百分号,可以配置maxSurge:1,表示最大可以超出一个实例
      maxSurge: 25%
	  #最大不可用的这个实例数的百分比
	  #比如带着百分号,有四个实例,必须有三个实例保证可用状态
      maxUnavailable: 25%
	#类型
    type: RollingUpdate
  selector:
    matchLabels:
      app: web-bluegreen
  #副本:2
  replicas: 2
  template:
    metadata:
      labels:
        app: web-bluegreen
		#这里跟其他部署策略不同的是加了version
        version: v2.0
    spec:
      containers:
      - name: web-bluegreen
	    #修改镜像
        image: hub.mooc.com/kubernetes/springboot-web2:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 1024Mi
            cpu: 500m
          limits:
            memory: 2048Mi
            cpu: 2000m
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
          successThreshold: 1
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /hello?name=test
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 1
          successThreshold: 1
          timeoutSeconds: 5
[root@node-1 6-deployment]# kubectl apply -f web-bluegreen2.yaml   
deployment.apps/web-bluegreen-v2 created

[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
web-bluegreen-79d6d89cc6-dzj4t      1/1     Running   0          40m   10.200.139.92   node-3   <none>           <none>
web-bluegreen-79d6d89cc6-mrbsg      1/1     Running   0          40m   10.200.139.94   node-3   <none>           <none>
web-bluegreen-v2-5b7897c7cc-2l4m9   1/1     Running   0          37s   10.200.247.56   node-2   <none>           <none>
web-bluegreen-v2-5b7897c7cc-pwhr9   1/1     Running   0          37s   10.200.247.45   node-2   <none>           <none>

image.png

案例2(升级镜像,切流量步骤2:到新服务):bluegreen-service2.yaml

[root@node-1 6-deployment]# cat bluegreen-service.yaml 
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-bluegreen
	#这里要选择app=web-bluegreen并且version=v2.0的POD
	version: v2.0
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  rules:
  - host: web-bluegreen.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-bluegreen
          servicePort: 80
[root@node-1 6-deployment]# kubectl apply -f bluegreen-service2.yaml       
service/web-bluegreen configured
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
web-bluegreen-79d6d89cc6-dzj4t      1/1     Running   0          44m     10.200.139.92   node-3   <none>           <none>
web-bluegreen-79d6d89cc6-mrbsg      1/1     Running   0          44m     10.200.139.94   node-3   <none>           <none>
web-bluegreen-v2-5b7897c7cc-2l4m9   1/1     Running   0          4m23s   10.200.247.56   node-2   <none>           <none>
web-bluegreen-v2-5b7897c7cc-pwhr9   1/1     Running   0          4m23s   10.200.247.45   node-2   <none>           <none>

#此时流量都切到了新服务上面

image.png

#此时旧版本的POD此时都还在。

[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
web-bluegreen-79d6d89cc6-dzj4t      1/1     Running   0          44m     10.200.139.92   node-3   <none>           <none>
web-bluegreen-79d6d89cc6-mrbsg      1/1     Running   0          44m     10.200.139.94   node-3   <none>           <none>
web-bluegreen-v2-5b7897c7cc-2l4m9   1/1     Running   0          4m23s   10.200.247.56   node-2   <none>           <none>
web-bluegreen-v2-5b7897c7cc-pwhr9   1/1     Running   0          4m23s   10.200.247.45   node-2   <none>           <none>

蓝绿部署意思是说:原来版本蓝色版本,现在版本绿色版本,两个版本是交替的,如果发现新版本有问题,可以修改service的yaml文件的版本,就会立刻切换回来。

在蓝绿部署上线时,一般旧版本要随着新版本运行一段时间,如果新版本确定没问题了,那么才可以把旧版本删掉,甚至可以旧版本一直运行,直到下上线个新版本的时候,才把这个旧版本替换掉。

更形象一些,命名规则:

比如,web-blungreen.yaml中metadata的name,这次上线叫web-blue,下次上线叫做web-green,下次再上线叫web-blue,这样交替的替换,时刻保持线上有两个版本的deployment,来回的替换。

#此时,再切回到旧服务

[root@node-1 6-deployment]# kubectl apply -f bluegreen-service.yaml

image.png

金丝雀部署(A/B测试)

在蓝绿部署的基础之上,修改一下selector,那么部署就变成了金丝雀部署。

案例:bluegreen-service3.yaml

#删除version: v2.0,那么所有name=web-bluegreen的POD都会被service选中。

[root@node-1 6-deployment]# cat bluegreen-service.yaml 
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-bluegreen
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-bluegreen
  namespace: dev
spec:
  rules:
  - host: web-bluegreen.mooc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web-bluegreen
          servicePort: 80
[root@node-1 6-deployment]# kubectl apply -f bluegreen-service3.yaml
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide        
NAME                                READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
web-bluegreen-79d6d89cc6-dzj4t      1/1     Running   0          58m   10.200.139.92   node-3   <none>           <none>
web-bluegreen-79d6d89cc6-mrbsg      1/1     Running   0          58m   10.200.139.94   node-3   <none>           <none>
web-bluegreen-v2-5b7897c7cc-2l4m9   1/1     Running   0          18m   10.200.247.56   node-2   <none>           <none>
web-bluegreen-v2-5b7897c7cc-pwhr9   1/1     Running   0          18m   10.200.247.45   node-2   <none>           <none>

image.png

因为service此时可以选中所有的这个四个POD。

金丝雀部署就是这样,可以访问两个,甚至是多个版本,比如新做了一个新功能,并不确定特别好用,比如现在的deployment有十个实例,新创建了一个deployment只有一个实例,这个时候上线,那么得到的流量只有百分之十,从而可以让这个小功能在不影响大量用户的情况下完成一个实验,也就是常说的A/B测试。

#删除测试的服务
[root@node-1 6-deployment]# kubectl delete -f web-bluegreen2.yaml 
[root@node-1 6-deployment]# kubectl delete -f bluegreen-service.yaml
[root@node-1 6-deployment]# kubectl delete -f web-bluegreen.yaml
[root@node-1 6-deployment]# kubectl get pods -n dev -o wide
No resources found in dev namespace.

标题:Kubernetes(十)服务调度与编排(10.4)部署策略详解---重建、滚动、蓝绿、金丝雀
作者:yazong
地址:https://blog.llyweb.com/articles/2022/11/22/1669065505207.html