쿠버네티스 실습 환경을 설정하기 위해서 3개의 가상머신을 설정해준다.
1개는 master node로 이용하고 나머지 두 개는 worker node로 사용한다.
따배쿠 강의를 보고 따라했는데, 강의 제작당시와 현재 container runtime 방식이 바뀌어서 설치하는 데 조금 시간이 걸렸다.
먼저 아래글을 따라서 가상머신을 하나만 만들어준다. 중요한 것은 가상머신의 메모리 2GB이상, CPU 2코어 이상을 설정해주는 것이다.
이후 해야할 것들은 다음과 같다.
1. NATNetwork 설정
2. swap 메모리 해제
3. ip table 설정
4. 방화벽 해제
5. 도커 설치
6. 컨테이너 런타임 인터페이스 설치 : cri-dockerd 이용
7. kubelet, kubeadm, kubectl 설치
8. VM snapshot을 이용하여 VM 복제 ( worker node 생성) 및 각 VM 네트워크 설정
9. [Master Node] kubeadm init, CNI 설정
10. [Worker Node] worker node Join
11. (추가) 자동완성 기능 추가
매우 길다!
+ k8s 설정, 실습시에는 su - 로 root 사용자로 로그인하여 작업을 진행하는게 덜 귀찮다. sudo를 입력해야하는 작업이 매우 많기 때문. 처음 가상머신을 설정했을때 root 사용자로 로그인하려면 root 사용자 비밀번호를 설정해야한다.
# root 사용자 비밀번호 설정
sudo passwd root
1. NATNetwork 설정
클러스터간 통신을 위한 NATNetwork를 설정해준다.
file-preferences-network로 들어가 +버튼을 눌러 네트워크를 정의해준다.
강의와 똑같이 설정해줬고, ip 주소는 다르게 지정해도 상관없다. Network Name에 띄어쓰기가 있으면 인식하지 못하는 오류가 있을 수 있다.
Port Forwading을 눌러 아래와 같이 포트포워딩을 설정한다. test는 캡처를 위해서 만든 머신이라 node2까지만 설정하면 된다.
강의에서는 vm를 만들고 xshell을 이용하여 원격접속을해서 실습을 진행하는데, 강의에서 똑같이 포트번호를 설정했을때 원격접속이 안되는 문제가 있어서 임의로 호스트 포트번호를 변경해주었다. 포트번호는 임의로 지정해주어도 되나 이미 사용중인 포트, 자주 사용되는 포트번호(ex. 8888, 8080) 등 은 피하도록 하자
그리고 가상머신을 설정하고 Settings - Network에 들어가 생성한 NATNetwork로 설정해준다.
2. Swap 메모리 해제
가상머신을 켜서 터미널에 들어간다.
우분투에서 터미널을 여는 단축키 : Ctrl+Alt+T
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
# 혹은
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
위의 명령어로 swap 메모리를 해제해준다.
swap 메모리는 RAM 용량이 부족할 때 하드 디스크의 일부 공간을 메모리처럼 사용하는 아주 좋은 기능이지만, 쿠버네티스는 swap 메모리를 고려하지 않고 설계되었기때문에 클러스터 구성시 swap 메모리를 비활성화 시켜주어야한다.
스왑메모리가 비활성화 되었는지는 아래 명령어로 확인할 수 있다.
free -h
3. ip table 설정
이 단계는 간단하다. 아래 내용을 터미널에 입력해주면 된다.
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
sudo sysctl --system
4. 방화벽 해제
포트 접속을 위해서 방화벽을 해제해주어야한다.
공식 문서에서는 firewalld 방화벽으로 나와있지만 나의 경우 가상머신에서 firewalld가 없다고 나왔다.
그런 오류가 뜬다면 ufw 방화벽을 비활성화 해주자.
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 사용하는 방화벽이 firewalld가 아니라면
# firewalld -> ufw 로 변경해서 실행
systemctl stop ufw
systemctl disable ufw
5. 도커 설치
컨테이너 런타임으로 도커를 이용할 것이므로 도커를 설치해준다.
6. 컨테이너 런타임 인터페이스 설치
따배쿠 강의 당시까지는 쿠버네티스가 도커를 컨테이너 런타임으로 지원했지만 그 이후 쿠버네티스가 도커 컨테이너 런타임 지원을 중단하여서 CRI로 불리는 컨테이너 런타임 인터페이스 설치가 필요해졌다.
자세한 내용은 아래에서 찾아볼 수 있다.
CRI로 cri-dockerd를 선택했다.
후담이지만 다 설정하고나서 들은 이야기로는 현업에서는 cotainerd로 바뀌고 있는 추세라고 한다.
cri-dockerd의 repo에 설치 방법이 나와있다. Go를 설치해야한다.
# clone repo
git clone https://github.com/Mirantis/cri-dockerd.git
###Install GO###
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd # 아무 출력없이 오래걸림
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
위의 명령어들을 모두 입력해주면 설치가 완료된다.
7. kubelet, kubeadm, kubectl 설치
sudo apt-get update && apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update && apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
위의 명령어를 차례로 입력해주면 설치가 완료된다.
한 번에 입력하면 뒤에 명령어들이 실행이 안될 수 있어 주의해야한다.
여기까지하고 vm을 종료하고 snapshot을 생성한다.
8. VM snapshot을 이용하여 VM 복제 ( worker node 생성) 및 각 VM 네트워크 설정
master를 복제하여 node1, node2를 만들어 총 3개의 vm을 만든다.
snapshot을 이용하는 방법은 간단하다.
그리고 모두 전원을 켜주고 아래의 작업들을 모든 머신에 해준다.
앞서 NATNetwork를 설정해준 것처럼 모든 머신의 네트워크는 NATNetwork로 설정해준다.
그리고 전원을 켜서 아래 작업들을 해준다.
1. 고정 ip 설정
2. 패키지 설치
3. hostname, host 설정
1. 고정 ip 설정
네트워크 옵션에 들어가서 ip를 고정한다
톱니바퀴를 눌러 설정으로 진입 -> IPv4 탭 선택
포트포워딩 테이블에 맞게 ip 정보를 입력해준다.
Netmask는 24로 입력해도 255.255.255.0 로 변경되는 것을 확인할 수 있는데 둘이 같은의미이기 때문에 그렇다.
Apply를 누르고 나온뒤 토글버튼을 두 번눌러 네트워크 해제 후 재연결을 해준후 다시 톱니바퀴를 눌러 Details을 확인했을때 설정한 정보가 그대로 나온다면 설정 완료
2. 필요 패키지 설치
sudo apt install openssh-server tree curl net-tools
원격으로 접속할 것이므로 ssh가 필요하고 ip 정보를 확인하기 위해서 net-tools이 필요하다.
3. hostname/host 설정
sudo nano /etc/hosts
# 또는
sudo vi /etc/hosts
본인에게 편한 에디터로 해당 파일을 들어가서 아래 내용은 그냥 두고 주석 위에 하단의 그림과 같이 ip 정보와 도메인 네임을 설정해준다. 모든 클러스터에 해야한다.
sudo nano /etc/hostname
이번에는 호스트네임을 설정해 주는데 각 클러스터에 맞는 호스트네임으로 변경해주면 된다.
master 노드는 master로 node1은 node1로.. hostname파일에 도메인 네임 옆에 적어줬던 것과 동일하게 작성한다
모든 노드에 설정 완료 후 ping을 날려보면 서로 연결되어있는지 확인할 수 있다.
# 예시 master 노드에서
ping node1.example.com
ctrl+c를 눌러 ping을 종료하거나 ping 명령시 -c 옵션을 사용하여 ping의 개수를 사전에 설정할 수 있다.
ping -c 2 node2.example.com
9. [Master Node] kubeadm init, CNI 설정
k8s를 사용기 위한 사전 준비가 모두 끝났고 이제 init을 통해 클러스터 설정을 해준다.
# on master node
kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock
--cri-socket은 해당 머신에 cri가 하나 존재하면 알아서 찾아서 하기 때문에 필수 옵션은 아니지만, 나의 경우에는 cri-dockred와 containerd 두 개가 잡혀서 설정을 해줘야 오류가 안났다.
해당 명령어 입력 후 나오는 log를 복사해서 기억해둬야된다!
# kubeadm init 후 나오는 로그
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.100.0.104:6443 --token 04dqxd.v5vuqyucj1bmv4zu \
--discovery-token-ca-cert-hash sha256:3c9ac7adfa2f090e573dab16cb9f8b06d52d57af8d6b6ac8586c58880bc12a53
각 노드들에 해야할 추가 태스크들이 나온다.
노드를 연결할때 필요한 토큰들이 나오니 정말 기억해야한다...
먼저 마스터 노드에 아래 명령어를 모두 입력한다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
CNI 설정
k8s 노드들의 네트워크를 조절하는 CNI를 설정한다.
Network Policy Provider는 여러가지가 있고 그중 weavnet을 선택했다.
# add-on : weave-net
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
10. [Worker Node] worker node Join
이제 워커노드들에 작업들을 해줘야한다.
워커노드에서 아까 init 후 복사해뒀던 토큰정보를 입력한다
kubeadm join 10.100.0.104:6443 --token 04dqxd.v5vuqyucj1bmv4zu \
--discovery-token-ca-cert-hash \
sha256:3c9ac7adfa2f090e573dab16cb9f8b06d52d57af8d6b6ac8586c58880bc12a53 \
--cri-socket unix:///var/run/cri-dockerd.sock
--cri-socket 옵션을 추가해주어서 소켓을 지정했다.
성공적으로 join을 완료하면 마스터 노드에서 확인이 가능하다.
kubectl get nodes
11. (추가) 자동완성 기능 추가
tab을 눌렀을때 명령어가 자동완성 되는 기능을 추가할 수 있다.
source <(kubectl completion bash) # set up autocomplete in bash into the current shell, bash-completion package should be installed first.
echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
alias k=kubectl
complete -o default -F __start_kubectl k
'Kubernetes' 카테고리의 다른 글
livenessProbe : Self-healing Pod 만들기 (0) | 2023.05.17 |
---|---|
[Kubernetes][따배쿠 6-2] ReplicaSet (0) | 2023.04.24 |
[Kubernetes][따배쿠 6-1] Controller - Replication Controller (0) | 2023.03.22 |
[Kubernetes] 따배쿠 5강 문제풀이 (0) | 2023.03.17 |
[Kubernetes] pod에 resource 할당하기 | 환경변수 설정과 실행 패턴 (0) | 2023.03.17 |