k8s/concept

VMware ubuntu 환경에서 k8s환경 구축하기.(2024 11월 기준 가능)

부엉이사장 2024. 9. 6. 13:16

 

# 바뀌어서 설치가 안되는부분만 최상단에 적음!! 시간이없어서 정리는 못하나, 바뀐부분만 적용하면 k8s클러스터 설치가능합니다.

 

2024년 9월 포스팅인데 현재 2024/11월 기준 9월에 포스팅한 방법으로 설치가 안됩니다.
한동안 k8s를 다룰일이 없다보니 그새 바껴버렸네요..

안되는 부분은 wget으로 다운받는 주소가 아예 구글쪽에서 없애버렸습니다. 
전 apt로 gpg키 추가하여 다운을 받았습니다.
하지만 패키지 설치하는 gpg키도 오류가 많습니다.

기존포스팅의 docker가 아니라 containerd를 컨테이너 런타임으로 사용했고
kube flannel이 아니라 calico로 바꿨습니다!

 

급하게 땜빵식으로 여기에 바뀐부분 적겠음.

node VM을 만들었을떄 마스터 노드 부분임.

 

1. vm설정을 다 해놓고 부터 vm에서 기초설정

sudo swapoff -a
# 네트워크 모듈 로드
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl 파라미터 설정
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# sysctl 파라미터 적용
sudo sysctl --system

 

 

2. containerd설치 및 쿠버네티스 런타임으로 설정

sudo apt install -y containerd

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo vi /etc/containerd/config.toml

저 파일 에디터에서 Cgroup검색해서 

SystemdCgroup부분이 false인데 true로 설정

sudo systemctl restart containerd.service

 

 

3. kubectl kubelet kubeadm설치.

본문에서 wget으로 /packages.cloud.google.com 경로에서 다운받는 주소가 막힘.

 

Installing kubeadm

This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.32. If

kubernetes.io

 

공식문서를 꼭 확인해야함!!!

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# sudo apt-mark hold kubelet kubeadm kubectl 이부분은 해도되고 안해도됨.

제 포스팅해보고 api install로 설치가 안되면, 꼭 공식문서 가서 확인하고 하란대로 하샘.

난 시도할때 gpg키가 안맞았음. 

한글 문서 공식문서는 또 gpg키인가 url이 없다던가 하면서 안되니까 꼭 영문으로 보고 공식문서 따라하샘!

 

 

4. 클러스터 초기화

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<마스터노드 ip>

워커노드 조인하는건 이전이랑 같음

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl 명령어 활성화

 

5. calico설치

wget https://docs.projectcalico.org/v3.18/manifests/calico.yaml
#여기서 PodDisruptionBudget의 apiVersion을 policy/v1로 변경
vi calico.yaml

이걸로 받아와서 yaml열어서 PodDisruptionBudget의 apiVersion을 바꿔주샘. 원파일엔 beta머시기 적혀있을거임

추가해서 3.18버전이 LTS버전이라고 해서 받았는데 다른버전은 또다른 문제가 있을 수 있음니다.

이거 설치해서 에러뜨면 그 부분을 고쳐야해요

kubectl apply -f calico.yaml

적용하면 끝

 

 

 


아래부터는 기존 9월 포스팅!

Introduction
만들어놓은 k8s클러스터가 VM을 껐다가 키니 계속 오류가 생기면서 동작하지 않았다.
오래전에 구축했던 클러스터고 환경구축은 링크만 떡하니 올려놨었어서 이번에 직접 A-Z까지 포스팅을 해보겠다.
복습도 할 겸..

 

 

 

 

# VM생성하기

VMware로 만들겠다.

우측에서 new virtual machine클릭

쭉쭉 그냥 next ㄱㄱ

os이미지를 선택해야하는데 

이전에 받아놨던 ubuntu 22.04.3버전의 iso파일로 만들것이다. 구글링하면 쉽게 다운로드 가능하니 알아서..

vm이름은 기본이름인 ubuntu 64-bit으로 만들거임.

둘둘로 헀던것 같음.

메모리는 4gb

NAT네트워크 쓸거임

쭉쭉 넘겨서 디스크는 그냥 20GB

하드웨어 설정해주자 저 버튼 클릭

네트워크에서 VMnet8번 NAT쓴다고해주샘

VM웨어에서 본인이 NAT네트워크 만든거에 따라서 저건 변할 수 있다. 난 VMnet8번

211.183.3.0/24대역을 NAT네트워크 연결해놨음

usb컨트롤러랑 sound card는 필요없으니 걍 삭제후 창 닫으샘

 

 

ubuntu 설치하기

