Skip to content

发布策略(扩展)(仅收藏)

发布策略

image-20230921083321559

目录

[toc]

滚动更新

yaml
apiVersion:apps/v1beta2kind:Deploymentmetadata:name:nginxlabels:app:nginxspec:replicas:1selector:matchLabels:app:nginxstrategy:type:RollingUpdaterollingUpdate:maxUnavailable:1## 最多1个pod处于不可工作状态maxSurge:2## 升级时可以比预期多出2个podminReadySeconds:5## 容器启动后等待5秒

蓝绿发布

创建新的部署,然后修改service的标签来将流量指向新的部署。

bash
[root@master b-g]# kubectl get podNAMEREADYSTATUSRESTARTSAGEnginxapp-1.19-bdb8dc6c4-2jfsw1/1Running012mnginxapp-1.19-bdb8dc6c4-79qrh1/1Running012mnginxapp-1.19-bdb8dc6c4-hbwkx1/1Running012mnginxapp-1.20-786464458-4zh5t1/1Running091snginxapp-1.20-786464458-5bfwq1/1Running091snginxapp-1.20-786464458-fwgxb1/1Running091s

v1.1.4-blue.yaml

yaml
kind:DeploymentapiVersion:apps/v1metadata:labels:k8s-app:devops4-ops-serviceversion:"1.1.4"name:devops4-ops-service-bluenamespace:devops4spec:replicas:3revisionHistoryLimit:10selector:matchLabels:k8s-app:devops4-ops-serviceversion:"1.1.4"template:metadata:labels:k8s-app:devops4-ops-serviceversion:"1.1.4"namespace:devops4name:devops4-ops-servicespec:containers:- name:devops4-ops-serviceimage:192.168.1.200:8088/devops4/devops4-ops-service:RELEASE-1.1.4-c6b176adimagePullPolicy:IfNotPresentports:- containerPort:8080name:webprotocol:TCPserviceAccountName:devops4-ops-service---apiVersion:v1kind:ServiceAccountmetadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-service

service.yaml

yaml
apiVersion:v1kind:Namespacemetadata:name:devops4---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressnamespace:devops4spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-serviceport:number:8080---kind:ServiceapiVersion:v1metadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-servicenamespace:devops4spec:type:ClusterIPports:- name:webport:8080targetPort:8080selector:k8s-app:devops4-ops-serviceversion:"1.1.4"

v1.1.5-green.yaml

yaml
kind:DeploymentapiVersion:apps/v1metadata:labels:k8s-app:devops4-ops-serviceversion:"1.1.5"name:devops4-ops-service-greennamespace:devops4spec:replicas:3revisionHistoryLimit:10selector:matchLabels:k8s-app:devops4-ops-serviceversion:"1.1.5"template:metadata:labels:k8s-app:devops4-ops-serviceversion:"1.1.5"namespace:devops4name:devops4-ops-servicespec:containers:- name:devops4-ops-serviceimage:192.168.1.200:8088/devops4/devops4-ops-service:RELEASE-1.1.5-bc630338imagePullPolicy:IfNotPresentports:- containerPort:8080name:webprotocol:TCPserviceAccountName:devops4-ops-service---apiVersion:v1kind:ServiceAccountmetadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-service

启动busybox容器调试(废弃)

bash
kubectlrun--restart=Never-it--image\infoblox/dnstoolsdnstools

修改流量(service)

bash
kubectlpatchsvcdevops4-ops-service-p'{"spec":{"selector":{"version":"1.1.5"}}}'-ndevops4

测试验证

bash
curlhttp:kind:Namespacemetadata:name:devops4---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingress-1-4namespace:devops4spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-service-1-4port:number:8080---kind:DeploymentapiVersion:apps/v1metadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-service-1-4namespace:devops4spec:replicas:1revisionHistoryLimit:10selector:matchLabels:k8s-app:devops4-ops-servicetemplate:metadata:labels:k8s-app:devops4-ops-servicenamespace:devops4name:devops4-ops-servicespec:containers:- name:devops4-ops-serviceimage:192.168.1.200:8088/devops4/devops4-ops-service:RELEASE-1.1.4-c6b176adimagePullPolicy:IfNotPresentports:- containerPort:8080name:webprotocol:TCPserviceAccountName:devops4-ops-service---apiVersion:v1kind:ServiceAccountmetadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-servicenamespace:devops4---kind:ServiceapiVersion:v1metadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-service-1-4namespace:devops4spec:type:ClusterIPports:- name:webport:8080targetPort:8080selector:k8s-app:devops4-ops-service

