티스토리 뷰

728x90
반응형

 

[Kubernetes] 1. Ubuntu에 Kubernetes 설치하기

 

 

 

 

쿠버네티스를 설치 전,

Docker가 설치되어 있지 않다면 Docker 설치 및 기초 학습을 위해 아래 게시물을 클릭해주세요!

 

[Docker] 1. Ubuntu에 Docker 설치하기
[Docker] 2. Docker registry에서 이미지 다운받아 컨테이너 생성 및 구동하기
[Docker] 3. Docker 컨테이너 생성/구동/중지/삭제 명령어 익히기
[Docker] 4. Docker 우분투 컨테이너에서 작업 후 이미지 제작하기
[Docker] 5. Docker 컨테이너의 데이터 공유하기

 

Docker 설치가 끝났으면, Docker의 cgroup driver를 cgroupfs에서 systemd로 변경해주어야 합니다.

#sudo mkdir /etc/docker
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

# 재시작
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker  

# 변경된 cgroup driver 확인
sudo docker info | grep -i cgroup

 

 

다음으로,  Swap 메모리를 비활성화 작업을 진행합니다.

Swap 메모리란?
실제 메모리 Ram이 가득 찼지만 더 많은 메모리가 필요할때 디스크 공간을 이용하여 부족한 메모리를 대체할 수 있는 공간을 의미합니다.

 

 

kubernetes는 Pod를 생성할 때, 필요한 만큼의 리소스를 할당받아 사용하는 구조이며 Swap을 고려하지 않기 때문에,
정상적으로 동작할 수 있도록 Swap 기능과 파일들을 모두 비활성화 해주어야 합니다.

# swap disable
swapoff -a
echo 0 > /proc/sys/vm/swappiness
sed -e '/swap/ s/^#*/#/' -i /etc/fstab

 

 

 


 

이제 kubernetes 클러스터 구성을 위해 아래 명령어를 통해 kubeadm, kubelet, kubectl을 설치합니다.

kubeadm이란?
kubernetes에서 제공하는 기본적인 도구이며, kubernetes 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공합니다.
kubelet이란?
클러스터의 모든 Node에서 실행되며, Pod 및 컨테이너 시작 등의 작업을 수행하는 구성요소입니다.
kubectl이란?
클러스터와 통신하는 CLI입니다.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

apt-get update

apt-get install -y kubelet kubeadm kubectl

 

그리고 자동으로 업데이트 되지 않도록 패키지 버전을 고정시킵니다.

sudo apt-mark hold kubelet kubeadm kubectl

 

 

다음으로, 마스터노드와 워커노드를 설정해줍니다.

kubeadm init 명령어를 통해 마스터 노드를 초기화 및 실행할 수 있습니다.

마스터 노드 세팅을 위해 필요한 옵션은 아래와 같습니다.

--pod-network-cidr
: Pod 네트워크를 설정합니다.

--apiserver-advertise-address
: 마스터노드의 API Server 주소를 설정합니다.

 

쿠버네티스 네트워크 모델 중 하나인 Flannel을 사용하기 위해 --pod-network-cidr 옵션에 10.244.0.0/16을 넣어줍니다.
Flannel은 서로다른 노드에 있는 Pod간 통신을 원활히 하기 위해 필요한 네트워크 플러그인 이며,

Flannel의 기본 네트워크 대역은 10.244.0.0/16입니다.

apiserver-advertise-address 에는 ifconfig 명령어를 입력하면 나오는 eth0 IP를 넣어주면 됩니다.

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address={마스터 노드 IP}

 

 

 

에러사항

만약 아래와 같이 에러가 발생하면 /etc/containerd/config.toml을 삭제하고 containerd 서비스를 다시 시작해줍니다.

[init] Using Kubernetes version: v1.26.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2023-02-23T15:27:29+09:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

/etc/containerd/config.toml을 삭제하고 containerd 서비스를 다시 시작!

rm /etc/containerd/config.toml
systemctl restart containerd

 

 

 

정상적으로 마스터 노드 초기화가 완료되었다면 아래와 같이 token 값을 받게 됩니다.

이 토큰값은 마스터 노드에 조인할 수 있는 토큰입니다. 워커노드를 설정할 때 필요하니 메모장에 복붙해둡니다.

(빨간 박스 참고)

 

셋업한 클러스터를 사용하기 위해 chown 진행해 주고,

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

 

그리고 Pod 끼리의 통신을 도와주는 Flannel Pod 네트워크를 클러스터에 배포합니다.

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

 

 

API 서버는 6443, 8080 두 포트를 사용하니, 포트가 열려있지 않거나 사용중이라면 에러가 발생하게 됩니다.

정상적으로 설정이 완료되었다면,

https://{마스터 노드 공인 IP}:6443/로 접속했을 때 아래와 같이 응답메세지가 호출됩니다.

code가 403으로 나왔는데, 403은 kubernetes API Server에 접근권한이 없을 경우 발생합니다.

(인증토큰 전달 없이 접속했으므로 정상임)

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {},
  "code": 403
}

 

 

 

마지막으로 워커 노드를 설정해줍니다.

워커 노드는 위에서 마스터 노드 설정 시 발급받은 토큰을 적어  마스터 노드에 조인해주면 됩니다.

{마스터 노드 IP}에는 마스터노드에서 kubeadm init --apiserver-advertise-address 옵션에 넣었던 ip를 입력합니다.

kubeadm join {마스터 노드 IP}:6443 --token {token} \
--discovery-token-ca-cert-hash sha256:{해시값}

 

 

만약 couldn't validate the identity of the API Server 라는 에러가 나오면, 토큰이 올바르지 않다는 에러이므로

마스터노드에서 토큰을 재발급받아, 새 토큰으로 마스터 노드에 조인해주세요.

# 토큰 확인
kubeadm token list
# 기존 토큰 삭제 (위 list에서 나온 TOKEN을 넣어줌)
kubeadm token delete {TOKEN}
# 새 토큰 create
kubeadm token create --print-join-command
# 새 토큰 확인
kubeadm token list

 

 

마스터노드에서 워커노드가 정상적으로 조인되었는지 확인합니다.

아래와 같이 마스터노드와 워커노드가 뜨면 kubernetes 설치 및 마스터노드, 워커노드 설정완료입니다.

kubectl get nodes

 

 

 

다음 게시물에서는 쿠버네티스 위에 프로젝트를 배포하는 작업에 대해서 작성해볼 예정입니다.


 

[Kubernetes] 2. hello kubernetes bootcamp! 프로젝트 배포해보기

https://domdom.tistory.com/592

 

728x90
반응형
댓글