9-4 部署策略详解 --- 重建、滚动、蓝绿、金丝雀
部署策略实践
这两个是kubernetes 层面支持的策略
Rolling update
Recreate 需要先停止旧服务
这两个是需要通过service的一些特征(labelselector)结合deployment一起完成
蓝绿部署
金丝雀
1 测试Recreate
创建web-recreate.yaml
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: web-recreate namespace: dev spec: # 策略为Recreate strategy: type: Recreate selector: matchLabels: app: web-recreate replicas: 2 template: metadata: labels: app: web-recreate spec: containers: - name: web-recreate image: harbor.pdabc.com/kubernetes/web:v3 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中先配置好域名 - host: web-recreate.pdabc.com http: paths: - path: / backend: serviceName: web-recreate servicePort: 80
创建pod
启动后访问
http://web-recreate.pdabc.com/hello?name=jiaminxu
修改web-recreate.yaml 的label字段
template: metadata: labels: app: web-recreate type: webappp
再apply一下
发现服务会先处于 Terminating 并且服务不可用,等到两个pod都停止之后才会新起两个pod,期间服务均不可用。这种场景在资源不足,或者服务需要在不同的node的情况下可以使用。
2 测试Rollingupdate
先删除刚刚创建的pod
kubectl delete -f web-recreate.yaml
创建web-rollingupdate.yaml
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: web-rollingupdate namespace: dev spec: strategy: rollingUpdate: # 如果pod为4个,最多多启动1个。也可以设置为数值 maxSurge: 25% # 如果pod为4个,最多去掉1个,保证3个可用。也可以设置为数值 maxUnavailable: 25% # 表示类型为Rolling update type: RollingUpdate selector: matchLabels: app: web-rollingupdate replicas: 2 template: metadata: labels: app: web-rollingupdate spec: containers: - name: web-rollingupdate image: harbor.pdabc.com/kubernetes/web:v3 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.pdabc.com http: paths: - path: / backend: serviceName: web-rollingupdate servicePort: 80
kubectl apply -f web-rollingupdate.yaml
通过健康检查之后显示为running状态
配制好本机hosts之后 访问http://web-rollingupdate.pdabc.com/hello?name=jiaminxu
修改web-rollingupdate.yaml 修改镜像为harbor.pdabc.com/kubernetes/springboot-web:v1
模拟镜像升级的情况
kubectl apply -f web-rollingupdate.yaml
在 /etc/hosts添加192.168.10.150 web-rollingupdate.pdabc.com
并通过脚本去检测 服务是否出现不可用
while sleep 0.2;do curl "http://web-rollingupdate.pdabc.com/hello?name=jiaminxu";echo "";done (这里没做好 最好是新pod起来的时候 输出的内容有变化 这样比较直观)
尝试滚动部署的另一种方法
将镜像改回image: harbor.pdabc.com/kubernetes/web:v3 并apply
在pod启动一个 的时候执行
kubectl rollout pause deploy web-rollingupdate -n dev
使滚动更新停止 再去访问服务 会有负载均衡
恢复使用
kubectl rollout resume deploy web-rollingupdate -n dev
回滚版本测试
kubectl rollout undo deploy web-rollingupdate -n dev
正在回滚会spring版本
全部回滚完成
蓝绿部署
通过selector 切换新旧的deployment 将流量切换过来
删除上面测试的pod
kubectl delete -f web-rollingupdate.yaml
创建 web-bluegreen.yaml
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: web-bluegreen namespace: dev spec: strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate selector: matchLabels: app: web-bluegreen replicas: 2 template: metadata: labels: app: web-bluegreen # 用于 version: v1.0 spec: containers: - name: web-bluegreen image: harbor.pdabc.com/kubernetes/web:v3 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
kubectl apply -f web-bluegreen.yaml
启动完成之后为其创建一个service
添加host web-bluegreen.pdabc.com
创建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-blue # 表示需要选择app为 web-bluegreen 且version为1.0的pod version: v1.0 type: ClusterIP --- #ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: web-bluegreen namespace: dev spec: rules: - host: web-bluegreen.pdabc.com http: paths: - path: / backend: serviceName: web-bluegreen servicePort: 80
通过前面相同的脚本去检测
while sleep 0.2;do curl "http://web-bluegreen.pdabc.com/hello?name=jiaminxu";echo "";done
并且创建service
测试升级 修改web-bluegreen.yaml 配置文件
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: web-bluegreen-v2 namespace: dev spec: strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate selector: matchLabels: app: web-bluegreen replicas: 2 template: metadata: labels: app: web-bluegreen version: v2.0 spec: containers: - name: web-bluegreen image: harbor.pdabc.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
应用并启动
kubectl apply -f web-bluegreen.yaml
此时启动了2个deploy 每个deploy 2个pod 还没有切流量 访问还没变
修改bluegreen-service.yaml 将版本改为2.0
kubectl apply -f bluegreen-service.yaml
没有交替的过程 直接全部切换成新版本
kubectl get pods -n dev
所有的版本都在
蓝绿方便切换版本.可以保留旧版本一段时间,在删除.或者再次发布 才会去掉.
第一次发布deployment的name为bule;第二次发布deployment的name修改为green,第三次发布deployment的name再修改为bule.保持线上有2个版本的deployment
金丝雀发布
蓝绿发布的基础上 简单修改selector 就是金丝雀发布了
修改bluegreen-service.yaml
--- #service apiVersion: v1 kind: Service metadata: name: web-bluegreen namespace: dev spec: ports: - port: 80 protocol: TCP targetPort: 8080 # selector 中删除了version selector: app: web-bluegreen type: ClusterIP --- #ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: web-bluegreen namespace: dev spec: rules: - host: web-bluegreen.pdabc.com http: paths: - path: / backend: serviceName: web-bluegreen servicePort: 80
kubectl apply -f bluegreen-service.yaml
版本在进行交替 是4个pod负载.线上环境可以v1版本10个pod 测试的功能1个pod 占10%流量
来源:CSDN
作者:爷来辣
链接:https://blog.csdn.net/xujiamin0022016/article/details/103883933