본문 바로가기

리눅스

[draft] 쿠버네티스 클러스터를 고가용성으로 구성하는 방법

728x90

쿠버네티스 클러스터를 고가용성으로 구성하는 방법

쿠버네티스 클러스터를 고가용성(HA)으로 구성하는 것은 클러스터의 안정성과 신뢰성을 높이기 위해 중요합니다. HA 구성은 다양한 구성 요소의 이중화와 자동 복구 기능을 포함하여 클러스터가 장애가 발생하더라도 계속해서 작동하도록 보장합니다.

1. 기본 개념

핵심 요소로 구성

  • etcd : 클러스터의 데이터 저장소로 HA 구성을 통해 여러 노드에서 이중화합니다.
  • kube-apiserver : Kubernetes의 API 서버로 여러 인스턴스에서 실행하여 요청을 분산합니다.
  • kube-controller-manager : 클러스터 상태를 관리하는 컨트롤러의 여러 인스턴스를 실행합니다.
  • kube-scheduler : 파드를 스케줄링하는 스케줄러의 여러 인스턴스를 실행합니다.
  • 로드 밸런서 : 외부 요청을 여러 API 서버 인스턴스로 분산합니다.
  • kubelet : 각 노드에서 실행되며 노드가 항상 가용하도록 보장합니다.

2. etcd 고가용성 구성

여러 etcd 노드 배포

  • etcd는 클러스터를 구성하는 여러 노드에서 실행됩니다. 일반적으로 3개 이상의 노드에서 etcd를 배포하여 분산 및 고가용성을 확보합니다.

etcd 바이너리 다운로드 및 설치

  • 각 etcd 노드에서 바이너리를 다운로드하고 설치합니다.
ETCD_VERSION=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest | grep -oP '(?<="tag_name": "v)[^"]*')
curl -fsSL  "https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz" \
-o /usr/local/src/etcd-v${ETCD_VERSION}.tar.gz
tar xzf /usr/local/src/etcd-v${ETCD_VERSION}.tar.gz -C /usr/local/bin --strip-components=1
sudo mkdir /etc/etcd
sudo mkdir /var/lib/etcd
sudo chown -R etcd:etcd /var/lib/etcd

각 etcd 노드의 설정

vim /etc/etcd/etcd.conf
ETCD_NAME=node1
ETCD_DATA_DIR=/var/lib/etcd
ETCD_LISTEN_PEER_URLS=https://<ETCD_NODE1_IP>:2380
ETCD_LISTEN_CLIENT_URLS=https://<ETCD_NODE1_IP>:2379
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://<ETCD_NODE1_IP>:2380
ETCD_ADVERTISE_CLIENT_URLS=https://<ETCD_NODE1_IP>:2379
ETCD_INITIAL_CLUSTER=node1=https://<ETCD_NODE1_IP>:2380,node2=https://<ETCD_NODE2_IP>:2380,node3=https://<ETCD_NODE3_IP>:2380
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster

etcd 서비스 파일

vim /etc/systemd/system/etcd.service
[Unit]
Description=etcd
Documentation=https://etcd.io
After=network.target

[Service]
User=etcd
ExecStart=/usr/local/bin/etcd --config-file=/etc/etcd/etcd.conf
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=4096
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

인증서 및 키 파일

  • TLS를 통해 etcd와 클라이언트 간의 보안을 강화합니다. 인증서와 키 파일을 /etc/etcd/pki에 배치합니다.
openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/etcd/pki/server.key -out /etc/etcd/pki/server.crt -days 365

서비스 시작 및 확인

sudo systemctl daemon-reload
sudo systemctl start etcd
sudo systemctl enable etcd
sudo systemctl status etcd

3. kube-apiserver 고가용성 구성

kube-apiserver 바이너리 다운로드 및 설치

  • 각 kube-apiserver 노드에서 바이너리를 다운로드하고 설치합니다.
