kubernetes는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장가능한 오픈소스 플랫폼이다.
다수의 서버가 있고 이 서버들에서 docker를 사용하게 되면 어떤 서버에 컨테이너를 생성하는 것이 맞을까에 대한 고민을 해야 하는데, 이를 쉽게해주는 orchestration tool이 k8s이다.
kubernetes cluster를 구축하는 방법은 3가지가 있다
이 튜토리얼에서는 로컬에서 사용하기 쉬운 minikube를 사용한다.
brew를 통해 minukube를 설치하고
$ brew install minikube
docker desktop을 설치한다음 docker driver를 사용한다.
$ minikube start --driver=docker
그 다음 아래 command를 통해서 k8s cluster의 profile을 확인한다.
$ minikube profile list
k8s CLI tool인 kubectl를 설치
$ brew install kubectl
터미널 기반 UI tool k9s 설치
$ brew install k9s
이제 환경설정은 끝났으니 PHP와 MySQL로 구성된 wordpress를 배포해보는 실습을 진행해보자.
아래와 같이 docker-compose.yml파일을 생성하고
version: "3"
services:
wordpress:
image: wordpress:5.9.1-php8.1-apache
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
ports:
- "30000:80"
mysql:
image: mariadb:10.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: password
$ brew install docker-compose
$ docker-compose up
을 실행하면 port와 env var가 설정된 wordpress container, mysql container가 실행된다.
chrome에서 localhost:30000
에 접속하면 아래와 같은 화면이 나온다.
docker-compose는 localhost
에 여러개의 docker container를 실행하는 tool이다.
이제 docker container를 localhost
가 아닌 kubernetes cluster에서 실행해보자.
docker-compose.yml의 내용을 k8s spec으로 정의하면
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mariadb:10.7
name: mysql
env:
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:5.9.1-php8.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: password
ports:
- containerPort: 80
name: wordpress
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: wordpress
tier: frontend
가 된다. 원래 실습에서 wordpress service의 type은 NodePort였으나 macos-docker driver에서는 connection이 안되는 문제가 있어서 LoadBalancer로 변경한다.
이를 minikube cluster에 apply 해보면 wordpress와 mysql에 대한 deployment와 service가 생성된다.
$ kubectl apply -f wordpress-k8s.yaml
deployment.apps/wordpress-mysql created
service/wordpress-mysql created
deployment.apps/wordpress created
service/wordpress created
tunnel을 열어줌으로써 external-ip를 통해 connection을 진행되게끔 한다.
(tunnel을 종료하면 service도 종료된다.)
$ minikube tunnel
아래와 같이 cluster에 떠있는 모든 것들을 확인하고
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/wordpress-74757b6ff-z4wxl 1/1 Running 0 61m
pod/wordpress-mysql-5447bfc5b-8xm4r 1/1 Running 0 61m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 62m
service/wordpress LoadBalancer 10.101.145.16 127.0.0.1 80:30430/TCP 61m
service/wordpress-mysql ClusterIP 10.107.75.32 <none> 3306/TCP 61m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/1 1 1 61m
deployment.apps/wordpress-mysql 1/1 1 1 61m
NAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-74757b6ff 1 1 1 61m
replicaset.apps/wordpress-mysql-5447bfc5b 1 1 1 61m
wordpress service의 external ip인 127.0.0.1과 port인 80을 통해
127.0.0.1:80에 접속하면 docker compose와 동일한 화면을 얻게된다.
$ kubectl delete -f wordpress-k8s.yaml
을 통해 cluster의 실행중인 것들읆 제거하고
$ minikube stop
$ minikube delete
를 통해 minikube도 지움으로써 할당한 모든 resource를 회수한다.