서버 쿠버네티스 클러스터링
테스트 서버를 쿠버네티스 클러스터로 구성해보자.
쿠버네티스 클러스터 구성을 보면 알겠지만 master 노드가 필수적으로 1대 필요하고, 실제 POD를 배포할 worker 노드가 필요하다.
때문에 최소 2대, POD가 각 워커노드에 잘 배포되는지를 보려면 3대의 테스트 서버가 필요하다.
master, worker node 전체 수행
패키지 우선 업데이트
1
apt-get update && apt-get upgrade -y
/etc/hosts 호스트명 변경
클러스터링 될 서버들을 각 역할에 맞게 변경한다.
도커 설치 및 설정
도커 설치
1
2
3
curl -s https://get.docker.com | sudo sh
systemctl enable docker
systemctl start docker
docker deamon.json 편집 (cgroup driver를 systemd로 변경)
1
2
3
4
5
6
7
8
9
10
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
도커 재실행 후 cgroup driver 확인
1
2
systemctl restart docker
docker info | grep -i cgroup
containerd 설치
k8s에서 v1.24.0 부터 docker를 기본 패키지에서 제외시킴, containerd는 docker와 같은 컨테이너 오픈소스
containerd 설치 => 아래 내용 전체 .sh 파일 생성 후 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
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
sudo apt update
sudo apt install -y containerd.io
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOF
sudo sed -i 's/^disabled_plugins \=/\#disabled_plugins \=/g' /etc/containerd/config.toml
sudo systemctl restart containerd
kubernetest 설치
아래내용 .sh 파일로 생성 후 실행
1
2
3
4
5
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 install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
서버 swap off 시켜주기
1
2
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
master 노드 작업
kubeadm init 실행
1
kubeadmin init
문제 발생 시 $HOME/.kube/config 삭제 후 kubeadm reset 한 뒤 다시 수행
아래 과정 중 문제 생기면 이렇게 초기화 하여 다시 수행하면 된다.
이때 나오는 로그 중 아래 로그는 wokernode 연결 시 사용됨
1
2
kubeadm join 192.168.0.202:6443 --token 82nkz2.dtxj99jnvegpyhsq \
....
init 성공 후 노드 조회
init 로그에 Successfully! 가 보일 경우 (root 외 계정 : sudo 권한이 없을 경우 root 계정으로 /etc/sudor 파일 수정)
1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
위 명령어 순서대로 수행 후
kubectl get nodes 명령어로 master node가 조회 되는지 확인
worker node 추가
[[서버 쿠버네티스 클러스터링#kubeadm init 실행]]위에서 출력된 로그 명령어 수행
1
2
kubeadm join 192.168.0.202:6443 --token 82nkz2.dtxj99jnvegpyhsq \
....
만약 master note init 시 출력 콘솔을 유실했다면 master 노드에서
kubeadm token create --print-join-command 명령어를 통해 재발급 가능
여기까지 했다면 kubectl get nodes 명령어를 통해 워커노드까지 조회가 되어야 한다.
다만 아직 NotReady로 조회된다.
master node Network Policy 제공자 설치
쿠버네티스 클러스터 구성 요소 중 Network Policy를 선택하여 설치하면 되는데 위브넷으로 진행
https://kubernetes.io/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy/
ex) 위브넷 설치 : kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
설치 후 kubectl get nodes 상태가 NotReady 에서 Ready로 변하는지 확인
클러스터 설정 완료
여기까지 했다면 아직 모든 k8s 명령어는 master node 서버에서만 수행 (worker node 에서도 bash 파일 복사하면 명령어 수행 가능)
⇒ 이제 master node가 현재 연결되어 있는 worker node 들 중 적당한 서버를 골라 deployment, pod 를 생성, replica를 유지 관리
쿠버네티스 외부로 포트포워드
1
2
kubectl port-forward --address=0.0.0.0 {service/pods 등..}/{어플리케이션명} {쿠버네티스 실행 포트}:{외부에서 접근할 포트} --namespace {namespace명}
kubectl port-forward --address=0.0.0.0 service/prometheus-grafana 3000:80 --namespace monitoring
이때 외부에서 접근하기 위해 --address=0.0.0.0 옵션을 필수로 준다.**