IT - DevOps/Kubernetes

Mac 에서 Docker Desktop 으로 Kubernetes 사용하기

happygram 2022. 11. 22. 00:03

로컬에서 Kubernetes 사용하는 방법은 다양합니다. 여러 가지 방법 중 Docker Desktop 으로 Kubernetes 를 설치하고 간단한 Nginx 이미지를 갖는 파드를 설치해서 접속하는 과정을 설명하도록 하겠습니다.

Mac Specification

현재 제가 소유하고 있는 Mac 사양은 다음과 같습니다.

  • Apple M1 칩
  • 16GB 메모리
  • Mac OS Ventura 13.0.1

Docker Desktop 설치

다음의 사이트에서 Mac with Apple silicon 을 선택해서 설치할 수 있습니다. ㄷ또한 Intel 칩의 경우 Mac with Intel chip 을 선택해서 설치할 수 있습니다.

Kubernetes 활성화 하기

  • Docker Desktop 메뉴의 Preferences > Kubernetes 를 선택해서 활성화합니다.
  • 잠시 동안 기다리면 Kubernetes 가 시작되는 것을 확인할 수 있습니다.

Docker Desktop 메뉴
Kubernetes 활성화 및 시작

Kubernetes 설치 확인 하기

kubectl 설치

아래의 커맨드를 이용해서 kubectl 커맨드 최신 버전을 설치할 수 있습니다.

brew install kubectl

더 많은 설치 방법은 kubernetes 공식 사이트에서 참조할 수 있습니다.

kubernetes context 확인 및 선택

kubectl config get-contexts docker-desktop
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop   docker-desktop   docker-desktop

kubectl config use-context docker-desktop
Switched to context "docker-desktop".

Kubernetes 리소스 탐색

설치한 kubectl 커맨드를 이용해서 Kubernetes API Server 에 다양한 질의를 통해서 Kubernetes 리소스를 조회하거나 조작할 수 있습니다.

# 네임스페이스 조회
kubectl get namespace # or kubectl get ns
NAME              STATUS   AGE
default           Active   14m
kube-node-lease   Active   14m
kube-public       Active   14m
kube-system       Active   14m

# default 네임스페이스 파드 조회
kubectl get pod
No resources found in default namespace.

# kube-system 네임스페이스 파드 조회
kubectl -n kube-system get pod
NAME                                     READY   STATUS    RESTARTS   AGE
coredns-95db45d46-txgcq                  1/1     Running   0          14m
coredns-95db45d46-xhl5f                  1/1     Running   0          14m
etcd-docker-desktop                      1/1     Running   0          14m
kube-apiserver-docker-desktop            1/1     Running   0          14m
kube-controller-manager-docker-desktop   1/1     Running   0          14m
kube-proxy-cs4cv                         1/1     Running   0          14m
kube-scheduler-docker-desktop            1/1     Running   0          14m
storage-provisioner                      1/1     Running   0          14m
vpnkit-controller                        1/1     Running   0          14m

위에서 볼 수 있는 것 처럼 Kubernetes 에 필수로 설치되는 파드들은 kube-system 이라는 네임스페이스에 설치됩니다. 반면에 조금 전에 설치된 깨끗한 Kubernetes 의 default 네임스페이스에는 리소스가 존재하지 않습니다. 이 default 네임스페이스에 Nginx 파드를 설치하고 접속하는 과정을 진행 해보겠습니다.

Kubernetes 파드 생성

웹 서버로 많이 이용하는 Nginx 를 설치하도록 하겠습니다. 간단히 매니페스트를 작성하고 이를 반영하도록 합니다. 다음 매니페스트는 Kubernetes 의 공식 사이트에서 제공하는 정보를 사용합니다.

cat > nginx.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

Nginx 파드를 생성하는 Deployment 를 작성하고, 이를 서비스하는 Service 를 생성합니다. --dry-run 옵션을 통해서 syntax 체크를 하고, 실제 반영 시 어떤 리소스가 생성되는 지 알 수 있습니다. 그 후 --dry-run 옵션을 제거하고 실제로 반영을 진행합니다.

# dry-run
kubectl apply -f nginx.yaml --dry-run=server
service/my-nginx created (server dry run)
deployment.apps/my-nginx created (server dry run)

# apply
kubectl apply -f nginx.yaml

# get pod
kubectl get pod
NAME                            READY   STATUS              RESTARTS   AGE
my-nginx-77d5cb496b-dbnqp   0/1     ContainerCreating   0          6s
my-nginx-77d5cb496b-zk6xv   0/1     ContainerCreating   0          6s
...
kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-77d5cb496b-dbnqp   1/1     Running   0          70s
my-nginx-77d5cb496b-zk6xv   1/1     Running   0          70s

# get service
kubectl get service my-nginx
NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
my-nginx   ClusterIP   10.106.237.194   <none>        80/TCP    58s

port-forward 커맨드와 Service 를 통해서 파드에 접근합니다. 포트 매핑은 8080:80 == Local 포트:Service 포트입니다.

kubectl port-forward service/my-nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

http://127.0.0.1:8080 혹은 http://localhost:8080 에 접속하면 Service 를 통해서 Nginx 가 설치된 파드에 접근할 수 있습니다.