方案实现方式:
RollingUpdate 滚动更新机制
当某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动服务。
如果业务集群规模较大时,这个工作就变成了一个挑战,而且全部停止了服务,再逐步升级的方式会导致服务较长时间不可用。
针对这个问题,k8s提供了滚动更新(rolling-update)的方式来解决上述问题。
滚动更新是针对pod来操作的,它通过一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新。
滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了服务的连续性
spec: replicas: 5 minReadySeconds: 120 #Pod被认为是可用状态的最小秒数,应用启动并注册nacos延迟时间。默认是0 selector: matchLabels: run: httpservice strategy: rollingUpdate: #指定更新时最大扩展的pod数 maxSurge: 2 #指定可接受的不可用pod数 maxUnavailable: 1
apiVersion: apps/v1 kind: Deployment metadata: name: httpservice-deployment spec: replicas: 5 minReadySeconds: 120 #Pod被认为是可用状态的最小秒数,应用启动并注册nacos延迟时间。默认是0 selector: matchLabels: run: httpservice strategy: rollingUpdate: #指定更新时最大扩展的pod数 maxSurge: 2 #指定可接受的不可用pod数 maxUnavailable: 1 template: metadata: labels: run: httpservice spec: containers: - name: http-service image: httpd:2.4.33 ports: - containerPort: 80
apiVersion: v1 kind: Service metadata: name: $IMG_NAME namespace: rz-dt labels: app: $IMG_NAME spec: type: NodePort ports: - port: 8091 nodePort: 31082 #service对外开放端口 selector: app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment #对象类型 metadata: name: $IMG_NAME #名称 namespace: rz-dt labels: app: $IMG_NAME #标注 spec: replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量 progressDeadlineSeconds: 600 #在Deployment 在进度卡住6分钟后报告 minReadySeconds: 120 #Pod被认为是可用状态的最小秒数。默认是0 strategy: rollingUpdate: maxSurge: 1 #升级过程中激增Pod的最大数量 maxUnavailable: 0 #升级过程中不可用Pod的最大数量 type: RollingUpdate selector: matchLabels: app: $IMG_NAME template: metadata: labels: app: $IMG_NAME spec: containers: #docker容器的配置 - name: $IMG_NAME env: - name: aliyun_logs_catalina value: stdout image: rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/$IMG_NAME:$IMG_TAG # pull镜像的地址 ip:prot/dir/images:tag imagePullPolicy: Always #pull镜像时机, #command: ["java","-Dserver.port=8055","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"] ports: - containerPort: 8091 #容器对外开放端口,需与springboot配置文件一致 volumeMounts: - name: time-config mountPath: /etc/localtime readOnly: true - name: volume-logs mountPath: /logs subPath: logs resources: limits: cpu: 500m memory: 1Gi requests: cpu: 10m memory: 50Mi #从私有仓库拉取镜像凭证 imagePullSecrets: - name: rz-dt-miyue-vpc volumes: - name: time-config hostPath: path: /usr/share/zoneinfo/Asia/Shanghai - name: volume-logs persistentVolumeClaim: claimName: rz-dt-nas-volume-claim