#这里讲了用原生的K8S进行部署的时候,都有什么选择:重新创建Recreate、滚动更新部署Rolling update、蓝绿部署、金丝雀部署。
这些用原生K8S就可以做到。
有些人可能觉得比较粗糙,没那么强大。
关于A/B测试和流量分发可以使用esure工具,可以完成更好的工作。
使用esure工作多、功能多、比较重量型,现在的方案比太简单,不过也很好用的,一些情况也是比较有优势的选择。
最基本最常见的滚动更新部署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>
案例2:多副本、type
不管有几个实例,要把旧实例全部停掉,停掉之后,再同时启动新的实例。
特点:服务是有间断的,因为服务要先全部停止。这种方式使用场景并不多。比如资源并不充足,某个节点多个服务,测试时为快速重启,就使用这种方式。
[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
案例:百分比、升级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>
[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.
滚动部署特征
#再开一个窗口,观察升级过程。下述是滚动部署的特征。
[root@node-1 6-deployment]# while sleep 0.2;do curl "http://web-rollingupdate.mooc.com/hello?name=world";echo "";done
#刚开始还是旧服务运行时输出
#升级过程中,应间隔输出新旧服务的切换输出内容
#最终只有新服务运行时输出
暂停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
这样就间接了访问了两个服务。
这个给了我们测试的机会,比如有10个实例,再滚动部署第一个实例之后,暂停掉,就可以简单的测试有无问题。
如果没有问题,那么可以继续。
如何继续呢?resume恢复回来。
[root@node-1 6-deployment]# kubectl rollout resume deploy web-rollingupdate -n dev
deployment.apps/web-rollingupdate resumed
现在发现都是更新的这版服务,springboot的版本就完全看不到了。
#那么如果此时做一下测试,发现新版本确实有问题,未测仔细。
#回到上一个版本去,执行回滚undo
#回滚的过程和升级的过程一样,按比例升级,不能超出过大和过小的范围。
[root@node-1 6-deployment]# kubectl rollout undo deploy web-rollingupdate -n dev
deployment.apps/web-rollingupdate rolled back
回滚过程完成,访问的都是以前的服务了。
蓝绿部署(流量分发)
上面都是一个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操作。
案例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>
案例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>
#此时流量都切到了新服务上面
#此时旧版本的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
金丝雀部署(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>
因为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