[Kubernetes] 쿠버네티스 이해하기 1

BBeumSeok·2024년 8월 22일
0

Kubernetes

목록 보기
3/4
post-thumbnail

Pod & Cluster

쿠버네티스

  1. Pod(파드)
  • 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.

  • 하나 이상의 컨테이너 그룹을 의미하며, 이 그룹은 스토리지 및 네트워크를 공유하고
    해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.

  1. Cluster(클러스터)
  • 애플리케이션 컨테이너를 실행하기 위한 일련의 노드 머신이다.

  • 쿠버네티스를 실행 중이라면 클러스터를 실행하고 있는 것이다.

  • 클러스터는 컨트롤 플레인 및 하나 이상의 컴퓨팅 머신 또는 노드를 포함하고 있다.

    		Control Plane
    		어느 애플리케이션을 실행하고 애플리케이션이 어느 컨테이너 이미지를 사용할지와
    		같이 클러스터를 원하는 상태로 유지 관리한다.
      

클러스터는 쿠버네티스의 핵심 장점으로써 물리 머신, 가상 머신, 온프레미스, 클라우드에
구애받지 않고 머신 그룹 전체에서 컨테이너를 예약하고 실행할 수 있다.

  1. Node
  • 애플리케이션과 워크로드를 실제로 구동 및 실행

Kubetcl

  • 쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한
    커맨드라인 툴

  • 구성을 위해 kubectl은 config 파일을 $HOME/.kube에서 찾는다.
    KUBECONFIG 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여 다른
    kubeconfig 파일을 지정할 수 있다.

Kubectl 실습하기

  1. XShell로 Worker Node 연결
  • w2-k8s 세션 연결

  1. kubectl 명령어로 노드 확인
  • kubectl get nodes
    해당 명령을 실행하면 아래와 같은 문구가 뜨게 된다.
The connection to the server localhost:8080 was refused - did you specify the right 
host or port?

명령을 실행해도 쿠버네티스의 노드들에 대한 정보가 표시되지 않는 것을 확인할 수 있는데
이는 쿠버네티스 클러스터의 정보를 kubectl이 알지 못하기 때문이다.

kubectl은 API 서버를 통해 쿠버네티스에 명령을 내린다.
따라서 kubectl이 어디에 있더라도 API 서버의 접속 정보만 있다면 어느 곳에서든
쿠버네티스 클러스터에 명령을 내릴 수 있다.

  1. 쿠버네티스 클러스터의 정보를 마스터 노드에서 scp 명령으로 워커 노드의 현재
    디렉터리에 받아온다.
  • 클러스터 정보 : /etc/kubernetes/admin.conf

  • Worker Node : w2-k8s



  1. kubectl get nodes 명령에 추가로 쿠버네티스 클러스터 정보를 입력받는 옵션과
    마스터 노드에서 받아온 admin.conf를 입력하고 실행
  • kubectl get nodes --kubeconfig admin.conf


  1. 노드 정보가 정상적으로 표시되는지 확인

kubelet

  • 각 노드에서 실행되는 기본 "노드 에이전트"이다.

  • 호스트 이름, 호스트 이름을 재정의하는 플래그 또는 클라우드 공급자의 특정 로직 중
    하나를 사용하여 api server에 노드를 등록할 수 있다.

kubelet으로 배포하기

  1. Master Node를 루트 계정으로 접근 후 리스트 불러오기
  • sudo -i

  • ls

  1. cat 내려받은 예제 내용 출력
  • cat _Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml

  1. 파드 생성
  • kubectl create -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml



  1. 생성된 파드 확인
  • kubectl get pod / pods

  • 파드 상세 정보 확인 : kubectl get pod -o wide
    => 파드의 위치인 워커 노드를 확인



  1. w3-k8s 워커 노드에서 아래 명령 실행
  • systemctl stop kubelet
    => kubelet 정지시키기



  1. Master Node로 돌아와 이전에 생성한 파드 삭제
  • kubectl delete pod nignx-pod
    삭제 명령 시 삭제가 되지 않고 동작하지 않는 것을 확인할 수 있는데
    이러한 이유는 직전에 kubelet을 정지시킴으로써 워커 노드의 동작 관리를
    할 수 없기 때문이다.

  1. kubelet 실행(worker node)
  • systemctl start kubelet

  1. 마스터 노드에서 파드 확인
  • kubectl get pod / kubectl delete pod nginx-pod
    정상적으로 삭제되는 것을 확인할 수 있다.



kube-proxy

  1. 파드 재배포 & 상세정보 확인
  • kubectl create -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml

  • kubectl get pod -o wide



  1. curl 명령으로 웹 서버 메인 페이지 내용 확인
  • curl [IP Address] 명령으로 터미널에서 내용 확인



  1. 문제 상황 만들기
  • modprobe -f br_netfilter

  • systemctl restart network



  1. curl 명령으로 다시 웹 서버 페이지 정보 받아오기

  2. 파드 상태 확인

  • kubectl get pod -o wide
  1. 다시 웹 서버 페이지 정보를 받아올 수 있도록 설정
  • modprobe br_netfilter

  • reboot

  1. 마스터 노드에서 파드 상태 확인
  • kubectl get pod -o wide
    => RESTARTS 숫자가 1 증가한 것을 확인할 수 있다.

  1. curl 명령으로 파드로부터 정보를 받아오는지 확인
  • curl [IP Address]

  1. 배포한 파드 삭제
  • kubectl delete -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml

쿠버네티스 기본 사용법

파드 생성 방법

  1. 파드 생성
  • kubectl run nginx-pod --image=nginx

  1. 생성된 파드 확인
  • kubectl get pods

  1. run이랑 비교하여 create로 파드 생성하기
  • kubectl create nginx --image=nginx
    => 명령 실행 시 에러 발생
    Error : Unknown flag: --image

  1. 기존 파드와 중복 이름을 피하고자 파드의 이름을 dpy-nginx로
    지정하여 생성
  • kubectl create deployment dpy-nginx --image=nginx

  1. 생성된 파드 확인
  • kubectl get pods

  1. 생성된 파드의 IP 확인
  • kubectl get pods -o wide

  1. curl 명령으로 웹 페이지 정보 불러오기
  • curl [IP Address]

  1. 웹 페이지가 정상적으로 동작하는지 확인

Mini Kube 설치하기

  1. Docker Desktop 설치 후 열기

  2. 우측 상단에 설정(톱니바퀴) 클릭

  3. Kubernetes 클릭

  4. 다운로드

  • Enable Kubernetes 체크 후 우측 하단에 Apply&Restart 클릭

  1. 설치 확인
  • Docker Desktop 메인에서 좌측 Images 탭 클릭

  • kubernetes 관련된 것들이 설치 되었다면 정상적으로 완료 !!

  1. 미니 쿠베 설치 후에 위 예제에서 했던 파드 생성하기 진행
    => 그래도 안된다면 그냥 docker pull nginx 명령으로 nginx 이미지 설치

  2. kubernetes 문제 발생 시 미니 쿠베를 이용하면 해당 문제를 해결할 수 있다.

오브젝트(Object)

파드와 디플로이먼트는 스펙(spec)과 상태(status) 등의 값을 가지고 있다.
이러한 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위를
오브젝트라고 한다.

기본 오브젝트

  1. Pod
  • 쿠버네티스에서 실행되는 최소 단위, 즉 웹 서비스를 구동하는데 필요한 최소 단위
    독립적인 공간과 사용 가능한 IP를 가지고 있다.

  1. namespace
  • 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹이다.
특별히 설정하지 않으면 기본으로 할당되는 default
쿠버네티스 시스템에서 사용되는 kube-system
온프레미스에서 쿠버네티스를 사용할 경우 외부에서 쿠버네티스 클러스터 내부로
접속하게 도와주는 컨테이너들이 속해있는 metallb-system

  1. Volume
  • 파드가 생성될 때 사용할 수 있는 디렉터리를 제공한다.

  • 기본적으로 파드는 영속성 개념이 아닌 제공되는 디렉터리도 임시로 사용한다.

  • 파드가 사라지더라도 저장과 보존이 가능한 디렉터리를 볼륨 오브젝트를 통해
    생성하고 사용할 수 있다.

  1. service
  • 파드는 클러스터 내에서 유동적이기 때문에 접속 정보가 고정일 수 없다.
    reboot 실행 시마다 해당 파드의 IP 주소가 바뀌는 것을 확인할 수 있음

  • 파드 접속을 안정적으로 유지하도록 서비스를 내/외부로 연결한다.

  • 기존 인프라에서 Load Balancer, Gateway와 비슷한 역할을 한다.

  1. deployment
  • 쿠버네티스를 좀 더 효율적으로 작동하도록 기능들을 조합하고 추가해 구현하는 것이
    디플로이먼트이다.
    이외에도 데몬셋, 컨피그맵, 레플리카셋, PV, PVC, 스테이트풀셋 등이 있으며
    앞으로도 요구사항에 따라 목적에 맞는 오브젝트들이 추가될 것이다.

  • 쿠버네티스에서 가장 많이 쓰이는 디플로이먼트 오브젝트는 파드에 기반을 두고 있으며,
    레플리카셋 오브젝트를 합쳐놓은 형태이다.

  • 실제로 API 서버와 컨트롤러 매니저는 단순히 파드가 생성되는 것을 감시하는 것이 아니라
    디플로이먼트처럼 레플리카셋을 포함하는 오브젝트의 생성을 감시한다.

Deployment 실습

  1. 디플로이먼트 생성
  • kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname

  1. 디플로이먼트를 통해 생성된 파드 확인
  • kubectl get pod

  1. 에러 발생 시 pull로 수동 설치
  • docker pull sysnet4admin/echo-hname

  1. 디플로이먼트 재생성

  2. 파드 확인

