虛擬 Kubelet 作為 Kubernetes 的擴充套件,能將 Serverless 平台如 AWS Fargate 和 Google Cloud Run 納入 Kubernetes 的管理體系,讓開發者以熟悉的 Kubernetes API 管理不同平台的工作負載。這篇文章除了介紹虛擬 Kubelet 的核心概念和整合方式外,也探討瞭如何在 Serverless 叢集上佈署應用程式,並利用 Kubernetes 的自動擴充套件機制實作彈性擴充。此外,針對多雲環境的監控和日誌管理挑戰,文章也提供了使用 Prometheus 和 EFK/Loki 的實務做法,確保跨平台的可觀測性。最後,文章介紹了 Submariner 這個跨叢集網路解決方案,它能簡化多雲 Kubernetes 佈署的網路連線和管理,進一步提升多雲環境的運作效率。

虛擬 Kubelet 與無伺服器叢集

虛擬 Kubelet 簡介

虛擬 Kubelet 是一個開源的 Kubernetes kubelet 實作,擴充套件了 Kubernetes API 以支援新增非傳統 VM、容器或裸機主機的節點。它作為 Kubernetes 與其他系統或平台之間的介面,使 Kubernetes 能夠管理在叢集外執行的工作負載,例如在無伺服器平台、邊緣裝置或其他雲端提供商上執行的工作負載。

在多雲 Kubernetes 的背景下,虛擬 Kubelet 提供了以下好處:

  • 與無伺服器平台的無縫整合:虛擬 Kubelet 允許在無伺服器平台(如 Azure Container Instances、AWS Fargate 或 Google Cloud Run)上執行 Kubernetes 工作負載。這使您能夠受益於這些平台提供的可擴充套件性、成本效益和降低的維運開銷,同時仍使用 Kubernetes 進行工作負載管理。
  • 多雲工作負載分佈:虛擬 Kubelet 使您能夠跨多個雲端提供商分佈工作負載。您可以在傳統 VM、容器或裸機主機上執行某些工作負載,同時在無伺服器平台或其他 Kubernetes 叢集上執行其他工作負載。這有助於最佳化資源使用、成本和效能,同時確保高用性和容錯能力。
  • 簡化邊緣裝置的管理:虛擬 Kubelet 可用於管理在邊緣裝置(如 IoT 感測器、智慧家電或閘道器)上執行的工作負載。這使您能夠利用 Kubernetes 強大的管理功能來佈署、擴充套件和監控在邊緣執行的應用程式,從而簡化這些分散式系統的管理。
  • 更輕鬆地在雲端提供商之間遷移:使用虛擬 Kubelet,您可以更輕鬆地在雲端提供商之間或遷移到本地環境。透過抽象基礎設施,虛擬 Kubelet 允許您在不同平台上使用相同的 Kubernetes 清單和工作流程,從而簡化遷移過程。
  • 可擴充套件性和自定義整合:虛擬 Kubelet 設計為可擴充套件的,允許您建立自定義提供商以與原生不支援的其他平台、服務或基礎設施整合。這使您能夠擴充套件 Kubernetes 以管理廣泛的工作負載和環境,以滿足您的特定需求。

虛擬 Kubelet 在多雲 Kubernetes 的背景下扮演著至關重要的角色,透過實作與各種平台和系統的無縫整合,簡化工作負載管理,並提供更大的工作負載分佈靈活性。這有助於組織最佳化其基礎設施,降低成本,並更有效地管理其跨多樣環境的應用程式。

將虛擬 Kubelet 與多雲環境整合

要在由 AWS 和 GCP 組成的多雲環境中整合虛擬 Kubelet,您需要設定虛擬 Kubelet 以與 AWS Fargate 和 Google Cloud Run 協同工作。本文將引導您完成兩個平台的流程。 注意: 您需要在 AWS 和 GCP 上執行 Kubernetes 叢集。本文假設您已安裝並組態了 kubectlhelm 以與您的叢集協同工作。

在 Kubernetes 叢集上安裝虛擬 Kubelet

首先,您需要在 AWS 和 GCP Kubernetes 叢集上安裝虛擬 Kubelet。您可以使用官方 Helm 圖表安裝虛擬 Kubelet。

