CKAD

[CKAD] Application Environment, Configuration and Security

테런 2023. 5. 28. 15:46
  • 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)  (2) 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