2021-04-30 우분투 VM 생성, Minikube 설치하고 deployment, service 배포
나의 local 환경에서 VirtualBox 에 ubuntu 이미지로 VM을 생성하고,
해당 VM에 docker와 minikube(worker, master가 통합되어 제공되는 교육용 kubernetes) 를 설치한 후,
nginx web server를 돌리는 pod를 생성, 및 배포하도록
deployment
와 service
에 대한 yaml 파일을 작성해본다.
특히, 해당 nginx 웹 서버를 외부에서 접근 가능하도록 service의 NodePort
를 이용한다.
VirtualBox 에서 ubuntu18.04 version으로 VM을 생성하였음. 쉬우니까 이 과정은 생략한다.
다만, 주의할 것은 minikube 실습을 위한 VM이므로 가상 cpu 설정을 2개로 해두었다. (그래야만 kubernetes 구동이 가능)
vi /etc/hosts
하여 hostname 에 minikube
를 추가해준다.sudo apt-get update
로 한 번 업데이트 해줌.sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
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"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
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 --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로 나오는지 확인해보자.
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를 확인해보면,
이처럼 확인이 가능하다. 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를 확인하여 보면,
이처럼 확인이 가능하다. 이제 이 service의 NodePort(30172
)를 이용하여 나의 local에서도(외부에서도) web browser로 접속이 가능하다.
자, 그런데 또 하나의 불편한 점이 생겼다.
이제 이 nginx web-server에 브라우저로 접속했을 때 보이는 html 파일을 변경하고 싶은데,
이렇게 하려면 pod의 IP로 접속하여 /usr/share/nginx/html/index.html
파일을 수정해야 한다.
사실 별 어렵지 않은 일이지만 이를 간편하게 하기 위해 다음과 같이 실행해 보자.
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 파일로 렌더링 시킨다.
(web page 의 rendering은, 현재 생성된 2개의 POD 중 kubectl에 의해 자동으로 판단되어 자동으로 rendering 된다.)