
kubectl을 통해 요청이 전송된 경우 kube-config 파일에 인증서가 구성되어 있고 # 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
Kubectl ➡️ Authentication ➡️ Authorization ➡️ Admission Controller ➡️ Create pod
Pod가 생성되기 전에 요청 자체를 변경하거나 추가 작업을 수행할 수 것을 제안하는 등 많은 것을 수행AlwaysPullImages : 파드가 생성될때 마다 이미지를 항상 가지고 오도록 한다, K8S와 함께 사전 빌드된 여러가지 Admission Controller가 있다.DefaultStorageClass : 허용 컨트롤러는 PVC 생성을 관찰하고 기본 스토리지 클래스가 지정되지 않은 경우 자동으로 DefaultStorageClass를 추가한다EventRateLimit : 컨트롤러는 API 서버가 한번에 처리할 수 있는 요청에 대한 제한을 설정하여 API 서버에 요청이 폭주하는 것을 방지하는 데 도움을 줄 수있다.NamespaceExists : 권한 부여 컨트롤러가 존재하지 않는 네임스페이스에 대한 요청을 거부한다.NamespaceExists
1. blue라는 Namespace에 존재하지 않는 pod를 만들고 싶다고 가정
2. kubectl run nginx --image nginx --namespace blue 명령어 입력하면 blue 네임스페이스를 찾을 수 없다는 에러가 발생
3. 여기서 일어나는 일은 내 요청이 인증되고, 승인이 된 다음 Admission Controller를 통과 하는것
4. AC가 요청을 처리하고 blue 네임스페이스를 사용할 수 있는지 확인 => 그렇지 않은 경우 요청 거절
5. 네임스페이스가 존재하면 기본적으로 활성화 되는 기본 제공 권한 컨트롤러 있음 => 기본적으로 사용하도록 설정되어 있지 않은 또 다른 어드미션 컨트롤러가 있으며 이를 NamespaceAutoProvision 이라고 함
$ kube-apiserver -h | grep enable-admission-plugins
$ kubectl exec kube-apiserver-controlplane -n kube-system -- kube-apiserver -h | grep enable-admission-plugins
# 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의 한가지 예시였다.
: 사용자의 요청을 검증하고 거부할 수 있을 뿐만 아니라, 백엔드에서 작업을 수행하거나 요청 자체를 변경할 수있다.
/etc/kubernetes/manifest/kube-apiserver.yaml 파일에서 또는 ps -ef | grep kube-apiserver | grep admission-plugins 옵션을 확인 할 수 있다.--disable-admission-plugins=<plugin’s Name>