쿠버네티스 교육

Kubernetes 실습 과제 리스트

Jerry_이정훈 2021. 8. 25. 01:19
728x90

외부 파트너 및 고객 엔지니어 대상으로 작성한 Kube 교육 용도 실습 과제 리스트를 정리하였습니다.

교육은 실습 위주입니다. 담당자가 자기 PC 화면을 공유하면서 실습 내역을 직접 시연하고 다른 분들이 Q&A하는 방식으로 진행합니다. 강사 혼자서 강의 & 실습하는 것은 한가지 경우만을 따라하기 혹은 외우려고 하여 효과가 크지 않아 변경하였습니다.

실제 자기가 발표 시연을 해야 하므로 싫어하는 분들이 많이 있어 진행하기가 쉽지 않을 것 같습니다. (지난 교육처럼 스타벅스 쿠폰을 남발하면서 최대한 참여를 이끌어 내려고 합니다.) 그리고 Kube 자체가 생소하고 경험이 없는 분들이 교육을 받는 거라 더 어려울 것 같구요. 하지만 문제를 해결하는 과정 자체가 의미 있다고 생각하여 과제 리스트만 나열 하였습니다. 물론 중간중간 제가 실습을 하면서 도움을 드릴 것 입니다.

아래 내용을 타 회사의 경우 내부 Kube 교육 용도 혹은 면접 시 질문 용도로 사용하실 수 있을 것 같습니다.

아래 교육 아젠다로 기업 방문 온사이트 (혹은 온라인) Kubernetes Training 서비스가 필요하시면 언제든지 연락 부탁 드립니다.

kuberenetes 교육/구축/기술 지원 및 Diamanti 기술 문의: leejunghoon@spkr.co.kr


Kube Cluster 설치

  1. kubespray 이용하여 단일 노드 혹은 3개의 노드에 Kube cluster 설치해 보세요. crio for container run time, audit log enable 설정 조건 입니다. (또는 k3s, kind(kubernetes in docker) 사용 가능합니다.)
  2. Window 기준 VSCode, WSL(Window Subsystem Linux), Window Terminal 사용해 보세요. (MAC VSCode)
  3. kubectl tool(Linux or Mac version)을 개인 PC에 설치하세요.
  4. 해당 Cluster를 원격 PC에서 제어 가능 하도록 PC $HOME/.kube/config 파일에 원격 Cluster Config 정보를 등록 합니다. 추가 후 원격 Cluster에 kubectl get nodes 명령어를 수행 합니다. (향후 복수의 cluster 관리 시 용이 합니다.)

Kube Tool 활용

  1. Kubectl 관련 자동 완성 및 Alias를 설정하세요. (예: kubectl for k, k get pod -o wide for kgp 등)
  2. Kubectl 관련 plug-in 설치를 도와주는 kubectl krew tool 설치하세요.
  3. 네임 스페이스(kubens) 및 Kube Cluster(kubectx) 변경 툴을 사용해 보세요.
  4. 현재 실행 중인 Cluster 이름 및 네임스페이스를 Bash PS(Prompt Status)에 출력하는 툴(kube ps)을 사용해 보세요. Kube 네임 스페이스를 변경하여 Bash Prompt를 확인 합니다.
  5. 단일 네임스페이스 내 여러 개의 POD 로그를 동시에 확인하는 Tool(kube tail)을 설치하세요.
  6. YAML Export 시 사용이 편리한 Kube neat Tool을 설치하세요.

POD

  1. 명령어를 사용하여 NGINX Deployment(이하 deploy) POD를 생성하세요.
  2. 현재 실행 중인 POD 리스트를 나열하세요.
  3. Default와 kube-system 네임 스페이스의 POD 리스트를 나열하세요.
  4. Kube Control Plane에서 사용하는 POD의 기능에 대하여 간단히 설명해 보세요.
  5. 전체 네임 스페이스의 파드 리스트를 확인해 보세요.
  6. POD의 개수를 10개, 0개, 1개 등으로 변경해 보세요.
  7. POD에 접속(sh 또는 bash 실행)하여 df, ps aux 등의 명령어를 실행해 보세요. 일반 VM과 어떤 차이가 있나요?

