K8s核心资源对象-Pod(PodSpec)
K8s核心资源对象-Pod(PodSpec)
基于1.25
什么是Pod
Pod是K8s最小可部署的单元。一个Pod可以有多个容器
每一个Pod,预置了一个Pause容器,其命名空间、IPC、网络和存储资源被Pod中其他容器共享
type PodSpec struct { |
主要分为几类:
- 容器相关:InitContaners、Containers、EphemeralContainers、ImagePullSecrets、EnableServiceLinks、OS
- 调度相关:NodeSelector、NodeName、Affinity、Tolerations、SchedulerName、RuntimeClassName、Overhead、PriorityClassName、Priority、PreemptionPolicy、TopologySpreadConstrains
- 存储相关:Volumes
- Pod生命周期相关:RestartPolicy、TerminationGracePeriodSeconds、ActiveDeadlineSeconds、ReadinessGate
- 主机名和DNS相关字段:Hostname、SetHostnameAsFQDN、Subdomain、HostAliases、DNSConfig、DNSPolicy
- 主机Namespace相关字段:HostNetwork、HostPID、HostPIPC、ShareProcessNamespace、HostUsers(aplha阶段)
- ServiceAccount相关字段:ServiceAccountName、AutomountServiceAccountToken、
ServiceAccount(弃用)
容器相关字段
Pod主要有三类容器:Init容器(InitContainer)、普通容器(Containers)、临时容器(EphemeralContainers)
InitConatiner
- Init容器是一个特殊的容器,在普通容器启动之前顺序执行,如果任何Init容器失败,则该Pod失败,根据RestartPolcy进行处理
- Init拥有应用容器的特性,但是不支持lifecycle、livenessProbe、readinessProbe、startupProbe
- Init按照顺序执行
Containers
- Pod中至少有一个是普通容器
- 如果有多个容器,其中一个是主容器,其他容器上说Sidecar容器,辅助主容器完成功能
EphemeralContainers
- 这是一个特殊的容器,在Pod临时使用,比如进行故障排除
- 永远不会自动重启
- 不能通过kubectl edit增加临时容器
- Ref:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/ephemeral-containers/
ImagePullSecrets
- 定义Pod中任何镜像账号信息
EnableServiceLinks
- 是否将有关服务的信息注入到Pod的环境变量,默认为true
- 不论是否为false,K8s总是设置一个default/Kubernetes 为service的环境变量
- Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/kubelet/kubelet_pods.go#L584
// Make the environment variables for a pod in the given namespace. |
OS
- 指定Pod的操作系统,当前支持linux和windows
- 如果设置了此属性,则不属于该类型的Pod和容器字段收到影响
调度相关字段
NodeSelector
- 基于NodeSelector通过K8s的label-selector机制选择调度到某个节点上
NodeName
Pod运行的节点信息,一般调度成功之后,调度器设置
Affinity
一组节点亲和调度规则
- NodeAffinity:Pod的节点调度规则
- PodAffinity: Pod的亲和性调度规则。比如Pod和一些Pod放在一起
- PodAntiAffinity:Pod反亲和调度规则。比如避免Pod放在一起
Tolerations
容忍五点,为了让某些Pod不再调度到某些节点,通过在节点上设置污点
- 设置了Noexecute,马上驱逐这些Pod
- 如果设置了可选TolerationSeconds,生存一段时间之后驱逐
RuntimeClassName、Overhead
- RuntimeClassName:引用node.k8s.io组中的RuntimeClass对象,该RuntimeClass对象将被用来运行这个Pod。RuntimeClass对象提供了一种在集群中配置不同运行时之间的选择。如果不匹配Runtime,Pod不运行。不设置或者空,使用旧版RuntimeClass
- Overhead:指定RuntimeClass对象运行Pod的资源开销
PriorityClassName、Priority
用于设置Pod优先级
- PriorityClassName由用户设置,需要管理PriorityClass字段
- 当启用Priority准入控制器,该控制器会组织用户设置Prioity字段
- 准入控制基于PriorityClassName设置Priority,Priority值越高,优先级越大
- 有俩个特殊的关键字,表示优先级,如果没有指定此字段,则Pod默认优先级为默认值,没有默认值是0
system-node-critical
优先级高于system-cluster-critical
- Ref: https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/plugin/pkg/admission/priority/admission.go#L137
// admitPod makes sure a new pod does not set spec.Priority field. It also makes sure that the PriorityClassName exists if it is provided and resolves the pod priority from the PriorityClassName. |
PreemptionPolicy
用于抢占优先级低的Pod策略,有Never(不抢占)、PreemptLowerPriority(抢占优先级低的)
func (pl *DefaultPreemption) PodEligibleToPreemptOthers(pod *v1.Pod, nominatedNodeStatus *framework.Status) (bool, string) { |
TopologySprendConstranints
描述一组Pod如何跨拓扑分布。
存储相关字段
主要通过设置Volumes字段来实现,设置Pod挂载的列表
Pod的生命周期
RestartPolicy
重启策略:
- Always(default):总是重启,指数回退方式,10s 20s,最长5min,如果10min没有问题,重置0
- OnFailure:失败的时候重启
- Never:从不重启
TerminationGradePeriodSeconds
Pod优雅终止的宽限时间。收到停止信号,存活时间。默认30s;
ActiveDeadlineSeconds
ActiveDeadlineSeconds资源在集群中存活的时间,一般跟Job一起使用。
ReadinessGate
ReadinessGate是Pod就绪门控,所有门控中的状态都是Ture,Pod才是就绪,此时Pod的IP地址才会展示
主机名和DNS相关字段
Hostname
- 创建的时候取Pod的metadata.name
- Hostname可以指定Pod的主机名
- 当这个字段设置,优先Pod名称成为主机名
SetHostnameASFQDN
启用此选项,Pod将主机名解析为FQDN
在容器内部/etc/hosts会设置对应的解析规则
// GetNodenameForKernel gets hostname value to set in the hostname field (the nodename field of struct utsname) of the pod. |
Subdomain
指定Pod的子域名
设置了此字段,则完全限定的Pod主机名将为
. . .svc.<集群域名> 未设置没有域名Pod
// GeneratePodHostNameAndDomain creates a hostname and domain name for a pod, |
HostAliases
HostAliases是一个可选列表的属性
- 包含Pod的hosts的主机和IP地址,仅对非HostNework生效
- HostAlias包含IP地址和主机名的对应关系,这些会被写入到Pod的hosts文件中
- Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/kubelet/kubelet_pods.go#L159
// makeMounts determines the mount points for the given container. |
DNSConfig、DNSPolicy
主要用于控制Pod的DNS
DNSConfig是可选的,可以搭配任何DNSPolicy
DNSPolicy为None的时候,必须制定DNSConfig
DNSPolicy有以下几种
- ClusterFirstWithHostNet:以Host Network运行Pod,显式声明不然回退到Default策略
- ClusterFirst(default):与集群域名不匹配的,都转发上游服务器
- Default:Pod从运行节点继承DNS解析配置
- None:忽略K8s的DNS设置,使用DNSConfig中的配置
DNSConfig有以下几种
- nameservers: 用于Pod的DNS服务器IP列表,最多三个
- searches: 用于Pod中查找主机名的DNS搜索域
- options: 可选对象列表,每个对象有name(必须)和value(可选)
namespace相关字段
HostNetwork
主要用于是否使用主机网络命名空间,默认false
HostPID
使用主机的PID命名空间,默认false
HostPIC
使用主机IPC命名空间,默认false
ShareProcessNamespace
是否启用PID命名空间共享,默认false
- 设置后,同一Pod下,可以收到其他容器的进程发出的信号
- 不能同时设置HostPID和ShareProcessNamespace
HostUsers
使用主机的用户命名空间,默认true
- 1.25 alpha阶段,需要启用UserNamespaceSupport才能使用
- 默认false可以缓解容器逃逸漏洞,防止主机上没有root权限的用户以root启动运行容器
ServiceAccount字段
ServiceAccountName
运行此Pod的ServiceName
AutomountServiceToken
是否自动挂在服务账号的账户令牌
ServiceAccount(弃用)
ServiceAccountName替换
上下文相关
SecurityConext包含Pod级别的安全属性和常见的容器设置,可选字段,默认空
- runAsUser:运行容器入口点的UID。未指定,默认镜像元数据中的指定的用户;spec.os.name=windows不能设置此字段
- runAsNonRoot:容器必须以非root用户运行。如果是true,kubelet在运行时进行验证,确保UID0(root)的身份运行
- runAsGroup:运行容器进程的入口点GID。未指定,使用默认值;spec.os.name=windows不能设置此字段
- supplentalGroup:在容器的主GID之外,应用于每一个容器的第一个组列表。未指定,不会增加额外组列表;spec.os.name=windows不能设置此字段
- securityConetxt.sysctls:包含用于Pod命名空间的sysctl列表。具有容器不支持的sysctl可能Pod无法启动;spec.os.name=windows不能设置此字段