Buy Me a Coffee

Google Kubernetes Engine (GKE) 全方位指南:從入門到精通

引言

嘿,各位開發者和IT朋友們!👋 準備好踏上一場精彩的容器化冒險了嗎?今天,我們要深入探索Google Kubernetes Engine (GKE)的神奇世界。不管你是剛開始接觸容器技術的新手,還是想要提升技能的老手,這篇全方位指南都能讓你收穫滿滿!

想像一下,GKE就像是一個超級智能的樂高積木工廠。🏭 在這裡,你可以輕鬆地搭建、管理和擴展你的應用程序,就像玩樂高一樣有趣!不僅如此,這個工廠還配備了最先進的安全系統和自動化工具,讓你的創意可以無憂無慮地綻放。

在接下來的旅程中,我們將探索四大核心主題:

  1. Kubernetes 基礎介紹:了解這個強大容器編排平台的來龍去脈
  2. 建立與配置 GKE 集群:學習如何搭建你自己的容器樂園
  3. 在 Kubernetes 中部署與擴展應用程式及服務:掌握應用部署的藝術
  4. 保護 GKE 並安全訪問 GCP 服務:確保你的應用安全無虞

準備好了嗎?繫好安全帶,讓我們開始這段精彩的GKE之旅吧!🚀

模組1:Kubernetes 基礎介紹

1.1 什麼是Kubernetes?

Kubernetes,這個名字聽起來有點像是某種外星科技,對吧?🛸 但別擔心,它其實是我們的好朋友!Kubernetes(常簡稱為K8s,因為中間有8個字母)是一個開源的容器編排平台。它就像是一個超級管家,負責管理和協調你的容器化應用。

想像你有一大堆的樂高積木(這些就是你的容器),Kubernetes就是那個幫你組織、擺放、移動這些積木的神奇助手。它確保每個積木都在正確的位置,而且能夠互相完美配合。

1.2 Kubernetes的核心概念

讓我們來認識一下Kubernetes的幾個核心概念:

  1. Pod:這是Kubernetes中最小的可部署單元。想像Pod是一個豆莢,裡面可以裝一個或多個緊密相關的容器。這些容器共享網絡和存儲資源,就像豆莢裡的豆子一樣親密無間。

  2. Node:Node就是你的工人。它可以是一個虛擬機或物理機,負責運行Pod。每個Node都勤勤懇懇地工作,確保Pod們住得舒適、工作順心。

  3. Cluster:Cluster是你的整個王國。它包含了一群Node(你的工人大軍)和控制平面(你的指揮中心)。

  4. Deployment:這是你的藍圖。它定義了你想要運行的Pod數量和狀態。Deployment確保你的應用程序總是按照你的心意運行。

  5. Service:Service就像是你應用的前台接待。它為一組Pod提供穩定的網絡端點,讓其他服務或用戶可以方便地訪問你的應用。

  6. Namespace:這是你的組織工具。Namespace可以將你的集群資源分割成多個虛擬集群,非常適合多租戶環境或大型項目的資源管理。

1.3 Kubernetes的工作原理

現在,讓我們來看看Kubernetes是如何運作的。想像你正在經營一家繁忙的餐廳:

  1. 控制平面(Control Plane):這就是你的餐廳經理。它負責整體決策和控制。

    • API Server:相當於經理的對講機,接收所有的指令和查詢。
    • etcd:餐廳的記事本,記錄所有重要信息。
    • Scheduler:負責安排哪道菜(Pod)由哪個廚師(Node)來烹飪。
    • Controller Manager:確保實際狀態與期望狀態相符,就像確保每桌都有正確的餐點。
  2. Node:這些是你的廚師。每個Node都包含:

    • Kubelet:廚師的大腦,執行控制平面的指令。
    • Container Runtime:廚師的手藝,實際烹飪食物(運行容器)。
    • Kube-proxy:負責網絡通信,就像服務生在餐桌間穿梭。

當你(用戶)下單(部署應用)時:

  1. 你的訂單(YAML文件)發送給API Server。
  2. 控制平面決定如何最好地滿足你的訂單。
  3. Scheduler選擇合適的Node來運行你的應用。
  4. 選中的Node上的Kubelet確保容器按照規格運行。
  5. Kube-proxy設置網絡規則,讓你的應用可以被訪問。

就這樣,你的應用就成功地在Kubernetes集群中運行起來了!

1.4 為什麼選擇Kubernetes?