VERSION=$(curl -s https://api.github.com/repos/kubernetes/kubernetes/releases/latest | grep -oP '(?<="tag_name": "v)[^"]*')
curl -fsSL "https://dl.k8s.io/v${VERSION}/kubernetes-server-linux-amd64.tar.gz" -o /usr/local/src/kubernetes-server.tar.gz
tar xzf /usr/local/src/kubernetes-server.tar.gz -C /usr/local/bin --strip-components=1

여러 kube-apiserver 인스턴스 배포

  • kube-apiserver를 여러 노드에 배포하고 로드 밸런서를 사용하여 API 요청을 분산합니다.

각 kube-apiserver 인스턴스의 설정

vim /etc/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://kubernetes.io/docs/
After=network.target

[Service]
ExecStart=/usr/local/bin/kube-apiserver \
  --advertise-address=<API_SERVER_IP> \
  --allow-privileged=true \
  --apiserver-count=3 \
  --authorization-mode=Node,RBAC \
  --etcd-servers=https://<ETCD_NODE1_IP>:2379,https://<ETCD_NODE2_IP>:2379,https://<ETCD_NODE3_IP>:2379 \
  --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \
  --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \
  --client-ca-file=/etc/kubernetes/pki/ca.crt \
  --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
  --tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
  --service-account-key-file=/etc/kubernetes/pki/sa.pub \
  --requestheader-allowed-names=aggregator \
  --requestheader-client-ca-file=/etc/kubernetes/pki/aggregator-ca.crt \
  --requestheader-extra-headers-prefix=X-Remote-Extra- \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --enable-admission-plugins=NodeRestriction,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \
  --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt \
  --etcd-certfile=/etc/kubernetes/pki/etcd/server.crt \
  --etcd-keyfile=/etc/kubernetes/pki/etcd/server.key \
  --cors-allowed-origins="*"
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=4096
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

인증서 및 키 파일

  • kube-apiserver는 TLS를 사용하여 보안 통신을 합니다. 인증서와 키 파일을 생성하여 /etc/kubernetes/pki에 배치합니다.
openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/kubernetes/pki/apiserver.key -out /etc/kubernetes/pki/apiserver.crt -days 365

로드 밸런서 설정

  • kube-apiserver의 고가용성을 위해 로드 밸런서를 설정합니다. 클라우드 제공업체의 로드 밸런서나 자체 로드 밸런서를 사용하여 kube-apiserver의 IP 주소 또는 도메인을 로드 밸런서에 추가합니다.

4. kube-controller-manager 및 kube-scheduler 고가용성 구성

여러 인스턴스 배포

  • kube-controller-manager와 kube-scheduler를 여러 인스턴스에서 실행합니다. 이들 각각의 인스턴스는 --leader-elect=true 플래그를 사용하여 리더 선출을 통해 고가용성을 보장합니다.

kube-controller-manager 서비스 파일

vim /etc/systemd/system/kube-controller-manager.service

kube-scheduler 서비스 파일

vim /etc/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://kubernetes.io/docs/
After=network.target

[Service]
ExecStart=/usr/local/bin/kube-scheduler \
  --master=https://<API_SERVER_LOAD_BALANCER>:443 \
  --kubeconfig=/etc/kubernetes/scheduler.conf \
  --leader-elect=true
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=4096
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

5. 노드 관리

kubelet : 클러스터의 각 노드에서 kubelet이 실행됩니다. kubelet은 노드의 상태를 유지하고 API 서버와 통신합니다.

노드 이중화 : 최소 3개의 노드를 구성하여 HA를 보장합니다.

kubectl cluster-info
kubectl get componentstatuses

6. 네트워크 및 저장소

네트워크 : Kubernetes 네트워크 플러그인을 사용하여 클러스터 내부의 통신을 관리합니다. 예를 들어, Calico, Flannel, Weave 등이 있습니다.

스토리지 : 클러스터의 스토리지 솔루션을 구성하여 고가용성을 보장합니다. 예를 들어, 클라우드 제공업체의 블록 스토리지나 NFS, Ceph 등을 사용할 수 있습니다.

7. 모니터링 및 알림

모니터링 : Prometheus, Grafana와 같은 도구를 사용하여 클러스터의 상태를 모니터링합니다.

알림 : 클러스터의 상태에 대한 알림을 설정하여 문제를 조기에 감지하고 대응할 수 있습니다.

8. 백업 및 복구

etcd 백업 : etcd 데이터를 정기적으로 백업하여 클러스터의 데이터 무결성을 유지합니다.

복구 절차 : 백업 데이터를 사용하여 etcd를 복구할 수 있는 절차를 설정합니다.

 

728x90