Kubernetes - 설치, 클러스터 구성

기반 정보

Master Node

etcd에 워커 노드들의 상태 정보 가지고 있음

API를 통해 요청받아서 etcd 정보 기반으로 스케줄러에게 요청 (어느 노드에서 프로세스 실행하는게 가장 좋아?)

-> 스케줄러의 답변 (xx노드에다가 yy프로세스 실행)

스케줄러의 결과 기반으로 특정 노드 접속해서 kubelet에게 실행요청(ex, nginx 실행해줘)

kubelet은 docker에 실행 요청

컨트롤러가 상태 관찰하다가 문제가 생기면 새로운 노드에서 실행해줌

Master component

controller - 개수 보장

scheduler - 위치 배정

node - 각각 실행

etcd - 모든 상태 저장

API - 요청받아서 관리

Worker component

kubelet - 노드 모니터링

kube-proxy - 노드 네트워크 담당

기타

실제 컨테이너 실행 - docker

kubeadm - 클러스터 관리 도구

CNI - container network interface, 컨테이너 간 통신

한번 쭉 돌려본 뒤에 다시 정리하도록 하고, 일단은 설치-실행까지 먼저 해보자..

실행

쿠버네티스 설치

도커 설치가 먼저 필요함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo apt-get update

sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

sudo systemctl enable docker
sudo docker version

쿠버네티스 설치 전 환경설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

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

systemctl stop firewalld 
systemctl disable firewalld

쿠버네티스 설치 (kubelet, kubeadm, kubectl)

1
2
3
4
5
6
7
8
9
10
11
12
13
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 start kubelet
sudo systemctl enable kubelet

클러스터 구성

Control-Plane

마스터에 컴포넌트들 생성 (API, Controller, Scheduler, etcd, coreDNS)

1
kubeadm init

설치 완료시

1
then you can join any number of worker nodes by running the following on each as root:

문구와 함께 토큰이 생성된다 (worker node 가 써야 하니까 따로 저장해두어야 함)

(만료기간이 하루? 정도로 매우 짧으니까 당장만 쓸 수 있음. 이후엔 재발급해야 함) -> 후술

모두 설치된 이후에는 다음 명령어로 path를 설정해주고

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
1
2
kubectl get nodes
kubectl get nodes -o wide # ip, 커널 정보 등 추가 출력

등의 명령어를 이용해서 클러스터 상태 확인 가능.

아직까지는 당연히 worker 등록을 하지 않았으니 control-plane 노드만 있다.

그리고 control-plane 노드가 not ready 일텐데, network add-on을 설치해야 함.

1
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

이제 다시 클러스터 상태를 보면 ready가 된 것을 볼 수 있다. - control plane 구성 끝

Worker Node

앞서 만들어둔 토큰을 인자로 명령어를 실행하면 됨

1
kubeadm join [master-node-ip]:[port] --token [token] --discovery-token-ca-cert-hash sha256:[hash키]

만약 토큰의 기간이 만료되었다면 control-plane 에서 재발급해야 함

1
2
3
4
5
6
7
8
# 토큰 생성
kubeadm token create --ttl 0 # (ttl 옵션은 유효기간 설정. 10m, 100h 등. 0은 무제한)

# hash 키 구하기
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# 토큰 목록 보기
kubeadm token list

나의 경우에는, kubeadm join 명령어 실행시 오류가 났음. 자세한 로그를 보기 위해서는 명령어 맨 뒤에 –v=5 옵션을 주면 에러 내용을 볼 수 있음. [troubleshooting]

다 되었으면 master 에서 확인 가능

1
2
kubectl get nodes # 실행중인 노드 보기
kubectl get nodes -o wide # 더 자세하게 보기
  • 설치 끝 -

kube 명령어들 자동완성(tab) 등록 방법

1
2
3
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
kubectl->kubeadm 동일하게 하면 kubeadm도 됨