Admission Controllers

Yu Sang Min·2025년 5월 30일

CKA

목록 보기
26/110
post-thumbnail

📌 Securing Kubernetes

⌨️ Kubectl 로 pod 생성시 절차

  1. kubectl 명령어 CLI로 입력
  2. Kube-ApiServer를 경유
  3. Pod 생성
  4. Etcd-cluster (DB에 정보 저장)

🪪 Authentication

  • 요청이 API 서버에 도달하면 인증 프로세스를 거침
  • 인증서를 통해 이루어짐
  • kubectl을 통해 요청이 전송된 경우 kube-config 파일에 인증서가 구성되어 있고
  • 인증 프로세스가 요청을 전송한 사용자를 식별하고 유효한지 확인하는 역할
  • 그런 다음 요청은 승인 프로세스를 거치고 요청한 사용자에게 해당 작업을 수행할 권한이 있는지 확인한다.
  • 그리고 역할 기반 액세스 제어를 통해 최종적으로 명령 실행 (RBAC)
# developer-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
- apiGroups: [“”]
  resources: [“pods”]
  verbs: [“list”, “get”, “create”, “update”, “delete”]

Kubectl ➡️ Authentication ➡️ Authorization ➡️ Create pod

💪 Admission Controller로 할 수 있는것들

  • Only permit images from certain registry
  • Do not permit runAs root user
  • Only permit certain capabilities
  • Pod always has labels
    등등.. 이것이 Admission Controller가 필요한 이유

Kubectl ➡️ Authentication ➡️ Authorization ➡️ Admission Controller ➡️ Create pod

  • admission controller는 클러스터 사용 방식을 강화하기 위해 더 나은 보안 조치를 구현하는데 도움이 된다!
  • admission controller는 단순히 구성의 유효성을 검사하기 보다 Pod가 생성되기 전에 요청 자체를 변경하거나 추가 작업을 수행할 수 것을 제안하는 등 많은 것을 수행

📋 Admission Controllers Detail

  • AlwaysPullImages : 파드가 생성될때 마다 이미지를 항상 가지고 오도록 한다, K8S와 함께 사전 빌드된 여러가지 Admission Controller가 있다.
  • DefaultStorageClass : 허용 컨트롤러는 PVC 생성을 관찰하고 기본 스토리지 클래스가 지정되지 않은 경우 자동으로 DefaultStorageClass를 추가한다
  • EventRateLimit : 컨트롤러는 API 서버가 한번에 처리할 수 있는 요청에 대한 제한을 설정하여 API 서버에 요청이 폭주하는 것을 방지하는 데 도움을 줄 수있다.
  • NamespaceExists : 권한 부여 컨트롤러가 존재하지 않는 네임스페이스에 대한 요청을 거부한다.
  • etc.. 더 많은 권한 부여 컨트롤러를 사용할 수 있다.

🔎 More Detail..

NamespaceExists
1. blue라는 Namespace에 존재하지 않는 pod를 만들고 싶다고 가정
2. kubectl run nginx --image nginx --namespace blue 명령어 입력하면 blue 네임스페이스를 찾을 수 없다는 에러가 발생
3. 여기서 일어나는 일은 내 요청이 인증되고, 승인이 된 다음 Admission Controller를 통과 하는것
4.
AC가 요청을 처리하고 blue 네임스페이스를 사용할 수 있는지 확인 => 그렇지 않은 경우 요청 거절
5. 네임스페이스가 존재하면 기본적으로 활성화 되는 기본 제공 권한 컨트롤러 있음 => 기본적으로 사용하도록 설정되어 있지 않은 또 다른 어드미션 컨트롤러가 있으며 이를 NamespaceAutoProvision 이라고 함

  • Namespace가 없는 경우 자동으로 생성되며 잠시 후에 활성화하는 방법 알아보자

🚀 View Enabled Admission Controllers

$ kube-apiserver -h | grep enable-admission-plugins
  • 위 명령어 입력하여 활성화된 admission plugin들을 확인
  • Kubeadm 기반 설정에서 실행하는 경우 👉 controlplane의 ApiServer pod 내에서 이 명령을 실행해야 한다.
$ kubectl exec kube-apiserver-controlplane -n kube-system -- kube-apiserver -h | grep enable-admission-plugins

➕ Enable Admission Controllers

# kube-apiserver.service

<중략>
--enable-admission-plugins=NodeRestricetion, NamespaceAutoProvision
 // 이 부분 추가

# /etc/kubernetes/manifests/kube-apiserver.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
     - kube-apiserver
     - --authorization-mode=Node,RBAC
     - --advertise-address=172.17.0.107
     - --allow-privileged=true
     - --enable-bootstrap-token-auth=true
     - --enable-admission-plugins=NodeRestriction,Nam // 이 부분 추가
     image: k8s.gcr.io/kube-apiserver-amd64:v1.11.3
     name: kube-apiserver

💡이 경우 admission controller가 작동하기 시작하면서 없는 네임스페이스에 pod를 설치 하려고 해도 자동으로 blue 네임스페이스를 생성하고 pod를 실행시킨다. => admission controller의 한가지 예시였다.

결론

: 사용자의 요청을 검증하고 거부할 수 있을 뿐만 아니라, 백엔드에서 작업을 수행하거나 요청 자체를 변경할 수있다.

Tip

  1. admission controller는 사용자 인증 후에 작동한다
  2. /etc/kubernetes/manifest/kube-apiserver.yaml 파일에서 또는 ps -ef | grep kube-apiserver | grep admission-plugins 옵션을 확인 할 수 있다.
  3. `kubectl exec -it kube-apiserver-controlplane -n kube-system -- kube-apiserver -h | grep ‘enable-admission-plugins’ 명령어로 활성화된 admission-plugins 옵션을 확인 할 수 있다. (괄호 안에 있는 항목이 활성화된 모든 admission-plugins 이다)
  4. 만약 명시적으로 어드미션 컨트롤러를 비활성화 시키기 위해서는 /etc/kubernetes/manifests/kube-apiserver.yaml (kubeadm 환경에서) 파일에서 다음 구문을 추가한다 --disable-admission-plugins=<plugin’s Name>
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글