로컬에서 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 가 시작되는 것을 확인할 수 있습니다.
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 가 설치된 파드에 접근할 수 있습니다.