티스토리 뷰

 

AWS EKS 나 GCP GKE를 이용하면 어렵지 않게 쿠버네티스 클러스터를 구축할 수 있지만 퍼블릭 클라우드를 이용하지 않고 온프레미스 환경에서 쿠버네티스 클러스터를 구축하기란 쉬운 일은 아닙니다. (최소 저한테는 ㅜㅜ)

 

그래서 이번 글에서는 k8s 공식 문서를 보고 온프레미스 환경에서 클러스터를 구축해보겠습니다. 클러스터 구축에 초점을 맞춰서 k8s 와 k8s 내 오브젝트들에 대한 설명을 생략하겠습니다.

 

또한 마스터 노드와 워커 노드에서 수행할 행위가 다르므로 각 부분마다 표시하겠습니다. 

그리고 반드시 진행 순서는 지켜주셔야 합니다.

 

만약 설치 하시다가 잘못된 느낌이 든다면 kubeadm reset 명령어를 통해 리셋해주시고 다시 진행하시기 바랍니다.

 

우선 미리 준비되어야 할 환경은 아래와 같습니다.

 

  • ubuntu 20.4 버전의 가상 머신 2대

마스터 노드 역할의 가상머신 (master)

 

워커 노드 역할의 가상머신 (node-1)

메모리는 4096MB, CPU는 2코어 입니다. 쿠버네티스 최소 권상사양이 2048MG, CPU 2코어 이기 때문에 만약 이보다 작은 리소스를 가상머신에 할당하게 될 경우 클러스터를 동작시킬 수 없습니다.

 

또한 각각의 가상머신들은 통신이 되야 하기 때문에 네트워크는 아래와 같이 구성하였습니다.

 

 

가상머신 또한 공유기에서 IP를 할당받기 위해서 브릿지를 사용하였습니다. NAT 같은 경우 호스트 OS를 거쳐서 통신이 되지만, 브릿지를 사용하게 되면 가상 머신 자체로 IP를 할당받기 때문에 호스트 OS를 거칠 필요가 없습니다.

 

가상 머신 네트워크 종류에 대해 자세히 알고 싶으시면 아래 링크로 가시면 됩니다.

 

[네트워크] 눈으로 확인해보는 Vmware Host-Only, Nat, Bridge 차이

가상머신(Vmware) 네트워크 방식 3가지 Host-only(Vmnet1), Nat(Vmnet8), Bridge(Vmnet0)가 어떤 차이가 있는지 간단히 살펴본 후, ping으로 각각의 연결 상태를 실제로 확인해보려 한다. Host-only (Vmnet1) 연결..

liveyourit.tistory.com

 

2대의 가상머신이 준비가 되었다면, 서로간에 통신이 되지는 확인하시기 바랍니다.

 

저 같은 경우 각각 아래의 IP를 갖게 됩니다. ifconfig를 통해서 자신의 ip를 알 수 있습니다.

  • master : 10.150.90.69
  • node-1 : 10.150.90.68
$ ifconfig
# 자신의 private ip를 확인합니다

$ ping 10.150.90.68
# TO node-1 FROM master

 

통신이 만약 잘된다면 쿠버네티스 구축을 위한 준비는 완료됩니다. 그럼 본격적으로 공식문서에 나와있는 순서에 맞게 클러스터를 구축해보겠습니다.

 

* 만약 서로 통신이 안된다면 각 가상머신의 라우팅 테이블을 확인해보시기 바랍니다.

 


공식문서 살펴보기

 

공식문서에 들어가보면 가장 처음으로 위와 같은 안내를 받을 수 있습니다. Before you begin에 명시된 조건을 모두 충족해야만 쿠버네티스 클러스터를 구축할 수 있습니다.

 

눈여겨 볼것은 크게 2가지입니다.

  1. 메모리는 2GB, 2CPU가 최소 사양입니다. 
  2. swap을 반드시 꺼야합니다.

 

첫번째 같은 경우 가상 머신을 구축할 때 해결이 되고, swap을 disabled 하겠습니다. 

 


swap disabled 해주기 (마스터 노드와 워커 노드 둘 다)

 

$ sudo swapoff -a  
# 이 명령어는 가상 머신 리부트할때 다시 초기화가 되므로 영구적으로 swap을 끄려면
# 아래 명령어 또한 하셔야 합니다.

$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 위 명령어는 지금 당장 swap을 꺼야해서 하는 명령어이고,
# 아래 명령어는 나중에 reboot 했을 때 위해서 실행하는 명령어입니다.

 

자세한 사항은 아래 링크를 확인해보시기 바랍니다.

 

How do I disable swap?

I have some sensitive data in RAM that I prefer not to be on disk. How do I disable swap? I have more than enough RAM. If RAM consumption gets too high I have no problems with processes being term...

askubuntu.com

 


도커 설치 해주기 (마스터 노드와 워커 노드 둘 다)

 

$ apt update && apt upgrade -y
$ apt install -y docker.io

$ docker version 
#도커 버전 확인

위 이미지와 같이 나온다면 정상적으로 설치 된 것입니다.

 


