Kubernetes v1.36 版本的文档已不再维护。你现在看到的版本来自于一份静态的快照。如需查阅最新文档,请点击 最新版本。
本页涵盖高级 Pod 配置主题,包括 PriorityClass、RuntimeClass、 Pod 内的安全上下文,并介绍调度相关内容。
PriorityClass 允许你设置 Pod 相对于其他 Pod 的重要性。
如果你为 Pod 分配了优先级类,Kubernetes 会根据你所指定的 PriorityClass 为该 Pod 设置 .spec.priority 字段
(你不能直接设置 .spec.priority)。如果 Pod 无法被调度,且原因是资源不足,
kube-scheduler
会尝试抢占较低优先级的 Pod,
以使较高优先级的 Pod 能够被调度。
PriorityClass 是一个集群级别的 API 对象,它将优先级类名称映射到一个整数优先级值。数值越大,优先级越高。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 10000
globalDefault: false
description: "Priority class for high-priority workloads"
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
priorityClassName: high-priorityKubernetes 提供两个内置的 PriorityClass:
system-cluster-critical:用于对集群至关重要的系统组件。system-node-critical:用于对单个节点至关重要的系统组件。这是 Kubernetes 中 Pod 可以具有的最高优先级。更多信息请参阅 Pod 优先级与抢占。
RuntimeClass 允许你为 Pod 指定底层的容器运行时。当你需要为不同类型的 Pod 指定不同的容器运行时, 例如需要不同的隔离级别或运行时特性时,这一机制非常有用。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
containers:
- name: mycontainer
image: nginxRuntimeClass 是一个集群级别的对象, 表示在某些或所有节点上可用的容器运行时。
集群管理员负责安装和配置支撑 RuntimeClass 的具体运行时。
他们可以在所有节点上设置这种特殊的容器运行时配置,也可以只在部分节点上设置。
更多信息请参阅 RuntimeClass 文档。
Pod 规约中的 Security context 字段提供了对 Pod 和容器安全设置的精细化控制。
securityContext 安全设置的某些方面适用于整个 Pod;对于其他方面, 你可能希望设置一个默认值,而不允许容器级别的覆盖。
以下是在 Pod 层面使用 securityContext 的示例:
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext: # 此项应用到整个 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"]你可以仅为特定容器指定安全上下文。以下是一个示例:
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你也可以使用 Pod 的 securityContext 来允许 Linux
容器进入特权模式。
特权模式会覆盖 securityContext 中的许多其他安全设置。
除非无法通过 securityContext 中的其他字段授予等效权限,否则应避免使用此设置。
你可以通过在 Pod 级别的安全上下文中设置 windowsOptions.hostProcess 标志,
以类似的特权模式运行 Windows 容器。有关详细信息和操作说明,
参阅创建 Windows HostProcess 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.8除了节点亲和性之外,你还可以基于节点上已运行的其他 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容忍度(Toleration) 允许 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 基础设施所消耗的资源。
---
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"