어드미션 컨트롤러란?

어드미션 컨트롤러는 쿠버네티스 API 서버의 요청을 가로채는 코드 조각입니다. 요청이 인증 및 권한 부여를 통과한 후, 하지만 리소스가 영구적으로 저장되기 전에 작동합니다.

이 컨트롤러는 오브젝트를 생성, 삭제, 또는 수정하는 요청에 적용됩니다. 또한 API 서버 프록시를 통해 파드에 연결하는 것과 같은 사용자 정의 동사(custom verbs) 요청도 차단할 수 있습니다. 하지만 오브젝트를 읽는(get, watch, list) 요청은 어드미션 컨트롤 계층을 통과하므로 차단하지 못합니다.


어드미션 컨트롤러의 역할

  • 쿠버네티스 기능 지원: 쿠버네티스의 여러 중요한 기능은 제대로 작동하기 위해 특정 어드미션 컨트롤러가 활성화되어야 합니다.
  • 보안 및 정책 적용: 클러스터 전체에 걸쳐 보안 정책, 거버넌스 규칙, 또는 사용자 지정 유효성 검사 규칙을 적용하는 핵심 메커니즘 역할을 합니다.

어드미션 컨트롤러의 종류

어드미션 컨트롤 메커니즘은 두 가지 유형으로 나눌 수 있습니다.

  • 변형(Mutating) 컨트롤러: 요청을 수정할 수 있습니다. 예를 들어, 파드에 특정 사이드카 컨테이너를 자동으로 추가하거나 기본값을 설정할 수 있습니다.
  • 유효성 검증(Validating) 컨트롤러: 요청을 수정할 수 없으며, 요청이 특정 규칙을 충족하는지 여부만 확인합니다. 규칙을 위반할 경우 요청을 거부합니다.

작동 방식

어드미션 컨트롤러는 kube-apiserver 바이너리에 내장되어 있으며, 요청이 API 서버로 들어오면 정의된 규칙에 따라 순차적으로 작동합니다. 첫 번째로 일치하는 규칙이 적용되며, 이 과정은 클러스터의 전반적인 보안과 안정성을 보장하는 데 매우 중요합니다.

따라서 올바른 어드미션 컨트롤러가 구성되지 않은 API 서버는 기능적으로 불완전하며, 기대하는 모든 기능을 지원하지 못할 수 있습니다.

 

설정 방법

AdmmisionConfiguration 파일 생성

{
   "apiVersion": "apiserver.config.k8s.io/v1",
   "kind": "AdmissionConfiguration",
   "plugins": [
      {
         "name": "ImagePolicyWebhook",
         "configuration": {
            "imagePolicy": {
               "kubeConfigFile": "/etc/kubernetes/policywebhook/kubeconf", ###kubeconf 위치####
               "allowTTL": 100,
               "denyTTL": 50,
               "retryBackoff": 500,
               "defaultAllow": false   ####필수####
            }
         }
      }
   ]
}

구문 설명

plugins: API 서버에서 활성화하고 구성할 어드미션 컨트롤러 목록입니다.

  • name: "ImagePolicyWebhook": 이미지 정책 웹훅 어드미션 컨트롤러를 활성화합니다. 이 컨트롤러는 파드(Pod)가 생성될 때 이미지의 유효성을 검사하기 위해 외부 웹훅 서비스에 요청을 보냅니다.
  • configuration: ImagePolicyWebhook 플러그인의 상세 설정입니다.
    • imagePolicy: 이미지 정책 웹훅의 핵심 설정입니다.
      • kubeConfigFile: "/etc/kubernetes/policywebhook/kubeconf": 웹훅 서비스와 통신하는 데 사용되는 kubeconfig 파일의 경로를 지정합니다. 이 파일에는 웹훅 서버의 주소, 인증서 등의 정보가 포함됩니다.
      • allowTTL: 100: 웹훅 서버가 이미지를 허용(Allow)한다고 응답하면, 해당 결과를 100초 동안 캐시합니다. 이 시간 동안 동일한 이미지에 대한 요청은 웹훅 서버로 보내지지 않고 캐시된 결과를 사용합니다. 이는 API 서버의 성능을 최적화하는 데 도움이 됩니다.
      • denyTTL: 50: 웹훅 서버가 이미지를 거부(Deny)한다고 응답하면, 해당 결과를 50초 동안 캐시합니다. 이 시간 동안 동일한 이미지는 무조건 거부됩니다.
      • retryBackoff: 500: 웹훅 서버에 연결할 수 없을 때 재시도 대기 시간을 500밀리초로 설정합니다.
      • defaultAllow: false: 이 설정이 가장 중요합니다. 웹훅 서비스에 연결할 수 없거나 웹훅에서 응답을 받지 못할 경우, 기본적으로 모든 이미지에 대한 요청을 거부합니다. 이는 "암묵적 거부(implicit deny)" 정책으로, 클러스터의 보안을 강화하는 데 매우 중요합니다. 만약 이 값이 true였다면, 외부 서비스가 다운될 경우 모든 이미지가 허용되어 보안 취약점이 발생할 수 있습니다.

 

 

