高级 Pod 配置

此页面涵盖高级 Pod 配置主题,包括 PriorityClassesRuntimeClasses、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 特定的安全设置

有关更多信息,请参阅 配置 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 相对于其他 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"

接下来

最后修改时间:2025 年 9 月 22 日 1:04 AM PST:docs: 改进页面内容 (0a3ab87322)