-
K8S HA(멀티 마스터 노드) 구성하기DevOps/K8s 2023. 10. 16. 01:31
HA (High Availability)
고가용성 기존의 마스터 노드를 한개로 두었을때 마스터 노드가 다운되었을때 전체 시스템의 장애가 발생하기때문에 이를 방지하고자 마스터노드를 여러대로 두어 가용자원을 높인다.
1. VM으로 노드 구성 하기
(물리적으로 컴퓨터를 6대 구매하여 자원을 격리하는 형태는 비용이 많이 들기때문에 아래와 같이 가상머신을 통해서 자원을 격리한다)
현재 서버의 스펙이 10코어 20스레드이며 램은 64GB 스레드를 기준으로 cpus를 배정했다.
마스터 3대
마스터 노드에는 컨테이너(어플리케이션)를 배정하지 않을 예정이기 때문에 자원을 적게 잡았다
multipass launch focal --name master-node1 --cpus 2 --memory 6G --disk 50G multipass launch focal --name master-node2 --cpus 2 --memory 6G --disk 50G multipass launch focal --name master-node3 --cpus 2 --memory 6G --disk 50G
워커노드 3대
워커 노드에는 컨테이너(어플리케이션)를 배정할 예정이므로 마스터 노드보다는 크게 설정 했다.
multipass launch focal --name worker-node1 --cpus 4 --memory 14G --disk 100G multipass launch focal --name worker-node2 --cpus 4 --memory 14G --disk 100G multipass launch focal --name worker-node3 --cpus 4 --memory 14G --disk 100G
로컬 L4 역할 Nginx사용
로컬에 도커 설치후 Nginx를 통해서 내부 VM 노드에 접근할 수 있도록 한다.
구성된 VM 인스턴스 목록
2. K8S 공식 문서로 클러스터를 구성한다.
2.1 공식 문서
1. 한글 번역 문서
2. 영문 사이트 1.27버전 문서
https://v1-27.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
2.2 큐브 어드민 설치 사전 작업
작업 해당 노드 : 마스터, 워커
최소사양 & 스왑 메모리 off
그림에서 말한대로 최소 사양은 2GB 이상, 2스레드 이상을 요구한다.
또한 스왑 메모리를 끄도록 설정하고있다.
(스왑 메모리는 저장장치의 일정 용량을 캐시메모리처럼 사용하는 것이라고 생각하면 된다)
1. 마스터 노드에 접근 (모든 노드에서 수행해야한다)
multipass exec master-node1 /bin/bash
2. 루트 계정으로 전환
sudo su
3. 쉘로 진입하여 스왑 메모리를 설정을 끈다.
sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
4. 스왑 메모리 설정 되있는지 여부 확인
free -m
5. 노드에 접속하지않고 명령어 전달로 실행
# 마스터 노드 3대 multipass exec master-node1 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab" multipass exec master-node2 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab" multipass exec master-node3 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab" # 워커노드 3대 multipass exec worker-node1 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab" multipass exec worker-node2 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab" multipass exec worker-node3 -- sudo bash -c "sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
확인용 multipass exec master-node1 -- sudo bash -c "free -m"
(스왑 메모리 끄지않으면 이후 설치 과정중에 꺼달라는 경고함께 설치가 중단 된다)
2.3 CRI-O (컨테이너 런타임) 우분투에 설치
작업 해당 노드 : 마스터, 워커
공식문서
CRI-O 설치 가이드
https://github.com/cri-o/cri-o/blob/release-1.28/install.md#apt-based-operating-systems
exec 명령어로 접속후 설정하기 편하도록 sudo su 관리자 계정 전환
1. 쉘에 두가지 변수 선언 : 운영체제, 버전 설정
OS=xUbuntu_20.04 VERSION=1.28
2. 다음 명령어를 통해서 설치한다.
echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list mkdir -p /usr/share/keyrings curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg apt-get update apt-get install cri-o cri-o-runc
3. 정상 설치시 스킵
CRI-O 설치과정에서 다음과 같은 에러가 발생 시
404 Not Found [IP: 195.135.221.134 443]
분명 OS와 버전도 깃허브 브랜치에서 확인한대로 작성했는데 동작하지않는다면 deb 레포 정보가 부정확해서 발생한 문제일 수 있다.
# 아래 디렉토리로 이동
cd /etc/apt/sources.list.d
# 파일 목록 확인
ls
# 두가지 파일을 확인 할 수 있다.
위 파일중 하나에 버전정보가 빠졌다
변수선언이 제대로 되지않은것 같다.
crio-o:$version.list에 버전 정보가 치환되어야하는데 변수선언이 되지않아 발생한 오류다
다시 쉘에 VERSION=1.28을 친 후 에 echo $VERSION로 잘 출력되는지 확인해본 후 다시
cat devel\:kubic\:libcontainers\:stable.list 으로 파일의 마지막에 $OS 버전이 맞게 작성되었는지 수동을 파일이름을 변경하던지 삭제하고 다시 위에 생성한 방법대로 재생성 한다.
4. CRI-O (컨테이너 런타임) 실행 방법
공식 문서
https://github.com/cri-o/cri-o/blob/release-1.28/install.md#starting-cri-o
sudo systemctl daemon-reload sudo systemctl enable crio sudo systemctl start crio # 서비스가 잘동작하는지 확인 service crio status
5. 기존 CRI-O 업그레이드 필요한 경우 아닌 경우 스킵
마찬가지로 OS, VERSION 변수 선언 후 앵커링 걸린 부분대로 실행하면 된다
https://github.com/cri-o/cri-o/blob/release-1.28/install.md#apt-based-operating-systems-1
6. crictl(container runtime tool) 컨테이너 명령어를 지원하는 툴 설치
설치방법
https://github.com/kubernetes-sigs/cri-tools#install
VERSION="v1.28.0" wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin rm -f crictl-$VERSION-linux-amd64.tar.gz
설정
https://github.com/cri-o/cri-o/blob/release-1.28/tutorials/crictl.md
sudo crictl --runtime-endpoint unix:///var/run/crio/crio.sock version
7. 정상 설정 시 다음과 같이 도커 명령어와 유사하게 실행가능
# 실행중인 컨테이너 목록 crictl ps # 컨테이너 이미지 목록 crictl images
2.4 특정 포트 방화벽 해제
작업 해당 노드 : 마스터, 워커
공식문서
쿠버네티스는 보통 방화벽을 해지하고 사용한다고한다.
방화벽은 내부가 아닌 외부에서 들어오는 입구에서 주로 설정 하기때문이다.
multipass exec master-node1 -- sudo bash -c "sudo systemctl stop firewalld" multipass exec master-node1 -- sudo bash -c "sudo systemctl disable firewalld" service ufw stop
방화벽이 설치 안된경우 다음과 같은 에러문구가 나오며 설치가 되어있지 않기 때문에 스킵 해도 된다.
2.5 브릿지 설정
작업 해당 노드 : 마스터, 워커
공식 문서
cat <<EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # sysctl params required by setup, params persist across reboots cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # Apply sysctl params without reboot sudo sysctl --system
위 명령어시 ubuntu 20.04버전에서는 중간부분 에러가 나는데 크게 신경쓰지않아도 된다고 한다.
2.6 Kubeadm, Kubelet, Kubectl 설치
작업 해당 노드 : 마스터, 워커
공식 문서
각 도구의 정의
kubeadm : 클러스터를 부트스트랩하는 명령이다. (클러스터 생성/관리 도구)
kubelet : 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
kubectl : 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.
1. Kubeadm, Kubelet, Kubectl 설치
# 1.Update the apt package index and install packages needed to use the Kubernetes apt repository: apt-get update apt-get install -y apt-transport-https ca-certificates curl # 2. Download the Google Cloud public signing key: curl -fsSL https://dl.k8s.io/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg # 3. Add the Kubernetes apt repository: echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list # 4.Update apt package index, install kubelet, kubeadm and kubectl, and pin their version: apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
2. 설치 과정에서 오류 발생 시 (정상 설치시 스킵)
오류 로그
gpg: can't create '/etc/apt/keyrings/kubernetes-archive-keyring.gpg': No such file or directory
gpg: no valid OpenPGP data found.
gpg: dearmoring failed: No such file or directory
(23) Failed writing bodymkdir /etc/apt/keyrings 로 디렉토리를 만들어주면 해결된다.
3. 실행
systemctl start kubelet systemctl enable kubelet
4. 그외 오류 발생 시
공식 문서
2.7 kubeadm으로 클러스터 구성하기
작업 해당 노드 : 마스터
공식 문서
1. /etc/hosts 구성하기 ( 모든 노드 + 로컬에 적용 )
#K8S
10.52.221.77 master-node2 master1
10.52.221.113 master-node2 master2
10.52.221.4 master-node3 master3
10.52.221.34 worker-node1 worker1
10.52.221.35 worker-node2 worker2
10.52.221.130 worker-node3 worker3
192.168.219.127 lb.k8s.ha lb2. Nginx를 통해서 VM에 설치된 마스터 노드 6443포트를 연결해준다.
events { } stream { upstream stream_backend { least_conn; server 10.52.221.203:6443; server 10.52.221.63:6443; server 10.52.221.49:6443; } server { listen 6443; proxy_pass stream_backend; proxy_timeout 300s; proxy_connect_timeout 1s; } }
3. 도커로 nginx 설정파일 실행
sudo docker run --name proxy -v /home/tory/k8s/nginx.conf:/etc/nginx/nginx.conf:ro --restart=always -p 6443:6443 -d nginx
4. API(controller, scheduler, etcd), CoreDNS 설치 및 단일 진입점 Nginx 설정 정보 추가
pod-network-cidr
파드 생성시 부여되는 아이피 범위를 Flannel 사용을 위해서 범위를 지정했다.
--control-plane-endpoint
/etc/hosts 파일과 nginx정보에 기록한 단일 진입정 정보
sudo kubeadm init --control-plane-endpoint "lb.example.com:6443" --pod-network-cidr=10.244.0.0/16 --upload-certs
nginx의 정보와 /etc/hosts 정보가 누락되었거나 다를 경우 설치과정에서 Initial timeout of 40s passed로 중단될 수 있다.
그럴결우 kubeadm reset을 통해서 초기화 후 다시 정보를 맞춰서 진행해야한다.
첫번째 빨간 블록 : kubectl 권한 설정 ( 원하는 계정으로 이동해서 아래 명령어를 실행한다 )
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
두번째 빨간 블록 : 토큰을 통해 하위 마스터 노드를 조인시킬때 사용된다.
위 토큰을 내용을 따로 저장하여 보관한다.
마스터 노드 Join
마스터 노드접속 -> control plane join에 kubeamd join [ip] --token ... 정보 입력
워커 노드 join
워커 노드접속 -> worker node join에 kubeamd join [ip] --token ... 정보 입력
오류 로그
couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
kubectl 명령어 사용을 원하는 노드는 $HOME/.kube/config를 적용해준다.
2.8 CNI 구성
작업 해당 노드 : 마스터
공식 문서
CNI (Container Network Interface) : 컨테이너간의 통신을 지원한다.
예시) 컨테이너기반 동작 애플리케이션이 두가지 있다.
하나는 프론트 서버인 리액트와 다른하나는 백엔드 서버인 스프링부트다
이러한 컨테이너간의 통신을 위해서 존재하는 인터페이스가 CNI다.
종류는 매우 다양하다.
Flannel로 설치시
https://github.com/flannel-io/flannel
Flannel 사용을 하는 경우 설치 파일 적용
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.ymlflannel 삭제 시
kubectl delete -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml kubeadm reset rm -rf /var/lib/cni/ rm -rf /etc/cni/ rm -rf /run/flannel ifconfig cni0 down ip link delete cni0 ip link delete flannel.1
weave로 설치 시
그중에 weave를 사용하려 했지만 1.28을 지원하지 않는지 적용이 되지않는다.
coreDns로그에서 kubenetes waiting 로그가 계속올라온다.
--[INFO] plugin/kubernetes: waiting for Kubernetes API before starting server--
파드에서 외부 통신이 잘되지 않는다 -> cat /etc/reolve.conf 확인
https://www.weave.works/docs/net/latest/kubernetes/kube-addon/#-installation
만일 weave 사용을 하는 경우 설치 파일 적용
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
'DevOps > K8s' 카테고리의 다른 글
[쿠버네티스] 로컬에서 클러스터 관리 (0) 2023.10.29 K8S 기본 개념 && 기본 명령어 (0) 2023.10.21 K3S로 프로젝트 구성하기 - 7 (0) 2023.06.20 K3S로 프로젝트 구성하기 - 6 (0) 2023.06.08