CKAD

[CKAD] Application Design and Build

테런 2023. 5. 27. 18:11
  • CKAD 시험 비중 (20%)
  • Docker Container Build
다음의 조건으로 appjs:latest 컨테이너를 빌드하세요.
* 빌드 디렉토리: ~/app_build/appjs
* /data/ckad/app.js 의 파일을 ~/app-build/appjs로 이동한 후 다음 조건에 맞게 컨테이너를 빌드하세요.
1. base image: node:12
2. app.js 파일을 컨테이너 / 디렉토리로 복사
3. 컨테이너 실행 시 node app.js가 동작되어야 한다.
* 빌드한 컨테이너를 실행하세요.
$ vi Dockerfile
FROM node:12
COPY app.js /
CMD ["node", "app.js"] or ENTRYPOINT

$ docker build -t appjs:latest .
$ docker images
$ docker run -p 8080:8080 --name appjs -d appjs
$ curl localhost:8080

 

  • Job
* Kubernetes는 Pod를 running 중인 상태로 유지
* Batch 처리하는 Pod는 작업이 완료되면 종료됨
* Batch 처리에 적합한 컨트롤러로 Pod의 성공적인 완료를 보장
1. 비정상 종료 시 다시 실행
2. 정상 종료 시 완료

 

  • CronJob
* Job 컨트롤러로 실행할 Application Pod를 주기적으로 반복해서 실행
* Linux의 cronjob의 스케줄링 기능을 Job Controller에 추가한 API
* 다음과 같은 반복해서 실행하는 Job을 운영해야 할 때 사용
1. Data Backup
2. Send email
3. Cleaning tasks
* Cronjob Schedule: "0 3 1 * *"
1. Minutes (from 0 to 59)
2. Hours (from 0 to 23)
3. Day of the month (from 1 to 31)
4. Month (from 1 to 12)
5. Day of the week (from 0 to 6)

 

  • 실습1
다음의 조건으로 실행하는 컨테이너를 실행하세요.
* /data/ckad/sample.yaml manifest 파일에 pod가 정의되어 있다.
* sample.yaml을 수정하여 busybox:stable 컨테이너가 매분마다 실행되어야 한다.
* 10초 내에 완료되거나 kubernetes에 의해 종료되어야 한다.
* cronjob 이름과 container 이름 모두 hello여야 한다.
* hello container가 성공적으로 실행되었는지 확인하세요.

 

  • Init Container
* 앱 컨테이너 실행 전에 미리 동작 시킬 컨테이너
* 본 Container가 실행되기 전에 사전 작업이 필요할 경우 사용
* 초기화 컨테이너가 모두 실행된 후에 앱 컨테이너를 실행
1. 초기화 컨테이너는 항상 완료를 목표로 실행
2. 각 초기화 컨테이너는 다음 초기화 컨테이너가 시작되기 전에 성공적으로 완료되어야 한다.
3. 파드의 초기화 컨테이너가 실패하면, Kubelet은 초기화 컨테이너가 성공할 때까지 반복적으로 재시작한다.

 

  • 실습1
/data/ckad/fc-app.yml을 편집해서 다음의 조건에 맞는 init 컨테이너를 추가하세요.
1. fc-app.yml을 통해 main 컨테이너 애플리케이션이 동작 가능하다.
2. init 컨테이너로 busybox:1.28 컨테이너를 추가하고 /workdir/fcdata.txt 라는 empty 파일을 생성한다.
3. 만약, init 컨테이너가 fcdata.txt 파일을 생성하지 못하면 main 컨테이너는 실행할 수 없다.
4. init 컨테이너와 main 컨테이너는 볼륨 마운트를 통해 /workdir 디렉토리를 공유한다.
apiVersion: v1
kind: Pod
metadata:
  name: fc-app
spec:
  containers:
  - name: main
    image: busybox:1.28
    command: ['sh', '-c', 'if [ !-f /workdir/fcdata.txt ];then exit 1;else sleep 300;fi']
    volumeMounts:
    - name: workdir
      mountPath: "/workdir"
  initContainers:
  - name: init
    image: busybox:1.28
    command: ['sh', '-c', 'touch /workdir/fcdata.txt']
    volumeMounts:
    - name: workdir
      mountPath: "/workdir"
  volumes:
  - name: workdir
    emptyDir: {}