어드미션 컨트롤러란?
어드미션 컨트롤러는 쿠버네티스 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였다면, 외부 서비스가 다운될 경우 모든 이미지가 허용되어 보안 취약점이 발생할 수 있습니다.
- imagePolicy: 이미지 정책 웹훅의 핵심 설정입니다.
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: v1 및 kind: 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 |