Ubuntu server 22.04 LTS 버전으로 진행했다.
싱글 마스터와 워커 노드의 하드웨어 성능이다.
master cpu 2 core, ram 4GB
worker1, 2 cpu 1 core, ram 2GB
이후 노드 간 통신이 가능하게 하기 위해 버추얼 박스의 네트워크 설정부터 조정해줘야 한다.
호스트 전용 네트워크도 가능하다고 들었으나 나같은 경우 NAT 네트워크로 진행했을 때 노드 간 통신이 가능했다.
도구 > 네트워크 > NAT 네트워크 > 만들기
를 진행하면 아래와 같은 화면을 볼 수 있다.
여기에서 IP주소가 자동으로 생기게 되는데 10.0.2.0/24는 버추얼박스의 NAT 네트워크 default IP주소라고 한다.
XShell, Putty 같은걸 사용하기 위해서는 포트포워딩을 켜줘야 한다.
버추얼 박스의 DHCP가 자동으로 할당해 주는 범위가 주로 10.0.2.15~10.0.2.244 사이라고 한다.
혹은 보통의 경우 15와 244 사이 중간부터 할당을 시작하기에 10, 20같은 숫자나 극후반 234 같은 주소를 할당해도 된다고 한다.
이렇게 하면 XShell 연결도 잘 된다.
가볍게 sudo apt-get update를 해주고
sudo apt-get install socat과 openssh-server를 설치해 준다.
socat은 쿠버네티스 노드, 파드 간 수월한 연결을 위해, openssh-server는 XShell 연결을 위해 설치한다.
이제 각 머신의 구체적인 환경설정을 시작한다.
sudo hostnamectl set-hostname your-hostname
명령어를 통해 각 노드들의 호스트 이름을 정해준다.
쿠버네티스는 노드 간 IP뿐만 아니라 호스트 이름을 통해 통신하기에 매우 중요한 부분이다.
가상 머신 환경이고 NAT 네트워크를 사용중이기에 상호작용 할 호스트들을 설정해 주어야 한다.
sudo nano /etc/hosts
//vi로 진행해도 되고 root라면 sudo를 생략해도 된다. 앞으로 나올 모든 nano와 sudo에 해당
위의 명령어를 실행하면 아래와 같은 화면이 나온다.
이미 설정을 해 둔 상태라 이렇게 나왔지만 처음에는
127.0.0.1 localhost
127.0.0.n your-hostname
과 아래의 ipv6 설정이 있을것이다.
이것을 처음 포트포워드 시 설정한 각 머신의 IP주소와 위에서 변경한 호스트 이름으로 저장한다.
이제 각 가상 머신의 고정IP 설정과 DHCP를 끌 차례이다.
IP주소는 NAT네트워크 포트포워딩 진행하며 설정한 IP주소로 한다.
ls /etc/netplan
명령어를 실행하면 아래와 같이 네트워크 설정 yaml 파일이 있을것이다.
다만 각 머신, 환경마다 이름은 다를 수 있다.
nano /etc/netplan/01-network-manager-all.yaml
명령어를 실행하게 되면
이렇게 밖에 존재하지 않을것이다.
desktop 버전을 통해 GUI로 설정하는 방법도 있지만 이 방법이 조금 더 확실하다고 생각되기에 직접 파일을 수정하는 방식으로 진행했다.
yaml 파일이기에 정확히 들여쓰기를 맞춰서 이 형태로 작성해 주면 설정은 끝난다.
10.0.2.1은 버추얼박스의 default gateway 주소이다.
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
enp0s3:
dhcp4: no //DHCP
addresses:
- 10.0.2.7/24 // ip address
routes:
- to: default
via: 10.0.2.1 //gateway address
nameservers: // DNS server
addresses:
- 8.8.8.8 // 구글 DNS
- 8.8.4.4
이것만으로는 DNS 설정이 마무리 되지 않는다.
마지막으로
nano /etc/resolv.conf
명령어를 통해
127.0.0.3/53 이런식으로 되어있는 nameserver를 8.8.8.8로 변경해주고
chattr +i /etc/resolv.conf
으로 재부팅을 하더라도 변경되지 않게 고정시켜준다.
이러면 일단 고정IP, DCHP 설정은 마무리 되었다.
아래는 쿠버네티스 설치를 위한 사전 작업이다.
//방화벽(ufw) 끄기/방화벽(ufw) 끄기
sudo ufw disable
//메모리 스왑 끄기
sudo swapoff –a && sudo sed –I ‘/swap/s/^/#/’ /etc/fstab
//쿠버네티스 네트워크 브릿지 모듈 설정
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
//네트워크 브릿지 설정
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipb4.ip_forward =1
net.ipv6.conf.all.forwarding =1
EOF
//재부팅 없이 설정 적용
sudo sysctl --system
명령어들의 역할은 주석으로 첨부했다.
쿠버네티스를 설치하기 위한 준비의 준비의 준비가 끝났다. 이제 정말 준비가 거의 다 끝났다.
컨테이너 런타임 설치를 위해 docker와 containerd를 설치해 준다.
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install –m 0755 –d /etc/apt/keyrings
sudo curl –fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux.ubuntu $(. /etc/os-release && “$VERSION_CODENAME”) stable” | \
Sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
//도커 및 containerd 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world
이는 도커 공식 사이트에서 가져온 명령어이다. 버전에 따라, 시기에 따라 바뀔수 있으므로 문제가 생기거나 진행이 되지 않는다면 도커 공식 사이트에서 확인을 해 보아야 한다.
이 과정이 마무리 되었다면 쿠버네티스 설치 전 마지막 환경설정을 해야한다.
nano /etc/containerd/config.toml
이 파일을 열어서 찾다보면
[plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc] 아래에
[plugins.”io.contrainerd.grpc.v1.cri”.containerd.runtimes.runc.options] 를 찾을 수 있다.
runc.options 맨 아래에 SystemdCgroup = true를 추가해 주고 저장하면 마무리 된다.
혹시나 아무것도 안뜨고 주석처리된 문장만 가득한 파일이 나올수도 있다.
이럴 경우에는 유일하게 주석처리가 되지않은 disable_plugins= ["cri"] 비슷한 문장이 하나 있을텐데
이 부분을 주석처리 해주고
[plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc]
[plugins.”io.contrainerd.grpc.v1.cri”.containerd.runtimes.runc.options]
SystemdCgroup = true
이 코드를 최하단에 추가해주면 된다.
sudo systemctl restart containerd
가볍게 containerd 재시작 툭. 해주면 쿠버네티스 설치 준비가 끝났다!
쿠버네티스 설치 명령어는 아래와 같다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/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
sudo systemctl enable --now kubelet
다만 구글 샤이닝키가 최근에 변경된것처럼 언제든 또 변경될 가능성이 있고
쿠버네티스 버전에 따라 명령어가 다를수 있으니 이 부분은 설치하려는 버전에 맞게 쿠버네티스 공식 도큐먼트 참고가 필요해 보인다.
여기까지가 마스터, 워커노드에 공통으로 진행하는 부분이다.
이제 마스터 노드를 만들 차례인데 주의해야 할 포인트가 조금 있다.
kubeadm init --control-plane-endpoint "10.0.2.7:6443" --pod-network-cidr=192.168.0.0/16
--control-plane-endpoint 에는 마스터노드의 IP와 포트를 " " 로 묶어서 적어주고
--pod-network-cidr= 은 원하는 CRI마다 IP 주소 대역이 다르다.
이 부분은 본인이 설치하고 싶은 CRI의 IP주소 대역을 확인하여 적어주면 된다.
나같은 경우에는 위와 같은 명령어를 사용했는데,
쿠버네티스가 1.31로 최신버전이라 호환이 안되는 CRI들이 있었기에 가장체급이 큰 Calico로 진행하기 위해서
192.168.0.0/16으로 매개변수를 주었다.
init 과정이 마무리 되면
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 10.0.2.7:6443 --token agzq6v.xvh43243243243 \
--discovery-token-ca-cert-hash sha256:1207071d4f62de1234559aedf5345354334465467e3cbf4234234223f87430c \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.7:6443 --token agzq6v.xvh43243243243 \
--discovery-token-ca-cert-hash sha256:1207071d4f62de1234559aedf5345354334465467e3cbf4234234223f87430c
구체적인 토큰은 다르겠지만 이런식으로 마스터노드에 join할수있는 토큰을 만들어준다.
반드시
kubeadm join 10.0.2.7:6443 --token agzq6v.xvh43243243243 \
--discovery-token-ca-cert-hash sha256:1207071d4f62de1234559aedf5345354334465467e3cbf4234234223f87430c
이 부분은 복사를 해두는걸 추천한다.
그리고 24시간이 지나면 이 키는 소멸되기에 만약 24시간이 지난 후에 join을 시도하게 될 경우
kubeadm create token
명령어를 통해 다시 발급받아서 진행하면 된다.
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
마지막으로 CRI의 매니페스트 파일을 kubectl에 적용해주면 마스터노드 구성은 끝난다.
잘 되었나 확인하기 위해서
kubectl cluster-info
kubectl get nodes
systemctl status kubelet
kubectl get nodes -o wide
중에 아무거나 실행해 보자. 별다른 오류가 없고 control-plane의 상태가NotReady가 아니라면 정상적으로 설정이 된것이다.
워커노드에서 마스터노드로 조인하려면
kubeadm join 10.0.2.7:6443 --token agzq6v.xvh43243243243 \
--discovery-token-ca-cert-hash sha256:1207071d4f62de1234559aedf5345354334465467e3cbf42342342
위에서 발급받은 토큰과 명령어를 그대로 실행해주면 끝난다.
조인 이후 마스터노드에서 아래 명령어를 실행했을 때
kubectl get nodes
이 화면과 비슷하게 출력되면 쿠버네티스 마스터, 워커노드 구성이 성공적으로 된 것이다!
마스터노드에서 kubeadm init 과정에서 매개변수를 잘못 주었거나, CRI를 기존것과 다른걸 사용하고 싶다면
kubeadm reset
해주고 다시 원하는 매개변수로 kubeadm init을 진행하면 된다.
'Kubernetes' 카테고리의 다른 글
Q4 Google Cloud Technical Series 후기 (6) | 2024.12.06 |
---|---|
쿠버네티스(Kubernetes, K8s) 컨닝페이퍼 (1) | 2024.09.06 |
컨테이너 컨닝페이퍼 (0) | 2024.09.06 |