이제 vm이 만들어졌고 다운받은 ubuntu iso파일로 ubuntu서버를 설치하자

영어 

그담 나오는 창도 Done으로 쭉쭉 넘기고

여기 네트워크 설정이 이제 중요함.

저 ens32에서 엔터누르고 IPv4설정으로 넘어가샘

매뉴얼로 설정

이런 창이 뜰건데 첫번제 subnet은 VM아까 열어둔 VMnet8번대 대역인 211.183.3.10/24로 함.

오랜만에 하는거라 난 서브넷 마스크적는건줄알고 255.255.255.0적었었음 ㅋㅋ

address는 이 VM이 사용할 아이피 주소. 난 211.183.3.10주소를 쓸거다.

게이트웨이는 VMnet8번에서 연결해놓은 게이트웨이. 난 211.183.3.2번으로 해놨음

네임서버는 도메인 받을때 쓰는건데 난 구글꺼가 가장 쉬워서 8.8.8.8으로 했다.

그리고 save ㄱㄱ

 

Done ㄱㄱ

 

그다음 나오는것도 다 그냥 기본설정되어있는대로 done이나 뭐 continue로 ㄱㄱ

음 여기선 유저만들고 비번정해주는.. vm킬때마다 적는거 설정하는거 같음.

기억쉽게될만한걸로 만드샘

다음으로 쭉 넘기다가

사진을 못찍었는데 SSH설치도 해주샘

나중에 ssh연결할때 필요함.

 

우웅..설치중

(사실 설치하는데 ㅅㅂ kernel설치단계서 계속 오류뜨고 안되서 iso파일 다시 다운받아서 했음.. 아마 파일이 손상됐나봄)

 

설치가 다 되면 저기 밑에 reboot now가 뜨게된다

 

 

네트워크 테스트

아까 위에서 설정한 아이디랑 비번으로 접속하면 잘 됐다.

 

네트워크 테스트를 위해 명령어 쳐보면

ip add
ping 8.8.8.8

아이피도 우리가 설정한 211.183.3.10으로 잘 설정 되어있고 네임서버에 핑도 잘 간다.

apt update

apt도 업데이트를 해주자.

 

 

VM clone

 

 

나중에 오류나면 이 VM 다시 쓸거같으니까 clone을 만들어줄거임.

매번 다시 VM만들고 ubuntu 설치하고 그럴필요 없게 하려고..

아 침고로 VM을 끄고 해야 클론이 된다.

상식적으로 같은 ip가진 VM이 두개가 동시에 존재할수 없으니까..

다음 계속 누르면

 

이번에 이 VM을 k8s으로 이름 짓자

 

 

이 k8s VM을 키고 접속해놓자.

sudo su

관리자 권한 ㄱㄱ

비밀번호는 아까 우분투 설치할떄 유저 비번치면됨

 

 

 

 

 

# 도커 설치

일단 난 여기서 SSH접속을 할거다. 복붙이 VM웨어에서는 안됨 ㅠㅠ

보통 xshell 자주쓰던데.. 난 moba x term을 사용한다.

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

명령어 쓰샘

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

이걸로 gpg키 다운받고 repository등록하샘

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

반드시 apt-get update또 써줘야함.

그리고 docker containerd 인스톨 합시다.

docker -v

도커 버전 확인하면서 설치됐는지 마무리.

 

 

 

# swap off
swapoff -a
vi /etc/fstab

저기 swap.img로 시작하는데를 주석처리하고 저장.

 

 

# kubernetes설치
wget https://packages.cloud.google.com/apt/pool/cri-tools_1.13.0-01_amd64_4ff4588f5589826775f4a3bebd95aec5b9fb591ba8fb89a62845ffa8efe8cf22.deb
wget https://packages.cloud.google.com/apt/pool/kubeadm_1.20.1-00_amd64_7cd8d4021bb251862b755ed9c240091a532b89e6c796d58c3fdea7c9a72b878f.deb
wget https://packages.cloud.google.com/apt/pool/kubectl_1.20.1-00_amd64_b927311062e6a4610d9ac3bc8560457ab23fbd697a3052c394a1d7cc9e46a17d.deb
wget https://packages.cloud.google.com/apt/pool/kubelet_1.20.1-00_amd64_560a52294b8b339e0ca8ddbc480218e93ebb01daef0446887803815bcd0c41eb.deb
wget https://packages.cloud.google.com/apt/pool/kubernetes-cni_0.8.7-00_amd64_ca2303ea0eecadf379c65bad855f9ad7c95c16502c0e7b3d50edcb53403c500f.deb

위 명령어들 다 입력해서 패키지를 wget으로 다운받아주자.

 

