티스토리 뷰

<출처> 

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


- On-Prem.
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



- On-Prem.
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/064 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                 
 |    `-._`-._        _.-'_.-'    |           http://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                 
 |    `-._`-._        _.-'_.-'    |                                 
  `-._    `-._`-.__.-'_.-'    _.-'                                  
      `-._    `-.__.-'    _.-'                                      
          `-._        _.-'                                          
              `-.__.-'                                              
 
[112 Aug 08:12:00.853 # Server started, Redis version 2.8.19
[112 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.
[112 Aug 08:12:00.855 * The server is now ready to accept connections on port 6379
cs



- On-Prem.
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/064 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                 
 |    `-._`-._        _.-'_.-'    |           http://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                 
 |    `-._`-._        _.-'_.-'    |                                 
  `-._    `-._`-.__.-'_.-'    _.-'                                  
      `-._    `-.__.-'    _.-'                                      
          `-._        _.-'                                          
              `-.__.-'                                              
 
[125 Aug 05:56:50.537 # Server started, Redis version 2.8.19
[125 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.
[125 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


- On-Prem.
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


- On-Prem.
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


- On-Prem.
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

- On-Prem.
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/064 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



- On-Prem.
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/064 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



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함