Study/K8S

[K8S - LAB - 02] 오답 노트 - CKAD

monitor 2023. 6. 3. 18:07

1. Pod에서 network 연결이 되지 않는 문제였다. 자세히 보니 문제점은 아래 이미지와 같았고 처리를 위해서 pod의 readinessProbe를 확인하였다.

 

spec:
  containers:
  - image: kodekloud/nginx
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 9080
      protocol: TCP
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 8080
        scheme: HTTP
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

readinessProbe는 container의 ready 상태를 먼저 알아보는 것인데 containerPort가 9080으로 열려 있는데 readinessProbe.port의 요청을 8080으로 하고 있으니 잘 못 되었다.

 

이는 아래와 같이 고치면 된다.

 

spec:
  containers:
  - image: kodekloud/nginx
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 9080
      protocol: TCP
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 9080
        scheme: HTTP
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

 

 

 

2. my-busybox라는 pod를 만드는데 namespace는 dev2406이고 image는 busybox를 사용 그리고 container는 secret으로 불려야하고(name을 secret으로 하라는 말이다.) sleep 3600 실행되어야한다.

 

container는 readonly 방식으로 secret volume을 secret-volume으로 불리는 것을 /etc/secret-volume으로 mount해야한다. 

이 secret은 dotfile-secret으로 만들어져있다.  

 

이 pod는 controlplane으로만 배정되어야한다.

apiVersion: v1
kind: Pod
metadata:
  name: my-busybox
  namespace: dev2406
spec:
  nodeName: controlplane #nodeSelector를 쓰는 것 보다 간단하게 node이름으로 연결 가능하다.
  containers:
    - name: secret #컨테이너 이름 secret으로 지정해줌
      image: busybox
      command: ["sleep", "3600"] #sleep 3600 실행
      volumeMounts:
        - name: secret-volume
          mountPath: /etc/secret-volume # 컨테이너 내부에서 마운트 되어질 위치
          readOnly: true # readOnly로 가져와서 읽기만
  volumes:
    - name: secret-volume 
      secret:
        secretName: dotfile-secret #이 secret을 쓴다고 문제에서 말함

 

사실 때어 놓고 하나씩 보면 쉬운 문제이나 중간 중간 해석을 이상하게 해서 하나씩 나사가 빠져 점수가 날아갈 수 있다.

 

 

3. Ingress 문제

video-service가 http://watch.ecom-store.com:30093/video 로 로 접근이 가능해야한다. 

http://apparels.ecom-store.com:30093/wear으로  apparels-service 접근 가능해야 함.

 

그런데 이미 ingress controller가 30093 port를 사용중이라고 한다.

 

오답 제출 건은 아래와 같습니다.

 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-vh-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: watch.ecom-store.com
    http:
      paths:
      - pathType: Prefix
        path: "/video"
        backend:
          service:
            name: video-service
            port:
              number: 30093
  - host: apparels.ecom-store.com
    http:
      paths:
      - pathType: Prefix
        path: "/wear"
        backend:
          service:
            name: apparels-service
            port:
              number: 30093

이렇게 구성을 하였는데 틀려서 찾아보니 apparels-service와 video-service가 각각 8080 포트로 연결하고 있었다.

 

착각을 해서 정리해보니 ingressController가 들어오는 port 번호를 열어주고 그에 따른 처리를 ingress 설정에 따라서 들어오는 것인데 그러면 외부에서 접속할 때는 ingressController가 설정해준 30092로 접속하고 그 이후로는 service에 접근하기 위해서 service 내부 접근 port로 열어야 한다.

 

정리 : 인그레스 컨트롤러는 30093 포트를 통해 이러한 트래픽을 수신하고, 각 서비스는 8080 포트에서 실행되고 있는 컨테이너로 트래픽을 전달합니다.

 

정답 코드

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-vh-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: watch.ecom-store.com
    http:
      paths:
      - pathType: Prefix
        path: "/video"
        backend:
          service:
            name: video-service
            port:
              number: 8080
  - host: apparels.ecom-store.com
    http:
      paths:
      - pathType: Prefix
        path: "/wear"
        backend:
          service:
            name: apparels-service
            port:
              number: 8080

 

4. A pod called dev-pod-dind-878516 has been deployed in the default namespace. Inspect the logs for the container called log-x and redirect the warnings to /opt/dind-878516_logs.txt on the controlplane node

 

kubectl logs dev-pod-dind-878516 -c log-x | grep WARNING >  /opt/dind-878516_logs.txt

 

kubectl logs dev-pod-dind-878516 -c log-x: "dev-pod-dind-878516"라는 이름의 Pod에서 "log-x"라는 이름의 컨테이너의 로그를 가져옴

 

  • kubectl logs: Pod의 로그를 출력
  • dev-pod-dind-878516: 로그를 확인하려는 Pod의 이름
  • -c log-x: 로그를 확인하려는 컨테이너의 이름