Minikube 실습

Doveloper·2022년 6월 2일
0

Kubernetes

목록 보기
8/9
post-thumbnail

2021-04-30 우분투 VM 생성, Minikube 설치하고 deployment, service 배포


Summary

나의 local 환경에서 VirtualBox 에 ubuntu 이미지로 VM을 생성하고,
해당 VM에 docker와 minikube(worker, master가 통합되어 제공되는 교육용 kubernetes) 를 설치한 후,
nginx web server를 돌리는 pod를 생성, 및 배포하도록
deploymentservice 에 대한 yaml 파일을 작성해본다.

특히, 해당 nginx 웹 서버를 외부에서 접근 가능하도록 service의 NodePort 를 이용한다.

VM생성

VirtualBox 에서 ubuntu18.04 version으로 VM을 생성하였음. 쉬우니까 이 과정은 생략한다.

다만, 주의할 것은 minikube 실습을 위한 VM이므로 가상 cpu 설정을 2개로 해두었다. (그래야만 kubernetes 구동이 가능)

기본 설정 변경

  • vi /etc/hosts 하여 hostname 에 minikube를 추가해준다.
  • sudo apt-get update로 한 번 업데이트 해줌.

Docker 설치

  • Install requirements
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
  • Add Docker repository
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
  • Install Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Minikube 설치

  • Download Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
sudo apt install conntrack
  • Minikube start
minikube start --vm-driver=none
mv .minikube/cache/linux/v1.20.2/kubectl /usr/local/bin/
sudo chown -R $USER $HOME/.kube $HOME/.minikube

이제 환경 setting은 모두 완료. kubectl get nodes 명령어를 쳐서 Ready로 나오는지 확인해보자.

Nginx webserver 배포

HOME directory 밑에서, nginx.yaml이라는 이름으로 deployment yaml파일을 하나 작성해본다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: webserver
  replicas: 1
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

이렇게 작성된 yaml파일을 기반으로, deployment를 생성해보자.
kubectl apply -f nginx.yaml

이제 pod를 확인해보면,

image

이처럼 확인이 가능하다. curl 명령어로 nginx 가 잘 작동하는 것도 확인하였다.

그런데 문제는, 이처럼 pod의 IP주소 기반은 외부에서 접속이 불가능하다는 것이다. (나의 local web browser에서만 해도 접속을 하려해도 불가능하다.)

따라서 다음과 같이 webserver.yaml이라는 이름으로 service yaml파일을 하나 작성한다.

apiVersion: v1
kind: Service
metadata:
  name: webserver
  labels:
    app: webserver
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: webserver

이제 마찬가지로 kubectl apply -f webserver.yaml로 서비스를 생성시켜주고,
kubectl get svc로 서비스의 NodePort를 확인하여 보면,

image

이처럼 확인이 가능하다. 이제 이 service의 NodePort(30172)를 이용하여 나의 local에서도(외부에서도) web browser로 접속이 가능하다.

image

자, 그런데 또 하나의 불편한 점이 생겼다.
이제 이 nginx web-server에 브라우저로 접속했을 때 보이는 html 파일을 변경하고 싶은데,

이렇게 하려면 pod의 IP로 접속하여 /usr/share/nginx/html/index.html 파일을 수정해야 한다.

사실 별 어렵지 않은 일이지만 이를 간편하게 하기 위해 다음과 같이 실행해 보자.

Nginx-with-Volume Mount

Nginx를 배포할 때, 해당 volume을 mount(여기서는 ubuntu18.04 VM) 에 마운트 할 수 있게끔 deployment yaml파일을 다시 작성해보자.

HOME directory 밑에 다음과 같이 nginx-volume-deployment.yaml을 작성한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-volume-deployment
spec:
  selector:
    matchLabels:
      app: webserver
  replicas: 1
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
      volumes:
      - name: shared-data
        hostPath:
          path: /shared
          type: Directory

여기서 보이듯이 spec - container 에서 volumeMounts 라는 옵션을 이용하여 volume 을 마운트 시키고 있다.

그러니까 배포되는 해당 pod의 /usr/share/nginx/html 디렉토리가 /shared 라는 위치에 마운트 되는 것이다. 따라서 이러한 deployment 파일을
kubectl apply -f nginx-volume-deployment.yaml 로 생성시키고, 원활히 동작되기 위해서는

minikube (VM) 에 /shared 라는 directory 가 존재해야만 한다.

  • mkdir /shared 로 마운트 될 디렉토리 생성
  • kubectl apply -f nginx-volume-deployment.yaml 로 deployment 생성.
  • kubectl get pods -o wide 로 포드 배포 확인

이제 /shared에서 index.html 파일을 작성하면,
Service의 NodePort를 이용하여 웹 브라우져로 접속 시에 index.html 파일로 렌더링 시킨다.

image

image

(web page 의 rendering은, 현재 생성된 2개의 POD 중 kubectl에 의해 자동으로 판단되어 자동으로 rendering 된다.)

profile
Hungry Developer

0개의 댓글