管理Pod资源对象04.md
pod资源类型
静态pod:
由kubelet加载配置信息后,自动在节点级创建的pod。没有控制器管它的。
kubelet会自动扫描 /etc/kubernetes/manifests/下的yaml,都认为是pod资源的定义,会自动起来。
root@k8s-master02:~# ls /etc/kubernetes/manifests/
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
这些目录只存在于master上;这些yaml定义在哪个节点上,哪个节点上就进行加载。
自主式pod:
由用户直接定义并创建的pod,用户提交给apiserver后,就由调度器来绑定到某个节点上,接下来就由节点上的kubelet把它创建运行起来。
有一个调度的过程,但只会调度一次;第一种静态pod没有调度的过程。
由于没有工作负载型控制器管控,一旦用户删了就没了。或者如果那个节点down了,那个pod也没了。调度器只会在创建的时候执行一次调度,以后就不管了。
由工作负载型控制器(workload controller)管控的pod
所以在生成环境中,哪怕就一个pod在运行,也要用workload controller来管控它。因为存在这么一个机制:
如果pod被删了,控制器会自己发现(控制器要求得有完全等同于用户期望数量的pod存在),如果pod删了,控制器会自动请求apiserver创建用模板;如果节点down,一样会导致pod少了,控制器也会自动请求apiserver创建。重新创建的请求就会有schdule重新调度和绑定。
pod
容器集 ,kubernets编排运行应用的最小单元。
仅应该包含具有超亲密关系的容器,评估指标 必须通过IPC通信,或共享一个Volume的时候。
在K8S里IPC一般是:通过 localhost 通信、通过 Unix Domain Socket 通信
一个pod可以有多个容器,而pod是调度的最小单元,意味着一个pod里的所有容器必须运行在同一个node(物理机/VM)上。
这些容器集也就是pod,共享Network名称空间(内核级),这个network namespace不是k8s里的namespace(类似文件夹)。
network内核级别的namespace,一般连带共享了,网卡tcp/ip socket hostname,也就是还共享了 IPC、UTS。 # 一个pod里的容器共享了network、ipc、uts 这些namepaces
底层基础设置容器pause
pause人如其名,暂停,创建出来不会运行,只是创建出来提供资源,共享给其他容器。
对于pod里的容器而言,和docker不太一样(让后来的容器共享第一个容器的网络名称空间的),pod里的共享的网络名称空间有一个底层基础的容器支撑--pause。很小几乎不占用资源,但是可以支撑一个pod底层基础设置。pod里我们创建的任何容器都是共享的该pause容器的资源。
在任何运行pod的节点上,都可以看到很多pause容器的存在。
一个pod对应一个pause,
root@k8s-master02:~# crictl pods --namespace kube-system --name coredns-86b4d456f8-pzmh9
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
73cd48b1a82bc 2 weeks ago Ready coredns-86b4d456f8-pzmh9 kube-system 0 (default)
root@k8s-master02:~#
root@k8s-master02:~# crictl inspectp 73cd48b1a82bc | jq '.info.pid'
18650
root@k8s-master02:~#
root@k8s-master02:~# ps -fp $(crictl inspectp 73cd48b1a82bc | jq -r '.info.pid')
UID PID PPID C STIME TTY TIME CMD
65535 18650 18623 0 May20 ? 00:00:00 /pause
root@k8s-master02:~#
###理解####
crictl pods 里的 73cd48b1a82bc
↓
这是这个 Pod 的 Sandbox
↓
Sandbox 对应宿主机 PID 18650
↓
PID 18650 的进程是 /pause
Network Namespace:网络命名空间,隔离网卡、IP、路由、端口、socket。
IPC Namespace:进程间通信命名空间,比如 System V IPC、POSIX 消息队列、共享内存。
UTS Namespace:主机名/域名命名空间,主要控制 hostname。
PID Namespace:进程号命名空间。
Mount Namespace:挂载命名空间,控制文件系统挂载视图。
User Namespace:用户命名空间,控制 UID/GID 映射。
Cgroup Namespace:控制组命名空间,和资源限制视图有关。
Time Namespace:时间命名空间,可以隔离系统时间视图,较新内核才有。
Pod 默认强绑定:Network、IPC、UTS Pod 可选共享:PID Pod 常用共享目录:Volume,不是 Mount Namespace Pod 权限控制:securityContext,不是直接操作 User Namespace Pod 资源控制:resources,不是直接操作 Cgroup Namespace
在 Kubernetes 里,Pod 不是简单地“所有 namespace 都共享”,而是默认共享网络相关的运行环境;进程、文件系统、用户、资源这些隔离仍然主要以容器为边界。
适合放在同一个 Pod:
- 主容器 + 日志采集 sidecar
- 主容器 + 代理 sidecar
- 主容器 + 配置热更新 sidecar
- 主容器 + 数据同步 sidecar
- 必须共享 Volume 的辅助容器
- 必须通过 localhost 通信的辅助容器
不适合放在同一个 Pod:
Web 服务 + MySQL
Nginx + Redis
后端 API + 独立消息队列
只是“业务上有关联”的两个服务
能通过 Service 访问的,通常不要塞进一个 Pod; 必须共享 localhost、Volume、生命周期的,才考虑放进一个 Pod。
写个简单的Pod
apiVersion: v1
kind: Pod
metadata:
name: demoapp
namespace: default
spec:
containers:
- name: demoapp # 这里-可以和containers齐平,也可以缩进2格
image: REGISTRY/REPOSITORY:TAG # REGISTRY默认是从dockerhub下载,如果是从私有仓库,还需要补用户名密码。这里的REGISTRY也叫名称空间--仓库地址。

这就是一个自主性Pod,不受制于任何工作负载控制器。正如前文所讲如果node挂了或者删了,pod也就没了。
到那时👇demoapp-xxx这三个Pod是受控于工作负载型控制器的,删了或者node挂了会重建。

这个pod启动什么名称,就是什么名称,没有-xxx后缀,且调度到了node02

kubectl delete pod 时,Kubernetes 默认会先给容器主进程发送 SIGTERM,并等待 terminationGracePeriodSeconds,默认 30 秒;如果进程在宽限期内没有退出,最后才会 SIGKILL 强杀👇

#默认30s的宽限期👇
kubectl delete pod demoapp
# 没有宽限期👇直接删除,但是不推荐,会有问题
kubectl delete pod demoapp --force --grace-period=0
自主型Pod:demoapp删掉后不会重建

工作负载型Pod:demoapp-xxx删掉后自动重建👇

不等删完,就自动重建了
