参考文档地址:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/scale/scale-intro/
在之前的模块中,我们创建了一个Deployment ,然后通过 Service让其可以开放访问。Deployment 仅为跑这个应用程序创建了一个 Pod。 当流量增加时,我们需要扩容应用程序满足用户需求。
扩缩 是通过改变 Deployment 中的副本数量来实现的。
扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到有可用资源的节点上,收缩 会将 Pods 数量减少至所需的状态。Kubernetes 还支持 Pods 的自动缩放。将 Pods 数量收缩到0也是可以的,但这会终止 Deployment 上所有已经部署的 Pods。
运行应用程序的多个实例需要在它们之间分配流量。服务 (Service)有一种负载均衡器类型,可以将网络流量均衡分配到外部可访问的 Pods 上。服务将会一直通过端点来监视 Pods 的运行,保证流量只分配到可用的 Pods 上。
点击“start scenario”,进入如下图页面
查看所有的deployments
kubectl get deployments
age:应用程序目前已经运行的时间。
查看Deployment创建的ReplicaSet
kubectl get rs
ReplicaSet的名称格式一般为:
[DEPLOYMENT-NAME]-[RANDOM-STRING]
DESIRED:显示应用程序的所需副本数量,这些副本是在创建Deployment时定义的。这是期望的状态。
CURRENT:显示当前正在运行的副本数量。
执行如下指令,扩展指定的Deployment的副本数量为4
kubectl scale deployments/kubernetes-bootcamp --replicas=4
查看所有的Deployment,发现如下图椭圆标注的内容发生了变化,现在我们就有了容器化应用程序的4个副本
kubectl get deployments
查看pod的数量是否发生了改变,如下图现在存在具有不同IP地址的4个pod
kubectl get pods -o wide
这些改变会被记录到Deployment 的事件日志中,使用如下指令可进行查看
kubectl describe deployments/kubernetes-bootcamp
点击上图中“continue”按钮,进入如下图页面:
使用describe service查看暴露的IP和端口
kubectl describe services/kubernetes-bootcamp
创建一个环境变量NODE_PORT 用来存在节点端口的值
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{
{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
下面我们将用curl指令去访问指定的IP和端口,访问多次
curl $(minikube ip):$NODE_PORT
从上图可以看出,我们的多次访问,指向了我们4个pod中的不同pod。这也就证明了负载均衡起作用了。
点击上图中的“continue”按钮,进入如下图页面
收缩指定Deployment的副本数到2
kubectl scale deployments/kubernetes-bootcamp --replicas=2
使用get deployments指令来检查副本数量收缩的改变是否生效,如下图椭圆标注的内容,副本数确实已发生变化
kubectl get deployments
查看当前的pod数量,如下图变为了2个
kubectl get pods -o wide
参考文档地址:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/update/update-intro/
用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度。
在前面的模块中,我们将应用程序扩展为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。默认情况下,更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本。
与应用程序扩展类似,如果公开了 Deployment,服务将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。
滚动更新允许以下操作:
点击“start scenario”进入如下图页面
查看所有的deployment
kubectl get deployments
查看所有的pod
kubectl get pods
查看所有的pod的详细信息
kubectl describe pods
更新应用的镜像版本为2,使用指令set image以及参数deployment名称、新的镜像版本。该指令通知deployment针对容器化的应用程序使用一个不同的镜像,并初始化rolling update
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
查看所有pod
kubectl get pods
点击上图中的“continue”按钮
查看暴露的IP地址和端口
kubectl describe services/kubernetes-bootcamp
创建一个环境变量NODE_PORT,并给其赋值为节点端口
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{
{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
使用curl去访问暴露的IP地址和端口,连续访问多次,可以看到其访问到了不同的pod,版本均为2
curl $(minikube ip):$NODE_PORT
查看所有pod的详细信息,可以看到你mage的版本是v2
kubectl describe pods
点击上图中的“continue”按钮,进入如下图页面
下面我们来进行另一个更新,设置指定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
通过执行如下指令,查看pod的详细信息,查找问题所在
kubectl describe pods
如上图所示,v10版本的镜像不存在。那现在我们rollout
undo 回滚到之前使用的版本。
kubectl rollout undo deployments/kubernetes-bootcamp
更新是受版本控制的,可以恢复到任何以前知道的Deployment状态。
此时,查看所有的pod
kubectl get pods
从上图发现4个pod都处于正常运行状态
查看pod的详情信息,发现已经回滚到了版本v2
kubectl describe pods