# 新增虛擬 Kubelet Helm 倉函式庫
helm repo add virtual-kubelet https://virtual-kubelet.github.io/charts
helm repo update

為 AWS Fargate 組態虛擬 Kubelet

要將虛擬 Kubelet 與 AWS Fargate 搭配使用,您需要建立一個 Amazon ECR 倉函式庫來儲存您的容器映像,建立具有必要許可權的 IAM 角色,並使用 AWS 提供者組態虛擬 Kubelet。 請遵循官方 AWS Fargate 提供者,為 AWS Fargate 設定虛擬 Kubelet。

為 Google Cloud Run 組態虛擬 Kubelet

詳細組態步驟:
  1. 建立 Google Cloud Run 服務帳戶:為虛擬 Kubelet 建立一個服務帳戶,並授予必要的許可權。
  2. 組態虛擬 Kubelet:使用 Google Cloud Run 提供者組態虛擬 Kubelet,確保正確設定區域和憑證。

虛擬 Kubelet 的優勢

虛擬 Kubelet 的使用帶來了多項優勢,包括但不限於:

  • 提高靈活性:透過允許在不同基礎設施上執行 Kubernetes 工作負載,提高了佈署的靈活性。
  • 成本最佳化:透過利用無伺服器平台,可以根據實際使用情況最佳化成本。
  • 簡化管理:透過統一管理介面,簡化了跨多雲環境的工作負載管理。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 虛擬 Kubelet 多雲 Kubernetes 佈署與 Serverless 叢集

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖表翻譯: 此圖示展示了將虛擬 Kubelet 與多雲環境(AWS 和 GCP)整合的流程。首先安裝虛擬 Kubelet,然後分別為 AWS Fargate 和 Google Cloud Run 組態虛擬 Kubelet,最終完成組態。

使用 Virtual Kubelet 佈署 Serverless 叢集與自動擴充套件

佈署 Serverless 叢集

Serverless 叢集是一種類別似 Kubernetes 的環境,您無需管理底層節點或基礎設施。相反,您依賴 Serverless 平台來抽象化基礎設施管理,使您能夠專注於佈署和管理應用程式。Serverless 平台會根據需求自動擴充套件資源,並且只為您的應用程式所消耗的資源收費,這可以節省成本並提高營運效率。

設定 Kubernetes 叢集

確保您在首選的雲端供應商或本地環境中啟動並執行 Kubernetes 叢集。該叢集將作為管理您的 Serverless 工作負載的控制平面。

在 Kubernetes 叢集中安裝 Virtual Kubelet

使用 Helm 安裝 Virtual Kubelet,如前一節所述。確保您已新增 Virtual Kubelet Helm 儲存函式庫並更新了 Helm 儲存函式庫。

為 Serverless 平台組態 Virtual Kubelet

根據您要使用的 Serverless 平台,請參閱適當的供應商:

  • 對於 AWS Fargate,請參閱 AWS Fargate 供應商。
  • 對於 Google Cloud Run,請參閱 Google Cloud Run 供應商。

在 Serverless 平台上佈署工作負載

安裝並組態 Virtual Kubelet 後,您可以在所選的 Serverless 平台上佈署 Kubernetes 工作負載。您需要在 Kubernetes 清單中將 spec.nodeName 欄位設定為代表 Serverless 平台的 Virtual Kubelet 節點名稱。

程式碼範例:佈署至 AWS Fargate

apiVersion: v1
kind: Pod
metadata:
  name: my-serverless-pod
spec:
  nodeName: virtual-kubelet-aws
  containers:
  - name: my-container
    image: my-ecr-repo/my-image:latest

內容解密:

此 YAML 組態定義了一個 Pod,將其排程到名為 virtual-kubelet-aws 的 Virtual Kubelet 節點上,該節點代表 AWS Fargate。nodeName 欄位確保 Pod 被佈署到正確的 Serverless 平台。容器使用來自 Amazon ECR 的 Docker 映象。

使用 kubectl 套用清單

kubectl apply -f my-serverless-pod.yaml

使用 Virtual Kubelet 進行擴充套件和自動擴充套件

手動擴充套件

手動擴充套件可以使用 Kubernetes 中的 ReplicaSet 或 Deployment 資源來完成。這些資源允許您指定給定應用程式所需的副本數量。

