[k8s] 쿠버네티스 튜토리얼 따라해보기

minikube 설치 확인

$ minikube version

미니큐브가 설치되었으니 시작해보자

$ minikube start

설치되어있는 kubectl 버전을 확인

$ kubectl version

클러스터 마스터 정보 확인 및 노드 정보 확인

$ kubectl cluster-info

$ kubectl get nodes

디플로이먼트를 생성할 때, 애플리케이션에 대한 컨테이너 이미지와 구동시키고자 하는 복제 수를 지정해야한다.

kubectl run을 이용하여 디플로이먼트 생성하기 (도커허브의 이미지를 지정해주고, 포트 파라미터를 전달했다)

$ kubectl run kubernetes-bootcamp —image=gcr.io/google-samples/kubernetes-bootcamp:v1 —port=8080

생성된 디플로이먼트를 확인해보자 (1개의 싱글 인스턴스가 노드의 도커 컨테이너에서 돌고있다)

$ kubectl get deployments

프록시를 만듬 (프록시를 통해 앱을 노출시킬 수 있음)

$ kubectl proxy

Pod이름을 가져오기

$ export POD_NAME=$(kubectl get pods -o go-template –template ‘{{range .items}}{{.metadata.name}}{{“\n”}}{{end}}’)

$ echo Name of the Pod: $POD_NAME

$Pod이름으로 애플리케이션의 API에 접근해보기

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

pods정보 가져오기

$ kubectl get pods

ip, port를 포함한 파드의 상세 정보를 가져오기

$ kubectl describe pods

pod STDOUT 로그 확인해보기

$ kubectl logs $POD_NAME

exec커맨드를 통해 파드안에 커맨드를 날릴 수 있다.

$ kubectl exec $POD_NAME env

pod컨테이너에 bash세션 시작하기

$ kubectl exec -ti $POD_NAME bash

정말 안에 있는지 확인하기 위해 server.js파일 보고,, 로컬호스트에 curl도 날려보자

$ cat server.js

$ curl localhost:8080

$ exit

NodePort 파라미터로 주고 expose해서 외부로 새로운 서비스를 노출하기(30000-32767 사이에서 자동생성)
$ kubectl expose deployment/kubernetes-bootcamp –type=”NodePort” –port 8080

service/kubernetes-bootcamp exposed

kubernetes-bootcamp 상세 속성을 보자

$ kubectl describe services/kubernetes-bootcamp

NODE_PORT 환경변수 설정

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}’)

$ echo NODE_PORT=$NODE_PORT

노출된 미니포트IP NODE_PORT 접근해보자

$ curl $(minikube ip):$NODE_PORT

kubernetes-bootcamp 이름으로 get pods

$ kubectl get pods -l run=kubernetes-bootcamp

kubernetes-bootcamp 이름으로 get services

$ kubectl get services -l run=kubernetes-bootcamp

POD_NAME 환경변수 생성

$ export POD_NAME=$(kubectl get pods -o go-template –template ‘{{range .items}}{{.metadata.name}}{{“\n”}}{{end}}’)

$ echo Name of the Pod: $POD_NAME

POD_NAME app=v1이라는 라벨을 붙여주자

$ kubectl label pod $POD_NAME app=v1

다시 정보를 출력해보면 Labels app=v1이 추가된걸 확인할 수 있다.

$ kubectl describe pods $POD_NAME

app=v1라벨이 달린 pods가져오기

$ kubectl get pods -l app=v1

run=kubernetes-bootcamp 라벨이 붙은 서비스를 삭제해보자

$ kubectl delete service -l run=kubernetes-bootcamp

잘 날라갔다.

$ kubectl get services

그래서 curl테스트도 실패한다.

$ curl $(minikube ip):$NODE_PORT

그래도 팟 내부에서 실행하도록 curl 테스트해보면 살아있는 걸 볼 수 있다.

$ kubectl exec -ti $POD_NAME curl localhost:8080

kubectl scale 이용하여 replicas 4개로 설정해보자

$ kubectl scale deployments/kubernetes-bootcamp –replicas=4

4개의 인스턴스가 있음을 확인할 수 있다.

$ kubectl get deployments

각각 풀어서 보기

$ kubectl get pods -o wide

엔드포인트 확인해본다

$ kubectl describe services/kubernetes-bootcamp

NODE_PORT 환경변수 설정

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}’)

$ echo NODE_PORT=$NODE_PORT

pod curl테스트를 날려보면 매번 다른 pod에 요청이 가는걸 확인할 수 있다. (로드밸런싱)

$ curl $(minikube ip):$NODE_PORT

스케일다운 처리하기

$ kubectl scale deployments/kubernetes-bootcamp –replicas=2

2개로 잘 줄었나?

$ kubectl get deployments

$ kubectl get pods -o wide

이미지를 새버전으로 업데이트해보자

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

Describe

$ kubectl describe services/kubernetes-bootcamp

Export NODE_PORT

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}’)

$ echo NODE_PORT=$NODE_PORT

curl날려보면 모두 v2 pods 요청이 감을 확인할 있다.

$ curl $(minikube ip):$NODE_PORT

rollout status하면,,, 이미지는 v2 바뀌었다.

$ kubectl rollout status deployments/kubernetes-bootcamp

$ kubectl get pods

$ kubectl describe pods

롤백해보기 (이미지를 v10으로 변경)

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

정보를 가져와보니 이미지가 v10으로 안바뀌어있음

$ kubectl get deployments

$ kubectl get pods

$ kubectl describe pods

rollout undo 롤백합시다.

$ kubectl rollout undo deployments/kubernetes-bootcamp

정상임을 재확인

$ kubectl get pods

$ kubectl describe pods

You may also like...

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.