Kubernetes等待部署完成 kubectl wait rollout

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes等待部署完成 kubectl wait rollout相关的知识,希望对你有一定的参考价值。

参考技术A 使用kubectl apply或者create命令创建/更新部署后,其pod需要时间完成创建/更新。
如果在CI中不等待所有pod更新完成,下一步流程很有可能使用更新前的环境。

根据实际情况 kubectl rollout status 命令,能够正确的获取rollout status。

以上shell脚本经过轮询 kubectl rollout status 可以很好的解决实际问题。

注意 kubectl wait 命令不能适用于更新部署。

该命令只能判断deployment是否available,不能用来判断rollout,即available状态的deployment,很可能老的pod还在terminating,新的pod还没创建好。

实战 Kubectl 创建 Deployment 部署应用

作者 | 洲的学习笔记

来源 | CSDN博客

本篇文章主要是实战 Kubectl 创建 Deployment 部署应用。

通过本期文章:

我们将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。

用 Kubectl 创建 Deployment

当运行 Kubernetes 集群,就可以在其上部署容器化应用程序。

此时,需要我们创建 Kubernetes Deployment 配置。

  • Deployment 指挥 Kubernetes 如何创建和更新应用程序的实例。创建 Deployment 后,Kubernetes master 将应用程序实例调度到集群中的各个节点上。

创建应用程序实例后,Kubernetes Deployment 控制器会持续监视这些实例。如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替换为集群中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障维护问题。

在没有 Kubernetes 这种编排系统之前,安装脚本通常用于启动应用程序,但它们不允许从机器故障中恢复。通过创建应用程序实例并使它们在节点之间运行, Kubernetes Deployments 提供了一种与众不同的应用程序管理方法。

1、部署第一个在K8s上的应用程序

接下来将使用 Kubernetes 命令行界面 Kubectl 创建和管理 Deployment。Kubectl 使用 Kubernetes API 与集群进行交互。将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。

实战部署

1、查看Kubectl配置

Kubectl命令的常见格式是:Kubectl action resource。这将对指定的资源(如节点、容器)执行指定的操作(如创建、描述)。我们也可以在命令之后使用——help来获得关于可能参数的额外信息(kubectl get nodes——help)。

通过运行kubectl version命令,检查kubectl是否被配置为与集群通信:

$ kubectl version
Client Version: version.InfoMajor:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"
Server Version: version.InfoMajor:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"

通过上述代码,可以看到Kubectl已经安装,可以看到客户端和服务器版本。

2、查询集群中节点信息

接下来我们需要查询集群中的节点信息,使用Kubectl get nodes命令。

$ kubectl get nodes
NAME       STATUS   ROLES                  AGE     VERSION
minikube   Ready    control-plane,master   3m44s   v1.20.2
$

通过上述的命令可以看到可用的节点。Kubernetes将根据Node可用资源选择部署我们的应用程序的位置。

3、部署程序应用

现在需要使用Kubectl创建部署命令在Kubernetes上部署我们的第一个应用程序。我们需要提供部署名称和应用程序映像位置(包括Docker中心之外托管的映像的完整存储库url)。命令如下:

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created

上一个命令为我们实现了:

  • 搜索可以运行应用程序实例的合适节点(本次实验环境只有1个可用节点)。

  • 计划应用程序在该节点上运行。

  • 配置集群在需要时在新节点上重新计划实例。

现在要列出部署,使用kubectl get deployments部署命令:

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           80s

可以看到有一个部署运行着你的应用程序的单个实例。这个实例运行在节点上的Docker容器中。

4、查看部署的程序

Kubernetes内部运行的Pods是在一个私有的、孤立的网络上运行的。默认情况下,它们对同一个kubernetes集群内的其他pods和服务是可见的,但在该网络之外是不可见的。当使用Kubectl时,通过一个API端点与应用程序进行交互。

Kubectl命令可以创建一个将通信转发到集群范围的私有网络的代理。该代理可以通过按control-C终止,并且不会显示任何内容。

现在将打开第二个终端窗口来运行代理。

echo -e "\\n\\n\\n\\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\\n";

现在,我们主机(在线终端)和Kubernetes集群之间有了连接。代理允许从这些终端直接访问API。

可以看到通过代理端点托管的所有api。比如,可以使用curl命令curl http://localhost:8001/version直接通过API查询版本:

$ curl http://localhost:8001/version

"major": "1",
"minor": "20",
"gitVersion": "v1.20.2",
"gitCommit": "faecb196815e248d3ecfb03c680a4507229c2a56",
"gitTreeState": "clean",
"buildDate": "2021-01-13T13:20:00Z",
"goVersion": "go1.15.5",
"compiler": "gc",
"platform": "linux/amd64"
$

需要注意的是,需要检查终端顶部。代理在一个新选项卡(终端2)中运行,最近的命令在原始选项卡(终端1)中执行。代理仍然在第二个选项卡中运行,这允许curl命令使用localhost:8001工作。

如果无法访问端口8001,请确保上面启动的kubectl代理正在运行。

API服务器将根据pod名称自动为每个pod创建一个端点,这个端点也可以通过代理访问。

首先,需要获取Pod名称,并将其存储在环境变量POD_NAME中:

使用:**export POD_NAME=$(kubectl get pods -o go-template --template ‘range .items.metadata.name“\\n”end’)**命令

$ export POD_NAME=$(kubectl get pods -o go-template --template 'range .items.metadata.name"\\n"end')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-57978f5f5d-mhtpf

可以通过运行下面的API来访问Pod:

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/

为了在不使用代理的情况下访问新部署,需要一个服务,这一点我们将在下一篇文章中进行讲解。

总结

通过本篇文章,我们已经大致了解到了如何在实战中Kubectl创建Deployment部署应用。也学习熟悉了创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。

往期推荐

Redis 内存优化神技,小内存保存大数据

使用 nginx 轻松管理 kubernetes 资源文件

Redis 内存满了怎么办?这样置才正确!

中间表是如何被消灭的?

点分享

点收藏

点点赞

点在看

以上是关于Kubernetes等待部署完成 kubectl wait rollout的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes二进制集群部署+Web管理界面+kubectl 命令管理+YAML文件详解(集合)

Kubernetes二进制集群部署+Web管理界面+kubectl 命令管理+YAML文件详解(集合)

kubernetes (kubectl) 端口转发在 Mac 上无法用于 IBM MQ/Docker 部署

如何让 kubernetes “kubectl apply”不更新现有部署

三Kubernetes集群的命令行工具kubectl

如何将 GitLab-Ci 与 Azure Kubernetes + Kubectl + ACR 集成以进行部署?