우분투에 Kubernetes 설치하기 (Installing Kubernetes on Ubuntu)

2022. 5. 23. 13:53프로그래밍 개발(Development)/k8s

반응형

Spec

- OS : ubuntu server 20.04

- vm : 2vm(2core, 4mb, 50GB) (master node, worker node)

 

K8s 설치 이전에 Docker 설치를 우선 진행 한다.

Before installing K8s, install Docker first.

 

OS의 기본 환경 설정은 minimal로 설치 후 openssh 정도만 설치 해 주었다.

 

※ 모든 설치는 root 계정으로 진행한다.

 

공통 요소

1. Docker 설치

더보기

repository 설정하기

apt package index를 업데이트 하고 HTTPS를 통해 repository 를 이용하기 위해 pakcage 들을 설치 한다.

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

Docker의 Official GPG Key 를 등록한다.

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

stable repository를 등록한다.

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

아래의 명령어를 통해 Docker를 설치 한다.

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

정상적으로 설치가 되었는지 확인한다.

$ docker --version

 

※ 수동으로 Docker를 설치해야 하는 경우 아래의 글 참고

2022.02.23 - [프로그래밍 개발(Development)/Docker] - Docker, Docker-compose 수동 설치(Centos, ubuntu)

 

Docker, Docker-compose 수동 설치(Centos, ubuntu)

인터넷이 제공되지 않은 환경에서 Docker를 설치 해야 하는 경우가 발생한다. 그럴 경우 설치 파일을 미리 다운로드 받아서 설치를 진행 하면 된다. 1. CentOS 7.5 기준 설치 방법 - 인터넷이 제공되는

choco-life.tistory.com

 

2. Swap off

kubelet에서 swap을 지원하지 않기 때문에, Master/Worker 모두 swap 기능을 꺼야 한다.

$ swapoff -a

영구적으로 기능을 끄기 위해서는 /etc/fstab파일에서 일부 주석 처리를 진행 해야한다.

$ nano /etc/fstab

swap 부분을 찾아서 주석 처리를 한다.

#/swap.img  none    swap    sw  0   0

 

3. Cgroup driver 설정

$ docker info

docker info

Cgroup driver가 "cgroupfs"로 설정되어 있는걸 확인 할 수 있다. 이 부분을 "systemd"로 변경하자.

$ nano /etc/docker/daemon.json

아래의 같이 입력해준다.

{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "storage-driver": "overlay2"
}

 

$ mkdir -p /etc/systemd/system/docker.service.d
$ systemctl daemon-reload
$ systemctl restart docker

docker info

 

4. kubernetes 설치

Master / worker node 모두 kubeadm, kubelet, kubectl 3개의 패키지가 설치되어야 한다.

추가적으로 kubernetes-cni, cri-tools 2개 패키지도 설치 한다.

 

아래에서 최신 버전의 주소(파일명) 확인이 가능하다. (16.04 이후 버전 모두 동일)

https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-amd64/Packages

패키지 다운로드.

$ 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

패키지 설치 진행

$ 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

여기까지 진행 했다면, 공통 요소의 설치는 모두 끝이 났다.

 

그럼 VM을 복제하여 한개를 더 생성하자.


Master Node 설정

 

동일한 VM일 경우 hostname이 동일하면 안되기 때문에 hostname을 변경해준다.

hostname명을 master로 설정 하였다.

$ hostnamectl set-hostname master

host의 IP를 확인한다. 둘중에 하나를 사용해도 된다.

minimal 버전이라면 ifconfig는 동작하지 않을 수 있다.

$ ip addr

or

$ ifconfig

IP를 확인 했으니 이제 설정 해보자. 아래와 같이 Host IP를 입력하고 Init을 한다.

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

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

정상적으로 진행이 되면 아래와 같이 가장 마지막 부분에 토큰 정보가 출력이 된다.

 

kubeadm join 192.168.102.111:6443 --token uifaqn.c8lsjrqts493mw7u \
    --discovery-token-ca-cert-hash sha256:2f3bd4a77fe040d1211d1ba684885ec0a8905160fc5cd5b6296525bf087ef7cc

사용자 계정에서 kubectl 실행을 할 수 있도록 설정을 해본다.

$ mkdir -p $HOME/.kube

$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ chown $(id -u):$(id -g) $HOME/.kube/config

잘 설치가 되었는지 확인해보자.

아래의 명령어를 통해서 node 정보가 제대로 호출 되는지 확인한다.

$ kubectl get pods --all-namespaces
 
$ kubectl get nodes

Pod Network 환경을 맞춰야 하는데, k8s를 위한 layer 3환경을 구축해주는 flannel을 사용한다.

https://github.com/coreos/flannel/

 

GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes

flannel is a network fabric for containers, designed for Kubernetes - GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes

github.com

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ kubectl get pods --all-namespaces
 
$ kubectl get nodes

all namespaces
node list

coredns : Pending -> Running 변경

kube-flannel 추가

Master Node : Not Ready -> Ready 상태 변경


Worker 설정

 

Worker도 마찬가지로 hostname을 변경 해준다.

hostname은 worker1으로 설정 하였다.

$ hostnamectl set-hostname worker1

기본 설정은 공통 요소에서 모두 설치 되었기 때문에, Master에서 Init 후 생성된 정보만 입력 해주면 된다.

$ kubeadm join 192.168.102.111:6443 --token uifaqn.c8lsjrqts493mw7u \
    --discovery-token-ca-cert-hash sha256:2f3bd4a77fe040d1211d1ba684885ec0a8905160fc5cd5b6296525bf087ef7cc
...
...
...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
 
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

위와 같은 내용이 나오면 정상적으로 join이 된것이다.

 

이제 Master에서 join이 제대로 되었는지 확인해보자.

$ kubectl get nodes

여기까지 진행을 했으면 모든 설정이 끝났다.

정상 동작을 하는지 확인을 해보자.


Kubernetes 동작 확인

 

Master Node에서 다음과 같이 deployment를 생성하자.

$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

아래의 명령어를 통해 확인

$ kubectl get deployments
 
$ kubectl get pods -o wide

Worker Node에서 해당 서비스가 잘 되는지 확인해보자.

$ curl http://10.244.1.4:8080

Hellow kubernetes가 정상적으로 출력 되는 것을 확인.

 

끝.

반응형