K8S 기초 Tutorial

 

아래 포스트를 보기에 앞서 컨테이너에 대해서 어느 정도 이해한 상태로 보는 것이 좋습니다.

 

quickstart(create k8s cluster)

  • minikube 를 활용하여 기본적인 k8s cluster 를 구축합니다.
# k8s start
$ minikube start
# cluster version(client, server)
$ kubectl version
# cluster details(kubernetes master, kubeDNS)
$ kubectl cluster-info
# get nodes
$ kubectl get nodes

 

quickstart(deploy app)

  • 이미지를 활용하여 k8s cluster 에 배포.
  • 배포된 application 은 single instance 형태로 docker container 로 기동중
  • proxy 서비스 활용 후 k8s cluster 에 접속하여 pod name 을 출력하는 과정까지.
# deploy application
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
# get deployments(1 deployment 로 single app 으로 동작)
$ kubectl get deployments
# (terminal 2)  run proxy(host 와 k8s cluster 간 연결)
$ kubectl proxy
# k8s cluster version
$ curl http://localhost:8001/version
# get pod name
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

 

quickstart(explore your app)

  • k8s cluster 와 연결하는 proxy 서버를 생성
  • pod 와 연결되는 라우팅 정보를 얻어냄.
# (terminal 2) 
$ kubectl proxy
# (terminal 1) get pod name
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
# (terminal 1) get route to pod
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy
# (terminal 1) get logs about pod
$ kubectl logs $POD_NAME
# (terminal 1) executing command on the container
# (terminal 1) get environment variables on Pod
$ kubectl exec $POD_NAME env
# (terminal 1) exec bash session on pod
$ kubectl exec -ti $POD_NAME bash
...
# cat server.js
# exit
...
$ exit

 

quickstart(expose your app public)

service란 ? k8s 에 배포한 앱을 public 하게 오픈할 때 주로 사용되며, Pod 의 논리적 연산을 추상화한 개념.

각 Pod 는 Container 들을 묶은 그룹이고, 클러스터 내에서는 Private IP 가 존재하나,

단. Service 가 없다면 클러스터 외부에 IP 를 노출하지는 않는다.

 

Service 에서는 아래와 같은 정보를 넣어야 한다.

  • Cluster IP : cluster 의 내부 ip
  • NodePort : NAT 를 사용한 클러스터 내부 port
  • LoadBalacner : 외부 로드밸런서 생성
  • ExternalName : 외부로 노출되는 service name

아래 그림을 보면, Service 와 Node, Pod, Deployment 간 관계를 이해하는 데 도움이 된다.

cluster-diagram

Create a new service

# service 셍성 후 외부로 노출시키기
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
$ kubectl get services
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP   7m5s
kubernetes-bootcamp   NodePort    10.106.252.22   <none>        8080:32609/TCP   8s
# internal port : 8080, external port : 32609
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
# 외부에서 minikube 접근하기
$ curl $(minikube ip):$NODE_PORT

 

Using labels

 

  • 라벨 정보를 통해 pods 정보를 조회한다.
$ kubectl get pods -l run=kubernetes-bootcamp
$ kubectl get services -l run=kubernetes-bootcamp
# Get Pod Name
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
# new labeling on pod
$ kubectl label pod $POD_NAME app=v1
# get pod info
$ kubectl describe pods $POD_NAME
# get pod with new label
$ kubectl get pods -l app=v1

 

Deleting a service

  • 서비스를 제거한 후 외부에서 접근 가능한 지 확인(접근 안되는 것이 맞음)
$ kubectl delete service -l run=kubernetes-bootcamp
# curl 을 통해 minikube 내 기존 서비스에 접근한다.(당연히 접근이 안될것.)
$ curl $(minikube ip):$NODE_PORT
# console 에서 내부 IP Port 로는 접근 가능.
$ kubectl exec -ti $POD_NAME curl localhost:8080

 

quickstart(scale your app)

 

실제 운영 중 서비스를 확장하고자 할 경우에 아래와 같이 scale-out 방식으로 replica 를 늘려서 대비한다.

 

scaling application

# get deployment with READY(1/1)
$ kubectl get deployments
# scale deployment
$ kubectl scale deployment/kubernetes-bootcamp --replicas=4
# get deployment with READY(4/4)
$ kubectl get deployments
# get pods
$ kubectl get pods -o wide
# describe with kubernetes-bootcamp deployment
$ kubectl describe deployments/kubernetes-bootcamp

 

load balancing

# describe service
$ kubectl describe services/kubernetes-bootcamp
# get node port
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
# access k8s cluster through service
$ curl $(minikube ip):$NODE_PORT

 

scale down

$ kubectl scale deployment/kubernetes-bootcamp --replicas=2

 

quickstart(update your app)

 

기존 kubernetes-bootcamp v1 로 사용하던 앱을 v2 로 바꾸는 과정을 진행한다.

 

update the version of the app

# updating image
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
# get pods(with terminating, running and so on)
$ kubectl get pods

 

verify an update

$ kubectl describe services/kubernetes-bootcamp
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
# check version
$ curl $(minikube ip):$NODE_PORT
# another verifying method about update
$ kubectl rollout status deployments/kubernetes-bootcamp

 

rollback an update

# update image with v10
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
# 아래 명령어 호출 후 뭔가 잘못된 게 생긴다(원하는 Pods 개수가 생기지 않음)
$ kubectl get deployments
$ kubectl get pods
$ kubectl describe pods
# 잘못된 경우에 대비하여 이전으로 돌아간다.
$ kubectl rollout undo deployments/kubernetes-bootcamp
# 이전으로 제대로 돌아갔는지 확인.
$ kubectl get pods
$ kubectl describe pods

 

여기까지 k8s cluster 에 Application 을 배포하고, 확장하고, image 교체도 하고, rollout 까지 하는 튜토리얼을 진행하였습니다.

 

 

해당 포스트는 minikube 활용 k8s tutorial 을 1회독 진행하면서 작성하였습니다.

 

 

상세 내용은 k8s 공식 Docs 에서 같이 튜토리얼 진행하시면 되겠습니다.

 

Referenced From

'개발 > k8s' 카테고리의 다른 글

ingress 호출 시 403 에러가 나는 경우 체크할 사항 (1)  (0) 2023.06.01
쿠버네티스(k8s) 컴포넌트  (0) 2020.12.17
쿠버네티스(k8s) 개요  (0) 2020.12.17

+ Recent posts