ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【云原生_K8S系列】什么是 Kubernetes Pod?用现实例子解释 [打印本页]

作者: 大连全瓷种植牙齿制作中心    时间: 2024-6-14 22:58
标题: 【云原生_K8S系列】什么是 Kubernetes Pod?用现实例子解释

Kubernetes(简称K8S)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。在Kubernetes中,Pod是最小的部署单元。理解Pod的概念对于掌握Kubernetes至关重要。本篇文章将详细解释什么是Kubernetes Pod,并通过现实例子帮助读者更好地理解这一概念。
什么是 Kubernetes Pod?

在了解 Kubernetes Pod 概念之前,先来了解容器
容器,众所周知,是一个自包含的环境,用于打包应用步调及其依赖项。通常,一个容器运行单个历程(只管也有方法可以运行多个历程)。每个容器都有一个IP地址,并且可以附加存储卷以及控制CPU和内存资源等。这些都是通过定名空间和控制组(namespaces and control groups)的概念实现的。
Kubernetes 是一个用于部署、扩展和管理容器化应用步调的容器编排系统,它有本身运行容器的方式,我们称之为 Pod。Pod 是 Kubernetes 中最小的可部署单元,代表一个应用步调的单个实例。
例如,假如你想运行 Nginx 应用步调,你可以将它运行在一个 Pod 中。
那么,Pod 与容器有何不同呢?
容器是一个单独的单位。然而,Pod 可以包含多个容器。你可以将 Pod 想象成一个可以同时容纳一个或多个容器的盒子。
Pod 提供了更高层次的抽象,允许你将多个容器作为一个单元进行管理。在这里,每个容器不再单独得到 IP 地址,而是 Pod 得到一个唯一的 IP 地址,并且运行在 Pod 内的容器通过 localhost 在不同端口上相互连接。

这意味着 Kubernetes Pod 内的容器共享以下内容:

Pod 内的容器不共享什么?

总的来说,你需要了解以下关于 Pod 的信息:
Pod YAML

如今我们已经对 Pod 有了基本的了解,接下来看看怎样定义 Pod。Pod 是原生的 Kubernetes 对象,假如你想创建一个 Pod,需要以 YAML 格式声明 Pod 的需求。你也可以利用 kubectl 命令创建 Pod,这将在后面的主题中介绍。
以下是一个创建 Nginx Web 服务器 Pod 的 Pod YAML 示例。这个 YAML 文件只是一个 Pod 的声明性期望状态。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: web-server-pod
  5.   labels:
  6.     app: web-server
  7.     environment: production
  8.   annotations:
  9.     description: This pod runs the web server
  10. spec:
  11.   containers:
  12.   - name: web-server
  13.     image: nginx:latest
  14.     ports:
  15.     - containerPort: 80
复制代码
让我们来了解这个 Pod YAML。一旦你理解了基本的 YAML 格式,就会更容易利用 Pod 和相关对象,如 Deployment、DaemonSet、StatefulSet 等。
每个 Kubernetes 对象都有一些通用的参数。这些参数的值会根据我们创建的对象类型而变化。让我们看看 Kubernetes Pod 对象。
参数描述apiVersionpod的API版本。在我们的例子中是v1kind对象类型,这里是Podmetadata元数据用于唯一地标识和描述pod- 标签(表示pod的键值对的集合)。这类似于云环境中的标志。每件物品都必须贴上标准标签。它有助于对对象进行分组。- name (pod的名称) - namespace (pod的定名空间)-注释(key-value格式的附加数据)spec在spec 部分,我们声明pod的所需状态。这些是我们想要在pod中运行的容器的规范。containers在containers下,我们声明pod中容器的所需状态。容器映像、暴露的端口等。 我们如今已经看到了一个基本的Pod YAML清单。需要注意的是,这个清单文件支持许多参数。我们将渐渐探索这些额外的参数与实践的方法。
如今我们对Pod有了一些基本的了解,让我们创建一个Pod。
创建Pod