你可能會問:「為什麼要使用Kubernetes呢?我的應用程序運行得好好的啊!」嗯,讓我們來看看Kubernetes能為你帶來哪些好處:

  1. 自動化部署和擴展:Kubernetes可以自動處理應用的部署和擴展。想像你的應用突然火了,訪問量暴增,Kubernetes可以自動增加運行實例,應對流量高峰。等流量下降後,它又可以自動縮減規模,節省資源。這就像有一個24小時待命的IT團隊,隨時為你調整應用規模。

  2. 自愈能力:Kubernetes會持續監控你的應用健康狀況。如果某個Pod掛了,Kubernetes會自動重啟或替換它。這就像你的應用擁有了超強的自愈能力,大大減少了半夜被緊急電話吵醒的機會。

  3. 負載均衡:Kubernetes內建負載均衡功能。它可以自動分配流量到不同的Pod,確保沒有任何一個Pod承受過大壓力。這就像有一個超級聰明的交通指揮官,總能找到最佳路線。

  4. 滾動更新和回滾:需要更新應用?No problem!Kubernetes支持滾動更新,可以逐步更新你的應用,而不會造成停機。如果新版本出現問題,它還能快速回滾到之前的穩定版本。這大大降低了更新帶來的風險。

  5. 配置管理:Kubernetes提供了強大的配置管理功能。你可以將配置信息與應用代碼分離,更靈活地管理不同環境的配置。這就像給你的應用配備了一個超級智能的個人助理,隨時為它準備好所需的一切。

  6. 可移植性:使用Kubernetes後,你的應用變得高度可移植。無論是在公有雲、私有雲還是混合雲環境,Kubernetes都能保證你的應用一致地運行。這給了你極大的自由,不用擔心被某個特定的雲平台綁定。

  7. 大規模應用管理:對於擁有成百上千個微服務的大規模應用,Kubernetes提供了強大的管理能力。它可以輕鬆處理服務發現、健康檢查、滾動更新等複雜任務。這就像給你的應用配備了一個超級管家,幫你打理大大小小的事務。

  8. 豐富的生態系統:Kubernetes擁有龐大而活躍的社區和豐富的生態系統。無論你遇到什麼問題,很可能社區中已經有人遇到並解決過。這就像加入了一個充滿智慧的大家庭,隨時都有人可以幫助你。

1.5 Kubernetes vs 傳統部署

讓我們用一個簡單的表格來對比Kubernetes部署和傳統部署方式:

特性傳統部署Kubernetes部署
擴展性手動擴展,耗時費力自動擴展,輕鬆應對流量變化
可用性依賴人工干預來處理故障自動檢測和替換故障組件
資源利用往往存在資源浪費高效利用資源,降低成本
部署速度部署流程複雜,速度慢快速、一致的自動化部署
版本控制版本管理複雜輕鬆管理多個版本,支持回滾
配置管理配置分散,難以管理集中化的配置管理
可移植性往往與特定環境綁定高度可移植,支持多種環境

看到這些差異,你就知道為什麼越來越多的企業選擇擁抱Kubernetes了吧?它不僅提高了開發和運維的效率,還為企業帶來了更大的靈活性和創新能力。

1.6 Kubernetes的局限性

雖然Kubernetes強大無比,但它也不是萬能的。在決定是否使用Kubernetes之前,你也應該了解它的一些局限性:

  1. 複雜性:Kubernetes的學習曲線相當陡峭。對於小型項目或團隊來說,可能會顯得有些過於複雜。

  2. 資源消耗:Kubernetes本身也需要消耗一定的計算資源。對於小規模部署,這些開銷可能顯得有些浪費。

  3. 狀態管理:雖然Kubernetes支持有狀態應用,但管理這些應用仍然比無狀態應用更具挑戰性。

  4. 網絡複雜性:Kubernetes的網絡模型相對複雜,可能需要額外的學習和配置。

  5. 持久存儲:在某些環境下,配置和管理持久存儲可能會比較麻煩。

  6. 安全性考慮:雖然Kubernetes提供了多種安全機制,但配置這些機制需要專業知識,配置不當可能導致安全風險。

1.7 小結

在這個模塊中,我們深入探討了Kubernetes的基礎知識。我們了解了什麼是Kubernetes,它的核心概念和工作原理,以及為什麼它在現代應用部署中如此重要。我們也客觀地看到了它的優勢和局限性。

記住,選擇使用Kubernetes應該基於你的具體需求。如果你的應用規模較大、需要高可用性和靈活性,或者你正在向微服務架構轉型,那麼Kubernetes絕對值得考慮。但如果你的應用相對簡單,或者團隊規模較小,可能直接使用容器或其他更輕量級的解決方案會更合適。

