쿠버네티스(k8s) 스터디3 - Docker Desktop에서 쿠버네티스 사용하기

4 minute read


클라우드 3대장의 Free Tier는 크레딧, 기간, 지원 서비스에 한계가 있다.

지원 서비스가 종료되면, 다시 새로운 계정으로 가입하는 꼼수를 쓰거나 유료로 서비스를 이용해야만 한다.

하지만, 최근 Docker가 쿠버네티스를 공식적으로 프로그램 내부에 품으면서, 로컬 PC에서 Docker만 돌아간다면 쿠버네티스를 테스트 해볼 수 있는 환경이 마련되었다.

1. Docker Desktop 설치하기

먼저, Docker Desktop을 설치해야 한다.

필자는 Windows 11 환경으로, 간단히 설치 파일을 다운로드 받아 기본 설정으로 설치 완료하기만 하면 된다.

2. Docker Desktop - 쿠버네티스 환경 설정

Docker Desktop을 실행 후, 설정에서 아래와 같이 설정하기

Kubernetes > Enable Kubernetes

Docker Desktop Settings

3. 쿠버네티스 동작 확인

아래와 같이 좌측 하단에 Kubernetes가 잘 동작하는 것을 확인할 수 있다.

How to check Kubernetes in Docker Desktop

(Option) GCP에서 Docker Desktop 쿠버네티스로 전환하기

쿠버네티스 클러스터가 여러개라면, Docker desktop으로 전환해줘야 한다.

PS C:\Users\Ho> kubectl config get-contexts
CURRENT   NAME                                                     CLUSTER                                                  AUTHINFO                                                 NAMESPACE
          docker-desktop                                           docker-desktop                                           docker-desktop
          gke_sonorous-summer-421512_us-central1-a_cluster-1       gke_sonorous-summer-421512_us-central1-a_cluster-1       gke_sonorous-summer-421512_us-central1-a_cluster-1
          gke_sonorous-summer-421512_us-central1-a_cluster-istio   gke_sonorous-summer-421512_us-central1-a_cluster-istio   gke_sonorous-summer-421512_us-central1-a_cluster-istio
*         gke_sonorous-summer-421512_us-central1-c_cluster-helm    gke_sonorous-summer-421512_us-central1-c_cluster-helm    gke_sonorous-summer-421512_us-central1-c_cluster-helm
PS C:\Users\Ho> kubectl config use-context docker-desktop
Switched to context "docker-desktop".
PS C:\Users\Ho> kubectl config current-context
docker-desktop
PS C:\Users\Ho> kubectl cluster-info
Kubernetes control plane is running at https://kubernetes.docker.internal:6443
CoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
PS C:\Users\Ho>

4. 쿠버네티스에 샘플 프로젝트들 배포해보기

본인이 제작한 샘플 프로젝트들을 배포해보자.

만약, 샘플 프로젝트가 없다면 제가 Github에 공유한 프로젝트를 이용해도 됩니다.

https://github.com/moon1z10/Kubernetes-learning-course

5. 쿠버네티스 Dashboard 설치하기

공식 홈페이지를 참고해서 설치하자.

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

Helm 설치하기

쿠버네티스 Dashboard의 설치 가이드가 Helm을 이용하므로, 만약 Helm이 설치되어 있지 않다면 Helm을 먼저 설치하자.

https://helm.sh/docs/intro/install/

PS C:\Users\Ho> helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
"kubernetes-dashboard" already exists with the same configuration, skipping
PS C:\Users\Ho> helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
Release "kubernetes-dashboard" has been upgraded. Happy Helming!
NAME: kubernetes-dashboard
LAST DEPLOYED: Mon May 13 17:59:44 2024
NAMESPACE: kubernetes-dashboard
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
*************************************************************************************************
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
*************************************************************************************************

Congratulations! You have just installed Kubernetes Dashboard in your cluster.

To access Dashboard run:
  kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443

NOTE: In case port-forward command does not work, make sure that kong service name is correct.
      Check the services in Kubernetes Dashboard namespace using:
        kubectl -n kubernetes-dashboard get svc

Dashboard will be available at:
  https://localhost:8443
PS C:\Users\Ho> kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443

kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443

Docker Desktop에서는 위 명령어를 통해서 포트포워딩을 해줘야 정상적으로 접근이 가능하다.

이후, https://localhost:8443로 접속해 보면, Bearer Token을 요구한다.

