高级 Pod 配置
此页面涵盖高级 Pod 配置主题,包括 PriorityClasses、RuntimeClasses、Pod 内的 安全上下文,以及介绍 调度的各个方面。
PriorityClasses
PriorityClasses 允许您设置 Pod 相对于其他 Pod 的重要性。 如果您为 Pod 分配优先级类,Kubernetes 会根据您指定的 PriorityClass 为该 Pod 设置 .spec.priority 字段(您无法直接设置 .spec.priority)。 如果或当 Pod 无法被调度,并且问题是由于资源不足造成的,kube-scheduler 会尝试 抢占 优先级较低的 Pod,以便可以调度优先级较高的 Pod。
PriorityClass 是一个集群范围的 API 对象,它将优先级类名称映射到一个整数优先级值。 数字越大表示优先级越高。
定义 PriorityClass
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 10000
globalDefault: false
description: "Priority class for high-priority workloads"
使用 PriorityClass 指定 Pod 优先级
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
priorityClassName: high-priority内置 PriorityClasses
Kubernetes 提供了两个内置的 PriorityClasses
system-cluster-critical:用于对集群至关重要的系统组件system-node-critical:用于对单个节点至关重要的系统组件。 这是 Kubernetes 中 Pod 可以拥有的最高优先级。
有关更多信息,请参阅 Pod 优先级和抢占。
RuntimeClasses
RuntimeClass 允许您为 Pod 指定低级别的容器运行时。 当您希望为不同类型的 Pod 指定不同的容器运行时时,这很有用,例如,当您需要不同的隔离级别或运行时功能时。
示例 Pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
containers:
- name: mycontainer
image: nginx一个 RuntimeClass 是一个集群范围的对象,它表示在您的某些或所有节点上可用的容器运行时。
集群管理员安装并配置支持 RuntimeClass 的具体运行时。
他们可能会设置在所有节点上或仅在某些节点上进行特殊容器运行时配置。
有关更多信息,请参阅 RuntimeClass 文档。
Pod 和容器级别的安全上下文配置
Pod 规范中的 Security context 字段提供对 Pod 和容器的安全设置的精细控制。
Pod 范围的 securityContext
某些安全方面适用于整个 Pod; 对于其他方面,您可能希望设置默认值,而无需任何容器级别的覆盖。
这是一个在 Pod 级别使用 securityContext 的示例
示例 Pod
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext: # This applies to the entire Pod
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- name: sec-ctx-demo
image: registry.k8s.io/e2e-test-images/agnhost:2.45
command: ["sh", "-c", "sleep 1h"]容器级别的安全上下文
您可以仅为特定的容器指定安全上下文。 这是一个例子
示例 Pod
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
containers:
- name: sec-ctx-demo-2
image: gcr.io/google-samples/node-hello:1.0
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault安全上下文选项
- 用户和组 ID:控制容器以哪个用户/组身份运行
- Capabilities:添加或删除 Linux 功能
- Seccomp Profiles:设置安全计算配置文件
- SELinux Options:配置 SELinux 上下文
- AppArmor:配置 AppArmor 配置文件以进行额外的访问控制
- Windows Options:配置 Windows 特定的安全设置
注意
您还可以使用 PodsecurityContext 允许在 Linux 容器中使用 特权模式。 特权模式会覆盖 securityContext 中的许多其他安全设置。 除非您无法使用 securityContext 中的其他字段授予等效权限,否则请避免使用此设置。 您可以通过在 Pod 级别安全上下文中设置 windowsOptions.hostProcess 标志,以类似特权的方式运行 Windows 容器。 有关详细信息和说明,请参阅 创建 Windows HostProcess Pod。有关更多信息,请参阅 配置 Pod 或容器的安全上下文。
影响 Pod 调度决策
Kubernetes 提供了几种机制来控制 Pod 被调度到哪些节点上。
节点选择器
最简单的节点选择约束形式
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd节点亲和性
节点亲和性允许您指定规则,以约束 Pod 可以被调度到哪些节点上。 这是一个 Pod 喜欢在标记为位于特定大陆上的节点上运行的示例,基于 topology.kubernetes.io/zone 标签的值进行选择。
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
containers:
- name: with-node-affinity
image: registry.k8s.io/pause:3.8Pod 亲和性和反亲和性
除了节点亲和性之外,您还可以根据已经运行在节点上的其他 Pod 的标签来约束 Pod 可以被调度到哪些节点上。 Pod 亲和性允许您指定 Pod 相对于其他 Pod 应该放置在何处的规则。
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- database
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:3.8容忍度
容忍度 允许 Pod 被调度到具有匹配污点的节点上
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myapp
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"有关更多信息,请参阅 将 Pod 分配给节点。
Pod 开销
Pod 开销允许您考虑 Pod 基础设施消耗的资源,除了容器请求和限制之外。
---
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: kvisor-runtime
handler: kvisor-runtime
overhead:
podFixed:
memory: "2Gi"
cpu: "500m"
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: kvisor-runtime
containers:
- name: myapp
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"接下来
- 阅读关于 Pod 优先级和抢占
- 阅读关于 RuntimeClasses
- 探索 配置 Pod 或容器的安全上下文
- 了解 Kubernetes 如何 将 Pod 分配给节点
- Pod 开销