無論如何,了解Kubernetes都是非常有價值的。因為即使你現在不需要使用它,未來很可能會遇到需要用到這些知識的場景。所以,讓我們繼續我們的學習之旅,下一站:Google Kubernetes Engine (GKE)!🚀

模組2:建立與配置 GKE 集群

歡迎來到我們GKE之旅的第二站!在上一個模塊中,我們了解了Kubernetes的基礎知識。現在,讓我們深入探索Google Kubernetes Engine (GKE),看看它如何讓Kubernetes的使用變得更加簡單和強大。

2.1 什麼是Google Kubernetes Engine (GKE)?

想像一下,如果Kubernetes是一輛強大的跑車,那麼GKE就是為這輛跑車量身打造的賽道,還配備了專業的維修團隊和最先進的控制系統。🏎️

GKE是Google Cloud Platform (GCP) 提供的完全託管的Kubernetes服務。它讓你能夠在Google的基礎設施上部署、管理和擴展容器化應用程序,而無需擔心底層基礎設施的管理。

使用GKE的主要優勢包括:

  1. 簡化的管理:GKE自動處理集群管理的許多方面,如升級、擴展和監控。
  2. 與Google Cloud的深度集成:輕鬆使用其他GCP服務,如Cloud Storage、BigQuery等。
  3. 自動擴展:根據需求自動調整集群大小。
  4. 高可用性:提供多區域和多集群部署選項,確保應用的高可用性。
  5. 安全性:內建多層安全防護,包括加密、網絡策略等。

2.2 GKE vs 自管理Kubernetes

你可能會問:「我已經會用Kubernetes了,為什麼還要用GKE呢?」好問題!讓我們來比較一下:

特性自管理KubernetesGoogle Kubernetes Engine (GKE)
基礎設施管理自己負責Google Cloud管理
版本更新手動更新自動更新選項
擴展性需要手動配置自動擴展
整合性需要額外配置與Google Cloud服務無縫整合
學習曲線陡峭相對平緩
成本可能較低,但需要更多人力資源按使用付費,可能總體成本更低
安全性需要自行配置和管理內建多層安全防護
監控和日誌需要額外設置與Google Cloud監控工具整合

看到差異了嗎?選擇GKE就像選擇了一個全包式的度假套餐,而不是自己規劃每一個細節。你可以將寶貴的時間和精力投入到真正重要的事情上 - 開發你的應用程序!

2.3 開始使用GKE

好了,理論知識我們已經掌握了,現在該動手實踐了!讓我們一步步來看如何開始使用GKE。🚀

步驟1:設置Google Cloud項目

首先,你需要一個Google Cloud項目。這就像是為你的應用程序準備一個專屬的工作區。

  1. 登錄到Google Cloud Console
  2. 點擊頁面頂部的「選擇項目」下拉菜單
  3. 點擊「新建項目」
  4. 為你的項目命名,然後點擊「創建」
# 或者使用 gcloud 命令行工具
gcloud projects create my-awesome-project

步驟2:啟用GKE API

就像打開工廠的大門,我們需要啟用GKE API:

  1. 在Cloud Console中,進入「API和服務」 > 「庫」
  2. 搜索「Kubernetes Engine API」
  3. 點擊「啟用」
# 使用 gcloud 命令行工具
gcloud services enable container.googleapis.com

步驟3:安裝和配置Google Cloud SDK

Google Cloud SDK是一組用於管理Google Cloud資源和應用程序的工具。在你的本地機器上安裝它:

  1. 訪問Google Cloud SDK下載頁面
  2. 根據你的操作系統下載並安裝SDK
  3. 打開終端,運行 gcloud init 來初始化SDK並登錄你的Google Cloud帳戶

步驟4:創建GKE集群

現在,讓我們來創建我們的第一個GKE集群!

gcloud container clusters create my-first-cluster --num-nodes=3 --zone=us-central1-a

這個命令會創建一個名為「my-first-cluster」的集群,包含3個節點,位於us-central1-a區域。

讓我們來解析一下這個命令:

  • gcloud container clusters create:這是創建GKE集群的基本命令。
  • my-first-cluster:這是你給集群起的名字。選一個有意義的名字!
  • --num-nodes=3:這指定了集群中的節點數量。3是一個好的開始數字,既不會消耗太多資源,又能提供足夠的冗餘。
  • --zone=us-central1-a:這指定了集群的地理位置。選擇離你的用戶較近的地區可以減少延遲。

步驟5:獲取集群憑證

創建集群後,我們需要獲取憑證以便使用kubectl(Kubernetes命令行工具)與集群進行交互:

gcloud container clusters get-credentials my-first-cluster --zone us-central1-a

