고급 파드 구성

고급 파드 구성 (Advanced Pod Configuration)

이 페이지는 PriorityClass, RuntimeClass, 파드 내부의 보안 컨텍스트(security context)를 포함한 고급 파드 구성 주제와 스케줄링 측면을 다뤄요.

출처: 문서

본문

PriorityClass

PriorityClass는 파드의 중요도를 다른 파드에 상대적으로 설정할 수 있게 해 줘요. 파드에 우선순위 클래스를 할당하면 쿠버네티스는 지정한 PriorityClass에 따라 그 파드의 .spec.priority 필드를 설정해요(.spec.priority는 직접 설정할 수 없어요). 파드를 스케줄링할 수 없고 그 문제가 리소스 부족 때문이라면, kube-scheduler는 더 높은 우선순위 파드의 스케줄링을 가능하게 하기 위해 더 낮은 우선순위 파드를 선점(preempt)하려고 시도해요.

PriorityClass는 우선순위 클래스 이름을 정수 우선순위 값에 매핑하는 클러스터 범위 API 객체예요. 숫자가 높을수록 더 높은 우선순위를 나타내요.

PriorityClass 정의하기 (Defining a PriorityClass)

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 10000
globalDefault: false
description: "Priority class for high-priority workloads"

PriorityClass로 파드 우선순위 지정하기 (Specify pod priority using a PriorityClass)

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  priorityClassName: high-priority

내장 PriorityClass (Built-in PriorityClasses)

쿠버네티스는 두 가지 내장 PriorityClass를 제공해요.

  • system-cluster-critical: 클러스터에 중요한 시스템 컴포넌트용
  • system-node-critical: 개별 노드에 중요한 시스템 컴포넌트용. 이것은 쿠버네티스에서 파드가 가질 수 있는 가장 높은 우선순위예요.

자세한 내용은 파드 우선순위와 선점(Pod Priority and Preemption)을 참고하세요.

RuntimeClass

RuntimeClass는 파드의 저수준 컨테이너 런타임을 지정할 수 있게 해 줘요. 다른 종류의 파드에 다른 컨테이너 런타임을 지정하려 할 때, 예를 들어 다른 격리 수준이나 런타임 기능이 필요할 때 유용해요.

예시 파드 (Example Pod)

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  runtimeClassName: myclass
  containers:
  - name: mycontainer
    image: nginx

RuntimeClass는 노드의 일부 또는 전체에서 사용 가능한 컨테이너 런타임을 나타내는 클러스터 범위 객체예요. 클러스터 관리자는 RuntimeClass를 뒷받침하는 구체적인 런타임을 설치하고 구성해요. 특별한 컨테이너 런타임 구성을 모든 노드에 설정하거나, 아마 일부 노드에만 설정할 수도 있어요.

자세한 내용은 RuntimeClass 문서를 참고하세요.

파드와 컨테이너 레벨 보안 컨텍스트 구성 (Pod and container level security context configuration)

파드 사양의 Security context 필드는 파드와 컨테이너의 보안 설정에 대한 세밀한 제어를 제공해요.

파드 전체 securityContext (Pod-wide securityContext)

보안의 일부 측면은 파드 전체에 적용돼요. 다른 측면에서는 컨테이너 레벨 오버라이드 없이 기본값을 설정하고 싶을 수도 있어요.

다음은 파드 레벨에서 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"]

컨테이너 레벨 보안 컨텍스트 (Container-level security context)

특정 컨테이너에 대해서만 보안 컨텍스트를 지정할 수 있어요. 다음은 예시예요.

예시 파드:

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

보안 컨텍스트 옵션 (Security context options)

  • 사용자/그룹 ID (User and Group IDs): 컨테이너가 실행되는 사용자/그룹을 제어
  • Capabilities: Linux capabilities 추가 또는 제거
  • Seccomp 프로파일 (Seccomp Profiles): 보안 컴퓨팅 프로파일 설정
  • SELinux 옵션 (SELinux Options): SELinux 컨텍스트 구성
  • AppArmor: 추가 접근 제어를 위한 AppArmor 프로파일 구성
  • Windows 옵션 (Windows Options): Windows 특정 보안 설정 구성

주의: Pod securityContext를 사용해 Linux 컨테이너에서 권한 있는(privileged) 모드를 허용할 수도 있어요. 권한 있는 모드는 securityContext의 다른 많은 보안 설정을 재정의해요. securityContext의 다른 필드로 동등한 권한을 부여할 수 없는 경우가 아니라면 이 설정을 사용하지 마세요. 파드 레벨 보안 컨텍스트에서 windowsOptions.hostProcess 플래그를 설정하면 Windows 컨테이너도 비슷한 권한 있는 모드로 실행할 수 있어요. 자세한 내용과 지침은 Windows HostProcess 파드 만들기를 참고하세요.

자세한 내용은 파드나 컨테이너에 보안 컨텍스트 구성하기를 참고하세요.

파드 스케줄링 결정에 영향 주기 (Influencing Pod scheduling decisions)

쿠버네티스는 파드가 스케줄링될 노드를 제어하는 여러 메커니즘을 제공해요.

노드 셀렉터 (Node selectors)

가장 단순한 형태의 노드 선택 제약:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd

노드 어피니티 (Node affinity)

노드 어피니티는 파드가 스케줄링될 수 있는 노드를 제한하는 규칙을 지정할 수 있게 해 줘요. 다음은 특정 대륙으로 라벨이 지정된 노드에서 실행하는 것을 선호하고, 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 affinity and anti-affinity)

노드 어피니티에 더해, 노드에서 이미 실행 중인 다른 파드의 라벨을 기반으로 파드가 스케줄링될 노드를 제한할 수도 있어요. 파드 어피니티는 파드가 다른 파드에 상대적으로 어디에 배치되어야 하는지에 대한 규칙을 지정할 수 있게 해 줘요.

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

톨러레이션 (Tolerations)

톨러레이션은 파드가 일치하는 테인트(taint)가 있는 노드에 스케줄링되도록 허용해요.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myapp
    image: nginx
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"

자세한 내용은 파드를 노드에 할당하기를 참고하세요.

파드 오버헤드 (Pod overhead)

파드 오버헤드는 컨테이너의 요청과 제한에 더해 파드 인프라가 소비하는 리소스를 계산할 수 있게 해 줘요.

---
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"

다음 단계 (What's next)

  • 파드 우선순위와 선점에 대해 읽기
  • RuntimeClass에 대해 읽기
  • 파드나 컨테이너에 보안 컨텍스트 구성하기 탐구
  • 쿠버네티스가 파드를 노드에 할당하는 방법 배우기
  • 파드 오버헤드

더 알아보기 (Learn more)