在本教程中,我们将学习如何创建和管理 Kubernetes Pod。 首先,我们将从 Kubernetes 中的 Pod 是什么以及 Pod 的工作原理开始。 接下来,我们将简要了解 Pod 的类型。 然后我们将看到如何创建一个新的 Pod 以及如何从命令行查看 Pod 的信息。 最后,我们将学习如何在不再需要 Pod 时将其删除。
Kubernetes 中的 Pod 是什么?
在 Kubernetes, pod 是您可以构建和控制的最小的可部署计算单元。 Pod 是一个或多个容器的集合,这些容器具有共享的存储和网络资源,以及一组容器应该如何运行的规则。
Pod 的内容总是在同一个环境中共同定位、共同调度和执行。 一个 Pod 代表一个特定于应用程序的“逻辑主机”:它包括一个或多个紧密连接的应用程序容器。
从 Docker 的角度来看,Pod 相当于一组具有公共命名空间和文件系统卷的 Docker 容器。
Kubernetes Pod 的类型
在 Kubernetes 集群中,有两种类型的 Pod。
- 单容器 POD: 最常见的 Kubernetes 用例是“每个 Pod 一个容器”的方法; 在这种情况下,将 Pod 视为单个容器的包装器; Kubernetes 直接维护 Pod 而不是容器。
- 多容器 POD: Pod 可以封装一个应用程序,该应用程序由许多需要共享资源的紧密连接的容器组成。 这些容器组合在一起形成一个单一的服务单元,这些容器将相互通信。
POD 是如何工作的?
每个 Pod 旨在执行单个应用程序实例。 如果您需要水平扩展应用程序,您可以使用多个 Pod,每个实例一个。 这通常被称为 Kubernetes 中的复制. 工作负载资源及其控制器通常会在组中生成和管理复制的 Pod。
Kubernetes 的最终目标是以容器的形式将应用程序部署在一组机器中,这些机器称为 工作节点 在 Kubernetes 集群中。
Kubernetes 不会直接在节点中启动容器,而是将容器封装为 Pod,Pod 是应用程序的单个实例。
在 Kubernetes 集群中,一个节点由 Pod 组成,一个 Pod 由容器组成。 为了 example,您有一个应用程序的单个实例,该应用程序在由 Pod 封装的单个容器中运行。
如果访问应用程序的用户数量增加,您需要扩展应用程序。 在这种情况下,您可能需要启动额外的实例来分担负载。
为了扩展应用程序,您需要在具有相同应用程序的节点中启动额外的新 Pod。 如果负载进一步增加并且当前节点没有容量,那么您需要有一个额外的节点来启动具有相同应用程序容器的 Pod。
同样,为了缩小规模,您需要删除现有的 Pod。
希望您对 Kubernetes Pods 有基本的了解。 现在让我们看看如何在 Kubernetes 中创建和管理 Pod。
在开始之前,请确保您已在系统上安装了 Kubernetes。 以下链接包含有关如何在 Linux 中设置单节点和多节点 Kubernetes 集群部署的说明。
- 如何在 CentOS Linux 中使用 Minikube 安装 Kubernetes
- 在 RHEL、CentOS、AlmaLinux、Rocky Linux 中使用 Kubeadm 安装 Kubernetes 集群
安装 Kubernetes 后,您可以开始创建 Pod。
通常,您不需要直接创建 Pod,即使是单例 Pod。 相反,使用工作负载资源创建它们,例如 部署 或者 工作. Deployment 为 Pod 和 ReplicaSet 提供声明式更新。
创建部署
使用现有映像创建示例部署 “回声服务器”. 它是一个简单的 HTTP 服务器,我们可以在端口上公开它 8080
使用 --port
选项。
容器镜像是将程序及其所有软件依赖项包装在二进制数据中的文件。 容器镜像是独立的可执行软件包,它们对其执行环境做出极其具体的假设。
在本文中,我们将在一个 单节点集群.
您可以通过运行以下命令来了解节点详细信息 root
用户
# kubectl get nodes
样本输出:
NAME STATUS ROLES AGE VERSION ostechnix Ready Master 25h v1.22.3
现在,部署一个名为 “你好,ostechnix” 使用以下命令。 您可以根据自己的方便命名。
# kubectl create deployment hello-ostechnix --image=k8s.gcr.io/echoserver:1.10
样本输出:
deployment.apps/hello-ostechnix created [[email protected] ~]#
部署已创建,使用以下命令验证部署。
# kubectl get deployments
样本输出:
NAME READY UP-TO-DATE AVAILABLE AGE hello-ostechnix 1/1 1 1 85s
访问部署
要将此部署作为服务访问,您需要将其公开为服务。 使用以下命令在端口上公开部署 8080
.
# kubectl expose deployment hello-ostechnix --type=NodePort --port=8080
样本输出:
service/hello-ostechnix exposed
使用以下命令获取公开服务的 URL。
# minikube service hello-ostechnix --url
样本输出:
https://192.168.181.131:30525

