티스토리 뷰
13 Stateless Application - Example: Deploying PHP Guestbook application with Redis
zerobig-k8s 2018. 8. 27. 08:36<출처>
https://kubernetes.io/docs/tutorials/stateless-application/guestbook/
이 강좌는 K8S와 Docker 를 이용한 단순한, Multi-tier 웹 애플리케이션을 빌드하는 방법에 대해 소개한다. 이 예제는 다음 컴포넌트로 구성된다:
- 방명록 기입을 저장할 단일 인스턴스 Redis 마스터
- 읽기 기능을 제공해 줄 복제된 Redis(replicated Redis) 인스턴스들
- 다중 웹 프론트엔드 인스턴스들
Objectives
- Redis 마스터를 구동한다.
- Redis 슬레이브를 구동한다.
- 프론트엔드 방명록을 구동한다.
- 프론트엔드 서비스를 노출하고 View 한다.
- 정리한다.
이번 튜토리얼 역시 두 가지 버전으로 동시에 실습을 병행할 것이다. 첫번 째는 Minikube 이고 두번 째는 On-premises 로컬 클러스터 환경이다. 추후 구글 클라우드 엔진 상에서 동일 실습을 진행하고 추가 게시할 예정이다, 참고로 On-premises(이하 On-Prem.)의 실습은 자체 검토 과정을 거치면서, 8월 25일 2차로 재배포/재편집되었다.
Before you begin
K8S 클러스터가 필요하고 클러스터와 소통할 수 있도록 kubectl CLI 도구가 구성되어 있어야만 한다. 아직 클러스터가 준비 안되었다면 Minikube 를 이용하여 생성할 수 있다. 또는 다음 K8S 플레이그라운드 중 하나를 이용할 수 있다.
kubectl version 을 입력하여 버전을 확인해 본다.
Start up the Redis Master
방명록 애플리케이션은 데이터를 저장하기 위해 Redis 를 이용하게 된다. Redis 마스터 인스턴스에 쓰기를 수행하고, 읽기는 여러 개의 Redis 슬레이브를 통해 이루어진다.
Creating the Redis Master Deployment
아래 manifest 파일은 단일 복제본의 Redis 마스터 파드를 실행해 주는 디플로이먼트 컨트롤러를 기술하고 있다.
redis-master-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: redis-master labels: app: redis spec: selector: matchLabels: app: redis role: master tier: backend replicas: 1 template: metadata: labels: app: redis role: master tier: backend spec: containers: - name: master image: k8s.gcr.io/redis:e2e # or just image: redis resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379 | cs |
1. manifest 파일을 다운받은 디렉토리에서 터미널 윈도우를 띄운다:
2. 다음 명령을 수행해 Redis Master 디플로이먼트를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f redis-master-deployment.yaml deployment.apps/redis-master created | cs |
1 2 | [root@docker-registry k8s]# kubectl apply -f redis-master-deployment.yaml deployment.apps/redis-master created | cs |
3. Redis 마스터 파드가 잘 올라왔는지 파드의 리스트를 조회해 본다: 응답결과는 다음 형태가 될 것이다:
- Minikube
1 2 3 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-55db5f7567-7m4r7 1/1 Running 0 2m | cs |
1 2 3 | [root@docker-registry k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-55db5f7567-69fsp 1/1 Running 0 41s | cs |
4. 다음 명령을 수행하여 Redis 마스터 파드의 로그를 확인해 보자:
- Minikube
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl logs -f redis-master-55db5f7567-7m4r7 _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 2.8.19 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [1] 12 Aug 08:12:00.853 # Server started, Redis version 2.8.19 [1] 12 Aug 08:12:00.854 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. [1] 12 Aug 08:12:00.855 * The server is now ready to accept connections on port 6379 | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@docker-registry k8s]# kubectl logs -f redis-master-55db5f7567-69fsp _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 2.8.19 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [1] 25 Aug 05:56:50.537 # Server started, Redis version 2.8.19 [1] 25 Aug 05:56:50.538 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. [1] 25 Aug 05:56:50.538 * The server is now ready to accept connections on port 6379 | cs |
Note: POD-NAME 은 독자들의 파드명으로 바꿔야 한다.
Creating the Redis Master Service
방명록 애플리케이션은 데이터를 기록하기 위해 Redis 마스터와 커뮤니테이션 해야 한다. Redis 마스터 파드에 트래픽을 Proxy 해 주도록 서비스를 적용해야 한다. 서비스는 파드에게 접근하기 위한 정책을 정의해 준다.
redis-master-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | apiVersion: v1 kind: Service metadata: name: redis-master labels: app: redis role: master tier: backend spec: ports: - port: 6379 targetPort: 6379 selector: app: redis role: master tier: backend | cs |
1. 다음 명령을 수행해 Redis 마스터에 서비스를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f redis-master-service.yaml service/redis-master created | cs |
1 2 | [root@docker-registry k8s]# kubectl apply -f redis-master-service.yaml service/redis-master created | cs |
2. Redis 마스터 서비스가 잘 올라왔는지 파드의 리스트를 조회해 본다:
- Minikube
1 2 3 4 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d redis-master ClusterIP 10.100.75.203 <none> 6379/TCP 47s | cs |
1 2 3 4 | [root@docker-registry k8s]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 20d redis-master ClusterIP 10.43.48.254 <none> 6379/TCP 1m | cs |
Note: 이 manifest 파일은 이전에 정의했던 레이브과 매치된 레이블 셋들과 함께 redis-master라는 이름의 서비스를 생성하므로, 서비스는 Redis 마스터 파드에 네트워크 트래픽을 라우트 해준다.
Start up the Redis Slaves
비록 Redis 마스터가 단일 파드이긴 하지만, Redis 슬레이브 레플리카를 추가함으로써 고가용성의 트래픽 처리가 가능하도록 할 수 있다.
Creating the Redis Slave Deployment
디플로이먼트 스케일은 manifest 파일에 설정된 세트 정보를 토대로 이루어진다. 이 경우, 디플로이먼트 오브젝트는 2개의 레플리카 를 정의했다.
만약 어떠한 레플리카도 동작하지 않는 상태가 되면, 디플로이먼트는 여러분의 컨테이너 클러스터에 2개의 레플리카를 띄우려 할 것이다. 역으로 2개 이상의 레플리카가 동작 상태로 있다면 2개가 될 때가지 스케일 다운을 시도할 것이다.
redis-slave-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: redis-slave labels: app: redis spec: selector: matchLabels: app: redis role: slave tier: backend replicas: 2 template: metadata: labels: app: redis role: slave tier: backend spec: containers: - name: slave image: gcr.io/google_samples/gb-redisslave:v1 resources: requests: cpu: 100m memory: 100Mi env: - name: GET_HOSTS_FROM value: dns # Using `GET_HOSTS_FROM=dns` requires your cluster to # provide a dns service. As of Kubernetes 1.3, DNS is a built-in # service launched automatically. However, if the cluster you are using # does not have a built-in DNS service, you can instead # access an environment variable to find the master # service's host. To do so, comment out the 'value: dns' line above, and # uncomment the line below: # value: env ports: - containerPort: 6379 | cs |
1. 다음 명령을 수행해 Redis 슬레이브 디플로이먼트를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f redis-slave-deployment.yaml deployment.apps/redis-slave created | cs |
1 2 | [root@docker-registry k8s]# kubectl apply -f redis-slave-deployment.yaml deployment.apps/redis-slave created | cs |
2. Redis 슬레이브 파드가 잘 올라왔는지 파드의 리스트를 조회해 본다:
- Minikube
1 2 3 4 5 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-55db5f7567-7m4r7 1/1 Running 0 42m redis-slave-584c66c5b5-f8cmx 1/1 Running 0 57s redis-slave-584c66c5b5-k7mdr 1/1 Running 0 57s | cs |
1 2 3 4 5 | [root@docker-registry k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-55db5f7567-69fsp 1/1 Running 0 26m redis-slave-584c66c5b5-28n8g 1/1 Running 0 1m redis-slave-584c66c5b5-jdvdw 1/1 Running 0 1m | cs |
3. Redis 슬레이브 파드의 로그를 확인해 보자: (원문에는 이 과정이 없지만 우리는 1개씩만 확인해 보겠다. 파드 2개 모두 동일한 결과이어야 한다.)
- Minikube
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl log -f redis-slave-584c66c5b5-f8cmx log is DEPRECATED and will be removed in a future version. Use logs instead. _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 6 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 6:S 12 Aug 08:52:28.677 # Server started, Redis version 3.0.3 6:S 12 Aug 08:52:28.677 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 6:S 12 Aug 08:52:28.677 * The server is now ready to accept connections on port 6379 6:S 12 Aug 08:52:28.677 * Connecting to MASTER redis-master:6379 6:S 12 Aug 08:52:28.681 * MASTER <-> SLAVE sync started 6:S 12 Aug 08:52:28.682 * Non blocking connect for SYNC fired the event. 6:S 12 Aug 08:52:28.684 * Master replied to PING, replication can continue... 6:S 12 Aug 08:52:28.684 * Partial resynchronization not possible (no cached master) 6:S 12 Aug 08:52:28.685 * Full resync from master: 9d0a3b28add4b398904d342fd9f857eac6005086:1 6:S 12 Aug 08:52:28.741 * MASTER <-> SLAVE sync: receiving 18 bytes from master 6:S 12 Aug 08:52:28.741 * MASTER <-> SLAVE sync: Flushing old data 6:S 12 Aug 08:52:28.741 * MASTER <-> SLAVE sync: Loading DB in memory 6:S 12 Aug 08:52:28.741 * MASTER <-> SLAVE sync: Finished with success | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [root@docker-registry k8s]# kubectl logs -f redis-slave-584c66c5b5-28n8g _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 8 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 8:S 25 Aug 06:01:40.285 # Server started, Redis version 3.0.3 8:S 25 Aug 06:01:40.313 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 8:S 25 Aug 06:01:40.313 * The server is now ready to accept connections on port 6379 8:S 25 Aug 06:01:41.286 * Connecting to MASTER redis-master:6379 8:S 25 Aug 06:01:41.300 * MASTER <-> SLAVE sync started 8:S 25 Aug 06:01:41.301 * Non blocking connect for SYNC fired the event. 8:S 25 Aug 06:01:41.302 * Master replied to PING, replication can continue... 8:S 25 Aug 06:01:41.302 * Partial resynchronization not possible (no cached master) 8:S 25 Aug 06:01:41.302 * Full resync from master: cc856e912b65f5de5002b18b15cfb1a25ee5aed9:1 8:S 25 Aug 06:01:41.362 * MASTER <-> SLAVE sync: receiving 18 bytes from master 8:S 25 Aug 06:01:41.363 * MASTER <-> SLAVE sync: Flushing old data 8:S 25 Aug 06:01:41.363 * MASTER <-> SLAVE sync: Loading DB in memory 8:S 25 Aug 06:01:41.363 * MASTER <-> SLAVE sync: Finished with success | cs |
Creating the Redis Slave Service
방명록 어플리케이션은 데이터를 읽기 위해 Redis 슬레이브들과 커뮤니케이션 해야 한다. Redis 슬레이브들을 찾을 수 있도록 서비스를 구성해줘야 한다. 서비스 파드 셋을 대상으로 투명한 로드밸런싱을 제공해 준다.
redis-slave-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | apiVersion: v1 kind: Service metadata: name: redis-slave labels: app: redis role: slave tier: backend spec: ports: - port: 6379 selector: app: redis role: slave tier: backend | cs |
1. 다음 명령을 수행해 Redis 슬레이브에 서비스를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f redis-slave-service.yaml service/redis-slave created | cs |
- On-prem.
1 2 | [root@docker-registry k8s]# kubectl apply -f redis-slave-service.yaml service/redis-slave created | cs |
2. Redis 슬레이브 서비스가 잘 올라왔는지 파드의 리스트를 조회해 본다:
- Minikube
1 2 3 4 5 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d redis-master ClusterIP 10.100.75.203 <none> 6379/TCP 28m redis-slave ClusterIP 10.97.39.60 <none> 6379/TCP 51s | cs |
- On-prem.
1 2 3 4 5 | [root@docker-registry k8s]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 20d redis-master ClusterIP 10.43.48.254 <none> 6379/TCP 28m redis-slave ClusterIP 10.43.145.132 <none> 6379/TCP 54s | cs |
Set up and Expose the Guestbook Frontend
방명록 애플리케이션은 HTTP 요청들을 처리해주는 PHP 로 작성한 웹 프론트를 갖는다. 이 애플리케이션은 쓰기 요청에 대해 redis-master 에 접속하도록, 읽기 요청에 대해서는 redis-slave에 접속하도록 구성되었다.
Creating the Guestbook Frontend Deployment
frontend-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: frontend labels: app: guestbook spec: selector: matchLabels: app: guestbook tier: frontend replicas: 3 template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: gcr.io/google-samples/gb-frontend:v4 resources: requests: cpu: 100m memory: 100Mi env: - name: GET_HOSTS_FROM value: dns # Using `GET_HOSTS_FROM=dns` requires your cluster to # provide a dns service. As of Kubernetes 1.3, DNS is a built-in # service launched automatically. However, if the cluster you are using # does not have a built-in DNS service, you can instead # access an environment variable to find the master # service's host. To do so, comment out the 'value: dns' line above, and # uncomment the line below: # value: env ports: - containerPort: 80 | cs |
1. 다음 명령을 수행해 프론트엔드 디플로이먼트를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f frontend-deployment.yaml deployment.apps/frontend created | cs |
- On-prem.
1 2 | [root@docker-registry k8s]# kubectl apply -f frontend-deployment.yaml deployment.apps/frontend created | cs |
2. 3개의 프론트엔드 레플리카 파드가 잘 올라왔는지 파드의 리스트를 조회해 본다:
- Minikube
1 2 3 4 5 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get pods -l app=guestbook -l tier=frontend NAME READY STATUS RESTARTS AGE frontend-544676796b-dfhp7 1/1 Running 0 1m frontend-544676796b-h82cc 1/1 Running 0 1m frontend-544676796b-t88nn 1/1 Running 0 1m | cs |
- On-prem.
1 2 3 4 5 | [root@docker-registry k8s]# kubectl get pods -l app=guestbook -l tier=frontend NAME READY STATUS RESTARTS AGE frontend-5c548f4769-6gm66 1/1 Running 0 1m frontend-5c548f4769-lnxrq 1/1 Running 0 1m frontend-5c548f4769-r4bp8 1/1 Running 0 1m | cs |
Creating the Frontend Service
독자들이 적용한 redis-slave 와 redis-master Service 들은 오직 컨테이너 클러스터 내에서만 접근 가능한데, 서비스의 디폴트 타입이 ClusterIP 이기 때문이다. ClusterIP 는 파드 셋에 대해 하나의 IP로 서비스가 지정되도록 제공해준다. 이 IP 주소는 오직 클러스터 내에서만 접근가능 하다.
만약 방문자들이 방명록에 접근되길 원한다면, 프론트엔드 서비스가 외부에 보여지도록 구성해줘야만 하는데. 그러면 클라이언트가 컨테이너 클러스터 외부로부터 서비스를 요청할 수 있게 된다. Minikube 는 NodePort 를 통해서만 서비스를 노출할 수 있다.
Note: GCE 또는 GKE 와 같은 일부 클라우드 제공사업자들은, 외부 로드밸런서를 제공해 준다. 만약 클라우드 제공사업자가 로드밸런서를 지원하고 독자들이 이를 사용하려면, "type: NodePort" 를 삭제하거나 Disable 시키면 된다. 그리고 "type: LoadBalancer" 를 주석해제한다.
- Minikube
frontend-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | apiVersion: v1 kind: Service metadata: name: frontend labels: app: guestbook tier: frontend spec: # comment or delete the following line if you want to use a LoadBalancer type: NodePort # if your cluster supports it, uncomment the following to automatically create # an external load-balanced IP for the frontend service. # type: LoadBalancer ports: - port: 80 selector: app: guestbook tier: frontend | cs |
- On-prem.
frontend-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | apiVersion: v1 kind: Service metadata: name: frontend labels: app: guestbook tier: frontend spec: # comment or delete the following line if you want to use a LoadBalancer # type: NodePort # if your cluster supports it, uncomment the following to automatically create # an external load-balanced IP for the frontend service. type: LoadBalancer ports: - port: 80 selector: app: guestbook tier: frontend | cs |
1. 다음 명령을 수행해 프론트엔드에 서비스를 적용한다:
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl apply -f frontend-service.yaml service/frontend created | cs |
- On-prem.
1 2 | [root@docker-registry k8s]# kubectl apply -f frontend-service.yaml service/frontend created | cs |
2. 프론트엔드 서비스가 잘 올라왔는지 파드의 리스트를 조회해 본다:
- Minikube
1 2 3 4 5 6 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.104.124.9 <none> 8089:32708/TCP 43s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d redis-master ClusterIP 10.100.75.203 <none> 6379/TCP 1h redis-slave ClusterIP 10.97.39.60 <none> 6379/TCP 40m | cs |
- On-prem.
1 2 3 4 5 6 | [root@docker-registry k8s]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.43.87.93 124.136.171.122 80:32618/TCP 44s kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 20d redis-master ClusterIP 10.43.48.254 <none> 6379/TCP 24m redis-slave ClusterIP 10.43.145.132 <none> 6379/TCP 40m | cs |
Viewing the Frontend Service via NodePort
Minikube 또는 로컬 클러스터에 이 애플리케이션을 배포했다면 방명록을 전시해줄 IP 주소를 알아내야 한다.
1. 프론트엔드 서비스 용 IP 주소를 얻기 위해 다음 명령을 수행한다.
1 | root@zerobig-vm:/home/study/k8s/guestbook# minikube service frontend --url | cs |
그 응답은 다음과 같을 것이다.
1 | http://192.168.99.100:30805 | cs |
2. IP 주소를 복사해서 브라우저 창에 붙여넣게 하면 방명록을 확인 할 수 있다.
(사실 번거롭게 IP를 확인해서 붙여넣는 번거로운 절차 없이 다음 명령을 수행하면 브라우저가 스스로 방명록 창을 띄워준다.)
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# minikube service frontend Opening kubernetes service default/frontend in default browser... | cs |
Viewing the Frontend Service via LoadBalancer
여러분이 LoadBalancer 타입으로 프론트엔드 서비스를 배포했다면 방명록을 전시해줄 IP 주소를 알아내야 한다.
1. 프론트엔드 서비스 용 IP 주소를 얻기 위해 다음 명령을 수행한다.
1 2 3 | [root@docker-registry k8s]# kubectl get service frontend NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.43.87.93 124.136.171.122 80:32618/TCP 19m | cs |
2. 외부 IP 주소를 복사해서 브라우저 창에 붙여넣게 하면 방명록을 확인 할 수 있다.
Scale the Web Frontend
독자의 서버들은 디플로이먼트 컨트롤러를 사용하는 서비스로 정의 되었으므로 손쉽게 스케일 업 또는 다운을 할 수 있다.
1. 프론트엔드 파드의 숫자를 스케일 업하는 명령을 수행하고 결과를 확인해 보자.
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl scale deployment frontend --replicas=5 deployment.extensions/frontend scaled | cs |
- On-prem.
1 2 | [root@docker-registry k8s]# kubectl scale deployment frontend --replicas=5 deployment.extensions/frontend scaled | cs |
- Minikube
1 2 3 4 5 6 7 8 9 10 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get pods NAME READY STATUS RESTARTS AGE frontend-544676796b-blf48 1/1 Running 0 10s frontend-544676796b-dfhp7 1/1 Running 0 5h frontend-544676796b-h82cc 1/1 Running 0 5h frontend-544676796b-r7hc2 1/1 Running 0 10s frontend-544676796b-t88nn 1/1 Running 0 5h redis-master-55db5f7567-7m4r7 1/1 Running 0 6h redis-slave-584c66c5b5-f8cmx 1/1 Running 0 5h redis-slave-584c66c5b5-k7mdr 1/1 Running 0 5h | cs |
- On-prem.
1 2 3 4 5 6 7 8 9 10 | [root@docker-registry k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE frontend-5c548f4769-2pzlx 1/1 Running 0 21s frontend-5c548f4769-7t8fn 1/1 Running 0 54m frontend-5c548f4769-dpdcw 1/1 Running 0 21s frontend-5c548f4769-fvjkk 1/1 Running 0 54m frontend-5c548f4769-tkc6n 1/1 Running 0 54m redis-master-55db5f7567-gvnk5 1/1 Running 0 5h redis-slave-584c66c5b5-kv75h 1/1 Running 0 5h redis-slave-584c66c5b5-mr9sw 1/1 Running 0 5h | cs |
Cleaning up
디플로이먼트와 서비스 또한 동작 중인 모든 파드를 정리할 경우, 하나의 명령으로 여러 리소스들을 지울 수 있도록 레이블을 이용하자.
1. 모든 파드, 디플로이먼트와 서비스를 지우기 위해 다음 명령을 실행해 보자.
- Minikube
1 2 3 4 5 6 7 8 9 10 11 | root@zerobig-vm:/home/study/k8s/guestbook# root@zerobig-vm:/home/study/k8s/guestbook# kubectl delete deployment -l app=redis deployment.extensions "redis-master" deleted deployment.extensions "redis-slave" deleted root@zerobig-vm:/home/study/k8s/guestbook# kubectl delete service -l app=redis service "redis-master" deleted service "redis-slave" deleted root@zerobig-vm:/home/study/k8s/guestbook# kubectl delete deployment -l app=guestbook deployment.extensions "frontend" deleted root@zerobig-vm:/home/study/k8s/guestbook# kubectl delete service -l app=guestbook service "frontend" deleted | cs |
- On-prem.
1 2 3 4 5 6 7 8 9 10 | [root@docker-registry k8s]# kubectl delete deployment -l app=redis deployment.extensions "redis-master" deleted deployment.extensions "redis-slave" deleted [root@docker-registry k8s]# kubectl delete service -l app=redis service "redis-master" deleted service "redis-slave" deleted [root@docker-registry k8s]# kubectl delete deployment -l app=guestbook deployment.extensions "frontend" deleted [root@docker-registry k8s]# kubectl delete service -l app=guestbook service "frontend" deleted | cs |
2. 동작 중인 파드가 없는지 검증해 보자.
- Minikube
1 2 | root@zerobig-vm:/home/study/k8s/guestbook# kubectl get pods No resources found. | cs |
- On-prem.
1 2 | root@docker-registry k8s]# kubectl get pods No resources found. | cs |
What's next
Complete the Kubernetes Basics Interactive Tutorials
Use Kubernetes to create a blog using Persistent Volumes for MySQL and Wordpress
Read more about connecting applications
Read more about Managing Resources
'Kubernetes' 카테고리의 다른 글
14 Stateful Applications - StatefulSet Basics (0) | 2018.09.02 |
---|---|
11 Configuration - Configuring Redis using a ConfigMap (0) | 2018.08.27 |
12 Stateless Application - Exposing an External IP Address to Access an Application in a Cluster (0) | 2018.08.27 |
10 Kubernetes Basics - Performing a Rolling Update (0) | 2018.08.23 |
09 Kubernetes Basics - Running Multiple Instances of Your App (0) | 2018.08.23 |