YAML Code

  1. 명령어를 이용하여 Busybox Deploy를 생성하세요.
  2. YAML 파일(kube manifest)을 이용하여 busybox deploy를 생성하세요. Deploy YAML 내 “command” 옵션을 이용 합니다. 명령어로 실행하는 것과 왜 차이가 있을까요?
  3. 실행 중인 NGINX Deploy를 YAML 파일로 Export 하세요. 좀 더 보기가 용이한 YAML 파일로 Export 하세요.
  4. NGINX 1.19.8 이미지 버전으로 deploy를 생성하세요.

기본 명령어

  1. 실행 중인 NGINX POD의 IP 및 노드 정보를 확인 하세요.
  2. NGINX POD의 상세 정보를 확인 하세요. 이미지 버전, Annotation 등.
  3. NGINX 1.19.8 이미지 1) POD를 삭제하세요. POD가 재 시작되는 이유가 무엇일까요? 2) Deploy를 삭제하세요.

TroubleShooting - Log & Event

  1. nginx 이미지 버전을 no-ver 으로 변경해 보세요. pod 리스트를 확인해 보세요.
  2. 에러 발생하는 nginx pod의 상세 정보를 확인해 보세요.
  3. kube cluster event를 확인해 보세요.
  4. 1) Warning type 메시지만 확인해 보세요.
  5. 2) 시간 순으로 정렬해 보세요.
  6. 정상 실행 중인 nginx pod의 로그를 확인해 보세요. following 옵션을 이용하세요. 확인 후 에러 발생하는 NGINX deploy를 삭제하세요.

Service

  1. NGINX deploy에 app: nginx label를 추가하여 실행해 보세요.
  2. 위 실행한 NGINX POD를 외부에서 접속 가능하도록 NodePort Type의 Service를 생성해 보세요.
  3. 외부에서 nginx application 접속해 보세요.
  4. busybox pod에 접속하여 DNS 서버 및 search 옵션을 확인해 보세요. DNS 서버는 어떤 걸 사용하나요?
  5. busybox deploy를 별도의 네임스페이스(test 등)에서 실행하세요. busybox pod에서 nginx pod로 연결 가능한 도메인 리스트를 나열해 보세요.

MetalLB

  1. Helm(또는 Kube Manifest)을 이용하여 MetalLB를 설치해 보세요. 외부에서 접속 가능한 Load Balancer IP 대역을 미리 준비합니다.
  2. nginxdemos/hello 이미지 + Replicas 5ea를 옵션으로 하는 NGINX Deploy를 생성하세요.
  3. 위 POD를 이용하여 LoadBalancer Type의 NGINX Service를 생성해 보세요.
  4. Endpoint 리스트를 확인해 보세요.
  5. 브라우저에서 nginxdemo pod에 접속합니다.
  6. curl 사용하여 nginxdemo pod의 load balancing 확인합니다.

Volume

  1. 현재 사용 가능한 Storage Class 나열하세요.
  2. OpenEBS-Hostpath Storage Class를 설치 하세요. 설치 시 Node 디렉토리를 디폴트가 아닌 /data (혹은 임의 디렉토리)로 지정하세요.
  3. 생성된 SC를 사용하여 default-pvc 이름의 PVC를 생성 하세요.
  4. 해당 PVC를 사용하는 임의의 POD를 생성해 보세요. 읽고 쓰기가 정상적인지 확인하세요.
  5. Pod가 실행 중인 노드를 리부팅 합니다. pod가 다른 노드에서 실행 되나요?
  6. IO 성능 측정 툴(fio) 이용하여 IOPS를 측정하세요

