--- 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/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up