# 建立自己的GKE Cluster

承上，Google Container Engine (GKE)是Google所推出的Container Host Cluster服務，也就是說可以讓執行Container(Docker)的環境可以Cluster起來。一方面允許擴展可以使用的資源，另一方面則可以讓執行時候可以有容錯的可能性(避免單點錯誤的狀況發生)。

## 安裝kubectl指令與相關設定

在gcloud工具已經安裝好的前提下，設定GKE的工具以及預設的ZONE只要透過下面步驟即可：

```
$ gcloud components update kubectl
$ gcloud config set compute/zone asia-east1-a
```

安裝gcloud與kubectl無誤後，可以透過clusters list可以確認目前專案中有哪些Cluster

```
$ gcloud container clusters list
NAME  ZONE  MASTER_VERSION  MASTER_IP  MACHINE_TYPE  NUM_NODES  STATUS
Listed 0 items.
```

以及kubectl get確認目前狀態

```
$ kubectl get cluster-info
the server doesn't have a resource type "cluster-info"
```

## 建立GKE Cluster

透過clusters create可已建立自己的GKE cluster...

```
$ gcloud container clusters create mygke
Creating cluster mygke...done.
Created [https://container.googleapis.com/v1/projects/my-gcp-project/zones/asia-east1-a/clusters/mygke].
kubeconfig entry generated for mygke.
NAME   ZONE          MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NUM_NODES  STATUS
mygke  asia-east1-a  1.1.2           104.199.140.230  n1-standard-1  3          RUNNING
```

然後執行在環境中設定預設的cluster為所建立的名稱

```
$ gcloud config set container/cluster mygke
```

## 設定環境使用

```
$ gcloud container clusters get-credentials mygke \
  --zone asia-east1-a \
  --project your-project-id
Fetching cluster endpoint and auth data.
kubeconfig entry generated for mygke.
```

如果想要了解一些細部的資訊，可以開啟Debug mode來看看指令做了些什麼...

```
$ gcloud container clusters get-credentials mygke --verbosity debug
DEBUG: Running gcloud.container.clusters.get-credentials with Namespace(__calliope_internal_deepest_parser=ArgumentParser(prog='gcloud.container.clusters.get-credentials', usage=None, description='See https://cloud.google.com/container-engine/docs/kubectl for\nkubectl documentation.', version=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=False), account=None, api_version=None, authority_selector=None, authorization_token_file=None, cmd_func=<bound method Command.Run of <googlecloudsdk.calliope.backend.Command object at 0x1054c1590>>, command_path=['gcloud', 'container', 'clusters', 'get-credentials'], configuration=None, document=None, format=None, h=None, help=None, http_timeout=None, log_http=None, name='mygke', project=None, quiet=None, trace_email=None, trace_log=False, trace_token=None, user_output_enabled=None, verbosity='debug', version=None, zone=None).
Fetching cluster endpoint and auth data.
DEBUG: Saved kubeconfig to /Users/peihsinsu/.kube/config
kubeconfig entry generated for mygke.
INFO: Display format "default".
```

## 調整 GKE group 大小

檢查目前的Cluster Size

```
$ gcloud compute instance-groups list
NAME                     ZONE         NETWORK MANAGED INSTANCES
gke-mygke-b0b86220-group asia-east1-a default Yes     3
```

執行調整指令，調整instance group大小...

```
$ gcloud compute instance-groups managed resize gke-mygke-b0b86220-group --zone asia-east1-a --size 1
Updated [https://www.googleapis.com/compute/v1/projects/my-gcp-project/zones/asia-east1-a/instanceGroupManagers/gke-mygke-b0b86220-group].
---
baseInstanceName: gke-mygke-b0b86220-node
creationTimestamp: '2015-11-23T18:47:48.119-08:00'
currentActions:
  abandoning: 0
  creating: 0
  deleting: 2
  none: 1
  recreating: 0
  refreshing: 0
  restarting: 0
fingerprint: 42WmSpB8rSM=
id: '8414696411043361083'
instanceGroup: gke-mygke-b0b86220-group
instanceTemplate: gke-mygke-b0b86220-1-1-2
kind: compute#instanceGroupManager
name: gke-mygke-b0b86220-group
selfLink: https://www.googleapis.com/compute/v1/projects/my-gcp-project/zones/asia-east1-a/instanceGroupManagers/gke-mygke-b0b86220-group
targetSize: 1
zone: asia-east1-a
```

