k8s 概念 + 实践滚动更新
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 概念 + 实践滚动更新相关的知识,希望对你有一定的参考价值。
文章目录
更新应用程序
用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度。
在前面的模块中,我们将应用程序扩展为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。默认情况下,更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本。
与应用程序扩展类似,如果公开了 Deployment,服务将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。
滚动更新允许以下操作:
将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
回滚到以前的版本
持续集成和持续交付应用程序,无需停机
实操:滚动更新与回滚
运行get deployments命令列出部署:
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 53s
请运行get Pods命令列出正在运行的Pods:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-fb5c67579-bm72t 1/1 Running 0 56s
kubernetes-bootcamp-fb5c67579-nx4xg 1/1 Running 0 57s
kubernetes-bootcamp-fb5c67579-rzzmh 1/1 Running 0 56s
kubernetes-bootcamp-fb5c67579-tbhrr 1/1 Running 0 56s
运行descripe pods命令并查找镜像。
要将应用程序的映像更新到版本2,请使用set image命令,后跟部署名称和新映像版本:
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
该命令通知部署为应用程序使用不同的映像,并启动滚动更新。检查新Pods的状态,并查看旧Pods,使用get Pods命令终止:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7d44784b7c-29nnt 1/1 Running 0 51s
kubernetes-bootcamp-7d44784b7c-9vlmw 1/1 Running 0 51s
kubernetes-bootcamp-7d44784b7c-ghm28 1/1 Running 0 48s
kubernetes-bootcamp-7d44784b7c-qfsgb 1/1 Running 0 48s
kubernetes-bootcamp-fb5c67579-nx4xg 0/1 Terminating 0 4m29s
kubernetes-bootcamp-fb5c67579-rzzmh 0/1 Terminating 0 4m28s
kubernetes-bootcamp-fb5c67579-tbhrr 0/1 Terminating 0 4m28s
再来:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7d44784b7c-29nnt 1/1 Running 0 82s
kubernetes-bootcamp-7d44784b7c-9vlmw 1/1 Running 0 82s
kubernetes-bootcamp-7d44784b7c-ghm28 1/1 Running 0 79s
kubernetes-bootcamp-7d44784b7c-qfsgb 1/1 Running 0 79s
验证更新:
首先,检查应用程序是否正在运行。要查找公开的IP和端口,请运行descripe service命令:
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: app=kubernetes-bootcamp
Annotations: <none>
Selector: app=kubernetes-bootcamp
Type: NodePort
IP Families: <none>
IP: 10.96.235.225
IPs: 10.96.235.225
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 32098/TCP
Endpoints: 172.18.0.10:8080,172.18.0.11:8080,172.18.0.12:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedToUpdateEndpointSlices 2m35s endpoint-slice-controller Error updating Endpoint Slices for Service default/kubernetes-bootcamp:
failed to update kubernetes-bootcamp-jsq7t EndpointSlice for Service default/kubernetes-bootcamp:
Operation cannot be fulfilled on endpointslices.discovery.k8s.io "kubernetes-bootcamp-jsq7t":
the object has been modified; please apply your changes to the latest version and try again
创建一个名为NODE_PORT的环境变量,该变量指定了节点端口的值:
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=32098
接下来,对暴露的IP和端口进行 crul:
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7d44784b7c-29nnt | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7d44784b7c-9vlmw | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7d44784b7c-ghm28 | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7d44784b7c-9vlmw | v=2
每次运行curl命令时,都会碰到不同的Pod。请注意,所有POD都运行最新版本(v2)。
还可以通过运行“rollout status”命令来确认更新:
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
要查看应用程序的当前图像版本,请运行descripe pods命令。
在输出的镜像字段中,确认您正在运行最新的镜像版本(v2)。
回滚:
让我们执行另一个更新,并部署一个标记为v10的映像:
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 3/4 2 3 13m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-59b7598c77-75c8z 0/1 ErrImagePull 0 104s
kubernetes-bootcamp-59b7598c77-p6pjz 0/1 ErrImagePull 0 103s
kubernetes-bootcamp-7d44784b7c-29nnt 1/1 Running 0 10m
kubernetes-bootcamp-7d44784b7c-9vlmw 1/1 Running 0 10m
kubernetes-bootcamp-7d44784b7c-ghm28 1/1 Running 0 10m
请注意,一些POD的状态为ImagePullBackOff。
要深入了解问题,请运行descripe pods命令。
在受影响的POD输出的事件部分,请注意存储库中不存在v10映像版本。
要将展开回滚到上一个工作版本,请使用“rollout undo”命令:
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp rolled back
“rollout undo”命令将展开恢复到以前的已知状态(图像的v2)。更新会进行版本控制,您可以恢复到以前已知的任何部署状态。
使用get pods命令再次列出pods:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7d44784b7c-29nnt 1/1 Running 0 12m
kubernetes-bootcamp-7d44784b7c-9vlmw 1/1 Running 0 12m
kubernetes-bootcamp-7d44784b7c-ghm28 1/1 Running 0 12m
kubernetes-bootcamp-7d44784b7c-rd62n 1/1 Running 0 51s
以上是关于k8s 概念 + 实践滚动更新的主要内容,如果未能解决你的问题,请参考以下文章