Pod 概述
- Pod 是最小部署的单元,Pod里面是由一个或多个容器组成,也就是一组容器的集合
- 一个pod中的容器是共享网络命名空间,每个Pod包含一个或多个紧密相关的用户业务容器
- Pod 是 k8s 系统中可以创建和管理的最小单元
- 是资源对象模型中由用户创建或部署的最小资源对象模型
- 也是在 k8s 上运行容器化应用的资源对象,
- 其他的资源对象都是用来支撑或者扩展 Pod 对象功能的, 比如控制器对象是用来管控 Pod 对象的
- Service 或者 Ingress 资源对象是用来暴露 Pod 引用对象的
- PersistentVolume 资源对象是用来为 Pod 提供存储等等
Pod的创建
- 现在创建一个 nginx 的 pod, 创建一个文件: my-nginx.yaml
apiVersion: v1 kind: Pod metadata: name: my-nginx labels: name: my-nginx spec: containers: - name: my-nginx image: nginx:latest resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80
- $
kubectl create -f my-nginx.yaml
pod/my-nginx created
- $
kubectl get po
NAME READY STATUS RESTARTS AGE my-nginx 0/1 ContainerCreating 0 6s
- $
kubectl describe pod my-nginx
Name: my-nginx Namespace: default Priority: 0 Node: node1.k8s/10.211.55.11 Start Time: Thu, 18 Apr 2024 09:49:12 +0800 Labels: name=my-nginx Annotations: <none> Status: Running IP: 10.244.1.12 IPs: IP: 10.244.1.12 Containers: my-nginx: Container ID: docker://2c73c0faa3aa91a72849fdaa1aa09cbca1ce3c6ef2092e2542fc7558d3b524a3 Image: nginx Image ID: docker-pullable://nginx@sha256:d2cb0992f098fb075674730da5e1c6cccdd4890516e448a1db96e0245c1b7fca Port: 80/TCP Host Port: 0/TCP State: Running Started: Thu, 18 Apr 2024 09:49:23 +0800 Ready: True Restart Count: 0 Limits: cpu: 500m memory: 128Mi Requests: cpu: 500m memory: 128Mi Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kpmzn (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-kpmzn: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: Guaranteed 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 13s default-scheduler Successfully assigned default/my-nginx to node1.k8s Normal Pulling 13s kubelet Pulling image "nginx" Normal Pulled 2s kubelet Successfully pulled image "nginx" in 10.625690431s Normal Created 2s kubelet Created container my-nginx Normal Started 2s kubelet Started container my-nginx
- 这里可以看到:
Successfully assigned default/my-nginx to node1.k8s
- 这里将pod分配到 node1.k8s 节点上
- 这里可以看到:
Pod 的实现原理
1 ) Pod 在 K8s 中结构
- k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成
- Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器
- Pause 容器对应的镜像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个Pod还包含一个或多个紧密相关的用户业务容器
2 )实现原理
- Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离方面
- 即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离
- 就 Docker 概念的术语而言,Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器
- 说明: 除了 Docker 之外,Kubernetes 支持很多其他容器运行时
- Docker 是最有名的运行时, 使用 Docker 的术语来描述 Pod 会很有帮助
3 )pod 的结构图例
- 一个包含多个容器的 Pod 中包含一个用来拉取文件的程序和一个 Web 服务器
- 均使用持久卷作为容器间共享的存储
- 在这个小小的pod之内,网络(网卡)和磁盘都是独立的
- 一个pod内的容器可以实现互相通信和资源共享,也就是可以访问同一个目录
- 在 pod 停掉之前,会先关闭里面的容器
4 )pod 的使用
- 通常你不需要直接创建 Pod,甚至单实例 Pod
- 相反,你会使用诸如 Deployment 或 Job 这类工作负载资源 来创建 Pod
- 如果 Pod 需要跟踪状态, 可以考虑 StatefulSet 资源
5 )Kubernetes 集群中的 Pod 主要有两种用法
- a )运行单个容器的 Pod
- "每个 Pod 一个容器"模型是最常见的 K8s 用例
- 在这种情况下,可以将 Pod 看作单个容器的包装器
- 并且 K8s 直接管理 Pod,而不是容器
- b ) 运行多个协同工作的容器的 Pod
- Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序
- 这些位于同一位置的容器可能形成单个内聚的服务单元:
- 一个容器将文件从共享卷提供给公众
- 而另一个单独的“边车”(sidecar)容器则刷新或更新这些文件
- 比如:这个 sidecar 是一个日志的收集容器, 要时时的收集日志
- 读取应用的日志并推送到 log-stash,elk 或 Prometheus 中去
- Pod 将这些容器和存储资源打包为一个可管理的实体
- 通过这种方式形成一个协同工作的单元
6 ) 使用job调度一系列的 pod
-
目的:基于一个nginx容器完成shell命令,并且完成5次
-
创建 hello-job.yaml
apiVersion: batch/v1 kind: Job metadata: name: hello-job spec: completions: 5 # 完成5次 template: spec: containers: - name: hello-job image: nginx command: ['sh', '-c', 'echo "Hello, Kubernetes" && sleep 1'] restartPolicy: OnFailure
-
$
kubectl create -f hello-job.yaml
创建 jobjob.batch/hello-job created
-
$
kubectl get job
获取 jobNAME COMPLETIONS DURATION AGE hello-job 0/5 39s 39s
-
$
kubectl get po -w
监控NAME READY STATUS RESTARTS AGE hello-job--1-dfj2j 0/1 Completed 0 12s hello-job--1-k2d2w 0/1 Completed 0 32s hello-job--1-km7sn 0/1 Completed 0 21s hello-job--1-n78fk 0/1 Completed 0 45s hello-job--1-pgcvn 0/1 ContainerCreating 0 2s hello-job--1-pgcvn 1/1 Running 0 8s hello-job--1-pgcvn 0/1 Completed 0 9s
-
$
kubectl get job
再次获取 jobNAME COMPLETIONS DURATION AGE hello-job 5/5 39s 39s
-
$
kubectl get po
再次查看 podhello-job--1-dfj2j 0/1 Completed 0 16m hello-job--1-k2d2w 0/1 Completed 0 16m hello-job--1-km7sn 0/1 Completed 0 16m hello-job--1-n78fk 0/1 Completed 0 17m hello-job--1-pgcvn 0/1 Completed 0 16m
-
$
kubectl logs hello-job--1-pgcvn
查看日志Hello, Kubernetes
-
$
kubectl delete job hello-job
job.batch "hello-job" deleted
-
基于以上,可以看到,基于 job 维护 pod 的运行状态的一个简单示例
7 ) pod 的 网络
- 每个 Pod 都在每个地址族中获得一个唯一的 IP 地址
- Pod 中的每个容器共享网络名字空间,包括 IP 地址和网络端口
- Pod 内 的容器可以使用 localhost 互相通信
- 当 Pod 中的容器与 Pod 之外的实体通信时,它们必须协调如何使用共享的网络资源 (例如端口)