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 概念 + 实践滚动更新的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes第六篇:k8s的四种部署策略

Kubernetes第六篇:k8s的四种部署策略

K8S集群使用Ingress实现网站入口动静分离实践

k8s容器灰度发布最佳实践(基于spinnaker)

自从上了K8S,项目更新都不带停机的!

k8s 实践经验:实操中学 k8s 五种资源Pod