## kubectl操作指令與K8S API

K8S本身具備完整的環境管理、操控API，也提供kubectl這個指令讓使用者可以透過Command Line的方式管理Cluster，下面稍微介紹使用API與kubectl的方式...

### K8S所提供的APIS

我們可以透過kubectl的Cluster info可以知道K8S環境上的一些資訊，其中包含API與K8S Web Console的位置資訊。

```
$ kubectl cluster-info
Kubernetes master is running at https://104.155.231.49
GLBCDefaultBackend is running at https://104.155.231.49/api/v1/proxy/namespaces/kube-system/services/default-http-backend
Heapster is running at https://104.155.231.49/api/v1/proxy/namespaces/kube-system/services/heapster
KubeDNS is running at https://104.155.231.49/api/v1/proxy/namespaces/kube-system/services/kube-dns
KubeUI is running at https://104.155.231.49/api/v1/proxy/namespaces/kube-system/services/kube-ui
```

如果想要使用上述的API與Web Console，可以使用下面指令，取出環境的存取帳號密碼：

```
$ gcloud container clusters describe mygke
clusterIpv4Cidr: 10.172.0.0/14
createTime: '2015-12-20T16:01:52+00:00'
currentMasterVersion: 1.1.3
currentNodeCount: 1
currentNodeVersion: 1.1.3
endpoint: 104.155.231.49
initialClusterVersion: 1.1.3
initialNodeCount: 3
instanceGroupUrls:
- https://www.googleapis.com/replicapool/v1beta2/projects/my-project/zones/asia-east1-a/instanceGroupManagers/gke-mygke-76b971b7-group
loggingService: logging.googleapis.com
masterAuth:
  clientCertificate: LS0tLS1CRUdJTiBDR...5EIENFUlRJRklDQVRFLS0tLS0K
  clientKey: LS0tLS1CRUdJT...RCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
  clusterCaCertificate: LS0tLS1C...tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  password: yFE...hAC
  username: admin
monitoringService: monitoring.googleapis.com
name: mygke
network: default
nodeConfig:
  diskSizeGb: 100
  machineType: n1-standard-1
  oauthScopes:
  - https://www.googleapis.com/auth/compute
  - https://www.googleapis.com/auth/devstorage.read_only
  - https://www.googleapis.com/auth/logging.write
  - https://www.googleapis.com/auth/monitoring
nodeIpv4CidrSize: 24
selfLink: https://container.googleapis.com/v1/projects/my-project/zones/asia-east1-a/clusters/mygke
servicesIpv4Cidr: 10.175.240.0/20
status: RUNNING
zone: asia-east1-a
```

在GKE的環境中，我們也可以透過web console中的cluster detail頁面來找到連線API的資訊：

![GKE cluster info](/files/-LAi7-9ditCoGmNWJP1y)

Request example:

```
$ curl -k -u admin:yFEvP...WhAC https://104.155.231.49/api/v1/nodes
```

Result:

```
{
  "kind": "NodeList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/nodes",
    "resourceVersion": "53696"
  },
  "items": [
    {
      "metadata": {
        "name": "gke-mygke-76b971b7-node-r1ph",
        "selfLink": "/api/v1/nodes/gke-mygke-76b971b7-node-r1ph",
        "uid": "5b740b74...2010af000f9",
        "resourceVersion": "53695",
        "creationTimestamp": "2015-12-24T10:44:49Z",
        "labels": {
          "kubernetes.io/hostname": "gke-mygke-76b971b7-node-r1ph"
        }
      },
      ...(skip),
        "nodeInfo": {
          "machineID": "",
          "systemUUID": "3C9751...9514B0E",
          "bootID": "16d8452...1da281ec",
          "kernelVersion": "3.16.0-0.bpo.4-amd64",
          "osImage": "Debian GNU/Linux 7 (wheezy)",
          "containerRuntimeVersion": "docker://1.8.3",
          "kubeletVersion": "v1.1.3",
          "kubeProxyVersion": "v1.1.3"
        }
      }
    }
  ]
}
```

### Reference

* K8S v1.0 API reference: <https://kubernetes.io/docs/reference/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gdgcloud-taipei.gitbook.io/google-cloud-platform-in-practice/google-cloud-shang-de-yun-suan-fu-wu/container-engine/jian-li-zi-ji-de-gke-cluster.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
