포스트

[CKA] TroubleShooting - 1

[CKA] TroubleShooting - 1

Case 1-1. Service의 이름이 잘못 명명됨

image.png

2계층 구조의 web service에서 접속이 되지 않는다.

pod와 svc, ep를 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
controlplane ~ ➜  k get pods -n alpha
NAME                            READY   STATUS    RESTARTS   AGE
mysql                           1/1     Running   0          3m31s
webapp-mysql-5c4c675768-qw4vb   1/1     Running   0          3m31s

controlplane ~ ➜  k get svc -n alpha
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mysql         ClusterIP   10.43.8.147    <none>        3306/TCP         3m41s
web-service   NodePort    10.43.61.170   <none>        8080:30081/TCP   3m41s

controlplane ~ ➜  k get ep -n alpha
NAME          ENDPOINTS         AGE
mysql         10.22.0.9:3306    8m20s
web-service   10.22.0.10:8080   8m20s

svc 항목의 name이 이상함을 확인할 수 있다. 아키텍쳐에서는 MySQL의 svc의 이름이 mysql-service로 되어 있지만, 실제 get svc에서 나오는 항목에 대해서는 svc명이 mysql로 되어 있다.

yaml 파일을 수정

1
2
3
4
5
6
7
controlplane ~ ✖ k get svc mysql -n alpha -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2025-06-03T07:46:29Z"
  name: mysql # <- 여기가 이상하다. mysql-service로 변경이 필요해보임
  namespace: alpha

yaml을 수정하고 재배포 하니 문제가 해결됨

1
2
3
4
5
controlplane ~ ➜  k delete svc mysql -n alpha
service "mysql" deleted

controlplane ~ ➜  k apply -f mysql-service.yml 
service/mysql-service created

Case 1-2. svc의 TargetPort가 잘못됨

svc의 target port를 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
controlplane ~ ➜  k describe svc mysql-service -n beta
Name:                     mysql-service
Namespace:                beta
Labels:                   <none>
Annotations:              <none>
Selector:                 name=mysql
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.43.97.173
IPs:                      10.43.97.173
Port:                     <unset>  3306/TCP
TargetPort:               8080/TCP
Endpoints:                10.22.0.11:8080
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

위의 이미지에서 mysql-service 의 pod는 mysql container로 국룰 port인 3306을 사용한다. 하지만 현재 mysql-service의 target port는 8080으로 잘못된 port가 설정되어 있다.

Case 1-3. svc의 Endpoint가 없음

mysql-service의 endpoint가 없는 것을 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
controlplane ~ ➜  k describe svc mysql-service -n gamma
Name:                     mysql-service
Namespace:                gamma
Labels:                   <none>
Annotations:              <none>
Selector:                 name=sql00001
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.43.138.8
IPs:                      10.43.138.8
Port:                     <unset>  3306/TCP
TargetPort:               3306/TCP
Endpoints:                
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

Endpoint를 비어져 있다는 것은 svc가 연결된 pod가 없다는 것을 의미한다. 그렇기에 본래 연결되어야할 mysql pod를 연결할 필요가 있다.

yaml을 수정하여 selector의 target을 적절한 이름으로 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
controlplane ~ ✖ k get svc mysql-service -n gamma -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2025-06-03T08:44:30Z"
  name: mysql-service
  namespace: gamma
  resourceVersion: "1039"
  uid: 1c098933-389e-4905-85cd-74fd44b49363
spec:
  clusterIP: 10.43.138.8
  clusterIPs:
  - 10.43.138.8
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
  selector:
    name: sql00001 # 이거를 본래 연결되어여할 pod의 이름인 mysql로 변경
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

Case 2

Case2-1. Cluster가 정상적으로 작동하지 않음

1
2
3
controlplane ~ ➜  k get deploy
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
app    0/1     1            0   

app deploy가 정상적으로 작동되지 않는다. pod나 deploy 모두 describe로 검사를 하였지만 별도의 문제는 발견되지 않는다. pod의 log 를 확인해도 log가 떨어지지 않은 상태이다.

kube-system을 확인하여 cluster의 상태를 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
controlplane ~ ✖ k get pods -n kube-system
NAME                                   READY   STATUS             RESTARTS      AGE
coredns-7484cd47db-hzkmf               1/1     Running            0             5m33s
coredns-7484cd47db-kbgwt               1/1     Running            0             5m33s
etcd-controlplane                      1/1     Running            0             5m41s
kube-apiserver-controlplane            1/1     Running            0             5m41s
kube-controller-manager-controlplane   1/1     Running            0             5m41s
kube-proxy-qwz8v                       1/1     Running            0             5m33s
kube-scheduler-controlplane            0/1     CrashLoopBackOff   4 (23s ago)   2m4s