레플리카셋으로 파드 수 관리

  1. 배포된 파드 상태 확인
  • kubectl get pod

  1. dpy-nginx를 scale 명령으로 3개 증가시키기
  • kubectl scale deployment dpy-nginx --replicas=3



  1. 생성된 결과 확인
  • kubectl get pods

  1. 레플리카셋을 이용하여 생성과 동시에 파드 수 늘리기
  • kubectl create deployment dpy-nginx2 --replicas=3 --image=nginx

  1. scale을 이용하여 deployment 사이즈 조정하기



스펙을 지정해 오브젝트 생성

  1. VS Code로 yaml 파일 열기
  • code echo-hname.yaml

  1. echo-hname.yaml 파일 작성

apiVersion: apps/v1   # API 버전
kind: Deployment      # 오브젝트 종류
metadata:             # 메타데이터
  name: echo-hname    # 오브젝트 이름
  labels:             # 레이블 설정
    app: nginx
spec:                 # 스펙
  replicas: 3         # 몇 개의 파드를 생성할지 결정
  selector:           # 레플리카 설정을 할 대상 지정
    matchLabels:
      app: nginx
  template:           # 템플릿 설정
    metadata:         # 템플리 메타데이터
      labels:
        app: nginx
    spec:             # 템플릿 스펙
      containers:
      - name: echo-hname
        image: sysnet4admin/echo-hname    # 사용되는 이미지

  1. API 버전 확인 명령어
  • kubectl api-versions



  1. 생성
  • kubectl create -f echo-hname.yaml

VS Code로 디플로이먼트 생성

  1. test.yaml 파일 생성
  • code test.yaml

  1. 파일 작성



  1. 생성
  • kubectl create -f test.yaml



기본 속성값을 포함하여 파일을 만들고 수정하기

  • kubectl create deployment output --image=nginx -o yaml > output.yaml

  • code output.yaml



위의 명령어를 참고해서 yaml 파일 작성



파드의 컨테이너 자동 복구 방법

  1. 현재 오브젝트 상태 확인
  • kubectl get pods -o wide

  1. 파드 컨테이너 셸 접속
  • kubectl exec -it nginx-pod -- /bin/bash
    "--"는 exec에 대한 인자 값을 나누고싶을 때 사용한다.
    명령어와 파드를 구분하기 위함



  1. 프로세스 생성 시간 확인
  • ls -l /run/nginx.pid
    => UTC 기준

  1. 터미널을 총 2개 띄운 다음 두 번째 터미널은 IP에서 돌아가는 웹 페이지를
    1초마다 한 번씩 요청하는 스크립트 실행
- i=1; while true; do sleep 1; echo $((i++)) `curl --silent [pod IP] | grep
title` ; done

  1. bash shell에서 nginx 프로세스인 PID 1번을 kill 명령으로 종료
  • kill 1

  1. 기존 터미널에서 nginx 웹 페이지를 받아오는 스크립트가 1초마다 잘 동작하는지
    확인하고, 자동으로 복구되는 것도 함께 확인

  2. nginx 웹 페이지가 복구된 것을 확인한 후에 다시 nginx-pod에 접속

  • kubectl exec -it nginx-pod -- /bin/bash

  1. ls 명령으로 리스트 확인
  • ls -l /run/nginx.pid

파드의 동작 보증 기능

  • 쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록
    보장하는 기능도 있다.

  • 레플리카셋을 이용하여 파드를 생성한 후에 삭제를 진행

kubectl delete pods [pod name]

kubectl get pods 명령을 통해 확인하면 이전에 delete를 이용해 삭제했지만
레플리카셋은 설정을 유지하기 위해 삭제와 동시에 새로 올리게 됨.

- 레플리카셋의 경우 많으면 줄이고, 적으면 늘림으로써 상태를 유지한다.
	(상시 모니터링)
    
- 파드의 해시값이 기존 삭제했던 것과 다른 것을 확인할 수 있다.

- 완전한 삭제를 위해서는 deployment 자체를 삭제해야 한다.
kubectl delete deployment

노드 자원 보호

노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 한다.
그런데 최근에 몇 차례 문제가 생긴 노드에 파드를 할당하면 문제가 생길 가능성이 높다.
어쩔 수 없이 해당 노드를 사용해야 한다면 어떻게 해야 할까?
이런 경우 영향도가 적은 파드를 할당해 일정 기간 사용하면서 모니터링 해야 한다.

  1. scale을 이용해 파드 사이즈 늘리기(기존 생성된 echo-hname)
  • kubectl scale deployment echo-hname --replicas=9

  • kubectl get pods -o 명령을 실행하여 특정 내용만 볼 수 있도록
    지정할 수 있다.

  1. 배포된 9개 파드의 여러가지 정보를 출력할 수 있도록 -o 옵션을 사용하여 출력
  • kubectl get pods \
    -o=custom-columns=NAME:.metadata

노드 유지보수

쿠버네티스를 사용하다 보면 정기적 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는
상황이 발생하게 된다.

이런 경우를 대비해 쿠버네티스는 drain 기능을 제공한다.
drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수 할 수
있게 한다.

profile
Do your best every moment

0개의 댓글