쿠버네티스란 무엇인가?
쿠버네티스는 컨테이너화된 애플리케이션의 자동 Deploy, Scaling 등을 제공하는 관리 시스템으로 오픈 소스 기반이다.
구글에 의해 설계되었고 현재는 리눅스 재단에 의해 관리되고 있다. 여러 클러스터의 호스트 간 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화 하기 위한 플랫폼을 제공하기 위한 목적을 가지고 있다. 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작한다.
쿠버네티스 구성요소
쿠버네티스 실습
1. 준비 작업
Virtual Box를 통해서 Master Node와 Worker Node를 2개 생성 해 주었다.
Master Node는 control plane으로 워커 노드들의 상태를 관리하고 제어하는 역할을 한다.
Worker Node는 도커 플랫폼을 통해서 컨테이너를 동작하며 실제 서비스를 제공하는 역할을 한다.
(현재 22.04 및 20.04 버전은 포트 오류로 인해서 18.04로 실습을 진행중)
2. 도커 설치하기 (Master, Worker 1, Worker 2)
먼저 MasterNode로 들어간 후 터미널을 들어가 준다.
그 후 sudo apt-get curl 명령어를 통해서 curl을 설치 해 준다.
sudo apt-get curl
그리고 curl -fsSL https://get.docker.com -o get-docker.sh 명령어를 입력 해 준다. 이 이 명령어를 입력하면 get-docker.sh 스크립트 파일이 저장이 된다.
curl -fsSL https://get.docker.com -o get-docker.sh
그리고 sudo sh get-docker.sh 명령어를 통해서 도커를 설치 해 준다.
sudo sh get-docker.sh
docker -v를 통해서 내가 현재 도커를 설치 했는지 무슨 버전을 쓰는지 확인할 수 있다.
마지막으로 Docker-Compose를 설치 해 준다. Docker Compse는 yaml 파일을 통해서 여러 컨테이너들을 한번에 관리를 해 줄 수 있는 역할을 한다.
Master Node에서 실행한 작업을 Worker 1, Worker 2 모두 반복 해 준다.
결국 쿠버네티스는 도커를 관리하는 툴 이라고 생각하면 되기 때문에 도커 설치가 필수적이다.
그러므로 3대 모두 도커를 설치해야 한다.
3. 쿠버네티스 사전 작업
kubernetes.io 에 접속한 후 Documentation을 클릭한다.
Set up a K8s cluster 에 있는 Install the kubeadm setup tool을 클릭한다.
위는 kubeadm을 통해서 쿠버네티스를 설치할 때 필요한 내용이다.
그렇다면 마지막을 보면 Swap disabled라고 적혀있다. kubelet을 사용하려면 스왑을 비활성화 해야한다는 것이다.
그러므로 먼저 swap을 Disable 해 준다. 이 명령어는 세 노드 전부 실행 해 줘야 한다.
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
그 후 iptable을 설정하기 위해서 위와 같은 명령어를 실행한다. 이 역시 세 노드 모드 진행한다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
이제 다음 진행 할 작업은 컨트롤 플레인과 워커 노드 모두 필요한 포트를 뚫어줘야 한다.
이는 쿠버네티스에서 권장하는 포트이다.
그러나 우리는 방화벽을 disable 할 것이다.
쿠버네티스 시스템에는 보통 방화벽을 켜놓고 사용하지 않는다. 앞단에서 방화벽을 보통 구성하고 있기 때문이다.
방화벽을 멈추고 비활성화 하는 명령어를 쳤는데 Failed이 떴다. 현재 시스템에서 방화벽 서비스 자체가 설치되어 있지 않기 때문에 나온 오류이므로 신경쓰지 않아도 된다.
sudo systemctl stop firewalld
sudo systemctl disable firewalld
하지만 이 방법으로 계속 진행하니 6443에 대한 포트 오류가 계속 되었다. 그래서 트러블 슈팅 결과 위 명령어는 레드헷 계열 혹은 cent os에서 쓰는 명령어이고
나는 ubuntu로 진행했기 때문에 데비안 계열에서는 다른 명령어를 입력해야 한다는 것을 알았다.
위 사진에서 역시 Ubuntu와 레드헷과 센트OS의 명령어가 다른 것을 확인할 수 있다.
그러므로 우리는 Ubuntu의 명령어를 실행시켜야 제대로 할 수 있다.
그리고 마지막에 꼭 Telnet으로 확인이 필요하다.
4. 쿠버네티스 인스톨
이제 사전 작업은 완료 되었으니 쿠버네티스를 설치 할 예정이다.
kubeadm, kubelet, kubectl 이 세가지를 설치 할 것이다.
- kubeadm: 클러스터를 부트스트랩하는 명령
- kubelet: 클러스터의 모든 시스템에서 실행되며 파드 및 컨테이너 시작과 같은 작업을 수행하는 구성 요소
- kubectl: 클러스터와 통신하기 위한 명령줄 유틸리티
먼저 쿠버네티스 설치를 진행하기 위해 저장 소 업데이트 및 필수 패키지를 추가한다. 이 작업 역시모든 노드에 적용시켜 준다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
그 후 구글 클라우드 퍼블릭 키 다운로드를 수행한다. 이 작업도 세 노드 모두 실시한다.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
쿠버네티스를 설치하기 위해 쿠버네티스 저장소를 추가한다. 이 작업도 세 노드 모두 실시한다.
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
쿠버네티스 저장소가 설치되면 차례대로 필요한 프로그램을 설치 해 준다. 이 작업 역시 세 노드 모두 진행한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
마지막으로 쿠버네티스를 서비스 등록을 마친 후 재시작을 수행한다. 이 작업 역시 세 노드 모두 진행한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
5. Control-Plane 구성하기
그 다음은 Control-Plane을 구성할 것이다. 이 작업은 Control-Plane이 될 Master Node만 실행시키면 된다.
kubeadm init 명령어를 입력한다. 그런데 오류가 뜨는 것을 확인할 수 있다.
문제를 보면 컨테이너 런타임이 실행되지 않는다는 오류가 뜬다.
이는 containerd.io 1.3.7 이상 시 문제가 발생하는 것으로 파악했으며 containerd 데몬에서 cri 옵션이 버그를 야기시키는 것이라고 보인다(github 토론)
또 다른 말로는 쿠버네티스 1.20 버전 이상부터 도커를 컨테이너 런타임으로 사용하는 것이 중지된 이유 때문이라고도 한다. 도커가 k8s CRI(Container Runtime Interface)를 지원하지 않기 때문이다. 따라서 중간에 dockershim을 어거지로 끼워서 사용은 가능했다.
그러나 1.24 버전부터는 dockershim 지원이 중지되었다. 이때부터는 쿠버네티스 CRI와 호환되는 컨테이너 런타임을 사용해야 한다.
그러므로 이 명령어를 입력해 준다.
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
혹은 /etc/containerd/config.toml 파일의 disabled_plugins = ["cri"]를 주석처리를 해야 한다.
그 다음 다시 kubeadm init을 실행 시켜 준다.
그렇다면 잘 되는 것을 확인할 수 있다.
kubeadm init
이 작업이 완료된다면 우리 Master 안에 API Server Controller, Scheduler, ETCD가 구성이 된다.
이것을 구성하는 것이 kubeadm init이고 이것은 contorl plane에만 실행하면 되는 것이다.
- kube-apiserver
- Cluster와 상호작용을 위한 k8s api 서버
- kube-scheduler
- Worker node에 있는 pod를 스케쥴
- kube-controller-manager
- Deployments나 Replication Controller 등 관리
- kube-cloud-manager
- Public Cloud Provider 연동 관리
- etcd
- Master cluster에서 k8s object 저장소로 사용
완료가 되면 이렇게 token이 나온다.
이를 저장 해 주었다.
이 토큰을 확인하면 마스터 시스템의 IP와 포트넘버, 마스터의 토큰과 인증서가 들어 있는 것을 확인할 수 있다.
마지막으로 모든 사용자가 kube 명령어를 사용할 수 있게 하기 위해 다음을 설정해야 한다.
이 작업을 master 사용자에게 해 준다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
우리는 현재 계정이 두개가 있다. master 계정과 root 계정이다.
master 계정에는 kube 명령어를 사용할 수 있도록 위의 명령어를 입력하여 줬지만 root 계정에는 아직 그 명령어를 입력해 주지 않았기 때문에 이러한 오류가 나오는 것이다.
만약 내가 사용하는 계정에게 kube 명령어를 사용할 수 있도록 하려면 위의 명령어를 입력해야 한다.
명령어를 입력한 후 마지막으로 master와 root 모두 kube 명령어를 사용할 수 있는 것을 확인하였다.
kube 명령어를 사용하기 위해서는 사용자 단위로 위 명령어를 꼭 입력해야 한다.
그 후 kubectl get nodes 명령어를 통해서 현재 쿠버네티스에 존재하는 nodes의 list를 불러오는 명령어를 입력했다.
명령어 입력 후 노드를 확인할 수 있고 역할이 control-plane인 것을 확인할 수 있다.
kubectl get nodes
하지만 master의 STATUS가 Not Ready 임을 확인할 수 있다.
이는 현재 CNI가 설치되지 않았기 때문이다.
CNI에는 다양한 종류의 플러그인이 존재한다. (플라넬, 칼리코, 위브넷 등등)
한 개의 CNI 플러그인이 반드시 존재해야 Pod 간의 통신이 가능하다.
우리는 위브넷을 설치 할 예정이다.
아래 명령어를 통해서 위브넷을 다운받아 준다. 잘 생성 된 것을 확인할 수 있다.
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
그 후 get nodes를 진행해 보면 STATUS가 Ready로 변경 된 것을 확인할 수 있다.
6. WorkerNode 설정하기
이제 Worker Node를 조인해 줘야 한다.
먼저 cat token.txt를 통해서 아까 저장해 놓은 토큰 값을 복사해 준다.
이걸 workernode1, workernode2에 붙여 넣어 준다.
그 이후 kubectl get nodes를 입력하면 이렇게 두 워커 노드들 역시 조인이 된 것을 확인할 수 있다.
이렇게 되면 가상머신 안에 쿠버네티스 설치가 완료 되었다.
참조 문서
https://confluence.curvc.com/pages/releaseview.action?pageId=98048155
https://medium.com/@texasdave2/troubleshoot-kubectl-connection-refused-6f5445a396ed
[K8s] 클러스터 구성중 Kubeadm init 과정 에러 (velog.io)
'[Kubernetes]' 카테고리의 다른 글
sample devops end to end project v1- devops project | ci/cd declarative pipeline using devops tools (0) | 2023.07.22 |
---|---|
[마이크로 서비스] 사용하지 않는 경우!! (0) | 2023.07.11 |
[k8s] Deployments란 무엇인가? & Update 방식 (0) | 2022.11.23 |
[k8s] YAML 기본 문법 및 k8s yaml 작성방법 (0) | 2022.11.23 |
[k8s] kubernetes의 Service가 무엇인가? (0) | 2022.11.22 |
[k8s] Helm을 통해 Prometheus, Grafana 적용하기 (0) | 2022.11.22 |
[k8s] 파드란 무엇인가, 파드 만들기(명령어로 생성 및 yaml로 생성) (0) | 2022.11.21 |
[k8s] 프로메테우스란 무엇인가? (개념 및 아키텍쳐) (0) | 2022.11.15 |
댓글