쿠버네티스 소개
- 쿠버네티스 시작
- 오랜 세월 동안 구글은 Borg(보그)라는 내부 시스템을 개발
- 애플리케이션 개발자와 시스템 관리자가 수천 개의 애플리케이션과 서비스를 관리하는 데 도움
- 조직 규모가 클 때 엄청난 가치를 발휘
- 수십만 대의 시스템을 가동할 때 사용률이 조금만 향상돼도 수백만 달러의 비용 절감 효과
- 구글은 보그와 오메가를 15년동안 비밀로 유지하다 2014년 구글 시스템을 통해 얻은 경험을 바탕으로 한 오픈소스 시스템인 ‘쿠버네티스’를 출시
- 인프라의 추상화
- 컨테이너 시스템에서 컨테이너 애플리케이션을 쉽게 배포, 관리하도록 돕는 소프트웨어 시스템
- 기본 인프라를 추상화해 개발 및 운영팀의 개발, 배포, 관리를 단순화
- 모든 노드가 하나의 거대한 컴퓨터인 것처럼 수천개의 컴퓨터 노드에서 소프트웨어 애플리케이션을 실행
- 쿠버네티스 장점
- 애플리케이션 배포 단순화
- 특정 베어메탈을 필요로 하는 경우 SSD/HHD 등에 라벨링을 하여 배포를 단순화할 수 있다.
- 가상화 아키텍처에서 크게 두 가지로 분류하는데, 호스트형 가상화와 베어메탈 가상화이다.
- 호스트형 가상화는 호스트 운영체제가 있고, 그 위에 가상머신을 구현한 방식
- 베어메탈 가상화는 호스트 운영체제가 없고, 하드웨어 상에 하이퍼바이저가 바로 설치되고, 이 위에 가상 머신을 구현한 방식
- 하드웨어 활용도 극대화
- 클러스터의 주변에 자유롭게 이동하여 실행중인 다양한 애플리케이션 구성 요소를 클러스터 노드의 가용 리소스에 최대한 맞춰 서로 섞고 매치
- 노드의 하드웨어 리소스를 최상으로 활용
- 상태 확인 및 자가 치유
- 애플리케이션 구성 요소와 실행되는 노드를 모니터링 하고 노드 장애 발생시 다른 노드로 일정을 자동으로 재조정
- 자동으로 리소스를 모니터링하고 각 애플리케이션에서 실행되는 인스턴스 수를 계속 조정하도록 지시 가능
- 오토스케일링
- 개별 애플리케이션의 부하를 지속적으로 모니터링할 필요 없이 자동으로 리소스를 모니터링하고 각 애플리케이션에서 실행되는 인스턴스 수를 계속 조정하도록 지시 가능
- 애플리케이션 개발 단순화
- 버그 발견 및 수정 (완전히 개발환경과 같은 환경 제공)
- 새로운 버전 출시 시 자동으로 테스트, 이상 발견 시 롤아웃
- 애플리케이션 배포 단순화
- 개발자 돕기: 핵심 애플리케이션 기능에 집중
- 애플리케이션 개발자가 특정 인프라 관련 서비스를 애플리케이션에 구현하지 않아도 된다.
- 쿠버네티스에 의존하여 서비스 제공
- 서비스 검색, 확장, 로드밸런싱, 자가 치유, 리더 선출 등
- 애플리케이션 개발자는 애플리케이션의 실제 기능을 구현하는 데 주력
- 인프라와 인프라를 통합하는 방법을 파악하는 데 시간을 낭비할 필요가 없다.
- 운영 팀 돕기: 효과적으로 리소스를 활용
- 실행을 유지하고 서로 통신할 수 있도록 컴포넌트에 정보 제공
- 애플리케이션이 어떤 노드에서 실행되는지 상관 없다.(신경 쓰지 않아도 된다.)
- 언제든지 애플리케이션을 재배치 가능
- 애플리케이션을 혼합하고 매장시킴으로써 리소스를 매칭
쿠버네티스 아키텍처
- 쿠버네티스 클러스터 아키텍처
- 쿠버네티스의 클러스터는 하드웨어 수준에서 많은 노드로 구성되며 두가지 유형으로 나뉜다.
- 마스터 노드: 전체 쿠버네티스 시스템을 관리하고 통제하는 쿠버네티스 컨트롤 플레인을 관장한다.
- 워커 노드: 실제 배포하고자 하는 애플리케이션의 실행을 담당한다.
- 마스터 노드에 여러 워커 노드를 운영할 수 있다. 마스터 노드 또한 이중화할 수 있다.
- 이미지 출처: https://medium.com/@chkrishna/kubernetes-architecture-f7ca63fff46e
- Kubernetes Control Plane (Masters)
- Control Plane에서는 클러스터를 관리하고 클러스터의 기능
- 단일 마스터 노드에서 실행하거나 여러 노드로 분할되고 복제해 고가용성을 보장
- 클러스터의 상태를 유지하고 제어하지만 애플리케이션을 실행하지 않는다.
- 구성 요소
- kube-apiserver(쿠버네티스 API 서버): 사용자, Control plane과 통신
- kube-scheduler(스케줄러): 애플리케이션 예약(애플리케이션의 배포 가능한 각 구성 요소에 워커 노드를 할당)
- Control-manager: 구성 요소 복제, 워커 노드 추적, 노드 장애 처리 등 클러스터 수준 기능을 실행
- etcd(데이터 스토리지): 클러스터 구성을 지속적으로 저장하는 안정적인 분산
- Worker Node
- 컨테이너화된 애플리케이션을 실행하는 시스템
- 애플리케이션에 서비스를 실행, 모니터링, 제공하는 작업은 다음과 같은 구성요소로 수행
- Container runtime: 컨테이너를 실행하는 도커
- Kubelet: 컨테이너의 생성, 삭제 뿐만 아니라 마스터와 워커 노드간의 통신 역할을 함께 담당. APi 서버와 통신하고 노드에서 컨테이너를 관리
- Kubernetes Service, Proxy: 애플리케이션 간에 네트워크 트래픽을 분산 및 연결
- 쿠버네티스의 클러스터는 하드웨어 수준에서 많은 노드로 구성되며 두가지 유형으로 나뉜다.
- 쿠버네티스에서 애플리케이션 실행
- 개발자가 미리 만든 이미지를 이미지 레지스트리에 push한다.
- 쿠버네티스에 올리길 원하면, yaml 또는 json으로 app descriptor를 작성한다.
- control plane(master)가 descriptor를 참조하여 worker node의 kublet에 이미지를 배치하도록 명령한다.
- 이 후 이미지 레지스트리에서 이미지를 worker node에 세팅한 후 실행한다.
- 개발자는 이미지를 만든 후 push하고 control plane에 descrption을 제출한다.
Ubuntu에 쿠버네티스 클러스터 구성
- 쿠버네티스 설치 필요 사항
- Master 우분투: 쿠버네티스의 마스터 노드가 설정될 호스트
- Work 노드(option): 필수 사항은 아니지만, 클러스터에 Work 노드 추가 학습
- 버추얼 박스에서 각 노드에서 복제하면서 반드시 변경해야 할 설정
- 호스트 이름: /etc/hostname
- 네트워크 인터페이스 변경
- NAT 네트워크 설정(NAT랑 다름)
- (호스트 이름 변경하려면 반드시 리붓)
- 쿠버네티스 우분투에 설치
- 도커를 먼저 설치
$ apt install docker.io # 만약 락이 걸려 있는 경우 reboot 후에 하면 된다.
- 다음 내용을 install.sh 파일에 작성하고 chmod로 권한을 주고 실행
$ gedit install.sh sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 복사 # 실행 $ bash install.sh # 설치 확인 $ kube + tab kubeadm kubectl kubelet # 설치 완료 후 halt(중단) $ halt
- 쿠버네티스 설치 사이트
- https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 신뢰할 수 있는 APT 키 추가
- apt-get update && apt-get install -y apt-transport-https curl
-
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg apt-key add -
- 도커를 먼저 설치
- Kubenrnetes를 관리하는 명령어
- kubeadm
- 클러스터를 부트스트랩하는 명령
- kubelet
- 클러스터의 모든 시스템에서 실행되는 구성요소로 창 및 컨테이너 시작과 같은 작업을 수행
- kubectl
- 커맨드 라인 util은 당신의 클러스터와 대화
- kubeadm
- 마스터 노드에서 Work 노드 복사
- 스냅샷 찍기
- docker, kubeadm 설치된 스냅샷으로 복원 가능
- 복제
- 이름 설정
- 주소 정책: NAT 네트워크 어댑터 새 MAC 주소 생성
- MAC 주소를 새로 생성해야 분리하여 사용할 수 있다.
- 파일 -> 환경설정 -> 네트워크 -> 새로운 NAT 추가
- 마스터, 워커 노드에 추가한 NAT 추가
- 이미지 우 클릭 -> 설정 -> 네트워크 -> NAT 네트워크 -> 추가한 NAT 네트워크로 설정
- 고급, MAC 주소 새로고침
- 같은 switch에 물릴 수 있도록 해당 설정 진행
- 확인
- 세개의 이미지를 올린 후에 ping으로 확인
# 세개의 이미지에서 다른 ip 확인 $ ip addr $ ping 10.0.2.5
- 만약 같은 ip로 나온다면 아래 설정을 확인해보자
- 네트워크 인터페이스의 MAC 주소를 변경하지 않음
- 네트워크 설정이 NatNetwork로 지정되지 않음
- 세개의 이미지를 올린 후에 ping으로 확인
- 스냅샷 찍기
- 마스터 노드, Work 노드 세팅
- 노드 별로 hostname을 수정해야 한다.
$ vi /etc/hostname Master WorkNode1 WorkNode2 # reboot해야 hostname 수정이 가능하다. $ reboot
- 마스터 및 워커 노드 스왑 에러 발생 시 스왑 기능 제거
$ sudo swapoff -a // 현재 커널에서 스왑 기능 끄기 $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab // 리붓 후에도 스왑 기능 유지
- 스왑기능을 비활성 하는 이유
- 쿠버네티스 1.8 이후, 노드에서 스왑을 비활성해야 한다. (또는, –fail-swap-on을 false로 설정)
- 쿠버네티스의 아이디어는 인스턴스를 최대한 100%에 가깝게 성능을 발휘하는 것
- 모든 배포는 CPU/메모리 제한을 고정하는 것이 필요
- 따라서 스케줄러가 포드를 머신에 보내면 스왑을 사용하지 않는 것이 필요
- 스왑 발생 시 속도가 느려지는 이슈 발생, 성능을 위한 것
- 참고 문헌: https://serverfault.com/questions/881517/why-disable-swap-on-kubernetes
- 스왑기능을 비활성 하는 이유
- 마스터 노드 초기화 (사용할 포드 네트워크 대역을 설정)
$ sudo kubeadm init
## 초기화 성공시 나오는 메시지 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.2.15:6443 --token dwaoa1.4nf7b81nsfnkxctw \ --discovery-token-ca-cert-hash sha256:b16367e80df58c3dbacfc3961126ae82d68519368d345fdb228addf04cb4ea2f ****
- 클러스터를 사용 초기 세팅
- 마스터 노드
## 다음을 일반 사용자 계정으로 실행 (콘솔에 출력된 메시지를 복붙) $ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 워크 노드
## Pod Network 추가 $ kubeadm join 10.0.2.15:6443 --token clwxjf.xjmjzwgkl364t68n \ --discovery-token-ca-cert-hash sha256:683486f3864307d970e4c343c2ce29b3f74ed3604720f1acb601d5765826e5c6 ## 이것을 잘해야 노드 추가 명령어가 잘 실행됩니다!
- 마스터 노드 연결 확인
$ kubectl get node NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 15m v1.20.5 worknode1 NotReady <none> 8m24s v1.20.5 worknode2 NotReady <none> 3s v1.20.5
- 마스터 노드
- 클러스터를 사용 초기 세팅
- 노드 별로 hostname을 수정해야 한다.
- STATUS: Not Ready
- Network 설정을 해야 사용할 수 있다.
- 참고문헌: https://www.weave.works/docs/net/latest/kubernetes/kube-addon/
# 워커 노드에서 실행 $ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
- node를 확인하면 Ready 상태로 변경된 것을 확인할 수 있다.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 32m v1.20.5 worknode1 Ready <none> 25m v1.20.5 worknode2 Ready <none> 17m v1.20.5
- 재부팅 후 이슈 해결
$ kubectl get nodes The connection to the server 10.0.2.15:6443 was refused - did you specify the right host or port?
- swap 설정이 제대로 안이뤄져서 그렇다.
$ sudo -i $ swapoff -a $ exit $ strace -eopenat kubectl version
- swap 설정을 한 후 다시 하면 된다.
- swap 설정이 제대로 안이뤄져서 그렇다.
-
일반적인 사용자와 마스터 노드, 워커 노드 연결관계
-
실무에서 사용되는 환경
-
현재 설정한 환경
- kubectl이 쿠버네티스 클러스터 밖에 있어서 제어하는 것이 아닌, master-virtualbox안에 있다.
-
** 출처: 데브옵스(DevOps)를 위한 쿠버네티스 마스터 ** 출처: 시작하세요 도커/쿠버네티스