Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新

1.运行应用程序的多个实例

参考文档地址:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/scale/scale-intro/

1.1使用 kubectl 扩缩应用程序

在之前的模块中,我们创建了一个Deployment ,然后通过 Service让其可以开放访问。Deployment 仅为跑这个应用程序创建了一个 Pod。 当流量增加时,我们需要扩容应用程序满足用户需求。

扩缩 是通过改变 Deployment 中的副本数量来实现的。

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第1张图片Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第2张图片

扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到有可用资源的节点上,收缩 会将 Pods 数量减少至所需的状态。Kubernetes 还支持 Pods 的自动缩放。将 Pods 数量收缩到0也是可以的,但这会终止 Deployment 上所有已经部署的 Pods。

运行应用程序的多个实例需要在它们之间分配流量。服务 (Service)有一种负载均衡器类型,可以将网络流量均衡分配到外部可访问的 Pods 上。服务将会一直通过端点来监视 Pods 的运行,保证流量只分配到可用的 Pods 上。

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第3张图片

点击“start scenario”,进入如下图页面

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第4张图片

查看所有的deployments

kubectl get deployments

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第5张图片

age:应用程序目前已经运行的时间。

查看Deployment创建的ReplicaSet

kubectl get rs

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第6张图片

ReplicaSet的名称格式一般为:

[DEPLOYMENT-NAME]-[RANDOM-STRING]

DESIRED:显示应用程序的所需副本数量,这些副本是在创建Deployment时定义的。这是期望的状态。

CURRENT:显示当前正在运行的副本数量。

执行如下指令,扩展指定的Deployment的副本数量为4

kubectl scale deployments/kubernetes-bootcamp --replicas=4

查看所有的Deployment,发现如下图椭圆标注的内容发生了变化,现在我们就有了容器化应用程序的4个副本

kubectl get deployments

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第7张图片

查看pod的数量是否发生了改变,如下图现在存在具有不同IP地址的4个pod

kubectl get pods -o wide

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第8张图片

这些改变会被记录到Deployment 的事件日志中,使用如下指令可进行查看

kubectl describe deployments/kubernetes-bootcamp

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第9张图片

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第10张图片

点击上图中“continue”按钮,进入如下图页面:

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第11张图片

使用describe service查看暴露的IP和端口

kubectl describe services/kubernetes-bootcamp

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第12张图片

创建一个环境变量NODE_PORT 用来存在节点端口的值

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{
    {(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第13张图片

下面我们将用curl指令去访问指定的IP和端口,访问多次

curl $(minikube ip):$NODE_PORT

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第14张图片

从上图可以看出,我们的多次访问,指向了我们4个pod中的不同pod。这也就证明了负载均衡起作用了。

点击上图中的“continue”按钮,进入如下图页面

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第15张图片

收缩指定Deployment的副本数到2

kubectl scale deployments/kubernetes-bootcamp --replicas=2

使用get deployments指令来检查副本数量收缩的改变是否生效,如下图椭圆标注的内容,副本数确实已发生变化

kubectl get deployments

查看当前的pod数量,如下图变为了2个

kubectl get pods -o wide

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第16张图片

 

2.执行滚动更新

参考文档地址:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/update/update-intro/

2.1使用 kubectl 执行滚动更新

用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度。

在前面的模块中,我们将应用程序扩展为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。默认情况下更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第17张图片Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第18张图片

 

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第19张图片Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第20张图片

与应用程序扩展类似,如果公开了 Deployment,服务将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。

滚动更新允许以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
  • 回滚到以前的版本
  • 持续集成和持续交付应用程序,无需停机

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第21张图片

点击“start scenario”进入如下图页面

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第22张图片

查看所有的deployment

kubectl get deployments

查看所有的pod

kubectl get pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第23张图片

查看所有的pod的详细信息

kubectl describe pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第24张图片

更新应用的镜像版本为2,使用指令set image以及参数deployment名称、新的镜像版本。该指令通知deployment针对容器化的应用程序使用一个不同的镜像,并初始化rolling update

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

查看所有pod

kubectl get pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第25张图片

点击上图中的“continue”按钮

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第26张图片

查看暴露的IP地址和端口

kubectl describe services/kubernetes-bootcamp

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第27张图片

创建一个环境变量NODE_PORT,并给其赋值为节点端口

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{
    {(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第28张图片

使用curl去访问暴露的IP地址和端口,连续访问多次,可以看到其访问到了不同的pod,版本均为2

curl $(minikube ip):$NODE_PORT

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第29张图片

查看所有pod的详细信息,可以看到你mage的版本是v2

kubectl describe pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第30张图片

点击上图中的“continue”按钮,进入如下图页面

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第31张图片

下面我们来进行另一个更新,设置指定Deployment使用的镜像版本为v10

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

查看deplyment的状态

kubectl get deployments

从上图发现存在一些问题,我们并没有获得需要的可用pod数量

kubectl get pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第32张图片

通过执行如下指令,查看pod的详细信息,查找问题所在

kubectl describe pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第33张图片

如上图所示,v10版本的镜像不存在。那现在我们rollout undo 回滚到之前使用的版本。

kubectl rollout undo deployments/kubernetes-bootcamp

更新是受版本控制的,可以恢复到任何以前知道的Deployment状态。

此时,查看所有的pod

kubectl get pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第34张图片

从上图发现4个pod都处于正常运行状态

查看pod的详情信息,发现已经回滚到了版本v2

kubectl describe pods

Kubernetes学习(三)使用 kubectl 扩缩应用程序+使用 kubectl 执行滚动更新_第35张图片

 

你可能感兴趣的:(Kubernetes)