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 간 관계를 이해하는 데 도움이 된다.
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 |