Pod

pod是k8s调度的最小单元。

  • 一组功能相关的Container的封装, 可以有多个容器。

  • 共享存储和Network Namespace

  • K8S调度和作业运行的基本单位。

创建pod有两种方式,一种是通过run命令在命令行直接创建

kubectl run pod1 --image=nginx --generator=run-pod/v1

另外一种是通过yaml文件,使用使用apply命令来创建。下面均使用apply命令来创建。

pod状态

  • Pending,通常表示还没有被调度。如果没有符合条件的主机,就会一直处于 Pending 状态。 或者是容器正在创建,经常是正在下载镜像。

  • Running,Pod已经绑定到某个Node并且正在运行。

  • Succeeded,表示Pod中的容器已经正常结束并且不需要重启。例如pod进行结束。

  • Failed,表示Pod中的容器遇到了错误而终止。

  • Unknown,因为网络或其他原因,无法获取Pod的状态。

  • Evicted,驱逐,通常是资源不足导致的驱逐。

创建一个pod

创建一个pod, 命令为: kubectl apply my-pod1.yaml, my-pod1.yaml 是yaml文件格式,文件内容如下,

apiVersion: v1
kind: Pod
metadata:
  labels:
        app: demo
  name: my-pod
  namespace: default
spec:
  containers:
  - image: python
        imagePullPolicy: Always
        name: main
        command: ['python', '-m', 'http.server']

通过get命令可以查询是否启动

$ kubectl  get pods
NAME                READY   STATUS    RESTARTS   AGE
my-pod              1/1     Running   0          5m2s

一个pod两个容器

通常一个容器仅运行一个程序,为了运行多个程序,通常是启动多个容器。这样就需要一个pod运行多个容器。 使用my-pod2.yaml来创建。

apiVersion: v1
kind: Pod
metadata:
  labels:
        app: demo
  name: my-pod
  namespace: default
spec:
  containers:
  - image: python
        imagePullPolicy: Always
        name: main
        command: ['python', '-m', 'http.server']
  - image: busybox
        imagePullPolicy: Always
        name: main2
        command: ["/bin/sh"]
        args: ["-c","while true; do echo $i >> /tmp/aaa; sleep 2; let i++; done"]

注意pod中的定义了两个镜像,就是启动了两个容器,两个容器名称不同,分别为main和main2

调用kubectl apply -f my-pod2.yaml创建pod, 然后使用kubectl get pods命令进行查看。可以看到READY列为2/2

kubectl  get pods
NAME                READY   STATUS    RESTARTS   AGE
my-pod              2/2     Running   0          62s

可以进入容器进行查看,一个pod有两个容器,因此需要使用-c选项指定容器名称。

kubectl exec -it my-pod -c main1 bash

删除 pod

删除pod

kubectl delete pods vsr-79v46

强制删除

kubectl delete pods vsr-79v46  --force

立即从API中删除资源并跳过正常删除。 例如pod所在的节点已从服务器离线,这是就需要强制删除。

静态 Pod

静态 Pod(Static Pod) 是直接由特定节点上的 kubelet 守护进程管理的pod。 静态Pod 不需要API 服务器管理它们。

对于静态 Pod 而言,kubelet 直接监控每个 Pod,并在其失效时进行重启。

下面在node2增加一个静态Pod, 我们在kubelet的配置文件 /var/lib/kubelet/config.yaml 中增加, 我这里默认配置已经增加

staticPodPath: /etc/kubernetes/mainfests/

然后执行创建yaml文件

cat <<EOF > /etc/kubernetes/manifests/my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
        app: my_pod
spec:
  containers:
        - name: db
          image: redis
EOF

/var/lib/kubelet/config.yaml是kubelet启动时加载的配置文件。重启kubelet以使配置修改生效

systemctl restart kubelet

然后通过命令查看pod是否成功,pod名称后缀会加上其node的命名

[root@node2]# kubectl get  pods
NAME           READY   STATUS    RESTARTS   AGE
my-pod-node2   1/1     Running   0          3m34s

容器分类

  • Infrastructure Container: 基础容器,维护整个Pod网络空间。

  • InitContainers容器, 先于业务容器启动

  • Contianers: 业务容器, 并行启动

资源及调度

如果资源不加限制,将会影响其他pod资源,导致其他pod被饿死甚至让pod掉线。所以通常必须进行资源限定, 通常限定内存和CPU。 内存以M为单位。CPU通常以核为单位,但也可以是小数,比如0.5核。

调度主要影响,CPU及内存

基于Pod中容器request资源“总和”调度

– resoureces.limits影响pod的运行资源上限,不影响调度 – initContainer取最大值,container取累加值,最后取大者即Max( Max(initContainers.requests), Sum(containers.requests)) – 未指定request资源时,按0资源需求进行调

健康检查

如果不健康,则尝试重建pod。

多个容器的情况

InitContainers容器逐个运行并退出,之后才拉起containers。资源需求取单个容器的最大值

Containers同时运行,资源为所有容器之和。

参考资料

https://kubernetes.io/docs/concepts/workloads/pods/