이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Kubernetes] Certified Kubernetes Administrator 연습 (3)

  • 2026.08.06 10:49
  • DevOps/Docker && Kubernetes
반응형

 

 

 

Q1. GPU 작업용 워크로드를 minikube-m03 노드에 배포하려는데 Pod이 안뜬다. m03노드는 GPU 전용임. 일반 워크로드가 못 들어오도록 설정해뒀음. m03 기본설정은 유지하되 Pod 2개가 m03에서 Running 되도록 조치하기. 

 

특정 노드에 Pod를 배치하지 않도록 설정하는건 taint. toleration은 그 거부 표시를 견딜 수 있음을 명시하는 표식으로 Pod에 붙인다.

 

0/3 nodes are available:
  1 node(s) had untolerated taint(s)                    ← m03: taint 있는데 Pod에 통행증 없음
  2 node(s) didn't match Pod's node affinity/selector   ← minikube, m02: nodeSelector가 m03을 지정했으니 당연히 안 맞음

 

나머지 2개는 원래 배제 대상이고 한개는 확인해 봐야 함. untolerated taint는 Pod이 taint를 견딜 toleration이 없음을 의미함. 

 

13months@13monthsBook k8s % k describe node minikube-m03 | grep -i taint
Taints:             dedicated=gpu:NoSchedule
13months@13monthsBook k8s % k edit deployment gpu-job -n prod
deployment.apps/gpu-job edited
13months@13monthsBook k8s % k get pods -n prod -o wide       
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
gpu-job-6c765f4fff-9rb66   1/1     Running   0          5s    10.244.2.39   minikube-m03   <none>           <none>
gpu-job-6c765f4fff-mq7h5   1/1     Running   0          3s    10.244.2.40   minikube-m03   <none>           <none>
13months@13monthsBook k8s %

 

Pod에 toleration을 추가하면 된다. 위치는 spec.template.spec 아래, containers 옆에다가 배치하면 됨. 

taint를 확인하고 그대로 YAML에 적으면 된다. operator: Equal은 고정으로 붙임. 그냥 k8s docs에서 복붙하면 되긴해.

 

 


 

 

 

Q2. 모니터링 담당자가 monitor-sa 계정으로 prod namespace의 Pod을 조회하려는데 권한이 없다고 함. 고쳐라. 

 

13months@13monthsBook k8s % k auth can-i get pods --as=system:serviceaccount:prod:monitor-sa -n prod
no
13months@13monthsBook k8s % k auth can-i list pods --as=system:serviceaccount:prod:monitor-sa -n prod
no
13months@13monthsBook k8s %

 

can-i 로 확인해보면 진짜 안되는걸 확인할 수 있음. 

 

13months@13monthsBook k8s % k describe role pod-reader -n prod
Name:         pod-reader
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  services   []                 []              [get list]
13months@13monthsBook k8s % k describe rolebinding monitor-binding -n prod
Name:         monitor-binding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  pod-reader
Subjects:
  Kind            Name        Namespace
  ----            ----        ---------
  ServiceAccount  monitor-sa  prod
13months@13monthsBook k8s %

 

Role의 이름은 pod-reader인데 권한은 services 관련 권한으로 설정되어있음. 

일단 rolebinding은 정상이다. 

 

pod-reader를 수정하면 됨. k edit으로 수정하면 된다. 

 

1. 리소스 이름이니까 k get role -n prod 로 이름을 찾아준다.

2. can-i 명령어로 무슨 리소스에 대한 무슨 동작을 누구의 권한에서 수행할 수 있는지 확인할 수 있음 

3. describe role 도 마찬가지임 그냥 쓰던대로 해 

 

 

 


 

 

 

Q3. DB 서비스 배포했는데 Pod이 안뜬다. 고치고 /var/lib/data 에 볼륨 마운트되도록 수정하기 

 

Pod이 안 뜨면 STATUS 부터 봐야함. YAML에는 볼륨이 있으니 PVC도 함께 확인해야 함. 

볼륨을 쓴다면 Pod와 PVC를 한 세트로 봐야 한다. (k get pods, k get pvc)

 

PVC가 Pending이면 당연히 Pod도 Pending이다. PVC 부터 고쳐야함.

