[k8s 구축] 1. Minikube 환경 구축하기

Minikube는 단일 노드에서 쉽게 쿠버네티스를 테스트할 수 있도록 제공되는 솔루션이다.
단일 노드에서 동작하도록 만들어졌기에 스케일링이 불가능하나 그만큼 경량화되고 간편하다.
필자의 경우 클라우드 쿠버네티스로 서비스를 배포하기 전에 로컬에서 테스트하기 위해 minikube를 사용하였다.
이 글에서 사용된 환경은 2vCPU, 4GB RAM, 20GB의 VM(VMWare)이다.

설치방법은 단순하다.
공식 홈페이지를 따르면 되며, docker와 minikube, kubectl만 설치하면 되기에 1분도 걸리지 않는다.

1. 설치

먼저 본인 환경에 맞게 도커를 설치하자. [공식 홈페이지]

$ sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
$ sudo dnf install -y docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable --now docker
$ sudo usermod -aG docker <USER_NAME>  # <USER_NAME> 사용자가 사용할 수 있게 권한 부여
$ newgrp docker  # 그룹 정보 갱신

그 후 본인 환경에 맞게 바이너리를 내려받아 설치하자.

$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

마지막으로 kubectl을 설치하면 된다. [공식 홈페이지]

$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x kubectl
$ sudo mv kubectl /usr/local/bin/

이제 minikube를 실행시켜보자.
도커때문에 루트 권한으로 실행시킬 수 없으니 도커 권한이 부여된 계정으로 로그인해야 한다.
아래 커맨드를 실행하면 기본 이미지가 설치되며 minikube가 실행된다.

$ minikube start --driver=docker

2. 사용

웹서버를 배포하여 간단한 환경을 구축해본다,
먼저 다음의 파일을 저장한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  labels:
    app: web-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

그리고 실행하면 된다.
실행한 후 서비스가 정상적으로 등록되었는지 확인하자.

$ kubectl apply -f web-server.yaml
$ kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-service   NodePort    10.107.227.132   <none>        80:31961/TCP   1h

이제 minikube 호스트 OS에서 서비스에 접근해보자.
curl을 통해 nginx에 접근했을 때 아래와 같은 출력이 나오면 성공이다.
참고로 필자의 개방된 포트는 31961이다. (미지정시 30000~32767 사이의 포트가 무작위로 할당된다)

$ curl http://$(minikube ip):31961
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

하지만 minikube의 호스트 OS는 minikube에 접근할 수 있으나 외부에서는 아직 minikube에 접근할 수 없다.
minikube 호스트 OS와 minikube 간 포워딩이 없기 때문이다.
이를 해결하기 위한 두 가지 방법을 소개한다.

3-1. 외부 접근 (프록시)

첫 번째는 kubectl proxy를 사용하는 방법이다.
kubectl proxy는 k8s API 서버와 k8s 호스트 OS 간 프록시 서버를 두는 기능이다.
kubectl proxy –port=8080 –address=0.0.0.0와 같이 포트와 IP 주소를 지정하여 사용하면 된다.
포트와 IP 주소를 지정하지 않는 경우 프록시 서버가 127.0.0.1:8001를 사용하도록 설정된다.

지금은 호스트 OS가 아니라 외부에서 접속하려는 경우이기에 address로 0.0.0.0(모든 네트워크)를 지정해야 한다.
또한 kubectl proxy는 API 요청을 필터링하므로 이를 해제하여 API 요청이 정상적으로 전달되도록 한다.
임시방편이지만 이 방법이 가장 편리하다.

당연히 프록시 서버의 포트 방화벽은 해제해줘야 한다.
참고로 필자의 minikube 호스트 IP는 192.168.108.140이다.

kubectl proxy는 세션을 점유하기에 백그라운드에서 실행하는 걸 추천한다.

$ kubectl proxy --address=0.0.0.0 --disable-filter=true
$ curl http://192.168.108.140:8001/api/v1/namespaces/default/services/http:nginx-service:/proxy/

굳이 curl을 해볼 필요도 없이 웹브라우저에서도 정상적으로 동작한다.

3-2. 외부 접근 (포트포워딩)

포트포워딩을 이용하는 방법도 있다.
kubectl은 포트포워딩 기능을 제공하여 k8s 외부에서 k8s 서비스에 접근할 수 있게 한다.
마찬가지로 호스트 OS가 아니라 외부에서 접속하려는 경우이기에 address로 0.0.0.0(모든 네트워크)를 지정해야 한다.
그리고 nodeport가 아니라 서비스에 접근하는 것이기에 서비스 port인 80을 대상으로 해야 한다.

kubectl port-forward 또한 세션을 점유하기에 백그라운드에서 실행하는 걸 추천한다.

$ kubectl port-forward service/nginx-service --address 0.0.0.0 8001:80
$ curl http://192.168.108.140:8001/

굳이 curl을 해볼 필요도 없이 웹브라우저에서도 정상적으로 동작한다.

Series Navigation[k8s 구축] 2. Kubernetes 환경 구축하기 >>

댓글 남기기