(MLOps-3) kubernetes 정리 - 1

dddwsd·2022년 5월 9일
0

Kubernetes

kubernetes는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장가능한 오픈소스 플랫폼이다.
다수의 서버가 있고 이 서버들에서 docker를 사용하게 되면 어떤 서버에 컨테이너를 생성하는 것이 맞을까에 대한 고민을 해야 하는데, 이를 쉽게해주는 orchestration tool이 k8s이다.

Install kubernetes

kubernetes cluster를 구축하는 방법은 3가지가 있다

  • k3s - docker 대신 containered와 같은 가벼운 대체제 사용, etcd 의존성 없애고 sqlite를 기본값으로 사용
  • minikube - 단일 노드 k8s cluster
  • kubeadm - k8s의 모든 기능을 사용하고 노드 구성까지 활용하고 싶을 때

이 튜토리얼에서는 로컬에서 사용하기 쉬운 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

Wordpress service

이제 환경설정은 끝났으니 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를 회수한다.

refer

profile
Github - https://github.com/dddwsd

0개의 댓글