ubuntu 20.04 쿠버네티스 한방 설치(containerd/keepalived) - (단일구성/다중구성) feat. proxmox vm
안녕하세요. 대왕코끼리입니다.
proxmox에 vm 6개를 가지고 master node 3 / worker node 3을 구성해본 경험담을 공유하고자 글을 작성합니다.
많은 우여곡절이 있어서 다른분들의 실패를 덜고자 공유드리오니 문의사항 있으시면 언제든지 부탁드립니다~
기본 환경
Ubuntu 20.04 환경에서 Stable하게 성공했습니다.
Static hostname: master Icon name: computer-vm Chassis: vm Machine ID: 6685ed20e74d4a84909769d1d1e80123 Boot ID: 17e47d7f4e5440afb37fb21d0777bcc5 Virtualization: kvm Operating System: Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-169-generic Architecture: x86-64
세줄요약
단일구성
- 마스터노드 초기화 후 마스터노드로 워커노드 조인
- CNI 설정
- 온프레미스 metallb 설치
다중구성
- 각 마스터노드에 keepalived 설치 및 MASTER BACKUP설정
- 마스터노드1에서 발급된 가상 IP로 초기화
- 마스터노드2 마스터노드3 가상 IP로 조인
- 각 워커노드 가상 IP로 조인
- CNI 설정
- 온프레미스 metallb 설치
사전구성
helm 설치
bash curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
단일 클러스터 구성
01.install kubernatessudo apt-get update
처음부터 끝까지 설치하는 스크립트입니다.
#!/bin/bash # Update package lists sudo apt-get update # Install necessary packages sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # Add GPG key for Kubernetes packages curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - # Add Kubernetes repository echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list # Update package lists again sudo apt-get update # Install Kubernetes components sudo apt-get install -y kubelet kubeadm kubectl sudo apt-get install -y containerd # Reload systemd and restart kubelet sudo systemctl enable kubelet sudo systemctl daemon-reload sudo systemctl restart kubelet # Pull Kubernetes container images kubeadm config images pull
02.default setting
메모리 스왑 OFF, 패킷 포워딩 및 iptalbes 에러 해결 스크립트입니다.
#[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist sudo modprobe br_netfilter #[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 /sbin/sysctl -w net.ipv4.ip_forward=1 swapoff -a
03.kubeadm init
마스터 노드에서 실행하는 방법입니다.
이후 출력되는 join 명령어로 worker 노드를 join 할 수 있습니다.
kubeadm init --apiserver-advertise-address=0.0.0.0 --pod-network-cidr=10.10.0.0/24
04.kubeadm init 후 추가설정
기본 세팅을 이관하여 명령어 사용할 수 있도록 해줍니다.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
05.worker node join(필요한만큼반복)
맨하단부에 추가합니다.
kubeadm join <Kubernetes API Server:PORT> --token <2. Token 값> --discovery-token-ca-cert-hash sha256:<3. Hash 값>
06.CNI 설정
각 구성요소를 내부네트워크로 묶는 명령어 입니다. weave를 사용합니다.
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
07.metallb 설정(온프레미스환경)
helm chart 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
namespace생성
kubectl create ns metallb-system
metallb-system ns에 helm을 통한 설치
helm install --namespace metallb-system my-metallb bitnami/metallb --version 4.10.1
08. IPAdressPool 설정(온프레미스환경)
# addresspool.yaml # The address-pools lists the IP addresses that MetalLB is # allowed to allocate. You can have as many # address pools as you want. apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: # A name for the address pool. Services can request allocation # from a specific address pool using this name. name: first-pool namespace: metallb-system spec: # A list of IP address ranges over which MetalLB has # authority. You can list multiple ranges in a single pool, they # will all share the same settings. Each range can be either a # CIDR prefix, or an explicit start-end range of IPs. addresses: - 192.168.10.0/24 - 192.168.9.1-192.168.9.5 - fc00:f853:0ccd:e799::/124
설정 적용
kubectl apply -f ./addresspool.yaml
09.결과화면
root@master1:/home/kingelip# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane 15m v1.28.2 worker1 Ready <none> 10m v1.28.2 worker2 Ready <none> 10m v1.28.2 worker3 Ready <none> 10m v1.28.2
고가용성 클러스터 구성
01.install kubernatessudo apt-get update
처음부터 끝까지 설치하는 스크립트입니다.
#!/bin/bash # Update package lists sudo apt-get update # Install necessary packages sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # Add GPG key for Kubernetes packages curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - # Add Kubernetes repository echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list # Update package lists again sudo apt-get update # Install Kubernetes components sudo apt-get install -y kubelet kubeadm kubectl sudo apt-get install -y containerd # Reload systemd and restart kubelet sudo systemctl enable kubelet sudo systemctl daemon-reload sudo systemctl restart kubelet # Pull Kubernetes container images kubeadm config images pull
02.default setting
메모리 스왑 OFF, 패킷 포워딩 및 iptalbes 에러 해결 스크립트입니다.
#[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist sudo modprobe br_netfilter #[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 /sbin/sysctl -w net.ipv4.ip_forward=1 swapoff -a
03. keepalived 설치
apt install -y keepalived
04.keepalived 세팅
master1 node의 /etc/keepalived/keepalived.conf 경로에서 다음 내용을 수정한다.
master1 vrrp_instance VI_1 { state MASTER # 마스터 하나만 Master, 그 외의 마스터는 BACKUP으로 설정 interface ens192 # 사용하는 인터페이스 virtual_router_id 51 priority 100 # 사용 가능한 마스터 중에서 우선 순위가 제일 높은 마스터에 VIP가 부여된다 advert_int 1 authentication { auth_type PASS auth_pass 1234 # 패스워드 설정 } virtual_ipaddress { 192.168.9.10 # VIP 설정(같은 네트워크 대역대, 이용 가능한 IP로 결정) } }
master2 node의 /etc/keepalived/keepalived.conf 경로에서 다음 내용을 수정한다.
master2 vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.9.10 } }
master3 node의 /etc/keepalived/keepalived.conf 경로에서 다음 내용을 수정한다.
master3 vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.9.10 } }
05.마스터노드1 설정(192.168.9.10로 지정)
sudo kubeadm init --control-plane-endpoint=192.168.9.10:6443 --pod-network-cidr=192.168.1.0/24 --upload-certs
06.마스터노드2, 마스터노드3 설정
kubeadm join 192.168.9.10:6443 --token jscz9z.i0kuu90uyobbgw2a \ --discovery-token-ca-cert-hash sha256:e0d3e4089a09cddf1b0b2a82ed6c3f002a764c23349ec96d3c981a5b8cd59cd6 \ --control-plane --certificate-key 1cff23e6825104b7ad1d0094754e041827d0f79576f3da71ad36868a35991030
07. 워커노드1, 워커노드2, 워커노드3 설정
kubeadm join 192.168.9.10:6443 --token jscz9z.i0kuu90uyobbgw2a \ --discovery-token-ca-cert-hash sha256:e0d3e4089a09cddf1b0b2a82ed6c3f002a764c23349ec96d3c981a5b8cd59cd6
08.CNI 설정
각 구성요소를 내부네트워크로 묶는 명령어 입니다. weave를 사용합니다.
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
09.metallb 설정(온프레미스환경)
helm chart 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
namespace생성
kubectl create ns metallb-system
metallb-system ns에 helm을 통한 설치
helm install --namespace metallb-system my-metallb bitnami/metallb --version 4.10.1
10. IPAdressPool 설정(온프레미스환경)
# addresspool.yaml # The address-pools lists the IP addresses that MetalLB is # allowed to allocate. You can have as many # address pools as you want. apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: # A name for the address pool. Services can request allocation # from a specific address pool using this name. name: first-pool namespace: metallb-system spec: # A list of IP address ranges over which MetalLB has # authority. You can list multiple ranges in a single pool, they # will all share the same settings. Each range can be either a # CIDR prefix, or an explicit start-end range of IPs. addresses: - 192.168.10.0/24 - 192.168.9.1-192.168.9.5 - fc00:f853:0ccd:e799::/124
설정 적용
kubectl apply -f ./addresspool.yaml
11. 결과화면
root@master1:/home/kingelip# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane 15m v1.28.2 master2 Ready control-plane 14m v1.28.2 master3 Ready control-plane 13m v1.28.2 worker1 Ready <none> 10m v1.28.2 worker2 Ready <none> 10m v1.28.2 worker3 Ready <none> 10m v1.28.2
클러스터 참고
master1이 ON 상태에서 master2에서 etcd 관련 작업을 하면 권한 없음이 뜬다.
master1가 OFF상태로 전환되면 master2가 권한이 상승되어 etcd 관련 작업이 가능하다.
etcd는 stack 상태에서 클러스터링이 되어 master1가 죽어도 싱크되어 종속된다.
트러블 슈팅
Unable to connect to the server: tls: failed to verify certificate: x509
export KUBECONFIG=/etc/kubernetes/admin.conf
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]
sudo modprobe br_netfilter
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]
/sbin/sysctl -w net.ipv4.ip_forward=1
[swap off]
swapoff -a
8080
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
내용참고
아래 글은 ansible playbook으로 구축하는 방법을 포함하고 있습니다. keepalived 부분을 참고했습니다.
[keepalived를 이용한 고가용성 K8S 클러스터 구성
고가용성 참고 공식문서
쿠버네티스 한번 입문해보긴해야하는데,, 언젠가 꼭 참고해서 도전해보겠습니다.
proxmox 에서 k8s 항상 실패해서 k3s 혹은 kind 같은걸로 맛만 봤는데 자세한 문서 고맙습니다.
vm 20.04 기반에서만 가능한거죠? ct 혹은 22.04 에서는 설치가 어려울까요? (proxmox에선 안되는것 같지만) Rancher 같은 애들처럼 그냥 설치만 하고 GUI 로 슥슥 할 수 있으면 좋을텐데, 구글 애들은 너무 이런거에 무신경하다고나 할까...;;;
저도 시간되면 한 번 도전해보겠습니다.
proxmox vm에서 수행했습니다. lxc는 세팅이안되었습니다
22.04 버전에서 haproxy로 쿠버 구성 초기화시 kuber apiserver가 죽는현상이있었습니다.
버전문제인가싶어서 20.04버전에서도 했는데 같은 현상이있었습니다
keepalived vip 구성으로 사용하여 성공했습니다.
vm 22.04도 keepalived로 하시면될듯합니다
엔서블 경험이 있으시면 쿠버스프레이로 호스트 준비해 명령어 한줄로 배포하여 클러스터환경 자동설치가능합니다
앤서블도 한 번 해보고 싶은데, 뭐가 그리 자기변명이 강한지...자꾸 미루기만 하네요. T.T
매번 실패 했는데 다시 도전해 봐야 겠네요.
promethus, grafna 도 진행하실 계획은 없으실까요?
eks 하시게 되면 부탁드립니다 .ㅠ.ㅠ
혹시 오프라인으로 세미나 하신다면 꼭 참석해 보고 싶습니다.
cmt alert