Post

쿠버네티스 GKE

쿠버네티스

클러스터 생성

GKE 명령어

강의 명령어 전체 목록

  • Kubectl

  • Kubernates Controller (쿠버네티스 컨트롤러)

    kubectl

    kubectl version

  • Deploy

    kubectl create deployment hello-world-rest-api --image=in28min/hello-world-rest-api:0.0.1.RELEASE

  • EXPOSE (서비스 외부로 노출)

    kubectl expose deployment hello-world-rest-api --type=LoadBalancer --port=8080

쿠버네티스 엔진 > 서비스 및 수신(Service & Ingress) 로 가면 엔드포인트를 볼 수 있다.

무료 크레딧

여러분의 무료 크레딧을 챙기세요.

클라우드 환경에서는, 리소스를 사용하지 않을 때 삭제하는 것이 가장 좋은 습관입니다.

만약 매번 삭제하고 새로운 클러스터를 생성하는 것이 귀찮으시다면, 클러스터 사이즈를 0으로 감소시키시면 됩니다.

하루 단위로 수업을 모두 들으신 후 클러스터 노드 사이즈를 0으로 감소시키시면 됩니다.

1
2
3
gcloud container clusters resize --zone <name_of_zone> <name_of_your_cluster> --num-nodes=0

gcloud container clusters resize --zone asia-northeast1-a cluster-1 --num-nodes=0

다시 시작할 준비가 되셨다면 노드의 숫자를 증가시키세요:

1
gcloud container clusters resize --zone <name_of_zone> <name_of_your_cluster> --num-nodes=3

k8s 안에는 뭐가 일어나고 있을까?

kubectl get events

엄청 많은 이벤트가 보인다.

Pod

ReplicaSet

Deployment

Service

kubectl get pods

kubectl get replicaset

kubectl get deployment

kubectl get service

우리가 kubectl에게 디플로이먼트를 만들라는 명령을 실행하면, 쿠버네티스는 Deployment, ReplicaSet 그리고 Pod를 만듭니다

kubectl에게 디폴로이먼트를 노출하라고 한다면, 쿠버네티스는 Service를 만듭니다

1
2
3
4
5
6
7
8
9
10
11
12
13
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
hello-world-rest-api-5b78b5c566-cb8x8   1/1     Running   0          11m
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get replicasets
NAME                              DESIRED   CURRENT   READY   AGE
hello-world-rest-api-5b78b5c566   1         1         1       11m
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get deployment
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
hello-world-rest-api   1/1     1            1           11m
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get service
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
hello-world-rest-api   LoadBalancer   10.56.2.225   35.200.46.55   8080:32742/TCP   8m22s
kubernetes             ClusterIP      10.56.0.1     <none>         443/TCP          171m

ReplicaSet

kubectl get rs

kubectl get replicasets

kubectl get pods -o wide // 포드를 불러올때 세부 사항을 추가하거나 더 많은 정보 얻을 수 있음

리플리카셋은 특정 수의 포드들이 확실하게 한번에 실행되도록 합니다.

포드를 지워도 1분 뒤면 다시 url이 활성화 됩니다.

왜냐면 replicaset 이 항상 감시하고 있다가 포드가 0개가 되면 ‘허거덩 바로 새로운 포드를 만들어야겠어’ 하고 움직이기 때문입니다.

1
2
3
4
5
6
7
8
9
10
11
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get replicasets
NAME                              DESIRED   CURRENT   READY   AGE
hello-world-rest-api-5b78b5c566   1         1         1       19m
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get pods -o wide
NAME                                    READY   STATUS    RESTARTS   AGE   IP          NODE                                       NOMINATED NODE   READINESS GATES
hello-world-rest-api-5b78b5c566-cb8x8   1/1     Running   0          19m   10.52.0.3   gke-cluster-1-default-pool-d2489f88-6q5f   <none>           <none>
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl delete pods hello-world-rest-api-5b78b5c566-cb8x8
pod "hello-world-rest-api-5b78b5c566-cb8x8" deleted
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get pods -o wide
NAME                                    READY   STATUS    RESTARTS   AGE   IP          NODE                                       NOMINATED NODE   READINESS GATES
hello-world-rest-api-5b78b5c566-nhx55   1/1     Running   0          23s   10.52.1.3   gke-cluster-1-default-pool-d2489f88-gpwq   <none>           <none>
1
2
3
4
5
6
7
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl scale deployment hello-world-rest-api --replicas=3
deployment.apps/hello-world-rest-api scaled
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
hello-world-rest-api-5b78b5c566-dzpw5   1/1     Running   0          9s
hello-world-rest-api-5b78b5c566-nhx55   1/1     Running   0          3m35s
hello-world-rest-api-5b78b5c566-rzmkm   1/1     Running   0          9s
1
2
3
fogofseoul@cloudshell:~ (concrete-braid-407601)$ kubectl get replicaset
NAME                              DESIRED(기대값)   CURRENT   READY   AGE
hello-world-rest-api-5b78b5c566   3         3         3       25m

