Kubernetes

Kubernetes - K8S ubuntu 18.04 set-up 진행

크라우니 2021. 7. 16. 16:49

주의 : 이 글에서는 VM을 한대밖에 가용하지 못해서 한대에 마스터만 구현했습니다. 정상기능으로 작동하나 원래대로 진행한다면 노드까지 포함하여 3대의 VM이 필요합니다.

 

1. 최소 스펙

 - MASTER 

   CPU : 2 Core

   RAM : 3 Gb  

- NODE

  CPU : 2 Core

   RAM : 3 Gb

 

2. 사전 준비 사항 

아래 사항을 반드시 체크 할 것 

  • CPU 2개 이상
  • 각 노드는 2개 이상의 CPU (코어) 가 있어야 합니다.
  • 스왑 메모리 비활성화
  • Kubernetes 는 Swap Memory 를 고려하지 않고 개발되었습니다. Swap Memory 가 활성화되어 있으면 여러 문제가 발생할 수 있습니다.
  • 각 노드간 원활한 네트워크
  • 방화벽 등 각 노드간의 네트워크를 방해하는것을 제거하는 것이 좋습니다.
  • Docker 설치
  • 도커는 최신 버전이 아니라, Kubernetes 에서 권장하는 버전을 설치합니다.

    도커 설치 참고 자료 

3. Docker 구성 

sudo apt update
sudo apt-get update

# Docker CE 설치
## 리포지터리 설정
### apt가 HTTPS 리포지터리를 사용할 수 있도록 해주는 패키지 설치
sudo apt-get install -y \
  apt-transport-https ca-certificates curl software-properties-common gnupg2

### Docker의 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

### Docker apt 리포지터리 추가.
sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

## Docker CE 설치.
sudo apt-get update && sudo apt-get install -y \
  containerd.io=1.2.13-1 \
  docker-ce=5:19.03.8~3-0~ubuntu-$(lsb_release -cs) \
  docker-ce-cli=5:19.03.8~3-0~ubuntu-$(lsb_release -cs)

# 데몬 설정.
sudo su -
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
exit

sudo mkdir -p /etc/systemd/system/docker.service.d

# Docker 재시작.
sudo systemctl daemon-reload
sudo systemctl restart docker

위와 같은 과정을 거쳐서 도커 CE를 생성한다. 

도커 CE와 EE의 차이는 다음 글에서 확인이 가능하다 : Docker CE, EE 차이

 

--추가 

혹시 VS code에서 작업을 진행하다가 설치를 하고 Docker Extension을 설치해서 사용하는데 목록이 안뜬다 싶으면

/var/run/docker.sock 에 권한이 없어서 그렇다고 경고 문자가 나오니...

 

sudo chmod 777 /var/run/docker.sock

으로 권한을 주면 VS Code Docker Extenson 에서 도커 image 및 Container를 운영이 가능하다.

 

4. 마스터 노드, 워커 노드 필요사항 설치

우선 지금까지 진행했던 설치들로 부터 발생하는 요소들에 대하여 다시 한번 Update를 진행한다.

sudo apt-get update
sudo apt-get upgrade

다음으로 

kubeadm, kubelet, kubectl 을 설치 진행 쿠버네티스 요소들에 대해서는 다른글을 통하여 알아보도록 하자.

 

sudo apt-get install -y apt-transport-https curl

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

sudo apt-get update

sudo apt-get install -y kubelet kubeadm kubectl

# 자동업데이트 방지
sudo apt-mark hold kubelet kubeadm kubectl

kubeadm version
kubelet --version
kubectl version

 

5. 쿠버네티스 마스터 설치 및 설정

Kuberadm init 설정

ifconfig

sudo kubeadm init --pod-network-cidr=<subnet ip>/16 \
  --apiserver-advertise-address=<Azure VM 내부 IP>

ifconfig가 없다면 실행하자마자 특정 프로그램을 설치하라는 경고가 나오니 설치를 진행하고 진행한다.

 

이과정에서 설치시간이 약 2~ 5분정도 소요된다. 

 

kuberctl을 앞으로 많이 사용하게 될건데 사용할때마다 sudo권한을 이용하기 싫다면 아래 설정을 적용해보자.

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

admin.conf 인증서 파일을 통해서 Kubernetes에 권한을 부여하여 실행을 하기떄문에 권한없이 진행이 가능하다. 

 

네트워크 에드온 설치

네트워크 에드온 클러스터간 네트워킹을 지원하기 위하여 설치하며 자세한 내용은 아래 공식 사이트를 참고하자

클러스터 네트워킹

 

그중에서 범용성? 이 좋은 Flannel을 설치하여 진행한다. 

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

설치가 완료 되면 상태 확인을 진행한다. 

kubectl get nodes
kubectl get pod --namespace=kube-system -o wide

설치완료...

여기까지 오면 마스터에 대한 설치가 완료 된다. 글쓴이는 여기까지 밖에 진행을 못하는데 이유는.. 

Azure 구독이 Free로 진행하다 보니 VM할당이 1대 밖에 안되기 때문에 ... 그 이상 설치할 계정의 크레딧을 다 터는 바람에... 글쓸당시 확인이 안되어 여기까지 밖에 진행하지 못했다. 이후는 아마 따라가면 노드 설정이 가능할것이다. 

 

마스터 노드만 설치가 되어있는경우 마스터 노드가 control plane node로 구성되기 때문에 추가 설정이 필요하다.

 

왜냐.. 그냥 바로 Pod를 생성하게 되면 Pending 상태에서 배포가 되지 않고 멈춰있기 때문이다..

 

이런식으로 말이다..

 

아래와같이 진행해 보자.

# Control-Plane-Node 확인

kubectl describe node master | grep Taints

# Taint 설정 해제 
kubectl taint nodes –all node-role.kubernetes.io/master-

# Pod 상태 확인
kubectl get pods -o wide

 

6. 워커노드 설정 

인증키 확인 / 관리

마스터 노드 접근권한을 얻기 위해서는 마스터 노드에서 만드는 토큰이 필요하다.

 

kubeadm init 실행시 토큰이 자동으로 발급된다.

 

토큰 리스트를 확인해 본다.

# Token List 확인

kubeadm token list

# Token Create

kubeadm token create

# 토큰 해시값 얻기

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

kubeadm init 명령 실행 결과에 나오는 kubeadm join <토큰> <해시값> 은 worker node가 control-plane에 연결될 때 필요 ((해시값 == 디스커버리 토큰))

sudo kubeadm join <마스터노드 프라이빗 아이피>:6443 \
  --token <토큰> \
  --discovery-token-ca-cert-hash sha256:<디스커버리 토큰>

아래 명령으로 등록후 확인이 가능하다.

kubectl get nodes