复制 URL 并将其粘贴到浏览器中,它将列出已部署应用程序的详细信息。

确保端口 30525
在您的路由器或防火墙中是允许的。 如果此端口被阻止,您可能无法在浏览器中查看 Pod 的信息。
删除部署
首先,使用命令删除服务“hello-ostechnix”:
# kubectl delete services hello-ostechnix
样本输出:
service "hello-ostechnix" deleted
接下来,删除部署“hello-ostechnix”:
# kubectl delete deployment hello-ostechnix
样本输出:
deployment.apps "hello-ostechnix" deleted
删除部署后,与应用程序关联的 Pod 将被终止。 完成终止需要几秒钟。
# kubectl get pods
样本输出:
NAME READY STATUS RESTARTS AGE hello-ostechnix-5d4cf4df75-jlwff 1/1 Terminating 0 57m
终止部署后,将无法再访问该应用程序。
# kubectl get pods
样本输出:
No resources found in default namespace.
使用图像运行 Pod
我们可以使用’kubectl run
‘ 命令在 Pod 中创建和运行应用程序。
$ kubectl run <POD name> --image=<image name>
在这里,Pod 名称可以是任何名称,并且镜像名称必须是特定的,可以在 Docker Hub 或任何本地存储库中使用。
让我们用 Nginx 镜像创建一个 Pod。
# kubectl run ostechnix-nginx --image=nginx
样本输出:
pod/ostechnix-nginx created
已创建一个名为“ostechnix-nginx”的 Pod。 您可以通过以下命令验证 Pod 的状态。
# kubectl get pods
样本输出:
NAME READY STATUS RESTARTS AGE ostechnix-nginx 1/1 Running 0 4m20s
您可以使用’wide
‘ 选项。
# kubectl get pods -o wide
样本输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ostechnix-nginx 1/1 Running 0 38m 172.17.0.6 ostechnix <none> <none>
您可以使用 ‘ 获取有关 POD 的完整信息kubectl describe
‘ 命令。
# kubectl describe pod ostechnix-nginx
此命令将为您提供 POD 的完整详细信息,例如容器详细信息及其状态、自 Pod 创建以来发生的事件详细信息。
Name: ostechnix-nginx Namespace: default Priority: 0 Node: ostechnix/192.168.181.131 Start Time: Thu, 03 Feb 2022 01:40:48 -0800 Labels: run=ostechnix-nginx Annotations: <none> Status: Running IP: 172.17.0.6 IPs: IP: 172.17.0.6 Containers: ostechnix-nginx: Container ID: docker://29eeb0392247aef193d6dff0138f8ef132dfb6359d8e67c3a5e4a21d7e259989 Image: nginx Image ID: docker-pullable://[email protected]:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 Port: <none> Host Port: <none> State: Running Started: Thu, 03 Feb 2022 01:40:54 -0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ggvk6 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-ggvk6: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m26s default-scheduler Successfully assigned default/ostechnix-nginx to ostechnix Normal Pulling 7m24s kubelet Pulling image "nginx" Normal Pulled 7m20s kubelet Successfully pulled image "nginx" in 4.114836826s Normal Created 7m20s kubelet Created container ostechnix-nginx Normal Started 7m20s kubelet Started container ostechnix-nginx [[email protected] ~]#

完成后,您可以使用 ‘ 删除 Podkubectl delete
‘ 命令。
# kubectl delete pod ostechnix-nginx
样本输出:
pod "ostechnix-nginx" deleted
通过列出可用的 Pod 来验证 Pod 是否被删除:
# kubectl get pods No resources found in default namespace.

结论
在本教程中,我们了解了 Kubernetes 中 Pod 的概念、简单的应用程序部署以及如何运行 Pod。 我们将有更多关于创建 Pod 的细节 YAML
我们即将发布的详细信息中的定义文件。
资源: