쿠버네티스란?
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 자동 Deploy, 스케일링 등을 제공하는 관리시스템으로, 오픈 소스 기반이다.
1.2.코드로 쉽게 구성하는 쿠버네티스 랩 환경
Vagrant 를 이용해서 설치 명령어 코드로 이미 설치된 버츄얼박스에 4개의 Cent OS 가상 서버를 설치 하고 동시에 쿠버네티스에 필요한 노드를 설치 하게 된다.
Vagrant 이용하기 위한 설치 명령어 코드 디렉토리에 가자
cd C:\HashiCorp\_Lecture_k8s_starter.kit-main\ch1\1.2\k8s-min-5GiB
Vagrant 실행하면 준비된 코드 명령어로 버츄얼 박스에 가상 서버가 설치 하게 된다.
vagrant up
설치된 가상 서버 (마스터 노드) 콘솔에 가서 쿠버네티스 구성된 노드들을 확인 해보자
kubectl get nodes
쿠버네티스에 어플리케이션 배포하기 (Pod 배포 하기)
이번에 Kubernetes 에 Nginx 를 배포 할 것이다.
설치된 가상 서버 (마스터 노드) 터미널로 가서 nginx 를 배포 해보자
여기서 Pod 란?
컨터이더(어플리케이션)의 집합이고 일반적으로 단일 컨터이너로 구성한다.
그럼 Pod 의 집합은 deployment 이다. 뒤에서 설명 한것이다.
1 |
|
설치된 파드(Pod) 를 외부에서도 접속 가능하게 해보자
우선 해당 로컬 PC 터미널에 curl {설치된 IP} 명령어를 입력해보자
그럼 접속이 안될것이다. 해당 PC에 가상화된 서버에 설치했을것이고 설치된 쿠버네티스 클러스트 지역에 있기 때문이다.
SVN 을 이용해서 외부에 접속해도 각각의 노드를 접속 할수 있도록 해보자
// 오픈할려고 하는 Tpye인 NodePort 입력하고 실제로 그 Pod가 내부에 있는 컨테이너를 통신하기 위한 Port 번호 지정
kubectl expose pod nginx --type=NodePort --port=80
// 노출된 것을 확인
kubectl get service
해당 명령어를 통해 밖으로 노출된 포트를 알아보자
그리고 노드로 접속해서 각각의 Pod 로 접속 하기 때문에 노드 정보를 알아보자 (INTERNAL-IP 를 확인 하자)
kubectl get nodes -o wide
웹브라우저에서
{마스터 노브 ip}:{밖으로 노출된 포트}
접속하면 설치된 nginx 메인 페이지가 보인다.
파드(Pod) 와 deployment 차이
지금까지 nginx 를 설치 및 배포를 해보았지만 워커 노드 한개만 설치 되었을 뿐이다.
이걸 전부 각각 워커 노드에게 nginx 설치 하는 방법을 알아보자
즉 deployment 는 여러 pod 를 관리 한다고 보면 되겠다.
kubectl create deployment deploy-nginx --image=nginx
kubectl get pods
kubectl get pods -o wide
curl {설치된 IP 주소}
create 명령어를 통해 ‘deploy-nginx’ 이라는 이름으로 deployment 를 만들자
여러개를 배포 할려면
kubectl scale deployment deploy-nginx --replicas=3
kubectl get pods
이렇게 하면 기존에 pod 가 한개 생성한것 비해 replica 를 3으로 늘려 pod 를 3개 생성 할 것이다.
deployment 를 노드포트로 노출하기
kubectl expose deployment deploy-nginx --type=NodePort --port=80
kubectl get services
kubectl get nodes -0 wide
외부로 노출하는 더 좋은 방법인 로드밸런서(LoadBalancer)
직접적으로 각 node 의 IP 로 곧바로 접속하는것은 좋은 방법이 아니다.
이걸 중간에 로드밸런서를 둬가지고 관리하는것이 좋다.
여기서 로드밸런서는 MetalLB 로 해볼려고 한다.
// 쿠버네티스에서 파일로 즉 코드로 이용해서 설치 할때는 ‘apply’ 명령어를 쓴다.kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
1 | // https://hub.docker.com/repository/docker/sysnet4admin/chk-hn 해당 도커허브 링크 통해 이미지를 가져와서 'chk-hn' 이라는 이름으로 deployment 를 만든다 |
배포한 것들 삭제하기
1 | kubectl get service // 이 명령어를 통해 service 된 것을 확인 |
쿠버네티스는 어떻게 구성되어 있을까?
지금까지 쿠버네티스 통해 nginx, chk-hn 을 설치 해보았는데.
이것은 쿠버네티스 default 라는 네임스페이스에 설치 되어 있는 것들이다.
실질적으로 쿠버네티스를 구성하는 곳은 kube-system 이라는 네임스페이에 저장 되어 있다.
해당 구역에 있는 쿠버네티스 구성 요소들을 확인 하기 위해서는
kubectl get pods -n kube-system
통해 확인 해보자
API 서버, 컨트롤러 매니저, 스케쥴러 등 있다.
쿠버네티스 파드에 문제가 생겼다면?
우리는 여기서 Pod(파드) 를 실수로 지웠을때 가정하에 설정한다.
- 파드만 배포된 경우
- 디플로이먼트 형태로 배포된 경우
1 번 경우는 곤란한 일이 생기지만 2번 경우는 여러 파드를 감싸고 있는것이 디플로이먼트 형태라
파드가 삭제하면 파드를 다시 만들면 된다.
실습 통해 알아보자
1 |
|
쿠버네티스 워커 노드의 구성 요소에 문제가 생겼다면
워커 노드의 kubelet 을 중단 해보면 어떻게 될까?
마스터 노드가 아닌 워커 노드 중 하나 서버 터미널로 접속해서
1 | systemctl stop kubelet // kubelet 중단 |
그 다음 마스터 노드의 서버 터미널로 접속해서
1 | kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1/del-deploy.yaml |
이번에 워커 노드의 ‘컨테이너 런타임 (Docker)’ 중단 해보자
마스터 노드가 아닌 워커 노드 중 하나 서버 터미널로 접속해서
1 | systemctl stop docker // docker 중단 |
다시 마스터 노드에 가서 설치된 디플로이먼트를 replica 를 6개로 늘리자
1 | kubectl scale deployment del-deploy --replicas=6 |
확인 해보면 해당 워커 노드에게만 배포 하지 않고 다른 워커 노드만 배포하고 있다.
이번에 추가 배포를 통해 스케줄러 역활 확인을 해보자
워커 노드 설치된것을 보면 균형이 깨진것을 볼 수 있다.
해당 워커 노드 터미널로 가서
1 | systemctl start docker // docker 실행 |
다시 마스터 노드에 가서 설치된 디플로이먼트를 replica 를 9개로 늘리자
1 | kubectl scale deployment del-deploy --replicas=9 |
쿠버네티스 오브젝트란?
쿠버네티스 오브젝트는 각각 상태를 갖고 있다.
‘추구하는 상태’, ‘현재 상태’
여기서 오브젝트는 원하는 상태가 기술 하는 것이다.
각 Pod 마다 상태값이 있다.
감시하고 이를 통해 차이를 발견하고 차이가 있다면 상태를 변경 해서
실제 오브젝트가 선언된 상태 이라고 한다.
그럼 오브젝트가 추구하는 상태 기술해 둔 것은 무엇일까?
1 | kubectl get pods // 현재 배포된 pod 확인 해보자 |
그럼 replicas 값을 3으로 변경했으니 pods 는 그에 맞게 삭제 되거나 추가 하게 된다.
볼륨 실습
1 | kubectl get pods |
Copyright 201- syh8088. 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.