這個命令會更新你的kubeconfig文件,讓kubectl知道如何與你的新集群通信。

2.4 GKE集群類型

GKE提供了幾種不同類型的集群,以滿足不同的需求:

  1. 標準集群:這是最常見的類型,提供完全可自定義的Kubernetes環境。

  2. 自動駕駛集群:這是一種更加自動化的集群類型,Google會自動管理更多的集群設置。

  3. 私有集群:這種集群使用內部IP地址,提供更好的隔離性。

  4. 區域集群:跨越單個區域內的多個區,提供更高的可用性。

  5. 多區域集群:跨越多個區域,提供最高級別的可用性。

選擇哪種類型取決於你的具體需求。例如,如果你需要最高級別的可用性,多區域集群可能是最佳選擇。如果你希望最大程度地減少管理負擔,自動駕駛集群可能更適合你。

2.5 GKE節點池

節點池是GKE的一個強大特性,它允許你在同一個集群中使用不同類型的節點。這對於優化成本和性能非常有用。

例如,你可以為需要高CPU的工作負載創建一個節點池,為需要高內存的工作負載創建另一個節點池。

創建新的節點池:

gcloud container node-pools create high-cpu-pool --cluster=my-first-cluster --machine-type=n1-highcpu-4 --num-nodes=2

這個命令在my-first-cluster集群中創建了一個名為high-cpu-pool的新節點池,使用高CPU的機器類型,包含2個節點。

2.6 自動擴展

GKE的自動擴展功能就像是給你的應用程序裝上了彈性褲。👖 無論你的應用程序變胖(流量增加)還是變瘦(流量減少),GKE都能自動調整資源,確保完美匹配。

GKE提供兩種類型的自動擴展:

  1. 水平Pod自動擴展(HPA):根據CPU使用率或自定義指標自動調整Pod的數量。

  2. 集群自動擴展:根據工作負載需求自動添加或刪除節點。

要啟用節點自動擴展,可以使用以下命令:

gcloud container clusters update my-first-cluster --enable-autoscaling --min-nodes=1 --max-nodes=5

這個命令設置集群的節點數在1到5之間自動調整。

2.7 自動修復

自動修復功能就像是給你的集群配備了一個24小時待命的醫生。🩺 一旦發現節點「生病」了(出現故障),GKE會自動進行修復,確保你的應用程序始終健康運行。

自動修復功能會定期檢查節點的健康狀態。如果發現問題,它會自動重新創建節點,同時確保運行在該節點上的工作負載被安全地轉移到其他健康的節點上。

要啟用自動修復,使用以下命令:

gcloud container node-pools update default-pool --cluster=my-first-cluster --enable-autorepair

2.8 自動升級

保持你的GKE集群版本最新可以確保你獲得最新的功能和安全補丁。GKE提供了自動升級選項,你也可以手動升級:

gcloud container clusters upgrade my-first-cluster --master --cluster-version=1.21

這個命令將集群的主節點升級到1.21版本。注意,版本號會隨時間變化,請總是使用最新的穩定版本。

2.9 監控和日誌

GKE與Google Cloud的監控和日誌服務緊密集成,讓你能夠輕鬆地監控集群的健康狀況和性能。

  1. Cloud Monitoring:提供集群和工作負載的詳細指標。
  2. Cloud Logging:集中收集和分析日誌。
  3. Cloud Trace:分佈式跟蹤系統,幫助你理解請求如何在你的應用中流動。

要查看集群的監控數據,你可以使用以下命令:

gcloud container clusters describe my-first-cluster --zone us-central1-a

然後在Google Cloud Console的Monitoring部分查看詳細的指標和圖表。

2.10 最佳實踐

在使用GKE時,遵循一些最佳實踐可以幫助你更好地管理你的集群和應用。以下是一些重要的建議:

  1. 使用節點池:利用節點池來優化資源分配和成本。

  2. 實施資源請求和限制:為你的容器設置資源請求和限制,幫助Kubernetes更好地調度Pod並防止資源耗盡。

  3. 使用命名空間:利用命名空間來組織和隔離工作負載。

  4. 定期更新集群:保持集群版本最新,以獲得最新的功能和安全補丁。

  5. 使用Preemptible VMs:對於可以容忍中斷的工作負載,使用Preemptible VMs可以顯著降低成本。

  6. 實施適當的備份策略:定期備份你的應用數據和Kubernetes資源。

  7. 利用GKE的自動擴展功能:充分利用HPA和集群自動擴展來優化資源使用。

  8. 使用工作負載身份:這是一種更安全的方式,用於授予你的應用訪問Google Cloud服務的權限。

