Kubernetes/Udemy - CKAD with Tests

Admission Controllers

비번변경 2022. 1. 10. 20:54

kube-apiserver에 요청이 도착하면, 요청을 수행하고 그 정보를 ETCD database에 저장된다.

요청을 수행하기 전에는 인증 과정(Authentication)이 필요하다. kubectl을 통해 요청이 전송되었다면 인증서가 구성된 kubeconfig 파일의 정보를 이용해 사용자를 식별하고, 유효한 사용자인지 확인한다.

인증 과정 후에는 사용자가 요청한 작업을 수행할 수 있는 권한이 있는지 확인하는 권한 부여 과정(Authorizaition)을 거치며, 이 과정에는 보통 역할 기반 접근 제어(RBAC)를 사용한다.

 

RBAC

여러 개체의 제어를 허용하거나 거부하는 역할을 사용자에게 부여하여 접근을 제한하는 방법이다.

특정 리소스(resourceName)만을 허용하거나 특정 네임스페이스의 접근만을 허용할 수도 있다.

다만 Kunernetes API 수준의 제한으로, 사용자에게 어떤 종류의 API 작업을 허용하는지의 수준이다.

 

포드 생성 요청 시 구성 파일을 검토하여 특정 이미지 실행만을 허용한다던지, 컨테이너 사용자를 제한한다던지 등의 개체에 대한 접근 권한 이상의 작업이 필요한 경우에는 Admission Controller를 사용해야 한다.

Admission Controller

클러스터의 관리 정책을 구현하며, 요청 검증 외에도 요청 변경 또는 추가 작업 등을 수행할 수 있다.

Admission Controller

Admission Controller는 아래와 같은 종류가 존재한다.

이름 역할
AlwaysPullImages pod 생성 시 image pull 수행을 항상 보장한다.
DefaultStorageClass pvc 생성을 확인하고 pvc의 Default Storage Class를 자동으로 추가한다.
EventRateLimit apiserver가 한 번에 너무 많은 요청을 처리하지 않도록 요청의 수량을 제한한다.
NamespaceExist 존재하지 않는 namespace에 대한 요청을 거부한다.
기본 제공 및 활성화된 admission controller다.
NamespaceAutoProvision 요청받은 namespace가 없는 경우 namespace를 자동으로 생성한다.
기본 제공 및 활성화된 admission controller가 아니다.
NamespaceLifecycle 존재하지 않는 namespace에 대한 요청을 거부한다.
default, kube-system 및 core public 등의 기본 namespace 삭제 요청을 거부한다.

+ NamespaceAutoProvision, NamespaceExist은 deprecated로, NamespaceLifecycle로 대체되었다.

 

 

명령어

활성화된 Admission Controller 목록 확인

kube-apiserver -h | grep enable-admission-plugins

 

kubeadm을 사용한 경우

kubectl exec kube-apiserver-controlplane -n kube-system -- kube-apiserver -h | grep enable-admission-plugins

 

 

활성화 Admission Controller 추가

서비스 파일에 --enable-admission-plugins 옵션을 추가하거나 수정한다. 여러 Admission Controller를 활성화할 때에는 쉼표로 구분한다.

vi /etc/systemd/system/kube-apiserver.service

###############
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${INTERNAL_IP} \\
--allow-privileged=true \\
--apiserver-count=3 \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/var/log/audit.log \\
--authorization-mode=Node,RBAC \\
--bind-address=0.0.0.0 \\
--client-ca-file=/var/lib/kubernetes/ca.crt \\
--enable-admission-plugins=NodeRestriction,ServiceAccount \\
...

 

kubeadm을 사용한 경우

/etc/kubernetes/manifests 아래에 존재하는 kube-apiserver.yaml 파일에 --enable-admission-plugins 옵션을 추가하거나 수정한다. 설정 파일이 수정되면 수정된 설정을 반영하기 위해 kube-apiserver가 자동으로 재시작한다.

vi /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.50
    - --allow-privileged=true
    - --enable-admission-plugins=NodeRestriction

 

 

Admission Controller 비활성화

서비스 파일에 --disable-admission-plugins 옵션을 추가하거나 수정한다. 여러 Admission Controller를 비활성화할 때에는 쉼표로 구분한다.

vi /etc/systemd/system/kube-apiserver.service

###############
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${INTERNAL_IP} \\
--allow-privileged=true \\
--apiserver-count=3 \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/var/log/audit.log \\
--authorization-mode=Node,RBAC \\
--bind-address=0.0.0.0 \\
--client-ca-file=/var/lib/kubernetes/ca.crt \\
--enable-admission-plugins=NodeRestriction,ServiceAccount \\
--disble-admission-plugins=DefaultStorageClass \\
...

kubeadm을 사용한 경우

/etc/kubernetes/manifests 아래에 존재하는 kube-apiserver.yaml 파일에 --disable-admission-plugins 옵션을 추가하거나 수정한다. 설정 파일이 수정되면 수정된 설정을 반영하기 위해 kube-apiserver가 자동으로 재시작한다.

vi /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.50
    - --allow-privileged=true
    - --enable-admission-plugins=NodeRestriction
    - --disable-admission-plugins=DefaultStorageClass