기본 환경
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 클러스터 구성
고가용성 참고 공식문서
'기타정보' 카테고리의 다른 글
[정보] kubernetes 사용에 도움되는 ansible playbook (0) | 2024.01.18 |
---|---|
[정보] kubernetes 트러블 슈팅 (0) | 2024.01.18 |
[정보] 메일서버 쉽게 만들기 mail in a box (0) | 2024.01.09 |
[정보] mailhog 메일 테스트용 SMTP 서 (0) | 2024.01.09 |
[정보] 이메일 테스트 리눅스 명령어 (0) | 2024.01.09 |