2.11 小結

在這個模塊中,我們深入探討了如何建立和配置GKE集群。我們學習了如何創建集群、管理節點池、設置自動擴展和自動修復,以及一些GKE的最佳實踐。

記住,GKE的強大之處在於它能夠自動化很多複雜的管理任務,讓你能夠專注於開發和改進你的應用。隨著你對GKE的熟悉程度提高,你會發現它能夠大大提升你的開發效率和應用性能。

在下一個模塊中,我們將探討如何在GKE中部署和擴展應用程序。準備好開始你的容器化應用之旅了嗎?讓我們繼續前進!🚀

模組3:在 Kubernetes 中部署與擴展應用程式及服務

歡迎來到我們GKE之旅的第三站!在前兩個模塊中,我們學習了Kubernetes的基礎知識,以及如何建立和配置GKE集群。現在,讓我們把手弄髒,學習如何在GKE中部署和擴展實際的應用程序。

3.1 部署你的第一個應用

讓我們從部署一個簡單的Hello World應用開始。我們將使用一個簡單的Nginx網頁服務器來做這個示範。

首先,創建一個名為hello-world.yaml的文件,內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: nginx:1.19.0
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  type: LoadBalancer
  selector:
    app: hello-world
  ports:
  - port: 80
    targetPort: 80

現在,讓我們來解釋一下這個YAML文件:

  1. Deployment:這定義了我們的應用程序如何部署。

    • replicas: 3:我們想要運行3個Pod副本。
    • selectorlabels:這些用於識別哪些Pod屬於這個Deployment。
    • containers:定義了我們要運行的容器。這裡我們使用nginx:1.19.0鏡像。
  2. Service:這定義了如何訪問我們的應用程序。

    • type: LoadBalancer:這會創建一個外部負載均衡器,使我們的應用可以從互聯網訪問。
    • selector:這告訴Service要將流量路由到哪些Pod。
    • ports:定義了Service監聽的端口和要轉發到的目標端口。

現在,讓我們部署這個應用:

kubectl apply -f hello-world.yaml

這個命令告訴Kubernetes創建我們在YAML文件中定義的所有資源。

要檢查部署狀態,可以運行:

kubectl get deployments
kubectl get pods
kubectl get services

當你看到所有的Pod都在運行,並且Service有了一個外部IP地址,那麼恭喜你!你的第一個應用已經成功部署到GKE了。🎉

你可以通過訪問Service的外部IP來查看你的應用。運行以下命令獲取IP地址:

kubectl get services hello-world-service

3.2 擴展你的應用

現在我們的應用正在運行,讓我們學習如何擴展它。Kubernetes makes it easy!

要增加運行的Pod數量,只需要更新Deployment的副本數:

kubectl scale deployment hello-world --replicas=5

這個命令會將hello-world Deployment的副本數增加到5個。

你也可以設置自動擴展,讓Kubernetes根據CPU使用率自動調整Pod數量:

kubectl autoscale deployment hello-world --cpu-percent=50 --min=3 --max=10

這個命令創建了一個Horizontal Pod Autoscaler (HPA),它會在CPU使用率達到50%時自動擴展Pod,保持Pod數量在3到10之間。

3.3 更新你的應用

假設我們想要更新我們的nginx版本。我們可以使用rolling update策略來實現零停機更新:

kubectl set image deployment/hello-world hello-world=nginx:1.20.0

這個命令告訴Kubernetes將hello-world容器的鏡像更新為nginx:1.20.0。Kubernetes會逐步替換舊的Pod,確保服務不中斷。

你可以使用以下命令監控更新進度:

kubectl rollout status deployment/hello-world

如果新版本出現問題,你可以輕鬆回滾:

kubectl rollout undo deployment/hello-world

3.4 配置和密鑰管理

在實際應用中,你可能需要管理配置和密鑰。Kubernetes提供了ConfigMaps和Secrets來處理這些需求。

創建一個ConfigMap:

kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2

創建一個Secret:

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=t0p-Secret

然後,你可以在Pod定義中使用這些ConfigMap和Secret:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app-image
        env:
        - name: CONFIG_KEY1
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: key1
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username

3.5 使用持久化存儲

對於需要持久化數據的應用,GKE提供了多種存儲選項。讓我們看看如何使用持久卷:

首先,創建一個持久卷聲明(PVC):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

然後,在你的Pod定義中使用這個PVC:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app-image
        volumeMounts:
        - name: my-storage
          mountPath: /data
      volumes:
      - name: my-storage
        persistentVolumeClaim:
          claimName: my-pvc

