• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글
정보

ubuntu 20.04 쿠버네티스 한방 설치(containerd/keepalived) - (단일구성/다중구성) feat. proxmox vm

대왕코끼리 대왕코끼리 353

5

7

안녕하세요. 대왕코끼리입니다.

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 클러스터 구성

고가용성 참고 공식문서

신고공유스크랩
7
profile image 1등
달소 2024.01.19. 09:43
와,, 완전 상세한 가이드네요!👍
쿠버네티스 한번 입문해보긴해야하는데,, 언젠가 꼭 참고해서 도전해보겠습니다.
3등
zepinos 2024.01.19. 10:56

proxmox 에서 k8s 항상 실패해서 k3s 혹은 kind 같은걸로 맛만 봤는데 자세한 문서 고맙습니다.
vm 20.04 기반에서만 가능한거죠? ct 혹은 22.04 에서는 설치가 어려울까요? (proxmox에선 안되는것 같지만) Rancher 같은 애들처럼 그냥 설치만 하고 GUI 로 슥슥 할 수 있으면 좋을텐데, 구글 애들은 너무 이런거에 무신경하다고나 할까...;;;
저도 시간되면 한 번 도전해보겠습니다.

profile image
대왕코끼리 글쓴이 2024.01.19. 11:21
zepinos

proxmox vm에서 수행했습니다. lxc는 세팅이안되었습니다

 

 22.04 버전에서 haproxy로 쿠버 구성 초기화시 kuber apiserver가 죽는현상이있었습니다.
버전문제인가싶어서 20.04버전에서도 했는데 같은 현상이있었습니다

keepalived vip 구성으로 사용하여 성공했습니다. 

vm 22.04도 keepalived로 하시면될듯합니다

 

엔서블 경험이 있으시면 쿠버스프레이로 호스트 준비해 명령어 한줄로 배포하여 클러스터환경 자동설치가능합니다

zepinos 2024.01.19. 12:47
대왕코끼리
답변 고맙습니다. k8s 를 거의 써보질 않아서 알아듣진 못했습니다T.T만, 나중에 익숙해지면 알 수 있는 시점이 오겠죠. 사실 업무에 필요하면 EKS+Fargate를 구성해서 사용할 것 같네요. proxmox에서는 제가 아는 한도 내에선 k3s로 작게 구성해도 크게 문제는 없는 것 같아서요.
앤서블도 한 번 해보고 싶은데, 뭐가 그리 자기변명이 강한지...자꾸 미루기만 하네요. T.T
profile image
bumworld 2024.01.19. 17:33
zepinos
오~~완전 감사합니다.
매번 실패 했는데 다시 도전해 봐야 겠네요.
promethus, grafna 도 진행하실 계획은 없으실까요?
eks 하시게 되면 부탁드립니다 .ㅠ.ㅠ
혹시 오프라인으로 세미나 하신다면 꼭 참석해 보고 싶습니다.

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story
번호 분류 제목 글쓴이 날짜 조회 추천
질문 /var/www 폴더가 삭제되었습니다. ㅜ,.ㅜ 2 니속사정 1일 전20:42 249 +1
잡담 jellyfin 자원 진짜 안쓰네요 kmw_ 1일 전19:26 357 +1
잡담 iventoy pxe는 속도가 엄청 느리군요.. nohdd는 왜 빠르지.. 음... 2 purndal 2일 전00:52 192 +2
3900 정보
image
툭툭이 24.03.28.11:14 925 +17
3899
image
eyeball 23.04.05.21:08 1816 +16
3898 정보
image
antegral 22.05.07.01:18 3208 +16
3897 잡담
image
햇서 23.06.05.05:53 917 +14
3896
image
달소 22.03.17.22:09 19074 +14
3895
image
달소 22.03.17.22:25 5100 +11
3894 정보
image
EXP 24.02.06.03:43 1357 +10
3893
image
달소 22.05.06.15:43 1046 +10
3892 정보
image
달소 24.02.19.00:58 980 +9
3891
image
theb1ue 22.06.14.16:05 4904 +9
3890 가이드
image
opq! 24.04.02.21:25 485 +8
3889 잡담
image
달소 24.01.15.03:22 587 +8
3888
image
달소 23.01.27.14:15 16189 +8
3887
image
달소 22.07.07.16:57 1947 +8
3886
image
달소 22.03.14.17:30 4218 +8
3885
image
달소 22.02.11.13:31 3049 +8
3884 후기
image
cdma2000 24.02.06.13:12 802 +7
3883 가이드
image
달소 23.07.04.20:38 1938 +7
3882
image
앨런임더 23.03.31.21:14 1907 +7
3881 잡담
image
곰삼촌 23.01.25.10:05 1096 +7