始終藉口 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
紅圈處資訊請更新 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
Done.