apt-get install socat conntrack ebtables
dpkg --install ./kubernetes-cni_0.8.7-00_amd64_ca2303ea0eecadf379c65bad855f9ad7c95c16502c0e7b3d50edcb53403c500f.deb
dpkg --install ./kubelet_1.20.1-00_amd64_560a52294b8b339e0ca8ddbc480218e93ebb01daef0446887803815bcd0c41eb.deb
dpkg --install ./cri-tools_1.13.0-01_amd64_4ff4588f5589826775f4a3bebd95aec5b9fb591ba8fb89a62845ffa8efe8cf22.deb
dpkg --install ./kubectl_1.20.1-00_amd64_b927311062e6a4610d9ac3bc8560457ab23fbd697a3052c394a1d7cc9e46a17d.deb
dpkg --install ./kubeadm_1.20.1-00_amd64_7cd8d4021bb251862b755ed9c240091a532b89e6c796d58c3fdea7c9a72b878f.deb

이거 다 입력해서 설치해주자.

 

 

 

master node 만들기

이제 이 k8s VM을 또 클론 할거다

얘는 control plane이라는 이름으로 만들어줄거임.

sudo su
hostnamectl set-hostname master

마스터로 hostname 설정

kubeadm config images pull

이것도 치샘

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<Host IP>

이거로 치샘. 마스터노드의 아이피를 저 <Host IP>에다가 넣으면 된다.

ip add 명령어치면 나오니까 모르겠으면 확인하샘.

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=211.183.3.10

 

난 211.183.3.10을 master노드 아이피로 할거라 저렇게 치면됨.

 

잘됐으면 이런식으로 저 kubeadm join 머시기가 뜰거임.

저 코드를 복붙해놓아서 이제 worker node VM을 만들어서 저 명령어를 쳐주면 master node와 연결이 되는것이다.

메모장에 복붙해놓으샘

 

 

master node / kubectl 명령어 사용하게 하기
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

이거도 순서대로 쳐주고..

kubectl get pods --all-namespaces
kubectl get nodes

각각 쳐주면 잘 써진다.

 

근데 자세히보면 core dns랑 이런게 pending 상태이다.

 

master node / kube flannel 적용
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

이거 치고 좀 기다리고 다시 pod들 확인하면

kubectl get pods --all-namespaces

kube flannel이 생기고 다 running이 되었다.

 

 

 

 

 

 

 

worker node 만들기

자, 이제 worker노드를 두개 만들거다.

각각 211.183.3.20, 211.183.3.30 아이피를 줄거임.

 

아까 만들었던 k8s VM을 클론하자. 사진은 worker node 1만 헀는데 worker node1, worker node 2 VM 두개 만들어서 똑같이 하면됨

클론하고 VM에 들어가서 일단 아이피를 바꿔줘야 한다.

참고로 세션으로 ssh 연결하지말고 이번엔 VMware에서 바로 하자.

세션연결하면 master node로 연결되서 마스터노드의 아이피를 바꿔버리는 불상사가 발생할수도 있음 ㅠ

아예 마스터노드를 꺼놓던가..

ip add

아이피가 211.183.3.10으로 되어있다. 이 아이피인 k8s VM을 클론한거니까 당연한거임.

이걸 211.183.3.20, 211.183.3.30으로 각각 워커노드들 설정할거임.

vi /etc/netplan/머시기.yaml

이 명령어로 저 파일을 보면

저 부분을 원하는 아이피로 바꿔주자.

사진에는 211.183.3.20인데 211.183.3.10이었었다.

원하는 211.183.3.20으로 제대로 바꾸고 저장. worker node 2는 211.183.3.30으로 바꾸고 저장

netplan apply

해당 명령어로 적용하고,

ip add

아이피 확인해보면

잘 적용됐다.

 

이제 ssh접속이 잘될거다.

 

hostnamectl set-hostname worker1

각 worker node VM에서 이거 치샘.

호스트네임을 worker1으로 할거임. 만약 워커노드 2라면 worker2로 하면됨.

 

 

 

그다음 아까 메모장에 복붙해놨던거 각각 worker노드에서 치샘

아까 master node에서 사진 젤아래에 나온 kubeadm join 머시기 했던거 치란 소리임.

 

 

다시 마스터노드로 돌아와서

kubectl get nodes

이거치면

worker1 worker2노드가 생긴걸 잘 볼 수 있음.

처음에 notReady상태인데 기다리면 바뀌니 참으샘

 

 

 

 

 

테스트상 deployment를 만들어보면

kubectl create deployment muzzi --image=nginx --replicas=5
kubectl get pods

워커노드들에서 pod들이 잘 만들어지는걸 볼 수 있음