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同时运行,资源为所有容器之和。