본문 바로가기

개발

katacoda 따라 하기 - Launch Single Node Kubernetes Cluster

kubernetes를 공부하려고 하는데 katacoda에 직접 쳐볼 수 있고 시나리오대로 잘 나와있어서 

하나씩 해석 하고 적어가는 것이 제일 내 것으로 만들기 좋기에 정리해서 적는다.

 

Minikube는 local에서 쉽게 Kubernetes를 운영할 수 있게 해주는 도구입니다.

Minikube는 노트북의 VM에서 Kubernetes 클러스터의 싱글 노드 실행하므로 Kubernetes를 사용해 보거나 매일 테스트해보려는 것에 적합하다.

미니쿠에 대한 자세한 정보는

https://github.com/kubernetes/minikube

 

kubernetes/minikube

Run Kubernetes locally. Contribute to kubernetes/minikube development by creating an account on GitHub.

github.com

 

Step 1 - Start Minikube

Minikube를 설치 및 구성했다고 가정하고 진행한다.

minikube version을 실행하여 올바르게 설치되었는지 확인한다.

$ minikube version
minikube version: v1.8.1
commit: cbda04cf6bbe65e987ae52bb393c10099ab62014

minikube start --wait=false  명령어를 사용해서 클러스터를 시작한다. 

$ minikube start --wait=false
* minikube v1.8.1 on Ubuntu 18.04
* Using the none driver based on user configuration
* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ...
* OS release is Ubuntu 18.04.4 LTS
* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ...
  - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Launching Kubernetes ... 
* Enabling addons: default-storageclass, storage-provisioner
* Configuring local host environment ...
* Done! kubectl is now configured to use "minikube"

위면 [Launching Kubernetes] 라고 해서 terminal에서 실행 중인 Kubernetes 클러스터가 있다.

Minikube가 VM을 시작했고, 해당 VM에서 Kubernetes 클러스터가 실행되고 있다.

Step 2 - Cluster Info

클러스터는 kubectl를 사용하여 상호 작용할 수 있다.

(매우 중요) kubectl은 클러스터 위에서 실행되는 Kubernetes 및 애플리케이션을 관리하는 데

사용되는 주요 접근 방식이다.

cluster 및 상태에 대한 세부 정보는 kubectl cluster-info를 통해 검색할 수 있다.

$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.37:8443
KubeDNS is running at https://172.17.0.37:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


cluster를 사용하는 node를 보는 명령어는 다음과 같다.

$ kubectl get nodes
NAME       STATUS   ROLES    AGE     VERSION
minikube   Ready    master   3m31s   v1.17.3


노드가 NotReady 로 표시되어도 여전히 components를 시작하고 있다.

이 명령은 애플리케이션을 호스팅 하는 데 사용할 수 있는 모든 노드를 표시한다.

이제 노드가 하나뿐이고 노드 상태가 ready 상태(애플리케이션을 배포할 수 있음)를 확인할 수 있다.

Step 3 - Deploy Containers

실행 중인 Kubernetes 클러스터를 통해 컨테이너를 배포할 수 있다.

kubectl run 을 통해서 컨테이너를 클러스터에 배포할 수 있다. 

$ kubectl create deployment first-deployment --image=katacoda/docker-http-server
deployment.apps/first-deployment created

※ 알아두면 좋은 오브젝트 생성 방법

  • run: 컨테이너를 실행할 새로운 파드를 생성한다.
  • expose: 파드에 걸쳐 트래픽을 로드 밸런스하도록 새로운 서비스 오브젝트를 생성한다.
  • autoscale: 디플로이먼트와 같이, 하나의 컨트롤러에 대해 자동으로 수평적 스케일이 이루어 지도록 새로운 Autoscaler 오브젝트를 생성한다.

kubectl 툴은 오브젝트 타입에 의해 구동되는 생성 커맨드를 지원한다

  • create <오브젝트 타입> [<서브 타입>] <인스턴스명>

 다음은 NodePort 서브 타입을 통해 서비스를 생성하는 예제이다.

kubectl create service nodeport <사용자 서비스 명칭>

실행 중인 pod 상태를 명령어를 통해 알 수 있다. 

$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
first-deployment-666c48b44-s5x5t   1/1     Running   0          30s

일단 실행 중인 컨테이너는 요구 사항에 따라 다양한 네트워킹 옵션을 고를 수 있다.

  • ClusterIP: 서비스를 클러스터-내부 IP에 노출시킨다. 이 값을 선택하면 클러스터 내에서만 서비스에 도달할 수 있다. 이것은 ServiceTypes의 기본 값이다.
  • NodePort: 고정 포트 (NodePort)로 각 노드의 IP에 서비스를 노출시킨다. NodePort 서비스가 라우팅되는 ClusterIP 서비스가 자동으로 생성된다. <NodeIP>:<NodePort>를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속할 수 있다.
  • LoadBalancer: 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅 되는NodePort와 ClusterIP 서비스가 자동으로 생성된다.
  • ExternalName: 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠 (예:foo.bar.example.com)에 매핑한다. 어떤 종류의 프록시도 설정되어 있지 않다.

한 가지 가능한 솔루션은 컨테이너에 동적 포트를 제공하는 NodePort이다.

$ kubectl expose deployment first-deployment --port=80 --type=NodePort
service/first-deployment exposed

아래 명령은 할당된 포트를 찾아 HTTP 요청을 실행합니다.

$ export PORT=$(kubectl get svc first-deployment -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}')
$ echo "Accessing host01:$PORT"
Accessing host01:30617
$ curl host01:$PORT
<h1>This request was processed by host: first-deployment-666c48b44-s5x5t</h1>

그 결과 요청을 처리한 컨테이너가 생성됩니다.

Step 4 - Dashboard

Minikub를 사용해서 dashboard를 활성화할 수 있다. 

$ minikube addons enable dashboard
* The 'dashboard' addon is enabled

다음 YAML 정의를 배포하여 Kubernetes Dashboard를 사용할 수 있도록 합니다

$ kubectl apply -f /opt/kubernetes-dashboard.yaml
namespace/kubernetes-dashboard configured
service/kubernetes-dashboard-katacoda created

kubernetes-dashboard.yaml 

apiVersion: v1
kind: Namespace
metadata:
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/minikube-addons: dashboard
  name: kubernetes-dashboard
  selfLink: /api/v1/namespaces/kubernetes-dashboard
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard-katacoda
  namespace: kubernetes-dashboard
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
    nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort

Kubernetes 대시보드를 통해 애플리케이션 UI를 볼 수 있습니다. 이 deployment에서 대시보드는 port 30000에서 사용할 수 있도록 설정되었지만 시작하는 데 시간이 다소 걸릴 수 있습니다.

Dashboard 시작 진행 상황을 보려면 다음을 명령어를 사용하면 된다.

$ kubectl get pods -n kubernetes-dashboard -w
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7b64584c5c-rbbpr   1/1     Running   0          19m
kubernetes-dashboard-79d9cd965-bqt8p         1/1     Running   0          19m

 

처음보면 명령어도 많고 이게 무슨말인가 싶은데 지금 나도 같은 마음이다. 

전체적인 흐름이 어떻게 되는것인가 파악하고 하나씩 쳐보면서 이게 이거구나 느끼는게 제일 빠른것 같다. 

 

출처 : https://kubernetes.io/ko/docs/concepts/services-networking/service/