즉, 사용자를 만들고 token을 생성해야 접속이 된다는 말.

6. 사용자 및 token 생성하기

PS C:\Users\Ho> kubectl -n kubernetes-dashboard create token dashboard-admin
error: failed to create token: serviceaccounts "dashboard-admin" not found
PS C:\Users\Ho> kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
serviceaccount/dashboard-admin created
PS C:\Users\Ho> kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
error: failed to create clusterrolebinding: clusterrolebindings.rbac.authorization.k8s.io "dashboard-admin" already exists
PS C:\Users\Ho> kubectl get secrets -n kubernetes-dashboard
NAME                                         TYPE                 DATA   AGE
kubernetes-dashboard-csrf                    Opaque               1      9m1s
sh.helm.release.v1.kubernetes-dashboard.v1   helm.sh/release.v1   1      9m1s
sh.helm.release.v1.kubernetes-dashboard.v2   helm.sh/release.v1   1      5m20s
sh.helm.release.v1.kubernetes-dashboard.v3   helm.sh/release.v1   1      98s
PS C:\Users\Ho> kubectl apply -f .\dashboard-admin-sa-token.yaml -n kubernetes-dashboard
secret/dashboard-admin-token created
PS C:\Users\Ho> kubectl describe secret dashboard-admin-token -n kubernetes-dashboard

dashboard-admin-sa-token.yaml 파일

apiVersion: v1
kind: Secret
metadata:
  name: dashboard-admin-token
  annotations:
    kubernetes.io/service-account.name: "dashboard-admin"
type: kubernetes.io/service-account-token

사용자 생성이 완료되었다면, token값을 복사해서 로그인 한다.

아래와 같이 화면을 볼수 있다면 성공!

Dashboard

7. Ingress

Ingress Controller 설치하기

기본적으로 GCP는 Ingress가 설치되어 있기 때문에, yaml파일을 적용만 시켜주면 되었던 걸로 기억한다.

하지만, Docker Desktop에서는 Ingress를 사용하기 위해서는 먼저 Ingress Controller를 설정해줘야지 이용이 가능하다.

https://kubernetes.github.io/ingress-nginx/deploy/#firewall-configuration

공식 사이트에서 설치 가이드를 보고 설치하자. (필자는 helm 명령어를 사용했다.)

PS C:\Users\Ho> helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
Release "ingress-nginx" does not exist. Installing it now.
NAME: ingress-nginx
LAST DEPLOYED: Mon May 13 19:19:11 2024
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the load balancer IP to be available.
You can watch the status by running 'kubectl get service --namespace ingress-nginx ingress-nginx-controller --output wide --watch'

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls
PS C:\Users\Ho> kubectl get service --namespace ingress-nginx ingress-nginx-controller --output wide --watch
NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
ingress-nginx-controller   LoadBalancer   10.108.85.13   <pending>     80:32002/TCP,443:30635/TCP   21s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx

참고로 EXTERNAL-IP<pending>상태라면, 아래 포트포워딩을 통해 바로 테스트 해볼수 있다.

만약 아래와 같이 localhost로 잘 나온다면, 포트 포워딩은 필요 없다.

(Option) 쿠버네티스 포트포워딩 설정

PS C:\Users\Ho> kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.108.85.13    localhost     80:32002/TCP,443:30635/TCP   14h
ingress-nginx-controller-admission   ClusterIP      10.104.12.193   <none>        443/TCP                      14h

만약 ingress-nginx-controllerEXTERNAL-IP가 계속 <pending>상태라면, Ingress를 호출하기 위해서는 포트포워딩을 설정해줘야 한다.

PS C:\Users\Ho> kubectl port-forward --namespace ingress-nginx service/ingress-nginx-controller 32002:80
Forwarding from 127.0.0.1:32002 -> 80
Forwarding from [::1]:32002 -> 80
Handling connection for 32002
Handling connection for 32002

그리고 나서, “http://localhost:32002/currency-exchange/from/USD/to/KRW” 로 호출하면 정상적으로 호출이 되는 것을 확인할 수 있다.

(ingress의 80:<외부port> 외부port를 명시해줘야 한다.)

유의점

Docker Desktop의 쿠버네티스 엔진은 단일 노드 (Single Node)이므로, 여러 노드의 환경에서의 실행 및 테스트는 알맞지 않을 수 있으니 참고 하시기 바랍니다.

Leave a comment