리플리카셋은 무얼 할까요?

현재 포드 수를 확인하고 만약 필요 수 보다 포드가 적으면, 자동으로 늘리는 일을 합니다.

쿠버네티스에서는 리플리카셋으로 어떤 작업을 하던지 전부 포드의 숫자를 유지하는 것과 관련있습니다.

포드는 컨테이너를 실행하는 곳 입니다. 포드는 컨테이너를 그룹화하고 리플리카셋은 특정 수의 포드가 항상 실행되게 합니다.

Deployment

이번엔 Deployment의 필요성에 대해 배워 볼 겁니다.

Deployment가 있어서 업데이트 시 제로 다운타임이 가능합니다.

  1. 업데이트하는 이미지가 정상인지 확인하고
  2. 순차적으로 기존버전의 컨테이너를 내리고, 새 버전의 컨테이너를 올립니다.

일반적으로 Deployment가 사용하는 전략을 롤링 업데이트라고 부릅니다.

1
2
3
4
5
6
kubectl set image deployment hello-world-rest-api hello-world-rest-api=in28min/hello-world-rest-api:0.0.2.RELEASE
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get pods -o wide
kubectl delete pod hello-world-rest-api-67c79fd44f-n6c7l
kubectl get pods -o wide
kubectl delete pod hello-world-rest-api-67c79fd44f-8bhdt

Service

쿠버네티스에서 포드는 버려지는 유닛입니다.

우리가 지운 포드 10.4.1.8은 이제 더 이상 존재하지 않습니다

포드들이 새로 생길 때 마다 새로운 IP 주소를 갖는다는 사실을 알 수 있습니다.

하지만 우리는 그리고 백그라운드에 있는 포드와 상관없이 단 하나의 URL이 작동하기를 원하실 겁니다.

이 URL 은 포드가 생기는 중에도, 지워지는 중에도, 그리고 새로운 포드가 생성되는 중에도 서비스는 계속해서 운영되고 있습니다.

이런 일이 어떻게 가능할까요?

바로 서비스라고 불리는 것 때문입니다 쿠버네티스에서 포드는 버려지는 유닛입니다.

포드가 고장날 수도 있고, 새로운 릴리즈 때 새로운 포드가 언제든지 생길 수도 있죠.

새로 생기는 포드가 여러개 일 수도 있고 오래된 포드가 완전히 사라질 수도 있습니다.

우리는 이런 불안정한 변화가 포드에서 일어나는 동안, 소비자들이 이 변화에 영향을 받지 않았으면 합니다. 앱의 유저들이 다른 URL을 사용하는 걸 원치 않죠.

이게 바로 서비스의 역할입니다.

서비스는 앱에 포드 안에서 운영되는 늘 작동 가능한 외부 인터페이스를 제공합니다.

기본적으로 서비스는 영구적인 IP 주소를 통해 트래픽을 수신할 수 있도록 해줍니다.

서비스는 우리가 초반에 deployment 를 노출했을때 생겼습니다.

kubectl expose deployment hello-world-rest-api --type=LoadBalancer --port=8080

위 명령어를 실행했을때 우리가 앱에 접속할때 사용하는 ip 주소로 서비스가 생성된 겁니다.

쿠버네티스 로드밸런서는 GKE, EKS, AKS 등 다양한 플랫폼들과 호환됩니다. 짱이당.

로드밸런서 서비스, Cluster IP 서비스 좀 더 알아보기

GKE 콘솔 UI 살펴보기

Actions

Autoscale Expose (Deployment 노출,포트 매핑) Rolling Update (업데이트할 이미지 버전 선택 후 업데이트 가능) Scale (인스턴스 수, 크기 조정)

여기서 할 수 있는걸 Yaml 파일과 커맨드 라인으로도 할 수 있다.

This post is licensed under CC BY 4.0 by the author.