kubeadm, kubelet and kubectl 설치하기 (마스터 노드와 워커 노드 둘 다)

 

공식 문서에 나와있는 대로 진행해줍니다.

 

간단히 설명드리자면

  • kubeadm : 클러스터를 구축하기 위한 부트스트랩입니다. kubeadm 말고도 쿠버네티스 클러스터를 구축할 수 있는 부트스트랩은 다양합니다
  • kubelet : 노드에서 컨테이너 런타임을 수행합니다.
  • kubectl : 쿠버네티스 클러스터와 대화하기 위한 cli 프로그램입니다.

1. Update the apt package index and install packages needed to use the Kubernetes apt repository:

$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl

2. Download the Google Cloud public signing key:

$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

3. Add the Kubernetes apt repository:

$ 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

 

4. Update apt package index, install kubelet, kubeadm and kubectl, and pin their version:

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

 

5. Version check (이건 제가 추가한 부분입니다)

$ kubeadm version

 

이렇게 kubectl, kubeadm, kubelet를 설치해주었습니다.

 


k8s와 docker cgroup 맞쳐주기(마스터 노드와 워커노드 둘다)

 

cgroups(control groups의 약자)는 프로세스들의 자원의 사용(CPU, 메모리, 디스크 입출력, 네트워크 등)을 제한하고 격리시키는 리눅스 커널 기능입니다.

 

쿠버네티스 v1.22부터는 도커와 cgroup이 다르기 때문에 이를 서로 맞쳐주어야 합니다. 따라서 docker의 cgroup을 cgroupfs에서 systemd로 바꿉니다.

 

 

[Docker] Kubernetes 보안 (Cgroup)

Cgroup 드라이버 cgroups(control groups의 약자)는 프로세스들의 자원의 사용(CPU, 메모리, 디스크 입출력, 네트워크 등)을 제한하고 격리시키는 리눅스 커널 기능입니다. [root@ciserver ~]# ls -la /sys/fs..

waspro.tistory.com

 

먼저 Docker Cgroup을 확인해줍니다

$ docker info

cgroupfs로 되어있는 걸 확인할 수 있습니다.

 

daemon.json 파일을 수정해줍니다. (아마 이 파일은 없으실 겁니다)

$ vi /etc/docker/daemon.json

vi 에디터로 실행 후 아래 코드를 넣어줍니다.

{
	"exec-opts": ["native.cgroupdriver=systemd"]
}

 

docker service 재기동해줍니다.

$ systemctl daemon-reload
$ systemctl restart docker

 

다시 Docker cgroup 확인을 합니다.

$ docker info | grep -i cgroup

 


kubeadm으로 클러스터 생성하기(마스터 노드만)


Creating a cluster with kubeadm 공식문서로 이동하여 마저 진행하겠습니다. 

 

드디어 설치한 kubeadm을 실행합니다.

$ kubeadm init

 

swap disable, RAM 2GB, CPU 2 cores, Update Docker cgroup 을 해주셨다면 문제 없이 실행이 잘됩니다.

 

잘 설치 되었다면 위와 같이 나옵니다. 가장 아래에 kubeadm join ~ 으로 되어있는 거 꼭 메모해 두시기 바랍니다. 워커노드에서 마스터 노드로 join 할때 필요합니다. 

 

그리고 터미널에 명시되어 있는 명령어를 차례대로 실행해줍니다.

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

 

잘 설치되었는지 확인하기 위해 아래와 같은 명령어를 실행시켜줍니다.

$ docker ps

파드들이 아주 잘 실행되고 있습니다.

 

마스터 노드도 잘 생성 되었는지 한번 확인해보겠습니다.

$ kubectl get nodes

구축은 된거 같은데 STATUS가 NotReady입니다. 아래 명령어를 실행해서 왜 그런지 확인해봅니다.

 

$ kubectl describe nodes

로그들은 살펴보면 위와 같이 NetworkReady=false라고 나옵니다. Cluster Network를 구축해주지 않아서 그런겁니다. 그럼 CN을 구축해보겠습니다.

 


Cluster Networking 구축하기(마스터 노드만)

 

You must deploy a Container Network Interface (CNI) based Pod network add-on so that your Pods can communicate with each other. Cluster DNS (CoreDNS) will not start up before a network is installed.

 

이제야 NetworkReady=false 였던 이유를 알 수 있습니다. 파드들의 소통을 가능케 해주는 CoreDNS가 시작 되지 않아서 였습니다. 

 

CoreDNS 파드 2개의 STATUS가 Pending인 걸 확인할 수 있습니다. 그러면 CNI를 배포해주어 CoreDNS의 STATUS를 Running으로 바꿔주겠습니다.

 

문제

마스터 노드의 STATUS가 NotReady임.

 

원인

CNI(컨테이너 네트워크 인터페이스) 기반 포드 네트워크 기능을 추가해주지 않음.

그로 인해 CoreDNS 파드의 STATUS가 Pending임.

 

해결

CoreDNS 파드의 STATUS를 Running으로 바꿔줘야함.

