본문 바로가기
Docker-k8s

NCP Server(ubuntu)를 이용한 Docker, kubernetes 설치(k8s cluster 구축)

by 간식주인 2022. 8. 29.

최근에 레거시 환경에서 MSA(Micro Service Architecture)로 전환하고자하는 분들이 많이 늘어난 것 같습니다.

하지만 CSP에서 PaaS 형식으로 제공해주는 Kubernetes Service(ex) NKS)는 비용이 부담되어 사용하기 어렵다는 분들도 더러 계셨습니다.

그렇기에 이번 글에서는 직접 서버에 Docker와 kubernetes를 설치하여 k8s cluster 구축 하는 방법에 대해 알아보도록 하겠습니다.

 

요건

 - Ubuntu 20.04 Server에 Docker 및 Kubernetes를 설치하여 k8s cluster를 구축

 

환경

  • 1 Master Node server(ubuntu 20.04 , 2cpu 4GB RAM) +  Public IP
  • 1 Worker Node server(ubuntu 20.04 , 2cpu 4GB RAM) +  Public IP

Process

  1. NCP Server 구축
  2. Docker 설치
  3. Kubernetes 설치
  4. Control Plane(Master Node) 구성 및 Worker Node 설정
  5. sample manifest file을 이용한 웹 애플리케이션 구축 및 접속

주의 사항

- 설치하려는 Kubernetes 버전에 따라 추가 명령어를 입력해야 하므로 버전을 잘 확인하고 OS(운영체제)에 따라 명령어가 달라질 수 있음을 숙지합니다.

- k8s cluster 내부 pod에 접속 시 nodeport를 사용해야 하므로 서버에 공인 아이피를 할당해야 합니다.

- NCP Console에서 Server > ACG를 통해 Control Plane(Master Node)와 Worker Node 간 통신을 허용해주어야 합니다.(테스트 시 편의상 1-65535 포트를 오픈하는 것이 좋습니다.)

Control Plane(Master Node)와 Worker Node 간 통신을 허용

 

==================================================================================

1. NCP Server 구축

NCP Console에서 수동으로 VPC, Subnet, Server, ACG를 생성하거나 Terraform을 이용하여 서버를 생성합니다.

*2대의 서버를 생성해야 하므로 아래 글을 참조합니다.

 

Terraform을 이용하여 NCP 서버 배포 2(서버 다중 배포)

[Terraform을 이용하여 NCP 서버 배포] 에 이어지는 글입니다. Terraform을 이용하여 NCP 서버 배포 엔지니어라면 특정 CSP의 서버를 통해 여러가지 테스트를 진행하는 경우가 있습니다. 오늘은 NCP에서

enginnersnack.tistory.com

 

Terraform을 이용하여 Control plane(Master Node) Server 1대, Worker Node Server 1대를 생성하였습니다.

필요에 따라 Worker Node 수를 더 늘리셔도 무방합니다.

2. Docker 설치

[master,worker node 공통]

apt package 업데이트를 진행한 후 필요한 패키지를 설치합니다.

sudo apt-get update
sudo apt-get -y install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

*NCP Ubuntu 20.04의 경우 필요 패키지가 모두 설치되어 있습니다.

 

Docker gpg key를 저장할 폴더를 생성한 후 gpg key를 다운로드 받습니다.

 sudo mkdir -p /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 

docker 설치를 위한 Repository를 등록합니다.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

다시 한 번 apt package 업데이트를 진행한 후 도커를 설치합니다.

 sudo apt-get update
 sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

 

도커가 정상적으로 설치되었는지 확인해봅니다.

docker --version
docker ps

 

enable 설정을 통해 서버가 재시작되어도 서비스가 다시 시작될 수 있도록 설정 합니다.

systemctl enable docker

 

 

3. Kubernetes 설치

[master,worker node 공통]

설치에 앞서 swap 메모리 사용을 영구적으로 중지시킵니다.

swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

 

노드간 통신을 위해 iptable 설정을 진행합니다.

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

 

kubernetes 설치에 필요한 패키지를 설치합니다.

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

 

kubernetes설치를 위한 gpg key를 등록하고 Repository를 등록합니다.

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

 

