---
lang: zh-tw
title: Google Kubernetes Engine
tags: GCP
---
# Google Kubernetes Engine
## Agenda
* Overview
* Cluster
* Workload
* Service & Ingress
* Configuration
* Storage
---
## GKE Overview
1. Google Kubernetes Engine,簡稱 GKE
2. 提供一個Kubernetes的代管環境,可以使用GCP的基礎架構在其中部署、管理和擴縮容器化應用
3. GKE環境包含多個機器(GCE),這些機器組合在一起就形成叢集(Cluster)
### 使用GKE的優點
1. Google Cloud針對GCE提供的負載平衡功能
2. 於叢集中可指定Node Pool提高靈活性
3. 自動擴展收容叢集Node的數量
4. 節點自動修復
### GKE 價格
1. GKE 叢集管理費用:$0.10/小時
2. 每個專案可以有一個免費的Zonal叢集
3. Node費用依GCE價格計算,直到Node刪除為止
## GKE Cluster
1. 一個叢集至少包含一個Master和多個Node
2. 可以建立區域性或地區性的叢集
3. 可以選擇[Private Cluster](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters)將Node與外部隔離
### GKE Master
1. 叢集的生命週期由GKE管理
2. 由`kubectl`呼叫Api-Server執行命令
3. Master負責調度Workloads,以及管理Workloads的生命週期、擴縮和升級
4. Master也管理Workload的Networking和Storage
### GKE Node
1. 建立叢集時,GKE使用會GCE instances(VM)
2. 每個Node都是標準的GCE機器類型,<br />可以在建立叢集時選擇
3. 可以建立先佔模式的Node Pool
4. 透過`nodeSelector`標籤,<br />將服務部署到特定Node Pool

### GKE 介面

### Create Cluster
```yaml=
gcloud container clusters create gt-test \
--zone=asia-east1 \
--num-nodes=1 \
--enable-autoscaling --max-nodes=3 --min-nodes=1 \
--machine-type=n1-standard-1 \
--disk-size=10g --disk-type=pd-standard \
--preemptible \
--enable-vertical-pod-autoscaling \
--enable-private-nodes --enable-ip-alias \
--master-ipv4-cidr="172.16.0.0/28" \
--network="audere-lab-vpc" --subnetwork="audere-lab-vpc-asia" \
--enable-master-authorized-networks --master-authorized-networks "59.120.226.200/32" \
--enable-basic-auth
```
## GKE Workload
+ 可以部署不同類型的Controller,常見的有:
+ Deployment(Stateless)
+ StatefulSet(Stateful)
+ DaemonSet
+ Job or CronJob
### [部署Stateless應用](https://cloud.google.com/kubernetes-engine/docs/how-to/stateless-apps)
建立 Deployment
kubectl create -f deployment.yaml
檢查 Deployment
kubectl describe deployment deployment-name
更新 Deployment
kubectl apply -f deployment.yaml
刪除 Deployment
kubectl delete -f deployment.yaml
```yaml=
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostnames-deployment
labels:
app: hostnames
spec:
replicas: 3
selector:
matchLabels:
app: hostnames
template:
metadata:
labels:
app: hostnames
spec:
containers:
- name: hostnames
image: mirrorgooglecontainers/serve_hostname
ports:
- containerPort: 9376
protocol: TCP
```
## Service & Ingress
### Service
+ 使用下列四種Service Type公開應用
+ ClusterIP
+ NodePort
+ LoadBalancer
+ ExternalName
1. ClusterIP(預設):內部客戶端向內部IP發送請求
2. NodePort:客戶端使用Service指定的一個或多個nodePort值的Node的IP發送請求
3. LoadBalancer:客戶端向網路負載平衡的IP發送請求
4. ExternalName:內部客戶端使用Service的DNS名稱作為外部DNS名稱的別名
5. Headless:如果需要Pod分組,但不需要IP,就可以使用Headless Service
#### 使用不同類型的Service
```yaml=
apiVersion: v1
kind: Service
metadata:
name: hostnames-service
spec:
type: ClusterIP | NodePort | LoadBalancer
# clusterIP: None
selector:
app: hostnames
ports:
- name: hostnames
port: 80
targetPort: 9376
```
### Ingress
1. 建立Ingress時,GKE Ingress Controller會建立一組HTTP(S)Load Balancing
2. 可以綁定預先約定好的靜態外部IP
3. 可以對HTTP(S)設定TLS或SSL
```yaml=
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hostnames-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "sample-external-ip"
networking.gke.io/managed-certificates: "gcp-managed-certs"
spec:
# tls:
# - secretName: secret-name
rules:
- http:
paths:
- path:
backend:
serviceName: hostnames-service
servicePort: hostnames
```
## Configuration
### ConfigMap
```yaml=
apiVersion: v1
kind: ConfigMap
metadata:
name: config-test
data:
REDIS_HOST: "localhost"
REDIS_PORT: "6379"
```
### Secret
```yaml=
apiVersion: v1
kind: Secret
metadata:
name: secret-test
type: Opaque
data:
REDIS_USERNAME: YWRtaW4=
REDIS_REQUIREPASS: MWYyZDFlMmU2N2Rm
```
## Storage
1. 如果應用需要儲存空間,可以使用Persistent Disk
2. Persistent Disk可以手動配置,也可以使用StorageClass動態配置
### PersistentVolume
1. 由GCE的Persistent Disk提供
2. 也可以將PersistentVolume與Cloud Volumes服務搭配使用
3. 透過可以透過PVC申請PV資源,或是由管理員建立
### StorageClass
1. 建立叢集時,GKE會建立標準磁碟類型的StorageClass
2. PVC未指定StorageClassName時,會使用預設的StorageClass
3. [Storage Provisioner](https://kubernetes.io/zh/docs/concepts/storage/storage-classes/)
```yaml=
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: pd-standard-test
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
fstype: ext4
volumeBindingMode: WaitForFirstConsumer
```
1. volumeBindingMode:控制綁定和動態分配的時機
2. volumeBindingMode: Immediate → 建立PVC即完成綁定和分配
3. volumeBindingMode: WaitForFirstConsumer → 使用PVC的Pod被建立才綁定和分配
4. 支持WaitForFirstConsumer的StorageClass:AWS、GCP、Azure
## Reference
[Google Kubernetes Engine 官方文件](https://cloud.google.com/kubernetes-engine/docs/how-to)
[Kubernetes 官方文件](https://kubernetes.io/docs/concepts/overview/)