- CKAD 시험 비중 (25%)
- Authentication, Authorization and Admission Control
1. 인증(Authentication)
* User 또는 Application이 API에 접근을 허가 받는 과정(인증서/토큰)
2. 허가(Authorization)
* RBAC 모델 기반
* 요청 ID에 적절한 Role이 있는지 확인
3. 승인 제어(Admission Control)
* 요청이 올바른 형식인지 판별
* 요청 내용에 대한 검증이나 요청, 내용을 강제로 변경할 때 사용
* 쿠버네티스에서 특정 기능을 제한(validate) 또는 변경(mutate)
1. Admission Controller 플러그인
* Resourcequota: Namespace에서 사용할 수 있는 전체 리소스 제한
* LimitRange: Namespace 단위로 Pod나 Container의 리소스 사용량을 제한 설정
* History를 이용한 이전 버전으로 Rollback 지원
2. LimitRange
* Pod나 Container에 적용할 수 있는 Request, Limit의 하한값과 상한값을 미리 정의
* Pod나 Container에 적용할 수 있는 최대/최소 리소스(cpu, memory) limit와 request 설정
* Container에 default로 적용한 cpu, memory 값 설정
* 최대/최소 적용 가능한 PersistentVolumeClaim 제한
* 하나의 Namespace에 하나의 LimitRange를 생성
3. ResourceQuota
* Namespace에서 사용할 수 있는 전체 리소스 제한
* CPU/Memory에 대해 리소스 제한
* 생성 가능한 Object(Pod, Deployment, Service 등) 수 제한
- 실습1
Pod를 생성 시 리소스 limit와 request를 명시하지 않으면 CPU는 200m, Memory는 50Mi가 기본으로 설정되도록 운영하세요. default Resource request는 devops 네임스페이스의 "devops-limit"이라는 이름으로 생성해야 한다.
apiVersion: v1
kind: LimitRange
metadata:
name: devops-limit
namespace: devops
spec:
limits:
- default: # this section defines default limits
cpu: 200m
memory: 50Mi
defaultRequest: # this section defines default requests
cpu: 200m
memory: 50Mi
type: Container
- 실습2
devops 네임스페이스에서는 Pods는 10개, Services는 최대 5개까지 생성할 수 있도록 제한하는 ResourceQuota "devops-quota"를 생성하세요.
$ kubectl create quota devops-quota --hard=pods=10,services=5 -n devops
- Resource Requirements, Limits
* Pod Resource 요청 및 제한
1. Resource Requests: Pod를 실행하기 위해 필요한 리소스 양을 요청
2. Resource Limits: Pod가 사용할 수 있는 최대 리소스 양을 지정
- 실습1
준비된 /data/ckad/nginx-pod.yaml을 이용해서 nginx 컨테이너가 동작될 때, 최대 메모리 50Mi, CPU 200m를 넘지 못하도록 구성하세요. 또한, nginx 컨테이너는 동작을 위해 CPU 200m, Memory 30Mi를 요청합니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
resources:
requests:
memory: "30Mi"
cpu: "200m"
limits:
memory: "50Mi"
cpu: "200m"
- Security Context
* 컨테이너에 대해 지정하는 보안 설정은 개별 컨테이너에만 적용되며 겹치는 경우 Pod 수준에서 설정한 것보다 우선 적용됨
1. runAsUser, runAsGroup: 컨테이너의 프로세스에서 실행할 수 있는 userId(UID)와 groupID(GID) 지정. 컨테이너 이미지에 내장된 특정 유저의 권한으로 컨테이너나 Pod를 실행할 수 있다. 먼저 기본 Pod를 실행 시 할당되는 유저 정보를 확인하고, 특정 유저의 권한으로 실행한 컨테이너와 비교해보자.
2. runAsNonRoot: 컨테이너가 root로 실행되는 것을 방지
3. privileged mode: 컨테이너에서 node의 root 권한을 획득. privileged mode는 supervisor mode이다. 노드의 커널에 대한 모든 access를 얻으려면 시스템의 완전한 full success를 지원한다.
4. Linux Capabilities: 컨테이너를 privileges mode로 실행하여 노드의 커널에 대한 모든 접근 권한을 부여. AllowPrivilegeEscalation: 프로세스가 상위 프로세스보다 많은 권한을 얻을 수 있는지 여부를 제어한다. Privileged로 실행하거나 CAP_SYS_ADMIN이 있는 경우 allowPrivilegeEscalation은 항상 true이다.
5. readOnlyRootFilesystem: 프로세스가 컨테이너의 파일 시스템에 쓰는 것을 방지. 보안적인 이유로 대부분의 컨테이너에서는 실행중인 프로세스가 컨테이너의 파일 시스템을 쓰지 못하게 하고, 특별히 마운트된 볼륨에만 쓰기가 허용되도록 한다.
6. supplementalGroups: 추가 그룹 권한 사용. supplementalGroups를 사용하면 컨테이너에서 실행중인 유저와 상관없이 추가 그룹의 권한으로 저장하여 파일을 공유할 수 있다.
- 실습1
준비된 /data/ckad/safe-pod.yaml을 이용해서 다음 조건의 Security Context를 구성하세요.
* Safe Container는 UID 0인 root로 실행을 금지한다.
* Safe Container는 실행할 때는 405 UID로 실행되어야 한다.
* Safe Container는 root의 권한으로 escalation을 금지한다.
apiVersion: v1
kind: Pod
metadata:
name: safe-pod
spec:
containers:
- name: safe
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
runAsNonRoot: true
runAsUser: 405
allowPrivilegeEscalation: false
$ kubectl exec safe-pod -- id
'CKAD' 카테고리의 다른 글
[CKAD] 자격증 취득 후기 (2023.06.24) (4) | 2023.06.27 |
---|---|
[CKAD] 자격증이란? (0) | 2023.05.28 |
[CKAD] Application Observability and Maintenance (0) | 2023.05.27 |
[CKAD] Application Deployment (0) | 2023.05.27 |
[CKAD] Application Design and Build (0) | 2023.05.27 |