그러려면 CNI(컨테이너 네트워크 인터페이스) 기반 포드 네트워크 기능을 추가해줘야함.

 


CNI 기반 포드 네트워크 기능 추가(마스터 노드만)

 

 

Cluster Networking

Networking is a central part of Kubernetes, but it can be challenging to understand exactly how it is expected to work. There are 4 distinct networking problems to address: Highly-coupled container-to-container communications: this is solved by Pods and lo

kubernetes.io

 

링크 걸어둔 공식문서를 확인해보면 CNI를 제공해주는 업체들이 상당히 많습니다.

 

퍼블릭 클라우드 3대장도 당연히 있고요.

칼리코 또한 있습니다. 하지만 저는 이들 말고 weaveworks에서 제공해주는 CNI 기능을 추가하겠습니다. 이유는 간단합니다. 온프레미스 환경이니깐 퍼블릭 클라우드 껀 굳이 사용할 필요 없고, 칼리코는 잘모릅니다 ㅜㅜ

 

 

Integrating Kubernetes via the Addon

The following topics are discussed: Installation Before installing Weave Net, you should make sure the following ports are not blocked by your firewall: TCP 6783 and UDP 6783/6784. For more details, see the FAQ. Weave Net can be installed onto your CNI-ena

www.weave.works

 

아래 명령어를 마스터 노드에서 실행해줍니다. weaveworks에서 제공해주는 yaml을 설치해줍니다.

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

 

아래 명령어를 통해 잘 설치되었는지 확인해봅니다.

$ kubectl get pods -n kube-system

coredns의 STATUS가 Running으로 바뀌었고, weave-net 파드도 추가된걸 확인할 수 있습니다. 

 


마스터 노드의 상태 확인하기(마스터 노드만)

 

 

이제 마스터 노드의 STATUS가 Ready가 된 것을 볼 수 있습니다. 

 

이렇게 쿠버네티스 클러스터의 대장인 마스터 노드를 kubeadm을 이용하여 설치하였습니다.

 


마스터 노드에 워커 노드 추가해주기(워커 노드만)

 

이제 마스터 노드는 설치했으니 워커 노드 또한 쿠버네티스 클러스터에 추가해주겠습니다. kubeadm init 했을 때 kubeadm join ~ 적어두시라고 했는데 기억 나시나요?

 

워커 노드로 사용할 가상 머신을 이동한 후 명령어 입력만 해주시면 됩니다. 

 

kubeadm join 10.150.90.69:6443 --token aksljd.alksjdklasjdklajskld \
        --discovery-token-ca-cert-hash sha256:askljdaklsjdlkajslkdhasulfghalkjla

 

이때 반드시 워커 노드의 가상 머신과 마스터 노드의 가상 머신과 통신이 되어야 합니다.

 

 

이미지처럼 터미널에 문구가 나오면 제대로 설치 된 것입니다.

 

만약 에러가 난다면 아래 링크를 참고해주세요

 

[K8S]unable to fetch the kubeadm-config ConfigMap: failed to get config map: UnauthorizedTo see the stack trace of this error ex

만약 kubeadm을 통해 master에 node join을 시도할 경우 아래와 같이 오류가 난다면 ubuntu@node:~$ sudo kubeadm join 192.168.241.92:6443 --token 4rlhh1.4dehcs172qy9enyj --discovery-token-ca-cert-hash sh..

kingofbackend.tistory.com

 


워커 노드가 잘 설치되었는지 확인하기(마스터 노드에서만)

 

$ kubectl get nodes

워커 노드(node-1)의 STATUS가 Ready 되기까지는 5분정도 걸립니다.

 

이렇게 워커 노드도 잘 구축되었습니다.

 


쿠버네티스 클러스터가 잘 구축되었는지 확인하기(마스터 노드와 워커 노드에서)

 

간단한 nginx.yaml 파일을 만들어서 테스트 해보겠습니다.

 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

 

위 코드를 복사 한 후 vi 에디터를 통해 작성해줍니다. 그리고 배포해줍니다.

$ vi ~/nginx.yaml
$ kubectl apply -f ~/nginx.yaml

모든 파드가 정상적으로 작동합니다.

 

그러면 워커 노드에서 서비스로 통신을 보내 보겠습니다. 

 

아주 잘됩니다!!

 

이렇게 온프레미스 환경에서 kubeadm으로 쿠버네티스 클러스터를 구축해보았습니다.

 

하시다가 안되는게 있으시면 언제든지 질문해주세요 :)

 

 

 

[AWS + K8S] EKS로 k8s 클러스터 생성 후 ALB로 배포하기

이번 글을 진행하려면 먼저 선행되어야 할 작업이 있습니다. 또한 aws, k8s에 대한 기초 지식이 없으면 어려울 수 있습니다. -k8s 1.19버전 -aws cli 설치 후 aws에 액세스 하기 -eksctl 설치 -아래와 같은 v

kingofbackend.tistory.com

 

댓글
댓글쓰기 폼
공지사항
Total
248,427
Today
802
Yesterday
1,065
링크
«   2022/10   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함