
해당 연습문제는 이성미강사님의 강의를 바탕으로 작성했다.
https://fastcampus.co.kr/dev_online_kubemaster
정말 좋은 강의이다! 기초부터 탄탄하게 알고 싶다면 보는 것을 적극 추천한다!!
https://www.youtube.com/watch?v=6n5obRKsCRQ&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c
문제를 풀때 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
해당 경로를 많이 사용하고 많이 참고 했다.
시험 시간이 넉넉하지는 않았다 그래서 타이핑 시간과 삭제시간(pod 잘 못 생성시 삭제가 필요)을 줄이기 위해 아래 명령어를 사용했다. (https://peterica.tistory.com/540 피터님이 알려주신 좋은 꿀팁!)
# "kubectl"를 "k"약자로 변경
alias k=kubectl
# yaml파일과 문법이 정상적으로 작동하는 지 확인
export do="--dry-run=client -o yaml" # k create deploy nginx --image=nginx $do
# pod삭제 시 바로 삭제
export now="--force --grace=period 0" # k delete pod nginx $now8. Create Pod
Context:
- Anytime a team needs to run a container on Kubernetes they will need to define a pod within which to run the container.
Task:
- Create a YAML formatted pod manifest /data/ckad/tspod.yml to create a pod named ts-app that runs a container named ts-cont using image busybox with these command line arguments: /bin/sh -c "while true; do echo hello; sleep 10; done"
- Create the pod with the kubectl command using the YAML file created in the previous step.
- When the pod is running, display summary data about the pod in JSON format using the kubectl command and redirect the output to a file named /data/ckad/ts-app_out.json. All of the files you need to work with have been created, empty, for your convenience. When creating your pod, you do not need to specify a container command, only args.
k run ts-app --image=busybox $do > /data/ckad/tspod.yamlapiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: ts-app
  name: ts-app
spec:
  containers:
  - image: busybox
    name: ts-cont  # container name 변경
    args: ["-c", "while true; do echo hello; sleep 10; done"]  # args 만 추가!
    
 ----------------------
 
    args:  # 이렇게 작성해도 된다!
    - /bin/sh
    - -c
    - while true; do echo hello; sleep 10; donek apply -f tspod.yaml
- command: 컨테이너가 시작될 때 실행할 기본 프로그램이나 스크립트를 정의합니다.
- args: command에 전달되는 인자들로, command가 실행되는 방식을 결정합니다.
command 에 전달 될 args 인자들은 있지만, command가 실행되어 있지 안하기 때문에 pod는 실행되지 않는다.

k get pod ts-app -o json > /data/ckad/ts-app_out.json9. Deployment yaml file
Context:
- The web deployment yaml file, which was operated by Kubernetes 1.15 version, is to be re-run by Kubernetes 1.23 version.
Task:
- The web deployment yaml file is /data/ckad/web-deployment.yaml.
- Edit yaml to run in Kubernetes 1.23 version and run the edited yaml.
참고 : https://kubernetes.io/docs/concepts/overview/kubernetes-api/
/data/ckad/web-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    app: app-js
  name: web-deployment
spec:
  replicas: 3
  selector:
    app: app-js
  template:
    metadata:
      labels:
        app: app-js
    spec:
      containers:
      - image: smlinux/appjs
        name: appjs
        port:
        - containerPort: 8080
참고 : https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
apiVersion: apps/v1  # 수정
kind: Deployment
metadata:
  labels:
    app: app-js
  name: web-deployment
spec:
  replicas: 3
  selector:
    matchLabels:  # 추가
      app: app-js
  template:
    metadata:
      labels:
        app: app-js
    spec:
      containers:
      - image: smlinux/appjs
        name: appjs
        ports:
        - containerPort: 8080k apply -f web-deployment.yaml
10. Create Deployment
Task: Create a new deployment for running nginx with the following parameters:
- Run the deployment in the devops namespace. The namespace has already been created
- Name the deployment web and configure with 6 replicas
- Configure the pod with a container image of nginx:1.13.7-alpine
- Set an environment variable of NGINX_PORT=80 and also expose that port for the container above
참고 : https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
k craete ns devops
k create deploy web --image=nginx:1.13.7-alpine --replicas=6 $do > web.yaml
참고 : https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
  namespace: devops
spec:
  replicas: 6
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.13.7-alpine
        name: nginx
        env:  # 환경 변수 사용
        - name: NGINX_PORT
          value: "80"
        ports:  # expose!!
        - containerPort: 80k apply -f web.yaml
환경변수와 port가 열려있는지 확인!
k describe pod [pod name] -n devpos

11. Rolling Update and Roll Back
Context:
- As a Kubernetes application developer, you will often find yourself needing to update a running application.
Task: Please complete the following:
- Update the eshop-order deployment in the devops namespace with a maxSurge of 4 and a maxUnavailable of 10%
- Perform a rolling update of the webapp deployment, changing the nginx image version to 1.16
- Roll back the webapp deployment to the previous version
참고 : https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#max-surge
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: eshop-order
  name: eshop-order
  namespace: devops
spec:
  progressDeadlineSeconds: 600
  	# deploymet가 새로운 replicaset으로 롤아웃을 진행할 때, 완료되기까지 기다리는 시간(초단위)을 지정
    # 만약 이 시간에 완료되지 않으면, kubernetes는 해당 deployment를 진행 중지 상태로 전환 하고 이벤트를 기록
  revisionHistoryLimit: 10
  	# deployment가 보관할 이전 replicaset 수를 지정
    # deployment는 롤백할 수 있도록 이전 replicaset들을 보관
    # 이 때, 보관할 최대 이전 replicaset의 수를 제한
  replicas: 2
  selector:
    matchLabels:
      app: eshop-order
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      	# rollingupdate시 새로운 pod가 기존 pod 수를 초과하여 얼마나 더 많이 생성 될 수 있는지
        # 퍼센트 or 절대값으로 정의
        # replicas=2 이고 이 때, 25%인 0.5개의 pod(최소 1개)를 추가 생성 할 수 있음
        # 즉, rolloutupdate 중에는 최대 3개의 pod가 동시에 존재 할 수 있음
      maxUnavailable: 25%
      	# rollingupdate시 사용할 수 없는 pod의 초대 수를 퍼센트 or 절대값으로 정의
        # replicas=2 이고 이 때, 25%인 0.5개의 pod(최소 1개)가 사용할 수 없도록 허용
        # 즉, rolloutupdate 중에는 최대 1개의 pod가 중단될 수 있음
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: eshop-order
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        resources: {}
status: {}
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: eshop-order
  name: eshop-order
  namespace: devops
spec:
  progressDeadlineSeconds: 600
  revisionHistoryLimit: 10
  replicas: 2
  selector:
    matchLabels:
      app: eshop-order
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 4  # 수정 된 부분
      maxUnavailable: 10%  # 수정 된 부분
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: eshop-order
    spec:
      containers:
      - image: nginx:1.16  # 수정 된 부분
        name: nginx
        resources: {}
status: {}
명령어로 실행 가능!
k patch deployment eshop-order -n devops --patch '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":4,"maxUnavailable":"10%"}}}}'
k set image deployment/eshop-order nginx=nginx:1.16 -n devops
다시 원상복구를 위해
k rollout undo deployment/eshop-order -n devops
'Kubernetes > CKA' 카테고리의 다른 글
| [CKAD] 연습문제 정리 4탄! (0) | 2024.08.21 | 
|---|---|
| [CKA] 연습문제 정리 3탄! (0) | 2024.08.14 | 
| [CKA] 연습문제 정리 2탄! (0) | 2024.08.08 | 
| [CKA] 연습문제 정리 1탄! (0) | 2024.08.07 | 
| [CKA] 자격증 준비 (0) | 2024.08.07 | 
 
                    
                   
                    
                   
                    
                  