本期文章是K8s第3篇,主要是实战Kubectl创建Deployment部署应用。通过本期文章:我们将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。
在前期的文章中,已经介绍了一些云原生入门的知识及简单实战,感兴趣的同学可以去我的云原生专栏中学习,任意门:云原生学习专栏
实战Kubectl创建Deployment部署应用、查看应用
- 前言:学习目标
- 一:用 Kubectl 创建 Deployment
- 1、部署第一个在K8s上的应用程序
- 二:实战部署
- 1、查看Kubectl配置
- 2、查询集群中节点信息
- 3、部署程序应用
- 4、查看部署的程序
- 后文:总结
前言:学习目标
本篇文章,学习目标是:
- 1、学习Kubetcl中应用的部署。
- 2、使用Kubectl在Kubernetes上部署第一个应用。
一:用 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 versionClient Version: version.Info{Major:"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.Info{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"}
通过上述代码,可以看到Kubectl已经安装,可以看到客户端和服务器版本。
2、查询集群中节点信息
接下来我们需要查询集群中的节点信息,使用Kubectl get nodes命令。
$ kubectl get nodesNAME STATUS ROLESAGE VERSIONminikube Readycontrol-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:v1deployment.apps/kubernetes-bootcamp created
上一个命令为我们实现了:
- 搜索可以运行应用程序实例的合适节点(本次实验环境只有1个可用节点)。
- 计划应用程序在该节点上运行。
- 配置集群在需要时在新节点上重新计划实例。
现在要列出部署,使用kubectl get deployments部署命令:
$ kubectl get deploymentsNAMEREADY UP-TO-DATE AVAILABLE AGEkubernetes-bootcamp 1/1 11 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_NAMEName 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 命令。