程式碼範例:建立 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-serverless-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-serverless-app
  template:
    metadata:
      labels:
        app: my-serverless-app
    spec:
      nodeName: virtual-kubelet-aws # 或 virtual-kubelet-gcp
      containers:
      - name: my-container
        image: my-ecr-repo/my-image:latest

內容解密:

此 Deployment 組態定義了一個應用程式的副本數量為 3,並將其排程到名為 virtual-kubelet-aws 的 Virtual Kubelet 節點上。nodeName 欄位指定了目標 Serverless 平台。

使用 kubectl 套用 Deployment

kubectl apply -f my-serverless-deployment.yaml

手動擴充套件副本數量

kubectl scale deployment my-serverless-app --replicas=5

此命令將副本數量增加到 5。

自動擴充套件

自動擴充套件可以使用 Kubernetes 中的 HorizontalPodAutoscaler (HPA) 資源來實作。HPA 根據觀察到的 CPU 利用率或自定義指標自動調整副本數量。

程式碼範例:建立 HorizontalPodAutoscaler

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-serverless-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-serverless-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

內容解密:

此 HPA 組態將嘗試在所有副本中維持平均 CPU 利用率為 50%,並根據需要將副本數量擴充套件到介於 1 和 10 之間。

使用 kubectl 套用 HPA

kubectl apply -f my-serverless-hpa.yaml

透過這些組態,您可以使用 Virtual Kubelet 手動和自動擴充套件在 Serverless 平台上執行的工作負載。擴充套件任務委託給 Serverless 平台,確保您的應用程式根據需求有效地擴充套件。

虛擬 Kubelet 的監控與日誌管理

在多雲環境中,虛擬 Kubelet 提供了一個統一的 Kubernetes 叢集管理方案。然而,監控和日誌管理在 serverless 叢集中變得更加複雜,因為底層基礎設施是抽象的。本文將介紹如何使用 Prometheus 和 EFK(Elasticsearch、Fluentd 和 Kibana)或 Loki 來實作虛擬 Kubelet 的監控和日誌管理。

使用 Prometheus 監控虛擬 Kubelet

Prometheus 是一個流行的監控工具,可以用來收集虛擬 Kubelet 的指標。

安裝 Prometheus

首先,需要在 Kubernetes 叢集中安裝 Prometheus。可以使用 kube-prometheus-stack Helm chart 來佈署 Prometheus、Grafana 和 Alertmanager。

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install my-prometheus prometheus-community/kube-prometheus-stack

組態 Prometheus

虛擬 Kubelet 提供了 Prometheus 格式的指標,可以透過 /metrics 端點存取。需要組態 Prometheus 來抓取這些指標。

建立一個 ServiceMonitor 資源,目標是虛擬 Kubelet 節點:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: virtual-kubelet
  labels:
    release: my-prometheus
spec:
  selector:
    matchLabels:
      app: virtual-kubelet
  endpoints:
  - port: metrics
    interval: 15s

使用 kubectl 應用 ServiceMonitor:

kubectl apply -f virtual-kubelet-servicemonitor.yaml

使用 Grafana 視覺化指標

kube-prometheus-stack chart 包括 Grafana,可以用來視覺化指標。透過埠轉發存取 Grafana 服務:

kubectl port-forward svc/my-prometheus-grafana 3000:80

開啟瀏覽器,存取 http://localhost:3000,使用預設憑據(使用者名稱:admin,密碼:prom-operator)登入。可以建立自定義儀錶板來視覺化虛擬 Kubelet 的指標。

使用 EFK 或 Loki 進行日誌管理

對於 serverless 叢集,可能需要使用雲提供商的原生日誌解決方案,例如 AWS CloudWatch Logs 或 Google Cloud Logging。然而,可以組態 Fluentd 或 Fluent Bit 將日誌轉發到 Elasticsearch 或 Loki,然後使用 Kibana 或 Grafana 視覺化和分析日誌。

組態 Fluentd

需要組態 Fluentd 將日誌轉發到 Elasticsearch 或 Loki。具體組態取決於所選擇的日誌解決方案。

Submariner:Kubernetes 跨叢集網路解決方案

Submariner 是一個開源的 Kubernetes 原生網路解決方案,旨在實作跨多個雲、資料中心和地理位置的 Kubernetes 叢集之間的無縫和安全互連。它為開發人員和管理員提供了統一和一致的體驗,無論底層基礎設施如何。