Helm MySQL

  1. Helm tool을 설치 합니다.
  2. Helm Chart를 이용하여 MySQL Application을 배포해 보세요. 설치 시 Chart 파일을 로컬에 다운 받아서 StorageClass 옵션을 OpenEBS-Hostpath으로 변경하여 설치 하세요.
  3. 생성된 PVC(Persistent Volume Claim) 리스트를 나열해 보세요.
  4. MySQL Service 타입을 확인해 보세요.
  5. nginx pod에서 MySQL pod로 ping 연결 테스트를 해 보세요. MySQL POD를 재시작하여 IP 변경 후 다시 연결해 보세요.

Helm Redis

  1. Helm Chart를 사용하여 Redis Application을 배포하세요. Pod는 3개를 배포 합니다.
  2. 배포된 Redis의 authPassword 변수를 변경하여 Helm 재 배포 하세요.
  3. Helm Chart에 포함된 노드 Affinity 설정을 확인하고 간단히 설명해 보세요.

일반

  1. 현재 Cluster의 Kube Version, Node IP 및 Container Runtime 정보를 확인해 보세요.
  2. 특정 Node의 전체 POD를 Terminate 하세요.
  3. cordon 된 노드를 다시 Scheduling 가능하도록 하세요.

ConfigMap & Secret

  1. 현재 사용 중인 MySQL ConfigMap 과 Secret 리스트를 확인해 보세요.
  2. ConfigMap, Secret 상세 정보를 확인해 보세요.
  3. POD에 접속하여 해당 ConfigMap 파일을 확인해 보세요.
  4. ConfigMap을 수정하여 MySQL Port를 default 3306 -> 13306 변경해 보세요. POD에 접속하여 해당 ConfigMap 파일을 확인해 보세요.
  5. 변경된 ConfigMap을 POD에 적용해 보세요.
  6. MySQL root 패스워드를 decrypt 해 보세요. root 패스워드를 임의의 패스워드(P@ssw0rd 등)으로 변경하여 새로 Secret 생성해 보세요.
  7. Vault 사용하여 secret 파일을 보호하세요.

User & RBAC

  1. 특정 네임스페이스(test)만 한정하여 POD, Volume, Service 등 Create, Get, List 등 권한이 가능한 ClusterRole, ClusterRoleBinding을 생성하세요.
  2. 해당 Config 설정 권한을 가지는 User로 변경하세요. 변경 후 타 네임스페이스의 POD 조회 및 생성 해 보세요.

Prometheus

  1. Metric 서버를 설치하세요. 설치 후 k top 명령어로 노드 및 POD의 CPU, Memory 사용량을 확인하세요.
  2. Helm 이용하여 prometheus-stack 설치하세요. 설치 옵션으로 로그 보관주기 6개월, prometheus/grafana/alertmanager 의 service type을 nodeport로 설정하세요.
  3. prometheus web ui 접속하세요
  4. 그래프로 특정 pod의 iops, cpu 사용량을 확인하세요

Grafana

  1. grafana 사이트에 접속 하세요.
  2. Cluster 전체 Node의 cpu, memory, network 등의 resource 사용량을 기본 제공되는 dashboard에서 확인 하세요.
  3. Cluster 전체 POD, Deploy 수량 및 각 POD 별 Resource 사용량 등을 확인해 보세요.
  4. grafana 홈페이지에서 임의의 template 대시보드를 추가하세요.
  5. 특정 대시보드 Panel 만 다른 대시보드에 추가하세요.

AlertManager

  1. alertmanger 접속해 보세요.
  2. Alert 발생 시 메일 전송하는 메일 계정을 추가하세요. (또는 Slack 연동)
  3. node rebooting 하여 Alert이 정상적으로 실행되는지 확인하세요.
  4. nginx 이미지의 버전을 no-ver으로 변경하세요. alertmanager 및 prometheus 에서 alert을 확인하세요. 해당 메시지를 임시로 alert 중지하세요.