1.1.5

yaml
apiVersion:v1kind:Namespacemetadata:name:devops5---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressnamespace:devops5annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-cookie:"from"spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-service-1-5port:number:8080---kind:DeploymentapiVersion:apps/v1metadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-servicenamespace:devops5spec:replicas:1revisionHistoryLimit:10selector:matchLabels:k8s-app:devops4-ops-servicetemplate:metadata:labels:k8s-app:devops4-ops-servicenamespace:devops5name:devops4-ops-servicespec:containers:- name:devops4-ops-serviceimage:192.168.1.200:8088/devops4/devops4-ops-service:RELEASE-1.1.5-bc630338imagePullPolicy:IfNotPresentports:- containerPort:8080name:webprotocol:TCPserviceAccountName:devops4-ops-service---apiVersion:v1kind:ServiceAccountmetadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-servicenamespace:devops5---kind:ServiceapiVersion:v1metadata:labels:k8s-app:devops4-ops-servicename:devops4-ops-service-1-5namespace:devops5spec:type:ClusterIPports:- name:webport:8080targetPort:8080selector:k8s-app:devops4-ops-service

创建资源:

bash
[root@zeyang-nuc-service canary]# kubectl get all -n devops4NAMEREADYSTATUSRESTARTSAGEpod/devops4-ops-service-1-4-7f97cb665c-vcntl1/1Running016mNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEservice/devops4-ops-service-1-4ClusterIP10.96.65.65<none>8080/TCP16mNAMEREADYUP-TO-DATEAVAILABLEAGEdeployment.apps/devops4-ops-service-1-41/11116mNAMEDESIREDCURRENTREADYAGEreplicaset.apps/devops4-ops-service-1-4-7f97cb665c11116m[root@zeyang-nuc-service canary]# kubectl get all -n devops5NAMEREADYSTATUSRESTARTSAGEpod/devops4-ops-service-5fbfb57777-6hc621/1Running015mNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEservice/devops4-ops-service-1-5ClusterIP10.96.64.251<none>8080/TCP15mNAMEREADYUP-TO-DATEAVAILABLEAGEdeployment.apps/devops4-ops-service1/11115mNAMEDESIREDCURRENTREADYAGEreplicaset.apps/devops4-ops-service-5fbfb5777711115m

测试:

yaml
## 编辑hosts文件192.168.10.100 devops4.ops.servicefor i in {1..10};do curl devops4.ops.service/hello ;done

基于权重的发布

<1.19.0

yaml
apiVersion:extensions/v1beta1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-weight:"10"spec:rules:- host:devops4.ops.servicehttp:paths:- path:/backend:serviceName:devops4-ops-serviceservicePort:8080

>1.19.0

yaml
apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-weight:"10"spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-serviceport:number:8080

Header报头流量分发

<1.19.0

yaml
apiVersion:extensions/v1beta1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-header:"Region"nginx.ingress.kubernetes.io/canary-by-header-value:"bj"spec:rules:- host:devops4.ops.servicehttp:paths:- path:/backend:serviceName:devops4-ops-serviceservicePort:8080

>1.19.0

yaml
apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-header:"Region"nginx.ingress.kubernetes.io/canary-by-header-value:"bj"spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-serviceport:number:8080
bash
fori in{1..10};docurl -H "region:bj"devops4.ops.service/hello;done

根据cookie流量分发

<1.19.0

yaml
apiVersion:extensions/v1beta1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-cookie:"from"spec:rules:- host:devops4.ops.servicehttp:paths:- path:/backend:serviceName:devops4-ops-serviceservicePort:8080

>1.19.0

yaml
apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressnamespace:devops4annotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-cookie:"from"spec:rules:- host:devops4.ops.servicehttp:paths:- pathType:Prefixpath:"/"backend:service:name:devops4-ops-serviceport:number:8080
bash
[root@master ingress-gray]# curl devops4.ops.service/hello --cookie "from=always"1.1.5[root@master ingress-gray]# curl devops4.ops.service/hello --cookie "from=a"1.1.4[root@master ingress-gray]# curl devops4.ops.service/hello --cookie "from=a"1.1.4

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新