3.6 使用Ingress進行高級流量路由

如果你需要更複雜的HTTP路由,可以使用Ingress資源。首先,你需要在你的集群中安裝Ingress控制器。然後,你可以創建Ingress資源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port: 
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port: 
              number: 80

這個Ingress將所有發往myapp.example.com/api的流量路由到api-service,其他流量路由到web-service。

3.7 使用Jobs和CronJobs

對於需要執行一次性任務或定期任務的場景,Kubernetes提供了Jobs和CronJobs。

創建一個Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

創建一個CronJob(每分鐘執行一次):

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

3.8 監控你的應用

GKE與Google Cloud的監控服務緊密集成,提供了豐富的監控功能。你可以在Google Cloud Console中查看集群和Pod的性能指標。

此外,你還可以使用Prometheus和Grafana等工具來增強監控能力。Google Cloud Marketplace提供了預配置的Prometheus和Grafana解決方案,你可以一鍵部署到你的GKE集群。

3.9 調試技巧

當你的應用出現問題時,以下是一些有用的調試技巧:

  1. 查看Pod日誌:

    kubectl logs <pod-name>
    
  2. 進入Pod內部:

    kubectl exec -it <pod-name> -- /bin/bash
    
  3. 查看Pod描述:

    kubectl describe pod <pod-name>
    
  4. 查看事件:

    kubectl get events
    

3.10 最佳實踐

在GKE上部署和管理應用時,以下是一些最佳實踐:

  1. 使用資源請求和限制來確保公平分配資源。
  2. 實施健康檢查和就緒探針,以確保流量只路由到健康的Pod。
  3. 使用滾動更新策略來實現零停機部署。
  4. 利用ConfigMaps和Secrets來管理配置和敏感信息。
  5. 為關鍵應用實施Pod Disruption Budgets,以確保高可用性。
  6. 使用命名空間來組織和隔離資源。
  7. 定期審查和清理未使用的資源。
  8. 利用GKE的自動擴展功能來優化資源使用。

3.11 小結

在這個模塊中,我們深入探討了如何在GKE中部署和擴展應用程序。我們學習了如何創建Deployments和Services,如何擴展和更新應用,如何管理配置和密鑰,以及如何使用持久化存儲。我們還介紹了更高級的主題,如Ingress、Jobs和CronJobs,以及一些調試技巧和最佳實踐。

記住,在GKE上部署應用是一個持續學習和改進的過程。隨著你的經驗積累,你會發現更多優化和改進的機會。保持好奇心,不斷嘗試新的方法和工具!

在下一個模塊中,我們將探討如何保護你的GKE集群和應用。安全性是雲原生應用的一個關鍵方面,所以讓我們一起深入研究吧!🔒

模組4:保護 GKE 並安全訪問 GCP 服務

歡迎來到我們GKE之旅的最後一站!在前面的模塊中,我們學習了如何設置GKE集群,以及如何部署和擴展應用程序。現在,讓我們來談談如何確保這一切的安全。畢竟,一個高效但不安全的系統就像是一座沒有鎖的寶庫 - 充滿風險!🗝️

4.1 GKE 安全概述

GKE提供了多層安全防護,包括:

  1. 集群安全:保護Kubernetes控制平面和節點。
  2. 網絡安全:控制集群內部和外部的網絡流量。
  3. 身份和訪問管理:確保只有授權用戶和服務可以訪問集群資源。
  4. 工作負載安全:保護運行在集群中的應用程序。
  5. 數據安全:保護靜態和傳輸中的數據。

讓我們深入了解每個方面。

4.2 集群安全

4.2.1 控制平面安全

GKE自動管理控制平面的安全性,包括:

  • 自動升級到最新的安全補丁。
  • 使用加密通信。
  • 實施訪問控制。

你可以通過啟用私有集群來進一步增強安全性:

gcloud container clusters create my-private-cluster \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.0/28 \
    --enable-ip-alias

這會創建一個私有集群,其中節點沒有公共IP地址,只能通過內部網絡訪問。

4.2.2 節點安全

GKE使用容器優化操作系統(COS)作為默認節點鏡像,它專門設計用於運行容器工作負載,並具有增強的安全功能。

你還可以使用節點自動升級來確保節點始終運行最新的安全補丁:

gcloud container node-pools update my-node-pool \
    --cluster=my-cluster \
    --enable-auto-upgrade

4.3 網絡安全

4.3.1 網絡策略

網絡策略允許你控制Pod之間的流量。首先,在集群中啟用網絡策略:

gcloud container clusters update my-cluster --enable-network-policy