Loki

  1. helm 이용하여 Loki 설치하세요. 로그 보관 주기를 4주로 설정합니다.
  2. Grafana에서 Loki Data Source를 추가합니다. Grafana Loki 대시보드를 확인 합니다.
  3. NGINX 로그 파일을 확인 합니다.
  4. NGINX POD를 재시작합니다. 종료된 POD 로그를 Loki 대시보드에서 확인 합니다.
  5. Warning 로그만 Filtering 하여 대시보드에서 확인 합니다.

Storage Snapshot w/ Rook-Ceph

  1. Helm Chart를 이용하여 rook-ceph 스토리지를 설치하세요.
  2. rook-ceph-block StorageClass를 추가합니다.
  3. Kube 공식 홈페이지를 참조하여 wordpress blog application을 설치 합니다. Wordpress 블로그에서 테스트 페이지를 포스팅 합니다.
  4. Wordpress MySQL PVC의 Snapshot을 생성합니다.
  5. MySQL PVC 삭제 합니다. wordpress 사이트를 확인합니다. 이 후 snapshot 이용하여 복구 합니다. 다시 wordpress 사이트를 확인 합니다.
  6. Snapshot을 이용하여 기존 PVC 이 외 추가 PVC를 생성하여 볼륨을 복구 합니다.
  7. IO 성능 측정 툴(fio) 이용하여 ceph Storage Class의 IOPS를 측정하세요

Rook-ceph & NFS

  1. NFS type의 rook-ceph-cephfs Storage Class 설치하세요.
  2. NGINX Deploy를 생성합니다. 옵션으로 /var/www/root 디렉토리 NFS로 Replica는 5개로 지정합니다.

Harbor

  1. Helm 이용하여 Harbor 설치 합니다.
  2. docker 명령어를 사용하여 생성한 Harbor Repository에 임의의 컨테이너 이미지를 Push 합니다.
  3. YAML 파일 내 컨테이너 이미지 Repository를 Harbor로 변경합니다. 정상적으로 POD Deploy 되는지 확인 합니다.
  4. 이미지 Upload 시 자동으로 이미지 보안 Scan 하도록 설정합니다. NGINX 이미지의 vulnerability 를 확인 합니다.

GitLab

  1. Helm 이용하여 GitLab 설치합니다.
  2. 로컬 디렉토리에서 Git init, Push, Pull 검증합니다.

ArgoCD for GitOps

  1. ArgoCD 설치. 위에서 생성한 컨테이너 레지스트리 & Git Source 등록합니다.
  2. ArgoCD 이용 NGINX Deploy 배포 합니다.
  3. ArgoCD 이용하여 Redis Helm 차트를 배포 합니다.

Traefik

  1. Traefik 설치
  2. 복수 도메인, URL Path 구분하여 서비스를 분기 합니다. Port별로 구분하여 서비스 분기 합니다.
  3. Custom TLS 인증서 연동
  4. Prometheus Traefik 모니터링 추가

Polaris

  1. Polaris 설치 및 전체 Polaris 대시보드 확인
  2. Helm으로 설치한 Redis Application 보안 취약점 제거

Cluster 업그레이드 및 노드 추가/삭제

  1. Kube Cluster 버전을 업그레이드 합니다.
  2. Cluster에 노드를 추가, 삭제 합니다.

부하 및 HA 테스트

  1. 부하 테스트 Tool(k6 or JMeter)을 사용하여 초당 100회 부하 테스트를 수행합니다.
  2. 특정 노드의 전체 POD를 삭제해 보세요. 임의의 Wordpress 블로그 등의 서비스가 노드 Down 시 이상 없는지 확인 합니다.

Kyverno

  1. POD 배포 시 Startup/Liveness Probe + Resource Limit/Requests 설정을 반드시(혹은 Warning) 포함하도록 Kyverno 정책을 적용해 보세요.

kube-bench

  1. kube-bench Tool을 사용하여 CIS Kubernetes Benchmark 실행해 보세요.

Kube-hunter

  • kube hunter Tool을 사용하여 Kubernetes 사용 중인 Port 취약점을 확인해 보세요.
반응형