프로그래밍 언어/k8s

[k8s] Kubernetes v1.26 세팅 가이드

반응형

Master 1대, Worker2대 기반으로 k8s clustering 진행

1.  Kubernetes 구성 요소 버전

  • CRI : Docker
    • Docker version: v20.10.22
    • Containerd version : v2.0
  • CNI : Calico v0.3.1
  • Kubectl: v1.26.0

2.  Virtal Machine 정보

  • AWS: t3.medium
    • Virtual Machine OS: Ubuntu 20.04 (해당 가이드는 Ubuntu 22 버전에서 오동작)
  • TCP 개방 요구사항
    • 22, 80 : ssh, http 기본 port
    • 443, 6443, 2379 : k8s apiserver, etcd 활용 port
    • 179, 5473 : Calico 활용 port
  • UDP 개방 요구사항
    • 51820, 51821, 4789 : 개방
  • CNI(Calico Network) 필요 Port 정보 링크
    • Network requirements 항목 확인

3.  Master, Worker 모두 적용해야하는 명령어

아래 명령어들은 k8s clustering을 하기 위한 설정들로 k8s node로 활용하고자 하는 모든 VM에 적용 필요

CRI(docker & containerd) 및 kubeadm, kubelet, kubectl 설치 진행 (관리자 권한으로 수행, sudo su)

 

Machine 정보 확인 : ubuntu 이미지 버전 확인

hostnamectl

 

Machine hostname 변경 : master worker1 worker2

hostnamectl set-hostname master
reboot

 

ssh 재접속 후, Machine hostname 변경 : hostname 변경 확인

hostnamectl

 

Swap 메모리 비활성화

swapoff -a && sed -i '/swap/s/&/#/' /etc/fstab

 

방화벽 비활성화

ufw disable

 

k8s 설치에 필요한 패키지 파일들 설치

apt-get install -y apt-transport-https ca-certificates gnupg lsb-release curl

 

Docker 엔진 관련 패키지 서버 정보 다운로드

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /u
sr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-
archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) s
table" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

패키지 서버 업데이트

apt-get update

 

 

Docker 관련 패키지 파일 다운로드

apt-get install -y docker-ce docker-ce-cli containerd.io

 

Docker daemon 설정 파일 수정

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

 

Machine이 구동될때 Docker도 자동실행 되도록 설정

systemctl enable docker

 

Docker 실행

systemctl start docker

 

Docker containerd를 cni로 활용하기 위해 설정 파일 수정

/etc/containerd/config.toml 파일의 disabled_plugins행 주석 처리

(vi /etc/containerd/config.toml을 수행하여 아래 명령어 수행 전 과 후 변화 확인)

sed -i -e '/disabled_plugins/ s/^/#/' /etc/containerd/config.toml

 

수정한 파일 적용을 위해 containerd 재시작

systemctl restart containerd

 

k8s 네트워크 테이블 설정

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

 

설정적용

sysctl --system

 

k8s 설치 도구 패키지 서버 정보 다운로드

curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cl
oud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://a
pt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kuber
netes.list

 

패키지 서버 업데이트

apt-get update

 

k8s 관련 패키지 파일들 다운로드

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

 

k8s 관련 패키지 파일들 버전 Lock

apt-mark hold kubelet kubeadm kubectl kubernetes-cni

 

k8s 동작에 필요한 바이너리 구동

systemctl daemon-reload
systemctl restart kubelet

 

4.  Master 적용 명령어

kubeadm을 통하여 master component 설정 (자동으로 됩니다.)

  • /etc/kubernetes/manifast에 yaml 파일 다운로드 후 필수 pod 구동
    • etcd, kube-apiserver, kube-controller-manager, kube-schedule
  • TLS 관련 설정 및 admin.conf파일 생성 (kubeconfig)
  • Pod Network 설정

ls /etc/kubernetes/manifests을 수행하여 아래 명령어 수행 전 과 필수 pod 유무 확인

kubeadm init --pod-network-cidr=10.0.1.0/24

참고 : 10.0.1.0/24 (사용할 내부 주소 직접 입력)

 

 

설치 완료 후 kubeadm join {ip}:6443 --token {token} --discovery-token-ca-cert-hash {hash} 문구 복사 및 별도로 저장

(워커 노드에 해당 명령어를 수행함으로서 worker를 master에 join 시킴. 5.Worker 적용 명령어 참고!!!!!) 

 

Master Component의 kubectl 설정

k8s apiserver주소 정보 및 인증서가 담긴 파일을 일반적으로 "kubeconfig"라고 부름

 

kubeconfig파일은 kubeadm init명령어 수행할 때 /etc/kubernetes/admin.conf로 생성

kubectl은 kubeconfig 파일을 읽어서 apiserver와 통신

 

아래 명령어를 수행하보면 현재 kubectl이 바라보고 있는 kubeconfig가 설정이 안된걸 알 수 있음

kubectl config view
kubectl get nodes

 

kubectl이 kubeconfig 파일을 바라보도록 설정 2가지 방법이 있다.

 

(1) kubectl의 kubeconfig 설정 1번째 방법

  • $HOME/.kube 디렉토리 생성 후, kubeconfig 파일을 "config"라는 이름으로 저장
  • kubectl은 default로 $HOME/.kube/config 파일을 읽도록 되어있다.
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

 

(2) kubectl의 kubeconfig 설정 2번째 방법

  • KUBECONFIG 환경 변수 지정
  • kubectl은 KUBECONFIG 환경 변수를 읽어서 파일을 가져오도록 되어있음
export KUBECONFIG=/etc/kubernetes/admin.conf

kubectl이 kubeconfig 파일을 읽었는지 확인

kubectl config view

 

kubectl 으로 k8s api server에게 node 정보 요청, 응답 결과 확인

Not Ready 상태의 Master node 확인

kubectl get nodes

만약 x509 에러(인증서 에러)가 발생했다면, kubectl이 (구)kubeconfig를 읽어들인것

위 설정 1번째 또는 2번째를 다시 수행(새로운 kubeconfig 적용)

 

 

5.  Worker 적용 명령어

Master에서 kubeadmin init 수행한 후 복사한 join 명령어를 각 worker에서 실행

kubeadm join {ip}:6443 --token {token} --discovery-token-ca-cert-hash {hash}

 

6. Master 적용 명령어

위 과정까지 모두 완료하였다면 kubernetes master, worker clustering은 성공

 

kubectl로 k8s api server에게 node 정보 요청, 응답 결과 확인

Not Ready 상태의 Master, Worker node 확인

kubectl get nodes

 

k8s CNI calico 설정 파일 다운로드

curl -O https://projectcalico.docs.tigera.io/manifests/calico.yaml

 

다운받은 calico.yaml의 pod network 부분 수정

위에서 실행한 master에서 kubeadm init --pod-network-cidr={ip/subnet} 설정한 {ip/subnet}으로 변경 

sed -i -e 's?192.168.0.0/16? 10.0.1.0/24?g' calico.yaml

 

calico.yaml적용

kubectl apply -f calico.yaml

 

k8s core-dns pod 동작 확인

kubectl get pod --namespace kube-system

 

8.  k8s Master, Worker 정상 설치 확인

kubectl을 통해 Master, Worker 노드 현황 및 상태 확인

kubectl get nodes

Master, Worker 모두 목록에 Ready 상태로 동작하는것 확인

 

nginx 예제 파일 배포하여 테스트

vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
kubectl apply -f pod.yaml

 

nginx pod 로그 출력 확인

kubeclt logs nginx

 

만약 먹통일 경우 CNI 설정이 잘못되었을 확률이 크다.

  • CNI 네트워크 설정을 잘못하여 배포한 경우 체크리스트
    • master에서 "kubeadm init --pod-network-cidr={ip/subnet}" 설정한 {ip/subnet}과 calico.yaml "sed -i -e 's?192.168.0.0/16? {ip/subnet}?g' calico.yaml이 불일치 
    • VM의 Calico 기본 TCP/UDP 개방 X

 

9.  설치완료

반응형