본문 바로가기

혼자하는 프로젝트/AWS_쿠버네티스_Docker

K8S Master Node HA 구성 (MasterNode:3)

728x90
반응형

# 쿠버네티스 클러스터링 환경 구성을 위해 k8s Master Node : 3, k8s Worker Node : 3 으로 k8s 클러스터링 환경을 만든다.

1. Swap을 사용하지 않도록 설정한다. (모든 노드 공통)

swapoff -a

echo 0 > /proc/sys/vm/swappiness

sed -e '/swap/ s/^#*/#/' -i /etc/fstab

2. docker 설치 (모든 노드 공통)

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

3. docker 데몬 교체 (모든 노드 공통)

# Docker 데몬이 사용하는 드라이버를 cgroupfs 대신 systemd를 사용하도록 설정
cat << EOF | sudo tee –a /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 위 명령어를 실행 후 아래의 명령어 실행
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker

4. kubernetes 설치 (모든 노드 공통)

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

5. hostname 설정 (모든 노드 공통)

sudo vi /etc/hosts
172.16.0.86          master1
172.16.0.189         master2
172.16.0.142         master3

# 각 노드 서버에서 실행
# master1
hostnamectl set-hostname master1
# master2
hostnamectl set-hostname master2
# master3
hostnamectl set-hostname master3

6. HAproxy 로드밸런서 설치 및 설정 (Master1 노드에서 수행)

# 프로그램 설치
sudo apt install haproxy -y

# 세팅
cat << EOF | sudo tee -a /etc/haproxy/haproxy.cfg
frontend kubernetes-master-lb
bind 0.0.0.0:26443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
option tcplog
server master1 172.16.0.86:6443 check
server master2 172.16.0.189:6443 check
server master3 172.16.0.142:6443 check
EOF

# 재시작
sudo systemctl restart haproxy
sudo systemctl enable haproxy

7. 클러스터 생성 (Master1 노드에서 실행)

- 아래의 클러스터 생성 시 설명에 대해서는 자세히? 리포팅 할 필요 있음.

--control-plane-endpoint 파라미터: ControlPlaneEndpoint는 제어부에 대해 안정적인 IP 주소 또는 DNS 이름을 설정합니다.
--apiserver-advertise-address
파라미터: 다른 노드가 마스터 노드에 접근할 수 있는 IP 주소를 명시한다.
--pod-network-cidr 파라미터: 쿠버네티스에서 사용할 컨테이너의 네트워크 대역을 지정한다.

(실제 서버에 할당된 IP와 중복되지 않도록 해야 한다. 다음 단계에서 진행할 네트워크 플러그인 설치 과정에서 Calico를 설치할 계획이라 CIDR 범위를 192.168.0.0/16로 지정했다. 만약 Flannel을 사용한다면 10.244.0.0./16을 사용해야 한다.)
--apiserver-cert-extra-sans 파라미터: 이 값에는 쿠버네티스가 생성한 TLS 인증서에 적용할 IP 또는 도메인을 명시할 수 있다.  로컬 환경에서 kubectl을 통해 이 클러스터에 접근하려면 kube-apiserver와 통신할 수 있어야 하기 때문에 마스터 노드가 실행되고 있는 EC2 인스턴스의 퍼블릭 IP 주소를 추가해야 한다.

--upload-certs 파라미터: 노드 join에 필요한 cert key값을 받기위해 필요.

#sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs
#가로 코드
sudo kubeadm init --control-plane-endpoint 172.16.0.86:26443 --apiserver-advertise-address=0.0.0.0 --pod-network-cidr=192.168.0.0/16 --apiserver-cert-extra-sans=10.1.1.10,3.34.123.28 --upload-certs

#위의 가로 코드를 보기좋게 정리한 코드 (같은 내용임)
sudo kubeadm init \
	--control-plane-endpoint 172.16.0.86:26443 \
	--apiserver-advertise-address=0.0.0.0 \
	--pod-network-cidr=192.168.0.0/16 \
	--apiserver-cert-extra-sans=10.1.1.10,3.34.123.28 \
	--upload-certs

# 위의 코드 실행 후 아래 명령어를 순서대로 실행해 줘야함
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

8. Master2, Master3 노드를 Master1 노드에 연결

- join 명령어가 아래와 같이 2개가 등장, 위에 control-plane 같이 있는 코드는 마스터 노드가 join해야 하는 코드임

You can now join any number of the control-plane node running the following command on each as root:
#마스터 노드에서 실행해야 하는 코드(아래의 값은 임의의 값으로 변경 함)
  kubeadm join 172.16.0.86:26443 --token 28wiw3.xofi21ouf9nek33u \
        --discovery-token-ca-cert-hash sha256:f2ff432d696c***********09c7c3c3e4fadd5a120d592a8fd067f \
        --control-plane --certificate-key 4a99d1012a626df************a339ac691786332d7d5f62666
...

Then you can join any number of worker nodes by running the following on each as root:
#워커 노드에서 실행해야 하는 코드(아래의 값은 임의의 값으로 변경 함)
kubeadm join 172.16.0.86:26443 --token 28wiw3.xo************fiek33u \
        --discovery-token-ca-cert-hash sha256:f2ff******************09c7c3c3e4fadd5a120d592a8fd067f

9. CNI 설치 (모든 노드 공통)

택 1
1. fannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2. weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')&env.IPALLOC_RANGE=10.244.0.0/16"

#나는 3번 설치함
3. calico
kubectl apply -f https://docs.projectcalico.org/v3.19/manifests/calico.yaml

10. 서비스 확인

- 마스터 노드 3개가 묶인것을 확인 할 수 있다.

- 워크노드의 추가는 매우 간단하다. 이전의 워커노드에서 실행해야하는 join 명령어를 복사하여 워커 노드에서 실행하면 된다.

11. 기타 ()

- 만약 아래와 같은 에러가 발생 시 

Unable to connect to the server: x509: 
certificate signed by unknown authority 
(possibly because of "crypto/rsa: verification error" 
while trying to verify candidate authority certificate "kubernetes")

- 명령어 실행

unset KUBECONFIG
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

12. 워커노드 참여

2022.02.24 - [혼자하는 프로젝트/AWS + 쿠버네티스 + Docker] - K8S Master Node HA 구성 (2개의 Worker Node 참여)

 

K8S Master Node HA 구성 (2개의 Worker Node 참여)

# EC2 인스턴스를 생성 (t3.samll - 2개) 1. Swap을 사용하지 않도록 설정한다. (모든 노드 공통) swapoff -a echo 0 > /proc/sys/vm/swappiness sed -e '/swap/ s/^#*/#/' -i /etc/fstab 2. docker 설치 (모든 노..

may9noy.tistory.com

- 끝 -

728x90
반응형