kubeconf 파일 생성

apiVersion: v1
kind: Config

# clusters refers to the remote service.
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/policywebhook/external-cert.pem  # CA for verifying the remote service.
    server: https://localhost:1234                   # URL of remote service to query. Must use 'https'.
  name: image-checker

contexts:
- context:
    cluster: image-checker
    user: api-server
  name: image-checker
current-context: image-checker
preferences: {}

# users refers to the API server's webhook configuration.
users:
- name: api-server
  user:
    client-certificate: /etc/kubernetes/policywebhook/apiserver-client-cert.pem     # cert for the webhook admission controller to use
    client-key:  /etc/kubernetes/policywebhook/apiserver-client-key.pem             # key matching the cert

 

구문 설명

 

  • apiVersion: v1kind: Config: 이 파일이 kubeconfig 형식임을 나타냅니다.
  • clusters: API 서버가 연결할 외부 웹훅 서비스에 대한 정보를 정의합니다.
    • name: image-checker: 이 외부 클러스터의 이름입니다.
    • certificate-authority: /etc/kubernetes/policywebhook/external-cert.pem: 웹훅 서버의 TLS(Transport Layer Security) 인증서를 검증하는 데 사용되는 CA(Certificate Authority) 인증서 파일의 경로입니다. 이를 통해 API 서버는 자신이 연결하는 웹훅 서버가 신뢰할 수 있는 서버인지 확인합니다.
    • server: https://localhost:1234: 웹훅 서비스의 URL입니다. 이 주소로 API 서버가 이미지를 검증하기 위한 요청을 보냅니다. 반드시 https를 사용해야 합니다.
  • users: API 서버가 웹훅 서비스에 자신을 인증하기 위해 사용하는 클라이언트 정보를 정의합니다.
    • name: api-server: API 서버 사용자의 이름입니다.
    • client-certificate: /etc/kubernetes/policywebhook/apiserver-client-cert.pem: API 서버가 웹훅 서비스에 자신을 인증하기 위해 제시할 클라이언트 인증서 파일의 경로입니다.
    • client-key: /etc/kubernetes/policywebhook/apiserver-client-key.pem: 클라이언트 인증서와 쌍을 이루는 프라이빗 키 파일의 경로입니다.
  • contexts: 클러스터와 사용자를 결합하여 컨텍스트를 정의합니다.
    • name: image-checker: 이 컨텍스트의 이름입니다.
    • cluster: image-checker: 위에서 정의한 image-checker 클러스터를 사용합니다.
    • user: api-server: 위에서 정의한 api-server 사용자를 사용합니다.
  • current-context: image-checker: 현재 사용 중인 컨텍스트를 지정합니다. 이 설정 덕분에 kubectl과 같은 클라이언트가 특정 클러스터에 연결할 때 별도의 --context 플래그를 지정할 필요가 없습니다. 하지만 이 파일은 kubeconfig이므로 API 서버에서만 사용됩니다.

 

kube-apiserver 수정

    - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook  ###ImagePolicyWebhook 추가###
    - --admission-control-config-file=/etc/kubernetes/policywebhook/admission_config.json  ##경로 추가##
    
    ...
    volumeMounts:
    - mountPath: /etc/kubernetes/policywebhook
      name: policywebhook
      readyOnly: true
      
    ...
  volumes:
  - hostPath:
      path: /etc/kubernetes/policywebhook
      type: DirectoryOrCreate
    name: policywebhook

 

'k8s > CKS' 카테고리의 다른 글

[CKS] Pod Security Standards  (1) 2025.09.07
[CKS] falco 사용방법 및 샘플 - 2  (0) 2025.09.07
[CKS] falco 사용방법 및 샘플 - 1  (0) 2025.09.07
[CKS] NetworkPolicy 설명  (0) 2025.09.07
[CKS] ServiceAccount 생성 및 Pod 적용  (0) 2025.09.07

+ Recent posts