[K8S - LAB - 02] 오답 노트 - CKAD
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: 로그를 확인하려는 컨테이너의 이름