Kubernetes 설치를 진행합니다.(이번에는 1.21.10 버전으로 설치를 진행하였습니다.)

sudo apt-get update
sudo apt-get install -y kubelet=1.21.10-00 kubeadm=1.21.10-00 kubectl=1.21.10-00
sudo apt-mark hold kubelet kubeadm kubectl

systemctl start kubelet
systemctl enable kubelet

 

 

*만약 Kubernetes 1.22버전 이상으로 설치할 경우 systemd와 cgroup을 맞춰주어야 합니다.(아래 명령어를 추가로 입력합니다.)

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

 

 

4. Control Plane(Master Node) 구성 및 Worker Node 설정

[Control Plane]

Control Plane(Master Node)에서 Kubeadm init을 진행합니다.

kubeadm init

 

kubectl 명령어를 사용하기 위해 폴더를 생성한 후 파일에 대한 권한을 부여합니다.

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

 

kubeadm init 완료 시 나오는 join 명령어 문구를 복사합니다. 이 명령어는 Worker Node가 쿠버네티스 클러스터의 노드로 join 될 수 있도록 하는 명령어 입니다.(혹시나 유실에 대비하여 파일에 기록하면 좋습니다.)

cat > token.txt
kubeadm join 10.0.0.7:6443 --token pqlkge.0euplo7rcjd3ffyg \
        --discovery-token-ca-cert-hash sha256:f9e832285cfe357d873fafb48c9caa98f1cf8f1edadb3e227faad265ad89b72a
(컨트롤+d)

 

pod간 통신을 위해 네트워크 폴리시에 대한 애드온을 설치합니다.

이번 글에서는 위브넷이라는 애드온을 설치해보겠습니다.

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

*만약 설치가 진행되지 않는다면 weave net 홈페이지에서 설치 명령어를 참고합니다.
https://www.weave.works/docs/net/latest/kubernetes/kube-addon/

 

 

[Worker Node]

Worker Node에서 join 명령어를 이용하여 쿠버네티스 클러스터에 노드를 조인시킵니다.

kubeadm join 10.0.0.7:6443 --token pqlkge.0euplo7rcjd3ffyg \
         --discovery-token-ca-cert-hash sha256:f9e832285cfe357d873fafb48c9caa98f1cf8f1edadb3e227faad265ad89b72a

 

[Control Plane]

쿠버네티스 클러스터 구축이 완료되었으면 명령어를 통해 노드 상태를 확인합니다.

kubectl get nodes

 

5. sample manifest file을 이용한 웹 애플리케이션 구축 및 접속

구축한 쿠버네티스 클러스터가 잘 동작하는지 확인하기 위해 샘플 웹 애플리케이션을 올려서 접속 테스트를 진행합니다.

 

먼저 2개의 매니페스트 파일(yaml)을 작성합니다.

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deploy-1
spec:
  replicas: 2
  selector:
    matchLabels:
      type: nginx
      version: v1
  template:
    metadata:
      labels:
        type: nginx
        version: v1
    spec:
      containers:
      - name: nginx-01
        image: nginx:latest
        ports:
        - containerPort: 80

 

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  selector:
    type: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30050
  type: NodePort

 

작성한 파일을 쿠버네티스 클러스터에 배포합니다.

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

 

쿠버네티스 리소스 조회 명령어를 통해 리소스가 잘 배포 되었는지 확인합니다.

kubectl get all -o wide

 

service.yaml에서 노드포트를 30050번으로 지정하였으므로, 실제 웹 애플리케이션에 접속하기 위해서는 본인pc아이피:30050으로 인바운드가 허용되어 있어야 합니다.

 

NCP Console에서 ACG로 이동한 다음 worker node가 속한 ACG에서 rule을 추가합니다.

 

이후 worker node(서버)의 공인 아이피를 확인하여 웹 애플리케이션 접속을 진행합니다.

워커노드공인아이피:30050

nginx

 

 

[여담]

이번 글을 통해 쿠버네티스 클러스터 구축에 필요한 명령어의 역할에 대해 이해하고 추후 구축 시 도움이 되었으면 좋겠습니다. :)