상세 컨텐츠

본문 제목

익스터널 etcd 구성

k8s

by drogva 2024. 4. 29. 02:43

본문

가용성, 안정성 및 마스토노드에 대한 가중화 된 부하 부산 및 etcd 저장파일을 독립하여 안정하게 관리하기위해 분리

 

1. 독립된 etcd vm을 생성한 후 최소 3개 이상의 홀수 개 etcd vm을 클러스터로 구성한다.

2. 클러스터 etcd 리더와 peer(다른 vm) 를 설정한 config.yaml 을  각  etcd vm 에 배포  - 

3. vm에서는 config.yaml 을 기반으로 인증서를 생성. 각 vm etcd 클러스터에 속하게 됨을 증명 , pod manifest 가 생성된다.

4. 아무 etcd 노드에서는 /etc/pki 에 생성된 etcd-api-server 인증서를 워커노드에 전달

5. 워커노드는 etcd api-server 인증성를 기반으로 config.yaml 작성

5. kubeadm init 클러스터  생성

 

● etcd 노드에도 kubeadm, kubelet, container runtime 및  기본 요건 등 똑같이 설치 되어야 한다. 

 

- kubelet을 etcd의 서비스 관리자로 구성하는 것입니다. etcd가 먼저 생성되었기 때문에 kubeadm에서 제공하는 kubelet 유닛 파일보다 우선 순위가 높은 새 유닛 파일을 만들어 서비스 우선 순위를 재정의

 

cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf
# Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
# Replace the value of "containerRuntimeEndpoint" for a different container runtime if needed.
#
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: false
authorization:
  mode: AlwaysAllow
cgroupDriver: systemd
address: 127.0.0.1
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
staticPodPath: /etc/kubernetes/manifests
EOF

cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf
Restart=always
EOF

systemctl daemon-reload
systemctl restart kubelet

 

-- 나머지는 그냥 docs 보고 따라하는게 나을 거  같다.

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

 

Set up a High Availability etcd Cluster with kubeadm

Note: While kubeadm is being used as the management tool for external etcd nodes in this guide, please note that kubeadm does not plan to support certificate rotation or upgrades for such nodes. The long-term plan is to empower the tool etcdadm to manage t

kubernetes.io

etcd 는 포트를 2379.  client 에 개방 2380 포트는 etcd 각 통신을 위한 예약포트이다.

listen-peer-urls: https://${HOST}:2380
            listen-client-urls: https://${HOST}:2379
            advertise-client-urls: https://${HOST}:2379
            initial-advertise-peer-urls: https://${HOST}:2380

보니까 host0 이 리더가 되고 남은 host 1,2 를 peer 된다는 설정으로 결국 모든 설정은 동일하게 된다.

 

- 이제 각 vm에서 etcdctl 을 구동후 2379 포트로 접속해 health 상태를 확인한다.

https://etcd.io/docs/v3.4/install/

 

Install

Instructions for installing etcd from pre-built binaries or from source.

etcd.io

etcd 를 설치한다. 

yum -y install go  

./build    -go 언어로 실행된다.

export PATH="$PATH:`pwd`/bin"

- 매 터미널에 변수를 지정해 줘야 하는 듯

1. etcd --logger=zap  etcd 를 실행한다.

2. 다른 터미널에서 헬스 체크를 한다.

 

ETCDCTL_API=3 etcdctl \
--cert /etc/kubernetes/pki/etcd/peer.crt \
--key /etc/kubernetes/pki/etcd/peer.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://${HOST0}:2379 endpoint health

결과 - 각 vm에서 확인

아직 쿠버네티스클러스터가 생성되기 전 인데 로컬에서 실행된 컨테인너가  pod 로 실행된 모습 - etcd 클러스터가 이미 생성됨

k8s 생성.

 

etcd 노드에서 마스터노드역할을 담당할 vm 에 etcd api 2379 에 접속이 가능한 인증서 전달.

export CONTROL_PLANE="ubuntu@10.0.0.7"
scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}":
scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}":
scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":

 

---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # change this (see below)
etcd:
  external:
    endpoints:
      - https://ETCD_0_IP:2379 # change ETCD_0_IP appropriately
      - https://ETCD_1_IP:2379 # change ETCD_1_IP appropriately
      - https://ETCD_2_IP:2379 # change ETCD_2_IP appropriately
    caFile: /etc/kubernetes/pki/etcd/ca.crt
    certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
    keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key

각 생성된 etcd 의 ip 기입

-kubeadm init --- 로 생성

 

결과

마스터노드에서의 etcd 는 skipping 하고 있다.

etcd 는 마스터노드에 생성되지 않았다. 다른 vm 에 구성되어 있기 때문이다. 

그럼 etcd 프로세스를 통해 앤드포인트를 확인해 본다.

ps -ef | grep etcd

 

 

각 etcd 클러스터의 ip 가 앤드포인트로 연결된 모습이다.

 

servers=https://172.30.1.136:2379,https://172.30.1.137:2379,https://172.30.1.140:2379

 

 

-etcd 클러스터 조회, 맴버 확인

 

ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints=https://172.30.1.140:2379 member list -w=table
+------------------+---------+---------+---------------------------+---------------------------+------------+
|        ID        | STATUS  |  NAME   |        PEER ADDRS         |       CLIENT ADDRS        | IS LEARNER |
+------------------+---------+---------+---------------------------+---------------------------+------------+
| 1d83d6303d0e094c | started | server3 | https://172.30.1.140:2380 | https://172.30.1.140:2379 |      false |
| 494cfbfb0332236d | started | server1 | https://172.30.1.137:2380 | https://172.30.1.137:2379 |      false |
| 8d2c4e43226b0152 | started | server2 | https://172.30.1.136:2380 | https://172.30.1.136:2379 |      false |
+------------------+---------+---------+---------------------------+---------------------------+------------+

 

-etcd 의 리더 확인

ETCDCTL_API=3 etcdctl \
> --cert /etc/kubernetes/pki/etcd/peer.crt \
> --key /etc/kubernetes/pki/etcd/peer.key \
> --cacert /etc/kubernetes/pki/etcd/ca.crt \
> --endpoints=https://172.30.1.140:2379 \
> endpoint status --write-out=table
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://172.30.1.140:2379 | 1d83d6303d0e094c |  3.5.12 |  4.7 MB |      true |      false |         3 |       9107 |               9107 |        |
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+----

 

 

-쿠버네티스의 클러스터 구성 후 마스터노드에서는 이 상태를 확인 불가능하다. etcd클러스터는 외부에 위치하게 되기 때문이다.

 

-가끔 etcd 클러스터가 가동 안되는 경우는  swapoff -a 후, systemctl restart kubelet 를 해준다. 

관련글 더보기