你可以用两种方法创建pod

让我们看看这两个方式。我们将利用以下内容创建一个NGINX pod

方法1:利用Kubectl命令创建Pod

对于讨论的pod需求,这里是kubectl命令。
  1. kubectl run web-server-pod \
  2.   --image=nginx:1.14.2 \
  3.   --restart=Never \
  4.   --port=80 \
  5.   --labels=app=web-server,environment=production \
  6.   --annotations description="This pod runs the web server"
复制代码
在这里,pod被部署在默认定名空间中。你可以得到部署的pod kubectl的状态。
  1. kubectl get pods
复制代码
部署pod后,您将看到pod的运行状态,如下所示。在我们的例子中,pod中只有一个容器。以是它体现1/1停当并运行。

假如你想知道运行pod的全部细节,可以利用kubectl describe pod。
  1. kubectl describe pod web-server-pod
复制代码
在下面的输出中,你可以看到pod的全部细节。它的IP地址、定名空间、容器细节、QoS类等。

这里是描述命令体现的全部重要pod信息的图形视图。

如今让我们利用以下命令删除pod。
  1. kubectl delete pod web-server-pod
复制代码
方法2:利用声明式YAML创建Pod

在现实项目中,你将不得不通过声明的方法来创建pods。
让我们看看怎样利用YAML清单文件创建pod。
创建名为nginx的文件。内容如下。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: web-server-pod
  5.   labels:
  6.     app: web-server
  7.     environment: production
  8.   annotations:
  9.     description: This pod runs the web server
  10. spec:
  11.   containers:
  12.   - name: web-server
  13.     image: nginx:1.14.2
  14.     ports:
  15.     - containerPort: 80
复制代码
如今,要部署清单文件,您需要利用文件名实行以下kubectl命令。
  1. kubectl create -f nginx.yaml
复制代码
我们应该记住创建YAML时的每个参数吗?不用。你可以利用--dry-run标志创建YAML文件。
  1. kubectl run nginx-pod --image=nginx:1.14.2 --dry-run=client -o yaml
复制代码
访问在 Pod 中运行的应用步调

如今我们有了一个运行中的pod和Nginx web服务器。整个想法是部署和访问在pod中运行的应用步调。
Kubectl提供了一个port-forward命令来从当地工作站访问Kubernetes集群中运行的pods。
我们有一个名为web-server-pod的运行pod。让我们通过port-forward命令访问它。

如今,假如您打开欣赏器并访问http://localhost:8080,您应该会看到如下所示的Nginx主页。网页由我们的Nginx web服务器pod提供服务。

如今你可以按CTRL+C断开端口转发。
以下是运行kubectl port-forward时发生的环境

   注意:kubectl端口转发更多的是一个调试实用步调。你需要利用Kubernetes服务对象来公开在pod中运行的应用步调。我们将在另一个博客中现实地研究Kubernetes service 的概念。
  访问 Pod Shell

我们已经学习了怎样访问在pod中运行的应用步调。
如今假如你想进入Pod shell怎么办?
有许多用例需要终端访问pod。一个主要用例是调试和故障排除。
这就是kubectl exec命令派上用场的地方。
您可以利用以下命令访问web-server-pod的shell。
  1. kubectl exec -it web-server-pod -- /bin/sh
复制代码
在下面的输出中,我正在pod内实行whoami命令。

Pod 的生命周期

关于pod你应该知道的另一个重要概念是它的生命周期。
pod通常由ReplicaSet controller、Deployment controller等控制器管理。当您利用YAML创建单个pod时,它不受任何控制器的管理。在这两种环境下,pod都会经历不同的生命周期阶段。
Pod的生命周期包括以下几个阶段:
假如你通过kubectl describe pod命令查看Pod的详细信息,你可以看到Pod的状态。这里有一个例子。