然後,你可以創建網絡策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-nginx-ingress
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: nginx-ingress
    ports:
    - protocol: TCP
      port: 80

這個策略只允許帶有app: nginx-ingress標籤的Pod訪問帶有app: web標籤的Pod的80端口。

4.3.2 防火牆規則

GKE自動創建必要的防火牆規則來保護你的集群。但是,你可能需要創建額外的規則來滿足特定需求:

# 這個規則允許從IAP隧道IP範圍到集群節點的SSH訪問
gcloud compute firewall-rules create allow-ssh-ingress \
    --allow tcp:22 \
    --source-ranges 35.235.240.0/20 \
    --target-tags gke-my-cluster-node

4.4 身份和訪問管理

GKE與Google Cloud的Identity and Access Management (IAM) 系統緊密集成,提供了細粒度的訪問控制。

4.4.1 Kubernetes RBAC

Kubernetes的基於角色的訪問控制(RBAC)允許你定義誰可以訪問集群中的哪些資源。以下是一個簡單的RBAC配置示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane@example.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

這個配置創建了一個pod-reader角色,允許讀取Pod信息,並將這個角色綁定到用戶jane@example.com

4.4.2 工作負載身份

工作負載身份是一種更安全的方式,用於讓你的GKE應用訪問其他Google Cloud服務。它消除了管理服務帳號密鑰的需要。

首先,在集群上啟用工作負載身份:

gcloud container clusters update my-cluster \
    --workload-pool=my-project.svc.id.goog

然後,創建一個Kubernetes服務帳號並將其與Google Cloud服務帳號關聯:

kubectl create serviceaccount my-sa
gcloud iam service-accounts add-iam-policy-binding \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:my-project.svc.id.goog[default/my-sa]" \
    my-gcp-sa@my-project.iam.gserviceaccount.com

最後,在你的Pod規範中使用這個服務帳號:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-sa
  containers:
  - name: main
    image: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
    command: ["sleep", "infinity"]

4.5 工作負載安全

4.5.1 Pod 安全策略

Pod安全策略允許你控制Pod可以使用的安全敏感特性。以下是一個限制性的Pod安全策略示例:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: MustRunAsNonRoot
  fsGroup:
    rule: RunAsAny
  volumes:
  - 'configMap'
  - 'emptyDir'
  - 'projected'
  - 'secret'
  - 'downwardAPI'
  - 'persistentVolumeClaim'

這個策略禁止特權Pod,並要求Pod以非root用戶運行。

4.5.2 Binary Authorization

Binary Authorization 是一個部署時安全控制,確保只有經過授權的容器映像才能部署到你的集群。

首先,在項目中啟用Binary Authorization:

gcloud services enable binaryauthorization.googleapis.com

然後,在集群上啟用Binary Authorization:

gcloud container clusters update my-cluster --enable-binauthz

4.6 數據安全

4.6.1 靜態加密

GKE默認使用Google Cloud的靜態加密來保護你的數據。但是,你也可以使用客戶管理的加密密鑰(CMEK)來進一步控制你的數據:

gcloud container clusters create my-cmek-cluster \
    --database-encryption-key projects/my-project/locations/global/keyRings/my-ring/cryptoKeys/my-key

4.6.2 Secret 管理

儘管Kubernetes Secrets默認加密,但它們並不是為存儲高度敏感的信息而設計的。對於高度敏感的信息,考慮使用專門的秘密管理解決方案,如Google Cloud Secret Manager。

你可以使用Secret Manager CSI驅動程序在你的Pod中掛載Secret Manager秘密:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secrets
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "gcp-secrets"

4.7 監控和審計

4.7.1 Cloud Monitoring

GKE與Cloud Monitoring緊密集成,提供了豐富的監控功能。你可以在Google Cloud Console中查看集群和Pod的性能指標。

4.7.2 Cloud Audit Logs

Cloud Audit Logs記錄了誰在什麼時候對你的GKE資源做了什麼。你可以在Google Cloud Console中查看這些日誌,或者將它們導出到BigQuery進行進一步分析。

4.8 安全最佳實踐

  1. 保持你的集群和節點版本最新。
  2. 使用最小權限原則配置RBAC。
  3. 啟用和配置網絡策略來控制Pod之間的通信。
  4. 使用工作負載身份而不是服務帳號密鑰。
  5. 實施Pod安全策略來控制Pod的安全上下文。
  6. 使用Binary Authorization確保只有經過授權的容器映像可以部署。
  7. 對敏感數據使用專門的秘密管理解決方案。
  8. 定期審查和分析審計日誌。
  9. 使用私有集群來增強網絡隔離。
  10. 實施強大的容器映像管理策略,包括定期掃描漏洞。