主要功能

安全的跨叢集通訊

Submariner 提供安全的、加密的 Kubernetes 叢集之間的通訊,確保敏感資料在傳輸過程中保持保護。這對於多雲環境尤為重要,因為資料需要在不同雲提供商之間傳輸。

網路發現和路由

Submariner 自動發現和連線叢集及其網路,透過專門的 Gateway 節點建立和管理叢集之間的安全隧道。這簡化了不同叢集之間的連線過程,減少了管理開銷。

跨叢集服務發現

Submariner 擴充套件了 Kubernetes 原生的服務發現功能,使其能夠跨多個叢集工作。它使得 Kubernetes 服務可以在連線環境中的其他叢集中被存取和發現,從而為開發人員和使用者提供無縫和一致的體驗。

負載平衡和高用性

Submariner 與 Kubernetes 原生的負載平衡和流量管理功能整合,確保流量能夠高效地分佈在可用的資源上,即使這些資源跨越不同的叢集或雲提供商。

Submariner:多雲Kubernetes佈署的強大網路解決方案

Submariner是一個專為Kubernetes設計的開源網路解決方案,旨在簡化多雲環境中的叢集間通訊。它提供了一系列強大的功能,包括安全叢集間通訊、網路發現和路由、跨叢集服務發現、負載平衡、高用性以及網路策略支援。這些功能使得Submariner成為管理跨多個雲端和資料中心佈署的Kubernetes應用程式的理想工具。

為什麼選擇Submariner進行多雲Kubernetes佈署

簡化管理

Submariner透過自動化連線和管理不同叢集的過程,簡化了多雲Kubernetes佈署的管理。這使得開發人員能夠專注於構建和佈署應用程式,而不必面對複雜的網路挑戰。

一致的應用程式體驗

透過實作無縫的叢集間通訊和服務發現,Submariner為應用程式和服務提供了一致的體驗,無論它們佈署在哪裡。這確保了使用者能夠獲得可靠、高品質的體驗,即使基礎設施不斷演變和增長。

提高安全性

Submariner的安全、加密通訊通道保護了敏感資料在叢集間傳輸的安全,防止了竊聽和篡改。這在多雲環境中尤為重要,因為資料通常需要穿越安全性較低的網路。

增強彈性和可擴充套件性

Submariner對負載平衡和高用性的支援確保了應用程式即使在跨多個叢集和雲端提供商擴充套件時也能保持高效執行和彈性。這有助於確保基礎設施能夠成長並適應使用者和業務的需求。

成本最佳化

透過實作不同雲端提供商託管的叢集之間的無縫互連,Submariner允許您利用每個提供商提供的最佳價格、功能和服務。這有助於最佳化成本,避免供應商鎖定,確保您的多雲Kubernetes佈署保持靈活和成本效益。

簡化合規性和安全性

Submariner對跨多個叢集的網路策略的支援簡化了為應用程式和服務強制執行一致的安全性和存取控制規則的過程。這在受監管行業中尤為重要,因為在不同環境中保持合規性可能是一個挑戰。

安裝和組態Submariner

要在涉及AWS和GCP的多雲設定中佈署Submariner,應採取以下步驟。假設Kubernetes叢集已經在兩個雲端提供商上啟動並執行,並且已安裝必要的命令列工具(aws和gcloud)以及kubectl。

安裝Subctl

Subctl是一個功能強大的命令列實用工具,它簡化了Submariner的佈署和管理,Submariner是一個為Kubernetes提供跨叢集網路連線的工具。使用subctl,使用者可以輕鬆地在其叢集上佈署和管理Submariner,而無需手動組態網路連線。

VERSION=$(curl --silent https://get.submariner.io/releases/latest/version)
curl -L https://get.submariner.io/releases/${VERSION}/subctl-${VERSION}-linux-amd64.tar.xz | tar -xJf -

內容解密:

上述命令用於安裝Subctl工具。首先,透過curl命令取得Submariner的最新版本號,並將其儲存在VERSION變數中。然後,使用curl下載對應版本的subctl工具,並透過tar命令解壓縮。這樣就完成了subctl工具的安裝,為後續的Submariner佈署和管理做好了準備。