Exercise 16.2: Detailed Steps
HAProxy로 SSH 접속
ssh root@HAPROXY_IP_ADDRESS
HAProxy 설치
sudo apt update && sudo apt install -y haproxy
HAProxy 설정파일에
/etc/haproxy/haproxy.cfg
라인들을 추가 - CP_IP_ADDRESS에 CP 노드의 IP 주소를 넣으세요.frontend kubernetes-cp mode tcp option tcplog bind *:6443 default_backend kubernetes-cp-nodes backend kubernetes-cp-nodes mode tcp balance roundrobin server cp1 CP_IP_ADDRESS:6443 check listen stats bind :9999 mode http stats enable stats hide-version stats uri /stats
HAProxy 데몬을 재시작하고 상태 확인
{ sudo systemctl restart haproxy sudo systemctl status haproxy --no-pager }
CP 노드에 연결된 터미널로 이동
/etc/hosts
파일에서 k8scp에 지정된 IP주소를 HAProxy IP 주소로 변경HAPROXY_IP_ADDRESS k8scp
k8scp에 연결된 IP 주소 확인
nslookup k8scp
Worker 노드에 연결된 터미널로 이동
/etc/hosts
파일에서 k8scp에 지정된 IP주소를 HAProxy IP 주소로 변경HAPROXY_IP_ADDRESS k8scp
k8scp에 연결된 IP 주소 확인
nslookup k8scp
웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속
CP 노드에 연결된 터미널로 이동
kubectl 명령어로 API 호출
{ kubectl get node kubectl get pod -A }
HAProxy 통계 페이지를 리프레시해서 트래픽 정보가 업데이트 되는지 확인
SecondCP로 SSH 접속
ssh root@SECOND_CP_IP_ADDRESS
실습 환경에 필요한 라이브러리 설치
sudo apt update && sudo apt install -y \ curl apt-transport-https vim git wget gnupg2 net-tools \ software-properties-common lsb-release ca-certificates uidmap
컨테이너 런타임 설치
{ cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf overlay br_netfilter EOF sudp modprobe overlay sudo modprobe br_netfilter cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update && apt install -y containerd.io sudo containerd config default | tee /etc/containerd/config.toml sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml sudo systemctl restart containerd cat <<EOF | sudo tee /etc/crictl.yaml runtime-endpoint: unix:///run/containerd/containerd.sock EOF }
쿠버네티스 설치 및 구동에 필요한 바이너리 설치
{ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update && apt install -y kubelet=1.28.1-00 kubeadm=1.28.1-00 kubectl=1.28.1-00 sudo apt-mark hold kubelet kubeadm kubectl }
/etc/hosts
파일에 아래와 같은 라인 추가HAPROXY_IP_ADDRESS k8scp
k8scp에 연결된 IP 주소 확인
nslookup k8scp
ThirdCP로 SSH 접속
ssh root@THIRD_CP_IP_ADDRESS
16번부터 20번 단계를 실행
CP 노드에 연결된 터미널로 이동
컨트롤 플레인 조인 명령어 생성
echo "sudo kubeadm join k8scp:6443 --control-plane \ --token $(sudo kubeadm token create) \ --discovery-token-ca-cert-hash sha256:$(openssl x509 -pubkey \ -in /etc/kubernetes/pki/ca.crt | openssl rsa \ -pubin -outform der 2>/dev/null | openssl dgst \ -sha256 -hex | grep -oE '[A-z0-9]+$') \ --certificate-key $(sudo kubeadm init phase upload-certs --upload-certs| tail -1)"
위에서 생성한 명령어를 SecondCP 노드 및 ThirdCP 노드에 실행
HAProxy 노드에 연결된 터미널로 이동
HAProxy 설정파일을
/etc/haproxy/haproxy.cfg
아래와 같이 수정... ... backend kubernetes-cp-nodes mode tcp balance roundrobin server cp1 CP_IP_ADDRESS:6443 check server cp2 SECOND_CP_IP_ADDRESS:6443 check server cp3 THIRD_CP_IP_ADDRESS:6443 check
HAProxy 데몬을 재시작하고 상태 확인
{ sudo systemctl restart haproxy sudo systemctl status haproxy --no-pager }
웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 추가한 노드들의 연결 상태 확인
CP 노드에 연결된 터미널로 이동
Node 목록 확인
kubectl get node
kubectl 명령어로 몇가지 API 호출을 실행하고 HAProxy 통계사이트에서 로드가 분산되는지 확인
for i in {1..10}; do kubectl get pod; done
실행중인 ETCD Pod 확인
kubectl get pod -n kube-system -l component=etcd
새롭게 추가된 ETCD Pod의 로그 확인
kubectl -n kube-system logs etcd-secondcp | grep leader
실행중인 ETCD Pod의 IP 주소 확인
kubectl get pod -n kube-system -l component=etcd -o wide
각 노드의 IP 주소 확인
kubectl get node -o wide
ETCD 클러스터의 멤버 목록 확인
kubectl -n kube-system exec -it etcd-cp -- \ etcdctl -w table \ --endpoints localhost:2379 \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ member list
ETCD 클러스터 멤버 목록을 환경변수로 지정
{ export ETCD_ENDPOINTS=$(kubectl -n kube-system exec -it etcd-cp -- \ etcdctl -w json \ --endpoints localhost:2379 \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ member list \ | jq -r '.members | map(.clientURLs[]) | join(",")') echo $ETCD_ENDPOINTS }
ETCD 클러스터의 리더 확인
kubectl -n kube-system exec -it etcd-cp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status
ETCD 클러스터의 각 멤버별 상태 확인
kubectl -n kube-system exec -it etcd-cp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint health
ETCD 클러스터의 리더 Pod가 배포된 노드에 가서 kubelet 및 컨테이너 런타임 정지- CP 노드의 ETCD가 가장 먼저 구성되었기 때문에 일반적으로 CP 노드에 배포된 ETCD가 리더
{ sudo systemctl stop kubelet sudo crictl stop $(sudo crictl ps -q) sudo systemctl stop containerd.service }
ETCD Pod 로그 확인
kubectl -n kube-system logs etcd-secondcp | grep leader
웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 노드들의 연결 상태 확인
ETCD 클러스터의 리더가 변경되었는지 확인
kubectl -n kube-system exec -it etcd-secondcp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status
ETCD 클러스터 각 멤버별 상태 확인
kubectl -n kube-system exec -it etcd-secondcp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint health
Node 상태 확인
kubectl get node
CP 노드에서 kubelet 및 컨테이너 런타임을 재실행
{ sudo systemctl start containerd.service sudo systemctl start kubelet }
웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 노드들의 연결 상태 확인
노드 상태 확인
kubectl get node
모든 Pod가 정상적으로 실행되고 있는지 확인
kubectl get pod -A -o wide
ETCD 클러스터의 리더가 다시 변경되었는지 확인
kubectl -n kube-system exec -it etcd-secondcp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint status
ETCD 클러스터 각 멤버별 상태 확인
kubectl -n kube-system exec -it etcd-secondcp -- \ etcdctl -w table \ --endpoints $ETCD_ENDPOINTS \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ endpoint health
Last updated