controlplane ~ ✖ k get pods -n kube-system
NAME                                   READY   STATUS             RESTARTS      AGE
coredns-7484cd47db-hzkmf               1/1     Running            0             5m33s
coredns-7484cd47db-kbgwt               1/1     Running            0             5m33s
etcd-controlplane                      1/1     Running            0             5m41s
kube-apiserver-controlplane            1/1     Running            0             5m41s
kube-controller-manager-controlplane   1/1     Running            0             5m41s
kube-proxy-qwz8v                       1/1     Running            0             5m33s
kube-scheduler-controlplane            0/1     CrashLoopBackOff   4 (23s ago)   2m4s
...
Events:
  Type     Reason   Age                   From     Message
  ----     ------   ----                  ----     -------
  Normal   Pulled   45s (x5 over 2m25s)   kubelet  Container image "registry.k8s.io/kube-scheduler:v1.32.0" already present on machine
  Normal   Created  45s (x5 over 2m25s)   kubelet  Created container: kube-scheduler
  Warning  Failed   44s (x5 over 2m24s)   kubelet  Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "kube-schedulerrrr": executable file not found in $PATH: unknown
  Warning  BackOff  20s (x20 over 2m22s)  kubelet  Back-off restarting failed container kube-scheduler in pod kube-scheduler-controlplane_kube-system(e62b9c3ab48bb2ebb392179898b5495e)

kube-scheduler-controlplane의 상태가 정상적이지 않다. describe를 통해 확인 결과 exec 명령이 잘못 설정되어짐을 확인할 수 있다.

스케줄러는 kubelet이 관리하는 pod마다 있는 static pod로 재배포하기 위해서는 별도의 yaml을 배포하는 것이 아닌 특정한 경로(/etc/kubernetes/manifest)에 있는 yaml을 수정하면 kubelet이 이를 감지하여 자동으로 재배포한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
controlplane /etc/kubernetes/manifests ➜  vi kube-scheduler.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-schedulererrr -> kube-scheduler 로 수정
    
controlplane /etc/kubernetes/manifests ➜  k get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS      AGE
coredns-7484cd47db-hzkmf               1/1     Running   0             14m
coredns-7484cd47db-kbgwt               1/1     Running   0             14m
etcd-controlplane                      1/1     Running   0             14m
kube-apiserver-controlplane            1/1     Running   0             14m
kube-controller-manager-controlplane   1/1     Running   0             14m
kube-proxy-qwz8v                       1/1     Running   0             14m
kube-scheduler-controlplane            1/1     Running   1 (22s ago)   53s

스케줄러가 정상적으로 가동되어진다.

Case 2-2. deployment가 정상적으로 작동하지 않음 (scailing 문제)

1
2
3
4
5
6
7
controlplane /etc/kubernetes/manifests ➜  k get deploy
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
app    1/2     1            1           12m

controlplane /etc/kubernetes/manifests ➜  k get rs
NAME             DESIRED   CURRENT   READY   AGE
app-7f9667c9d9   1         1         1       12m

app의 deployment는 두 개의 pod를 배포할려고 하지만 이 영향이 하위 리소스인 replicaset에 적절하게 반영되지 않은 현상이 발생했다. 마찬가지로 kube-system의 원인으로 추정하고 상태를 확인한다.

1
2
3
4
5
6
7
8
9
controlplane /etc/kubernetes/manifests ➜  k get pods -n kube-system
NAME                                   READY   STATUS             RESTARTS      AGE
coredns-7484cd47db-hzkmf               1/1     Running            0             16m
coredns-7484cd47db-kbgwt               1/1     Running            0             16m
etcd-controlplane                      1/1     Running            0             16m
kube-apiserver-controlplane            1/1     Running            0             16m
kube-controller-manager-controlplane   0/1     CrashLoopBackOff   4 (42s ago)   2m15s
kube-proxy-qwz8v                       1/1     Running            0             16m
kube-scheduler-controlplane            1/1     Running            2 (65s ago)   3m34s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
controlplane /etc/kubernetes/manifests ➜  k describe pod kube-controller-manager-controlplane -n kube-system
Name:                 kube-controller-manager-controlplane
Namespace:            kube-system
Priority:             2000001000
...
--controllers=*,bootstrapsigner,tokencleaner
--kubeconfig=/etc/kubernetes/controller-manager-XXXX.conf
--leader-elect=true

controlplane /etc/kubernetes/manifests ➜  vi kube-controller-manager.yaml 
    - --cluster-name=kubernetes
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf <- 수정함

kube-controller-manager의 설정 파일의 이름이 --kubeconfig=/etc/kubernetes/controller-manager-XXXX.conf로 되어 있다. 뒤의 XXXX를 제거하여 수정 후 이를 kubelet이 자동으로 감지하여 재배포하도록 한다.

잘못된 k8s-certs를 올바른 path로 변경하기

1
2
3
4
5
6
7
8
9
10
11
  k8s-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/kubernetes/WRONG-PKI-DIRECTORY
    HostPathType:  DirectoryOrCreate
    
    
    k8s-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/kubernetes/pki
    HostPathType:  DirectoryOrCreate
  kubeconfig:

정상적으로 kube-system의 pod들이 가동되고 deploy 또한 적절하게 scaling이 되어졌다.

1
2
3
4
5
6
7
8
9
controlplane /etc/kubernetes/manifests ➜  k get pods -n kube-system
NAME                                   READY   STATUS             RESTARTS      AGE
coredns-7484cd47db-hzkmf               1/1     Running            0             16m
coredns-7484cd47db-kbgwt               1/1     Running            0             16m
etcd-controlplane                      1/1     Running            0             16m
kube-apiserver-controlplane            1/1     Running            0             16m
kube-controller-manager-controlplane   0/1     CrashLoopBackOff   4 (42s ago)   2m15s
kube-proxy-qwz8v                       1/1     Running            0             16m
kube-scheduler-controlplane            1/1     Running            2 (65s ago)   3m34s
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.