Google Kubernetes Engine Guestbook tutorial with Google Cloud Platform

New photo by WuNan Lin / Google Photos

始終藉口 K8S 難學,今天看到 tutorial  真心覺得技術門檻不高
所以就順手記錄起來了
This tutorial is provided by Google Cloud Platform.
You can reach more detailed information from the Google Cloud Platform.


1. Create Kubernetes Cluster

New photo by WuNan Lin / Google Photos

紅圈處資訊請更新 cluster name, zone.
2. Prepare example application source by Github
從 Github 取得 Source file

heavenruler@cloudshell:~ (project-name)$ git clone https://github.com/kubernetes/examples
Cloning into 'examples'...
remote: Enumerating objects: 33, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 11289 (delta 16), reused 30 (delta 16), pack-reused 11256
Receiving objects: 100% (11289/11289), 16.91 MiB | 7.28 MiB/s, done.
Resolving deltas: 100% (5981/5981), done.

檢查一下內容物

heavenruler@cloudshell:~/examples/guestbook (project-name)$ ls -al
total 56
drwxr-xr-x 6 heavenruler heavenruler 4096 Sep 29 10:40 .
drwxr-xr-x 8 heavenruler heavenruler 4096 Sep 29 10:40 ..
drwxr-xr-x 2 heavenruler heavenruler 4096 Sep 29 10:40 all-in-one
-rw-r--r-- 1 heavenruler heavenruler  900 Sep 29 10:40 frontend-deployment.yaml
-rw-r--r-- 1 heavenruler heavenruler  438 Sep 29 10:40 frontend-service.yaml
drwxr-xr-x 2 heavenruler heavenruler 4096 Sep 29 10:40 legacy
-rw-r--r-- 1 heavenruler heavenruler  367 Sep 29 10:40 MAINTENANCE.md
drwxr-xr-x 2 heavenruler heavenruler 4096 Sep 29 10:40 php-redis
-rw-r--r-- 1 heavenruler heavenruler  239 Sep 29 10:40 README.md
-rw-r--r-- 1 heavenruler heavenruler  607 Sep 29 10:40 redis-master-deployment.yaml
-rw-r--r-- 1 heavenruler heavenruler  233 Sep 29 10:40 redis-master-service.yaml
drwxr-xr-x 2 heavenruler heavenruler 4096 Sep 29 10:40 redis-slave
-rw-r--r-- 1 heavenruler heavenruler  941 Sep 29 10:40 redis-slave-deployment.yaml
-rw-r--r-- 1 heavenruler heavenruler  209 Sep 29 10:40 redis-slave-service.yaml

3. Setup Redis master docker instance
3-1. Setup gcloud & kubectl credential

heavenruler@cloudshell:~ (project-name)$ gcloud container clusters get-credentials test-cluster --zone asia-east1
Fetching cluster endpoint and auth data.
kubeconfig entry generated for test-cluster.

3-2. review redis master yaml config

heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat redis redis-master-deployment.yaml
apiVersion: apps/v1 #  for k8s versions before 1.9.0 use apps/v1beta2  and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
  name: redis-master
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

3-3 deploy redis master docker instance

heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f redis-master-deployment.yaml
deployment.apps "redis-master" created
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get podsNAME                            READY     STATUS    RESTARTS   AGEredis-master-585798d8ff-5bd4r   1/1       Running   0          37s

4. Create redis-master service

heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat redis-master-service.yaml
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
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f redis-master-service.yaml
service "redis-master" created
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get services
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.31.240.1     <none>        443/TCP    32m
redis-master   ClusterIP   10.31.245.206   <none>        6379/TCP   15s

5. Setup Redis slave docker instance

heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat redis-slave-deployment.yaml
apiVersion: apps/v1 #  for k8s versions before 1.9.0 use apps/v1beta2  and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
  name: redis-slave
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
          # If your cluster config does not include a dns service, then to
          # instead access an environment variable to find the master
          # service's host, comment out the 'value: dns' line above, and
          # uncomment the line below:
          # value: env
        ports:
        - containerPort: 6379
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f redis-slave-deployment.yaml
deployment.apps "redis-slave" created
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get pods
NAME                            READY     STATUS              RESTARTS   AGE
redis-master-585798d8ff-5bd4r   1/1       Running             0          5m
redis-slave-865486c9df-4hszl    0/1       ContainerCreating   0          7s
redis-slave-865486c9df-n8zcp    0/1       ContainerCreating   0          7s
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
redis-master-585798d8ff-5bd4r   1/1       Running   0          6m
redis-slave-865486c9df-4hszl    1/1       Running   0          33s
redis-slave-865486c9df-n8zcp    1/1       Running   0          33s

6. Create redis-slave service

heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat redis-slave-service.yaml
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
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f redis-slave-service.yaml
service "redis-slave" created
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get service
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.31.240.1     <none>        443/TCP    37m
redis-master   ClusterIP   10.31.245.206   <none>        6379/TCP   5m
redis-slave    ClusterIP   10.31.242.68    <none>        6379/TCP   12s

7. Setup Guestbook Front Docker Instance

heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat frontend-deployment.yaml
apiVersion: apps/v1 #  for k8s versions before 1.9.0 use apps/v1beta2  and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
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
          # If your cluster config does not include a dns service, then to
          # instead access environment variables to find service host
          # info, comment out the 'value: dns' line above, and uncomment the
          # line below:
          # value: env
        ports:
        - containerPort: 80
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f frontend-deployment.yaml
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
frontend-67f65745c-pjsbg        1/1       Running   0          36s
frontend-67f65745c-qqrs9        1/1       Running   0          36s
frontend-67f65745c-w5dp8        1/1       Running   0          36s
redis-master-585798d8ff-5bd4r   1/1       Running   0          9m
redis-slave-865486c9df-4hszl    1/1       Running   0          4m
redis-slave-865486c9df-n8zcp    1/1       Running   0          4m

因為要將服務公開在 Public Internet 上,所以要透過 LoadBalancer 取得 Public IP,所以要調整一些設定

heavenruler@cloudshell:~/examples/guestbook (project-name)$ sed -i -e 's/NodePort/LoadBalancer/g' frontend-service.yaml
heavenruler@cloudshell:~/examples/guestbook (project-name)$ cat frontend-service.yaml | grep LoadBalancer
  # comment or delete the following line if you want to use a LoadBalancer
  type: LoadBalancer
  # type: LoadBalancer

接著 deploy service

heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl create -f frontend-service.yaml
service "frontend" created
heavenruler@cloudshell:~/examples/guestbook (project-name)$ kubectl get services --watch
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
frontend       LoadBalancer   10.31.250.251   <pending>     80:32488/TCP   19s
kubernetes     ClusterIP      10.31.240.1     <none>        443/TCP        43m
redis-master   ClusterIP      10.31.245.206   <none>        6379/TCP       11m
redis-slave    ClusterIP      10.31.242.68    <none>        6379/TCP       6m
frontend   LoadBalancer   10.31.250.251   35.229.221.253   80:32488/TCP   50s

等 LoadBalancer 拿到 Public IP 後即算完成
先試試看 front 服務是否正常

heavenruler@cloudshell:~/examples/guestbook (project-name)$ curl -I http://35.229.221.253
HTTP/1.1 200 OK
Date: Sat, 29 Sep 2018 03:26:39 GMT
Server: Apache/2.4.10 (Debian) PHP/5.6.20
Last-Modified: Wed, 09 Sep 2015 18:35:04 GMT
ETag: "399-51f54bdb4a600"
Accept-Ranges: bytes
Content-Length: 921
Vary: Accept-Encoding
Content-Type: text/html

8. Browser Guestbook by Web Browser

New photo by WuNan Lin / Google Photos

Done.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *