在 KinD(Kubernetes in Docker) 中建立 LoadBalancer Service:使用 Cloud-Provider-KinD

Posted by Polin on Sun, Dec 8, 2024

在 KinD(Kubernetes in Docker) 中建立 LoadBalancer Service:使用 Cloud-Provider-KinD

KinD 是 Kubernetes 社區開發者最常用的本地集群工具之一,因為它基於 Docker,默認情況下並不支持 LoadBalancer 類型的 Service。而 Cloud-Provider-KinD 是一個專為 KinD 集群設計的插件,提供模擬的 LoadBalancer 功能,使開發者能夠更接近雲端環境進行測試。

先決條件

在開始之前,請確保您的 macOS 環境已經具備以下軟體:

  1. Homebrew:macOS 的套件管理工具,用來安裝其他必要軟體。

  2. KinD: 一種基於 Docker 的本地 Kubernetes 集群工具,用於在本地開發與測試 Kubernetes 工作負載。 可以透過 Homebrew 安裝:

    brew install kind
    

    更多詳細說明可參考 在本機用 KinD 建立 Kubernetes

  3. Golang: 使用 cloud-provider-kind,需要先安裝 Go (Golang) 開發環境,因為這個工具是用 Go 編寫的,並需要通過 Go 的包管理器進行安裝。

    brew install go
    

安裝 Cloud-Provider-KinD

下載並安裝 Cloud-Provider-KinD

Cloud-Provider-KinD 是一個獨立的二進制文件,需要在主機上運行,並連接到 KinD 集群。可以使用以下命令安裝:

go install sigs.k8s.io/cloud-provider-kind@latest

啟動 Cloud-Provider-KinD

sudo cloud-provider-kind

請注意,Cloud-Provider-KinD 需要獲取系統權限以打開端口並連接到容器運行時,因此需要使用 sudo。 啟動後,Cloud-Provider-KinD 會監控所有 KinD 集群中的 LoadBalancer 類型的服務,並為其配置對應的負載均衡器容器。

驗證配置

部署 LoadBalancer 類型的服務

現在,可以在 KinD 集群中創建 LoadBalancer 類型的服務。以下是一個範例,創建一個回顯 “foo” 的服務:

創建foo-service.yaml

cat > foo-service.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: foo-app
  labels:
    app: http-echo
spec:
  containers:
    - name: foo-app
      image: hashicorp/http-echo:0.2.3
      args:
        - "-text=foo"
---
apiVersion: v1
kind: Service
metadata:
  name: foo-service
spec:
  type: LoadBalancer
  selector:
    app: http-echo
  ports:
    - port: 5678
EOF
kubectl apply -f foo-service.yaml

使用cURL驗證服務

Cloud-Provider-KinD 會自動為該服務創建對應的負載均衡器容器,並分配一個外部 IP。可以使用以下命令查看服務的外部 IP:

kubectl get svc foo-service

成功後會顯示以下類似訊息

NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
foo-service   LoadBalancer   10.96.53.15   172.19.0.3    5678:31524/TCP   15s

一旦外部 IP 分配完成,可以使用 curl 測試服務

curl http://<EXTERNAL-IP>:5678

這邊範例的EXTERNAL-IP會變成是172.19.0.3

curl http://172.19.0.3:5678
foo

如果配置正確,應該會看到 “foo” 的響應。

參考

KinD 官網

Cloud-Provider-KinD Github網址