Pod 功能

我们已经部署了一个简单的Nginx pod,配置非常少。但是,pod具有许多用于资源管理、配置、机密、可用性、安全性等方面的特性。
假如你是初学者,一次性学习全部这些概念将是多余的。在利用与pod相关的对象(如具有现实用例的Deployment)时,学习全部这些概念更有意义。
别的,您需要通过现实用例详细了解每个特性。
以下是与pod相关的主要特性。
全面的 Pod YAML 配置
假如您添加我上面列出的pod特性,您将得到一个全面的pod YAML配置,如下所示。别的,这些选项将与Deployment、Statefulset等对象一起利用。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: web-server-pod
  5. spec:
  6.   initContainers:
  7.   - name: init-myservice
  8.     image: busybox:1.28
  9.     command: ['sh', '-c', 'echo "Init container started!"']
  10.   containers:
  11.   - name: web-server
  12.     image: nginx:latest
  13.     ports:
  14.     - containerPort: 80
  15.     volumeMounts:
  16.     - name: shared-data
  17.       mountPath: /usr/share/nginx/html
  18.     - name: secret-volume
  19.       mountPath: /etc/my-secret
  20.     - name: configmap-volume
  21.       mountPath: /etc/config
  22.     securityContext:
  23.       capabilities:
  24.         add: ["NET_ADMIN", "SYS_TIME"]
  25.     resources:
  26.       requests:
  27.         memory: "64Mi"
  28.         cpu: "250m"
  29.       limits:
  30.         memory: "128Mi"
  31.         cpu: "500m"
  32.     readinessProbe:
  33.       httpGet:
  34.         path: /index.html
  35.         port: 80
  36.       initialDelaySeconds: 5
  37.       periodSeconds: 5
  38.     livenessProbe:
  39.       httpGet:
  40.         path: /index.html
  41.         port: 80
  42.       initialDelaySeconds: 15
  43.       periodSeconds: 20
  44.     startupProbe:
  45.       httpGet:
  46.         path: /index.html
  47.         port: 80
  48.       failureThreshold: 30
  49.       periodSeconds: 10
  50.     lifecycle:
  51.       postStart:
  52.         exec:
  53.           command: ["/bin/sh", "-c", "echo 'PostStart'"]
  54.       preStop:
  55.         exec:
  56.           command: ["/bin/sh", "-c", "echo 'PreStop'"]
  57.   serviceAccountName: nginx-service-account   
  58.   securityContext:                        
  59.     runAsUser: 1000
  60.     runAsGroup: 3000
  61.     fsGroup: 2000
  62.   shareProcessNamespace: true
  63.   volumes:
  64.   - name: shared-data
  65.     emptyDir: {}
  66.   - name: secret-volume
  67.     secret:
  68.       secretName: nginx-secret
  69.   - name: configmap-volume
  70.     configMap:
  71.       name: nginx-configmap
复制代码
Pod 关联对象

当谈到在Kubernetes上运行应用步调时,我们不会运行单个pod。因为Kubernetes是关于扩展和维护pod可用性的。
以是假如你运行一个单独的pod,它将是一个单点故障。因为Pod本身不能直接缩放。
正如我们在Kubernetes架构中讨论的那样,我们需要像Replicaset如许的控制器来确保始终运行所需数目的pod。
针对不同的用例,Kubernetes有不同类型的对象与pod相关联。

以下是与pod相关的重要对象:
总结

Kubernetes Pod是容器编排的基本单元,包含一个或多个共享网络和存储的容器。通过理解Pod的概念和生命周期,我们可以更有效地在Kubernetes中部署和管理应用。本文通过一个简单的Nginx Pod示例展示了怎样创建和访问Pod,渴望能帮助读者更好地理解Kubernetes Pod的基本原理。
假如你对云原生和Kubernetes感兴趣,欢迎关注我们后续的【云原生|K8S系列】文章。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4