如何在 Linux 中创建和管理 Kubernetes Pod

在本教程中,我们将学习如何创建和管理 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 集群

在 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] ~]#
显示 Pod 的完整信息显示 Pod 的完整信息

完成后,您可以使用 ‘ 删除 Podkubectl delete‘ 命令。

# kubectl delete pod ostechnix-nginx

样本输出:

pod "ostechnix-nginx" deleted

通过列出可用的 Pod 来验证 Pod 是否被删除:

# kubectl get pods
No resources found in default namespace.
删除 Pod删除 Pod

结论

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

资源: