본문 바로가기

쿠버네티스

[쿠버네티스] 아키텍쳐 정리 및 간단한 실습 정리

728x90

쿠버네티스 아키텍쳐 구조도 - 그림1, 그림2 에 각각 또 필요한 부분이 빠져 있어서 그림 두개를 올림

 

그림1
그림2

쿠버네티스 주요 컴포넌트 정리

  1. kubectl (클라이언트)
    • kubectl은 사용자 콘솔에서 명령어를 통해 쿠버네티스 클러스터와 통신하는 도구입니다.
    • API 서버와 직접 통신합니다.
  2. Control Plane (k8s-master, 사용자 콘솔)
    • API Server
      • 클러스터의 핵심 컴포넌트로, 모든 외부 요청과 내부 통신을 처리합니다.
      • 다른 쿠버네티스 컴포넌트들과 상호작용합니다.
    • etcd
      • 클러스터의 설정과 상태 데이터를 key-value 형태로 저장합니다.
      • 모든 상태 정보(노드 상태, 파드 정보 등)를 보관합니다.
    • Controller Manager
      • 클러스터의 상태를 관리하는 컨트롤러 집합입니다.
      • 예를 들어, 레플리케이션 컨트롤러는 파드의 수를 조정합니다.
    • Scheduler
      • 노드에 파드를 할당하는 역할을 수행합니다.
      • 리소스 사용량과 정책에 따라 적절한 노드를 선택합니다.
    • CoreDNS
      • 클러스터 내부에서 DNS 서비스를 제공합니다.
      • 서비스의 이름 해석(Name Resolution)을 처리합니다.
  3. Worker Node (k8s-worker1, k8s-worker2)
    • kubelet
      • 각 노드에서 실행되는 에이전트로, API 서버와 통신하며 파드를 관리합니다.
      • 파드의 라이프사이클을 모니터링하고 필요한 컨테이너를 시작 및 중지합니다.
    • kube-proxy
      • 네트워크 라우팅을 설정하고 외부와의 통신을 처리합니다.
      • 서비스 간 트래픽을 라우팅합니다.
    • Docker Engine
      • 컨테이너를 실행하는 역할을 합니다.
      • 파드 안에 있는 컨테이너를 구동합니다.
  4. 네트워크
    • NIC (Network Interface Card)
      • 노드 간, API 서버 간 통신을 지원하는 네트워크 인터페이스입니다.
  5. CNI (Container Network Interface)**란?
    • 쿠버네티스는 CNI를 사용하여 다양한 네트워크 플러그인을 지원하며, 이를 통해 컨테이너 간 통신과 네트워크 관리를 수행합니다.

 

해당 아키텍쳐의 동작 흐름은 아래와 같다.

전체 흐름

  1. 사용자(콘솔)에서 kubectl을 통해 API 서버에 요청을 보냅니다.
  2. API 서버는 요청을 받아 etcd에서 상태를 확인하거나 업데이트합니다.
  3. Scheduler는 파드 배치 계획을 세워서 적절한 Worker Node에 전달합니다.
  4. Worker Nodekubelet이 요청된 파드를 실행하며 Docker Engine을 통해 컨테이너를 구동합니다.
  5. kube-proxy는 네트워크 라우팅을 처리해 서비스 간 트래픽을 연결합니다.
  6. CoreDNS가 클러스터 내부 DNS를 통해 이름 해석을 제공합니다.

 


[실습]

# 1. 원격 노드 접속
ssh k8s-master

# 2. CNI 설정 파일 확인
ls /etc/cni/net.d/

# 3. CNI 플러그인 활성화 확인
ps -ef | grep cni

# 4. 원격 노드 종료
exit

# 5. CNI 플러그인 이름 저장
echo "flannel" > /var/CKA2022/k8s_cni_name.txt

# 6. 저장된 CNI 이름 확인
cat /var/CKA2022/k8s_cni_name.txt

 

쿠버네티스 노드 확인 및 필터링 명령어 정리

1. 노드 정보 확인

  • 명령어: 
  •  
    kubectl get nodes

     

  • 출력결과:NAMESTATUSROLESAGEVERSION
    hk8s-m Ready control-plane,master 33d v1.22.4
    hk8s-w1 Ready <none> 33d v1.22.4
    hk8s-w2 NotReady <none> 24d v1.22.4

2. 노드 이름만 출력하기

  • 문제: cut 명령어 사용 시 오류 발생 (문법 문제).
  • 명령어:
     
    kubectl get nodes | cut -d' ' -f1

     

  • 결과:
    NAME hk8s-m hk8s-w1 hk8s-w2

3. 헤더 제외하고 노드 이름만 출력하기

  • 명령어:
    kubectl get nodes | cut -d' ' -f1 | grep -v NAME

     

  • 설명:
    • cut -d' ' -f1: 노드 목록에서 첫 번째 컬럼(이름) 추출.
    • grep -v NAME: NAME 헤더를 제외하고 출력.
  • 결과:
    hk8s-m hk8s-w1 hk8s-w2
     

 

# 1. 모든 노드 이름 저장 (헤더 제외)
kubectl get nodes | cut -d' ' -f1 | grep -v NAME > /var/CKA2022/hk8s-node-info.txt

# 2. 파일 내용 확인
cat /var/CKA2022/hk8s-node-info.txt

# 3. Ready 상태 노드 출력
kubectl get nodes | grep -i -w ready

# 4. Ready 상태 노드 이름만 출력
kubectl get nodes | grep -i -w ready | cut -d' ' -f1

# 5. Ready 상태 노드 이름 저장
kubectl get nodes | grep -i -w ready | cut -d' ' -f1 > /var/CKA2022/hk8s-node-ready.txt

# 6. 저장된 Ready 노드 확인
cat /var/CKA2022/hk8s-node-ready.txt

 

 


문제1 - 멀티 클러스터 정보 보기

 

1-1 문제. k8s 클러스터로 이동

# 현재 설정된 Kubernetes 컨텍스트를 확인합니다.
kubectl config current-context

# Kubernetes 컨텍스트를 'k8s'로 전환합니다.
kubectl config use-context k8s

# 다시 현재 설정된 Kubernetes 컨텍스트를 확인합니다.
kubectl config current-context

 

 

전체 명령어와 결과

    1. 현재 컨텍스트 확인
      kubectl config current-context

       

      결과:
      • k8s

  1. 컨텍스트 변경
    kubectl config use-context k8s

     

    결과: Switched to context "k8s".
    • Kubernetes 컨텍스트가 k8s로 변경되었습니다.

  1. 컨텍스트 확인 (변경된 상태)
    kubectl config current-context

     

    결과:
     
    k8s
    • k8s로 설정되어 있습니다.

 


 

1-2 문제.  k8s 클러스터의 상태를 확인하자.

 

명령어

kubectl cluster-info

 

 

결과

Kubernetes control plane is running at https://k8s-master:6443
CoreDNS is running at https://k8s-master:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

 

설명

 

  • kubectl cluster-info
    Kubernetes 클러스터의 제어 평면(Control Plane)DNS 서비스의 정보를 출력합니다.
  • 결과의 의미
    • Control Plane:
      Kubernetes 클러스터의 API 서버가 https://k8s-master:6443에서 실행 중입니다.
      Control Plane은 클러스터 상태를 관리하고 명령을 실행하는 핵심 구성 요소입니다.
    • CoreDNS:
      클러스터의 DNS 서비스(CoreDNS)가 실행 중인 URL이 https://k8s-master:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy로 출력됩니다.
      CoreDNS는 Kubernetes의 DNS를 제공해 Pod 이름을 도메인 이름으로 변환할 수 있게 합니다

1-3 문제. k8s 클러스터에서 동작중인 모든 CNI 이름을 /var/CKA2022/k8s cni_name.txt에 저장하시오!!

 

# 1. SSH로 Kubernetes 마스터 노드 접속
ssh k8s-master

# 2. CNI 설정 파일 확인
ls /etc/cni/net.d/
# 결과:
# 10-flannel.conflist

# 3. CNI 관련 프로세스 검색
ps -ef | grep cni
# 결과:
# root 1034 1 0 09:30 ? 00:00:29 /usr/bin/kubelet --network-plugin=cni ...

# 4. 로그아웃 (마스터 노드 종료)
exit

# 5. CNI 이름 'flannel'을 파일에 저장
echo "flannel" > /var/CKA2022/k8s_cni_name.txt

# 6. 파일 내용 확인
cat /var/CKA2022/k8s_cni_name.txt
# 결과:
# flannel

 

 

설명

  1. SSH 접속: k8s-master 노드에 접근합니다.
  2. CNI 설정 확인: /etc/cni/net.d/ 경로에 있는 CNI 설정 파일을 확인합니다. 결과로 10-flannel.conflist 파일이 나옵니다.
  3. CNI 프로세스 검색: kubelet이 CNI 플러그인을 사용하고 있는 것을 확인합니다.
  4. 로그아웃: 마스터 노드 세션을 종료합니다.
  5. CNI 이름 저장: CNI 이름 flannel을 **/var/CKA2022/k8s_cni_name.txt**에 저장합니다.
  6. 파일 확인: 저장된 내용을 확인하면 flannel이 출력됩니다.

1-4 문제. k8s 클러스터에서 ready 상태인 노드 이름을 추출하여 /var/CKA2022/k8s-node-ready.txt 에 저장하시오.

# 1. Kubernetes 노드 중 Ready 상태 확인
kubectl get nodes | grep -i -w ready
# 결과:
# k8s-master   Ready   control-plane,master   33d   v1.22.4
# k8s-worker1  Ready   <none>                 33d   v1.22.4
# k8s-worker2  Ready   <none>                 33d   v1.22.4

# 2. Ready 상태 노드의 이름만 추출해 파일에 저장
kubectl get nodes | grep -i -w ready | cut -d' ' -f1 > /var/CKA2022/k8s-node-ready.txt

# 3. 저장된 파일 내용 확인
cat /var/CKA2022/k8s-node-ready.txt
# 결과:
# k8s-master
# k8s-worker1
# k8s-worker2

 

설명

  1. Ready 상태 확인
    kubectl get nodes 명령어를 사용해 클러스터의 노드 상태를 확인하고, grep으로 Ready 상태인 노드만 필터링합니다.
  2. 노드 이름만 추출
    cut -d' ' -f1 명령어를 사용해 첫 번째 필드(노드 이름)만 추출합니다.
    • 결과를 /var/CKA2022/k8s-node-ready.txt 파일에 저장합니다.
  3. 파일 내용 확인
    cat 명령어로 저장된 파일 내용을 확인하면 Ready 상태인 노드 이름이 출력됩니다.
728x90