--- 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.