k describe pvc data-claim -n prod로 확인해보니 fast-ssd 를 못찾는다고 함. 이게 머임? 이건 storageClass임. k get storageClass로 확인해보면 standard 하나만 뜬다. PVC는 fast-ssd를 요구하니까 이 부분을 고쳐야 함. 

 

k edit pvc 로 고치려는데 안된다. pvc는 immutable이니까.. 한 번 만들면 수정이 안 됨. 삭제 후 재작성 해야 한다. 먼저 Pod가 쓰고 있으니 Deployment를 먼저 삭제하고 PVC를 삭제해야 한다. vim 으로 storage-issue.yaml을 수정하고 재생성한다. standard가 기본이니 그 줄을 그냥 지워버리는게 합리적이다. 

 

바꾸고 나니까 아직도 Pending 인데 Events를 확인하자. provisioner를 확인하라고 함. k get pods -n kube-system으로 확인해보면 프로비저너가 없는걸 확인할 수 있음. 즉, 클러스터 문제라는거임. 그러니 minikube addons enable storage-provisioner로 활성화 해 주면 해결됨. 

 

 

 


 

 

Q4. prod namespace에 로깅 에이전트를 배포해야 함. 노드 하나에 정확하게 하나씩 실행되어야 함. log-agent / busybox:1.36 / sh -c "while true; do echo collecting; sleep 30; done" 마스터 노드에도 배치되어야 함. 

 

Deployemnt로 replicas: 3을 지정해도 스케쥴러가 노드 한개에 2개를 몰아줄 수 있음. 그러니 노드마다 한개를 강제하려면 DaemonSet을 사용해야 한다. Deployment yaml 템플릿에서 kind 부분만 바꿔주면 됨. 

 

minikube는 마스터 노드도 Pod를 배치할 수 있어서 그냥 그대로 쓰면 된다. 

 

k create deployment log-agent --image=busybox:1.36 -n prod --dry-run=client -o yaml > agent.yaml

템플릿 뽑고 거기다가 kind 바꾸고 replicas 삭제하고 strategy 삭제하면 된다. 

 

혹시나 노드 중에서 taint 붙어있는거 있을 수 있으니 최종 점검하고 확인하면 됨. DaemonSet도 taint를 무시할 수는 없다. 

그리고 yaml 작성할 때 commands 위치도 좀 알아두면 좋을듯.. "sh" "-c" "나머지" 이런 순서로 배치해야 한다. 

 

 

 


 

 

 

Q5. 프론트 배포했는데 서비스가 불안정함. frontend Pod 정상으로 만들고 SITE_NAME 환경변수 체크하고 frontend-svc로 접속되도록 수정하기.

 

서비스가 불안정하다는건 아예 안뜨는게 아니라 떴다 죽었다를 반복하는 것. get pods 에서 RESTARTS 되는걸 확인한다.

describe로 확인해보면 Pod는 잘 뜸. 에러도 없음. 그런데 SIGQUIT를 받고 죽었다는건? 누군가 외부에서 죽인거다. 쿠버가 죽인듯. 

 

Events를 보면 Liveness Probe에서 실패해서 재시작중이라고 함. 실패하면 컨테이너를 재시작하는거니까.. 

컨테이너가 듣는 포트는 80인데 실제로 헬스체크하는 포트는 8080이다. k edit deployment로 수정해줬음. 

 

echo로 환경변수 찍을 때는 " " 말고 ' ' 로 감싸줘야 정상작동함. 

 

 


 

 

 

Q6. 리포트 서비스를 배포했는데 Pod이 만들어지지 않음. 아예 안보임. 고쳐보기.

 

k get pods 했더니 없음. 그러면 describe deployment로 확인한다.

must specify limits.cpu limits.memory 라고 함. 이러면 requests를 설정해 줘야 하는걸 알 수 있음. 

 

resources는 컨테이너의 속성이니 containers의 아래, image name과 같은 라벨로 위치시켜야 함. 

컨테이너의 속성은 containers 안에다가 배치하고 pod의 속성은 template.spec 아래에 배치한다. 

헷갈리면 Managing Resources for Containers 를 k8s docs에 검색하면 됨. 

 

 

 


 

 

 

