Pod & Cluster
쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.
하나 이상의 컨테이너 그룹을 의미하며, 이 그룹은 스토리지 및 네트워크를 공유하고
해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.
애플리케이션 컨테이너를 실행하기 위한 일련의 노드 머신이다.
쿠버네티스를 실행 중이라면 클러스터를 실행하고 있는 것이다.
클러스터는 컨트롤 플레인 및 하나 이상의 컴퓨팅 머신 또는 노드를 포함하고 있다.
Control Plane
어느 애플리케이션을 실행하고 애플리케이션이 어느 컨테이너 이미지를 사용할지와
같이 클러스터를 원하는 상태로 유지 관리한다.
클러스터는 쿠버네티스의 핵심 장점으로써 물리 머신, 가상 머신, 온프레미스, 클라우드에
구애받지 않고 머신 그룹 전체에서 컨테이너를 예약하고 실행할 수 있다.
Kubetcl
쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한
커맨드라인 툴
구성을 위해 kubectl은 config 파일을 $HOME/.kube에서 찾는다.
KUBECONFIG 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여 다른
kubeconfig 파일을 지정할 수 있다.
Kubectl 실습하기
The connection to the server localhost:8080 was refused - did you specify the right
host or port?
명령을 실행해도 쿠버네티스의 노드들에 대한 정보가 표시되지 않는 것을 확인할 수 있는데
이는 쿠버네티스 클러스터의 정보를 kubectl이 알지 못하기 때문이다.
kubectl은 API 서버를 통해 쿠버네티스에 명령을 내린다.
따라서 kubectl이 어디에 있더라도 API 서버의 접속 정보만 있다면 어느 곳에서든
쿠버네티스 클러스터에 명령을 내릴 수 있다.
클러스터 정보 : /etc/kubernetes/admin.conf
Worker Node : w2-k8s
kubelet
각 노드에서 실행되는 기본 "노드 에이전트"이다.
호스트 이름, 호스트 이름을 재정의하는 플래그 또는 클라우드 공급자의 특정 로직 중
하나를 사용하여 api server에 노드를 등록할 수 있다.
sudo -i
ls
kubectl get pod / pods
파드 상세 정보 확인 : kubectl get pod -o wide
=> 파드의 위치인 워커 노드를 확인
kube-proxy
kubectl create -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml
kubectl get pod -o wide
modprobe -f br_netfilter
systemctl restart network
curl 명령으로 다시 웹 서버 페이지 정보 받아오기
파드 상태 확인
modprobe br_netfilter
reboot
쿠버네티스 기본 사용법
파드 생성 방법
Mini Kube 설치하기
Docker Desktop 설치 후 열기
우측 상단에 설정(톱니바퀴) 클릭
Kubernetes 클릭
다운로드
Docker Desktop 메인에서 좌측 Images 탭 클릭
kubernetes 관련된 것들이 설치 되었다면 정상적으로 완료 !!
미니 쿠베 설치 후에 위 예제에서 했던 파드 생성하기 진행
=> 그래도 안된다면 그냥 docker pull nginx 명령으로 nginx 이미지 설치
kubernetes 문제 발생 시 미니 쿠베를 이용하면 해당 문제를 해결할 수 있다.
오브젝트(Object)
파드와 디플로이먼트는 스펙(spec)과 상태(status) 등의 값을 가지고 있다.
이러한 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위를
오브젝트라고 한다.
기본 오브젝트
특별히 설정하지 않으면 기본으로 할당되는 default
쿠버네티스 시스템에서 사용되는 kube-system
온프레미스에서 쿠버네티스를 사용할 경우 외부에서 쿠버네티스 클러스터 내부로
접속하게 도와주는 컨테이너들이 속해있는 metallb-system
파드가 생성될 때 사용할 수 있는 디렉터리를 제공한다.
기본적으로 파드는 영속성 개념이 아닌 제공되는 디렉터리도 임시로 사용한다.
파드가 사라지더라도 저장과 보존이 가능한 디렉터리를 볼륨 오브젝트를 통해
생성하고 사용할 수 있다.
파드는 클러스터 내에서 유동적이기 때문에 접속 정보가 고정일 수 없다.
reboot 실행 시마다 해당 파드의 IP 주소가 바뀌는 것을 확인할 수 있음
파드 접속을 안정적으로 유지하도록 서비스를 내/외부로 연결한다.
기존 인프라에서 Load Balancer, Gateway와 비슷한 역할을 한다.
쿠버네티스를 좀 더 효율적으로 작동하도록 기능들을 조합하고 추가해 구현하는 것이
디플로이먼트이다.
이외에도 데몬셋, 컨피그맵, 레플리카셋, PV, PVC, 스테이트풀셋 등이 있으며
앞으로도 요구사항에 따라 목적에 맞는 오브젝트들이 추가될 것이다.
쿠버네티스에서 가장 많이 쓰이는 디플로이먼트 오브젝트는 파드에 기반을 두고 있으며,
레플리카셋 오브젝트를 합쳐놓은 형태이다.
실제로 API 서버와 컨트롤러 매니저는 단순히 파드가 생성되는 것을 감시하는 것이 아니라
디플로이먼트처럼 레플리카셋을 포함하는 오브젝트의 생성을 감시한다.
Deployment 실습
디플로이먼트 재생성
파드 확인
레플리카셋으로 파드 수 관리
스펙을 지정해 오브젝트 생성
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 # 사용되는 이미지
VS Code로 디플로이먼트 생성
기본 속성값을 포함하여 파일을 만들고 수정하기
kubectl create deployment output --image=nginx -o yaml > output.yaml
code output.yaml
위의 명령어를 참고해서 yaml 파일 작성
파드의 컨테이너 자동 복구 방법
- i=1; while true; do sleep 1; echo $((i++)) `curl --silent [pod IP] | grep
title` ; done
기존 터미널에서 nginx 웹 페이지를 받아오는 스크립트가 1초마다 잘 동작하는지
확인하고, 자동으로 복구되는 것도 함께 확인
nginx 웹 페이지가 복구된 것을 확인한 후에 다시 nginx-pod에 접속
파드의 동작 보증 기능
쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록
보장하는 기능도 있다.
레플리카셋을 이용하여 파드를 생성한 후에 삭제를 진행
kubectl delete pods [pod name]
kubectl get pods 명령을 통해 확인하면 이전에 delete를 이용해 삭제했지만
레플리카셋은 설정을 유지하기 위해 삭제와 동시에 새로 올리게 됨.
- 레플리카셋의 경우 많으면 줄이고, 적으면 늘림으로써 상태를 유지한다.
(상시 모니터링)
- 파드의 해시값이 기존 삭제했던 것과 다른 것을 확인할 수 있다.
- 완전한 삭제를 위해서는 deployment 자체를 삭제해야 한다.
kubectl delete deployment
노드 자원 보호
노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 한다.
그런데 최근에 몇 차례 문제가 생긴 노드에 파드를 할당하면 문제가 생길 가능성이 높다.
어쩔 수 없이 해당 노드를 사용해야 한다면 어떻게 해야 할까?
이런 경우 영향도가 적은 파드를 할당해 일정 기간 사용하면서 모니터링 해야 한다.
kubectl scale deployment echo-hname --replicas=9
kubectl get pods -o 명령을 실행하여 특정 내용만 볼 수 있도록
지정할 수 있다.
노드 유지보수
쿠버네티스를 사용하다 보면 정기적 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는
상황이 발생하게 된다.
이런 경우를 대비해 쿠버네티스는 drain 기능을 제공한다.
drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수 할 수
있게 한다.