4.9 安全掃描和滲透測試

定期進行安全掃描和滲透測試是確保GKE環境安全的重要步驟。Google Cloud提供了多種工具來幫助你完成這些任務:

  1. Container Analysis: 自動掃描容器映像中的漏洞。

    gcloud container analysis images describe gcr.io/my-project/my-image
    
  2. Web Security Scanner: 掃描你的web應用程序的常見漏洞。

  3. Cloud Security Command Center: 提供集中式安全和風險管理平台。

記住,在進行任何滲透測試之前,務必查看Google Cloud的滲透測試政策並獲得適當的授權。

4.10 災難恢復和業務連續性

確保你的GKE環境能夠在災難發生時快速恢復是安全策略的重要組成部分。以下是一些建議:

  1. 使用多區域或區域集群: 這可以提供更高的可用性和災難恢復能力。

    gcloud container clusters create my-regional-cluster \
        --region us-central1 \
        --num-nodes 1 \
        --node-locations us-central1-b,us-central1-c,us-central1-f
    
  2. 定期備份: 使用工具如Velero定期備份你的Kubernetes資源和持久卷數據。

  3. 實施災難恢復計劃: 定期測試你的災難恢復計劃,確保在需要時能夠快速恢復操作。

4.11 合規性考慮

如果你的組織需要遵守特定的合規標準(如HIPAA、PCI DSS、GDPR等),GKE提供了多種功能來幫助你達到這些標準:

  1. 客戶管理的加密密鑰 (CMEK): 為敏感數據提供額外的控制層。

  2. VPC Service Controls: 創建安全邊界來保護 Google Cloud 資源。

  3. Cloud Identity-Aware Proxy (IAP): 為應用程序和資源提供基於身份的訪問控制。

  4. Cloud Data Loss Prevention (DLP): 幫助你發現、分類和保護敏感數據。

記住,合規性是一個持續的過程,需要定期審查和更新你的安全措施。

4.12 小結

在這個模塊中,我們深入探討了如何保護GKE環境和安全訪問GCP服務。我們學習了如何實施多層安全策略,包括集群安全、網絡安全、身份和訪問管理、工作負載安全和數據安全。我們還討論了一些重要的安全最佳實踐,以及如何處理安全掃描、災難恢復和合規性問題。

記住,安全不是一次性的工作,而是一個持續的過程。隨著新的威脅和漏洞的出現,你需要不斷更新和改進你的安全措施。保持警惕,定期審查你的安全設置,並利用Google Cloud提供的最新安全功能和最佳實踐。

恭喜你完成了這個全面的GKE安全之旅!你現在已經具備了在GKE上構建、部署和保護應用程序的知識和工具。繼續探索,保持學習,並享受你的雲原生之旅!🚀🔒

總結

我們的GKE全方位指南到此就要告一段落了。從Kubernetes的基礎知識,到GKE集群的創建和配置,再到應用程序的部署和擴展,最後是安全性的考慮,我們已經深入探討了GKE的方方面面。讓我們來回顧一下我們學到的主要內容:

  1. Kubernetes基礎: 我們了解了Kubernetes的核心概念,包括Pod、Node、Deployment、Service等,以及Kubernetes如何簡化容器化應用的管理。

  2. GKE集群管理: 我們學習了如何創建、配置和管理GKE集群,包括節點池、自動擴展、自動修復等高級特性。

  3. 應用部署與擴展: 我們探討了如何在GKE上部署應用,如何進行滾動更新,如何使用ConfigMaps和Secrets管理配置,以及如何使用持久化存儲。

  4. GKE安全: 我們深入研究了GKE的安全特性,包括網絡策略、RBAC、工作負載身份、數據加密等,以及如何實施安全最佳實踐。

記住,使用GKE是一個持續學習和改進的過程。技術在不斷發展,新的特性和最佳實踐也在不斷涌現。保持好奇心,持續學習,並經常查看Google Cloud的官方文檔以獲取最新信息。

最後,我想再次強調,雲原生技術如Kubernetes和GKE不僅僅是技術工具,它們代表了一種新的應用開發和運維方式。擁抱這些技術可以幫助你的組織提高效率、降低成本、增強靈活性。但同時也要記住,技術是為業務服務的。始終關注你的業務目標,選擇最適合你需求的解決方案。

感謝你陪伴我們完成這個全面的GKE之旅。希望這個指南能夠幫助你在GKE上成功構建、部署和管理你的應用。祝你在雲原生的世界中探索愉快,建設偉大的事物!🚀👨‍💻👩‍💻