Q7. 매 분 마다 실행되는 백업 작업을 배포했는데 작업이 완료되지 않고 있음. CronJob은 만들어졌고 Job도 생성됨. 고쳐보기.

 

CronJob  ──(시간 되면)──>  Job  ──(만듦)──>  Pod
  틀                      실행 단위          실제 작업

 

CronJob은 작업을 반복해서 실행하라는 규칙이고, Job은 그 실제로 만들어진 작업을 의미한다. Pod는 Job이 실행하는 컨테이너임.

Deployment -> ReplicaSet -> Pod 계층과 유사하다.

 

k get cronjob -n prod 
k get jobs -n prod       
k get pods -n prod     

 

Job은 생기는데 Pod가 안생김. 그러니 describe job 으로 확인해보자.

확인하면 또 request와 limit를 설정해 줘야 한다고 함. 그러면 CronJob을 수정해서 해당 부분을 명시해 주면 됨. 

위치는 컨테이너와 같은 위치.

 

또 안된다. 이번에는 describe pod을 본다. 확인해보니 ConfigMap 이름 문제임. 

CronJob을 수정해서 이름 맞춰주면 된다. 

 

다만 Deployment와 다르게 CronJob을 고쳐도 이미 만들어진 Job은 수정되지 않음. 그러니 k delete job --all -n prod 로 모두 삭제한 후 확인하면 된다. 

 

 

 


 

 

 

Q8. API 게이트웨이를 배포했는데 서비스로 접속이 안된다. Pod는 살아있는 상태. gateway-svc로 정상 접속되도록 고치기. 

 

k get pods로 확인했을 때 Running 이지만 READY 컬럼이 0/1 상태임. 뭔가 문제가 있다.

k describe svc 와 pod로 봤을 때 Endpoints가 비어있음. 그런데 Selector는 정상이네? 

pod를 보니 /healthz 로 요청을 보내고 있다. 

 

/healthz 경로가 nginx에 없으니 404를 뱉고, READY 0/1이 되는 것. 그러니 Service가 Endpoints에서 제거되는거고.. 

READY가 0/1 이면 Selector가 아니라 다른걸 봐야한다. 

 

k describe로 볼 때 | less 를 사용하면 vim 처럼 확인할 수 있음. 

 

 

 


 

 

 

Q9. 장바구니 API가 배포가 안되고 서비스도 동작하지 않음. MODE 환경변수 확인하고 8080으로 접속되도록 확인하기 

 

Deployment의 selector는 immutable이다. 그러니 바꾸려면 삭제 후 재생성 해야 함.

Service의 selector는 수정할 수 있으니 라벨 불일치 문제는 Service쪽을 수정하는게 합리적임.

 

 

 

 

 

반응형
저작자표시 (새창열림)

'DevOps > Docker && Kubernetes' 카테고리의 다른 글

[Kubernetes] kubectl 연습 - namespace와 Secret  (0) 2026.08.20
[Kubernetes] Certified Kubernetes Administrator 연습 (4)  (0) 2026.08.17
[Kubernetes] kubectl 연습 - RoleBinding  (0) 2026.07.26
[Kubernetes] kubectl 연습 - Deployment ReplicaSet  (0) 2026.07.21
[Kubernetes] Kubernetes Concept  (0) 2026.07.21

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Kubernetes] kubectl 연습 - namespace와 Secret

    [Kubernetes] kubectl 연습 - namespace와 Secret

    2026.08.20
  • [Kubernetes] Certified Kubernetes Administrator 연습 (4)

    [Kubernetes] Certified Kubernetes Administrator 연습 (4)

    2026.08.17
  • [Kubernetes] kubectl 연습 - RoleBinding

    [Kubernetes] kubectl 연습 - RoleBinding

    2026.07.26
  • [Kubernetes] kubectl 연습 - Deployment ReplicaSet

    [Kubernetes] kubectl 연습 - Deployment ReplicaSet

    2026.07.21
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (717) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (163)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Data Science (11)
      • Embedded Software (10)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (27) N
      • Docker && Kubernetes (14) N
      • Jenkins (4)
      • Cloud Service (9)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (12)
    • 💬 기록 (15)
    • 📚 논문 (7)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Daum. Copyright © i3months.

티스토리툴바