Certificate/CKA

CKA Troubleshooting - Application Failure 문제 분석 및 해결

ygtoken 2025. 3. 4. 20:32
728x90

CKA(Certified Kubernetes Administrator) 시험에서는 Kubernetes 클러스터 내 애플리케이션의 장애를 진단하고 해결하는 능력이 중요한 평가 요소입니다. 본 글에서는 'Application Failure' 문제를 상세히 분석하고 해결 방법을 설명하겠습니다.


1. 문제 설명: 애플리케이션 장애(Application Failure)

📌 출제 의도

이 문제는 Kubernetes 클러스터에서 애플리케이션이 정상적으로 동작하지 않는 원인을 분석하고 해결하는 능력을 평가합니다. 주요 진단 항목은 다음과 같습니다.

  • 서비스(Service) 설정 오류 (Selector, Port 설정 문제)
  • 애플리케이션의 환경 변수(Environment Variables) 설정 오류
  • 네임스페이스(namespace) 문제
  • 데이터베이스 접근 설정 오류

문제 상황

  1. webapp-mysql 애플리케이션이 mysql-service와 통신해야 하지만, 정상적으로 작동하지 않습니다.
  2. mysql-service가 webapp-mysql이 데이터베이스(MySQL)에 접근할 수 있도록 설정되어야 합니다.
  3. webapp-mysql Pod의 환경 변수 설정이 올바르지 않아 DB 접속에 실패할 가능성이 있습니다.
  4. mysql-service의 Selector 또는 Port 설정이 잘못되어 MySQL Pod과 연결되지 않았을 수 있습니다.

2. 문제 해결 접근법

1단계: mysql-service의 Selector 및 Port 확인

먼저, mysql-service의 Selector와 Port 설정을 확인하여 mysql Pod과 올바르게 연결되고 있는지 확인해야 합니다.

kubectl -n gamma describe svc mysql-service

출력된 결과에서 Selector 값이 올바르게 설정되어 있는지 확인합니다. 잘못된 경우 다음과 같이 수정해야 합니다.

📌 수정된 mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-service  # MySQL 서비스 이름 확인
  namespace: gamma  # 올바른 네임스페이스 설정
spec:
  ports:
    - port: 3306  # MySQL 기본 포트
      targetPort: 3306  # MySQL Pod이 리스닝하는 포트
  selector:
    app: mysql  # MySQL Pod을 정확하게 선택해야 함

📝 설명:

  • namespace: gamma 네임스페이스 내에서 서비스가 동작하도록 설정해야 합니다.
  • selector: app: mysql 라벨을 가진 Pod과 연결되도록 수정합니다.
  • ports: MySQL Pod이 수신하는 포트를 올바르게 지정해야 합니다.

2단계: webapp-mysql의 환경 변수 수정

webapp-mysql 애플리케이션이 MySQL 서비스에 접근할 때 사용하는 환경 변수가 올바르게 설정되지 않았다면, MySQL 연결이 실패할 수 있습니다.

kubectl -n gamma describe pod webapp-mysql | grep -i DB_

환경 변수가 잘못된 경우 Deployment를 수정해야 합니다.

📌 수정된 webapp-mysql Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-mysql
  namespace: gamma
spec:
  replicas: 1  # 단일 인스턴스 실행
  selector:
    matchLabels:
      app: webapp-mysql
  template:
    metadata:
      labels:
        app: webapp-mysql
    spec:
      containers:
      - name: webapp-container
        image: my-webapp:latest
        env:
          - name: DB_Host
            value: mysql-service  # MySQL 서비스의 올바른 이름 설정
          - name: DB_User
            value: root  # MySQL 사용자 이름
          - name: DB_Password
            value: password  # MySQL 비밀번호 확인 필요

📝 설명:

  • DB_Host: mysql-service로 설정하여 MySQL 서비스와 올바르게 연결되도록 합니다.
  • DB_User, DB_Password: MySQL 접속 정보가 정확한지 확인합니다.

3단계: web-service의 NodePort 수정

애플리케이션이 외부에서 접근 가능해야 한다면, NodePort를 올바르게 설정해야 합니다.

📌 수정된 web-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: web-service
  namespace: zeta
spec:
  ports:
    - nodePort: 30081  # 외부에서 접근할 수 있도록 NodePort 설정
      port: 8080  # 서비스가 내부에서 사용하는 포트
      targetPort: 8080  # Pod 내부 컨테이너가 사용하는 포트
  selector:
    app: webapp-mysql  # 올바른 Pod과 연결되도록 설정
  type: NodePort  # 외부 노출을 위한 NodePort 설정

📝 설명:

  • nodePort: 30081로 설정하여 외부에서 해당 서비스에 접근할 수 있도록 합니다.
  • targetPort: webapp-mysql 컨테이너가 실제로 요청을 처리하는 포트를 가리켜야 합니다.
  • selector: 올바른 Pod을 대상으로 설정해야 합니다.

3. 결론

위 단계를 거쳐 webapp-mysql 애플리케이션이 정상적으로 MySQL과 통신할 수 있습니다. Kubernetes에서 애플리케이션 장애를 해결할 때는 다음 접근법을 기억하세요.

문제 해결 접근법 정리

  1. 서비스와 Pod 연결 확인 → kubectl describe svc <서비스명>
  2. 환경 변수 설정 확인 → kubectl describe pod <pod명>
  3. NodePort 설정 확인 → kubectl get svc -o yaml
  4. YAML 파일 수정 후 다시 적용 → kubectl apply -f <파일명>

 

728x90