備註:
- 此教學課程位於 Oracle 提供的免費實驗室環境。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室之後,請將這些值取代為您雲端環境特有的值。
將 MetalLB 與 Oracle Cloud Native Environment 搭配使用
簡介
網路負載平衡器提供對外部公開 Kubernetes 應用程式的方法。Kubernetes LoadBalancer 服務用於建立網路負載平衡器,提供和公開可從叢集外連線至應用程式的外部 IP 位址。
MetalLB 是一個網路負載平衡器,適用於在裸機主機上執行的 Oracle Cloud Native Environment 上部署的 Kubernetes 應用程式。MetalLB 可讓您在裸機環境中傳統使用雲端提供者網路負載平衡器的 Kubernetes LoadBalancer 服務。
目標
本文件簡要說明如何使用 MetalLB 搭配 Oracle Cloud Native Environment 來設定及使用 MetalLB 模組進行 Kubernetes 應用程式。
必要條件
本節列出可執行本教學課程步驟的主機系統。若要成功,需要:
-
7 個 Oracle Linux 系統可用作:
- 運算子節點 (ocne-operator)
- 3 個 Kubernetes 控制層節點 (ocne-control01 、ocne-control02 、ocne-control03)
- 3 個 Kubernetes 工作節點 (ocne-worker01 、ocne-worker02 、ocne-worker03)
-
主要控制層節點的虛擬 IP 位址。此 IP 位址不應在任何節點上使用,且會動態指定給負載平衡器指定為主要控制器的控制層節點。
Oracle Support 免責聲明:如果您要部署至 Oracle Cloud Infrastructure,您的租用戶需要啟用 OCI:虛擬雲端網路 (VCN) 內 VLAN 的第 2 層網路新功能。雖然免費實驗室環境的租用戶未啟用此功能,但 OCI 第 2 層網路功能一般無法使用。
如果您有使用案例,請洽詢您的技術團隊,讓您的租用戶能夠使用此功能。 -
每個系統均應至少安裝下列項目:
- 安裝並執行 Unbreakable Enterprise Kernel Release 6 (UEK R6) 的最新 Oracle Linux 8 (x86_64)
-
這些系統上預先配置的設定如下:
- 具備
sudo權限的oracle使用者帳戶 - 每個節點間的無密碼 SSH
- 已安裝並設定 Oracle Cloud Native Environment
- 具備
設定實驗室環境
注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以瞭解連線和其他使用指示。
此實驗室涉及多個系統,每個系統都需要執行不同的步驟。建議您從開啟七個終端機視窗或頁籤開始,然後連線至每個節點。這樣可以避免您重複登入和登出。這些節點為:
- ocne-control01
- ocne-control02
- ocne-control03
- 餘弦運算子
- ocne-worker01
- ocne-worker02
- ocne-worker03
重要事項:免費實驗室環境會在提供的節點上部署完全安裝的 Oracle Cloud Native Environment。此部署在啟動後大約需要 25-30 分鐘完成。因此,您可能想要在此次執行時離開,然後返回以完成實驗室。
-
開啟終端機,並透過 ssh 連線至每個節點。
ssh oracle@<ip_address_of_ol_node>
驗證 Kubernetes 環境
-
(在任何控制層節點上) 驗證
kubectl可運作。kubectl get nodes範例輸出:
[oracle@ocne-control01 ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ocne-control01 Ready control-plane,master 22m v1.23.7+1.el8 ocne-control02 Ready control-plane,master 21m v1.23.7+1.el8 ocne-control03 Ready control-plane,master 20m v1.23.7+1.el8 ocne-worker01 Ready <none> 20m v1.23.7+1.el8 ocne-worker02 Ready <none> 19m v1.23.7+1.el8 ocne-worker03 Ready <none> 19m v1.23.7+1.el8 [oracle@ocne-control01 ~]$
設定工作節點
(在所有控制層和工作節點上) 設定網路連接埠。
sudo firewall-cmd --zone=public --add-port=7946/tcp --permanent
sudo firewall-cmd --zone=public --add-port=7946/udp --permanent
sudo firewall-cmd --reload
安裝 MetalLB 模組
下次安裝並驗證 MetalLB 模組。
在 ocne-operator 節點上:
-
建立 MetalLB 組態檔。
cat << 'EOF' | tee metallb-config.yaml address-pools: - name: default protocol: layer2 addresses: - 10.0.12.240-10.0.12.250 EOF -
檢視組態檔內容。
cat ~/myenvironment.yaml -
新增 Helm 和 MetalLB 模組至 Oracle Cloud Native Environment 組態檔。
cat << 'EOF' | tee -a ~/myenvironment.yaml - module: helm name: myhelm args: helm-kubernetes-module: mycluster - module: metallb name: mymetallb args: metallb-helm-module: myhelm helm-kubernetes-module: mycluster metallb-config: /home/oracle/metallb-config.yaml EOF -
確認 Helm 和 MetalLB 模組已新增至 myenviroment.yaml 檔案。
cat ~/myenvironment.yaml -
建立模組。
olcnectl module create --config-file myenvironment.yaml範例輸出:
[oracle@ocne-operator ~]$ olcnectl module create --config-file myenvironment.yaml Modules created successfully. Modules created successfully. Modules created successfully. [oracle@ocne-operator ~]$ -
驗證模組。
olcnectl module validate --config-file myenvironment.yaml範例輸出:
[oracle@ocne-operator ~]$ olcnectl module validate --config-file myenvironment.yaml Validation of module mycluster succeeded. Validation of module myhelm succeeded. Validation of module mymetallb succeeded. [oracle@ocne-operator ~]$ -
安裝模組。
olcnectl module install --config-file myenvironment.yaml注意:這可能需要幾分鐘的時間才能完成。
範例輸出:
[oracle@ocne-operator ~]$ olcnectl module install --config-file myenvironment.yaml Modules installed successfully. Modules installed successfully. Modules installed successfully. [oracle@ocne-operator ~]$ -
顯示已安裝的模組。
olcnectl module instances --config-file myenvironment.yaml範例輸出:
[oracle@ocne-operator ~]$ olcnectl module instances --config-file myenvironment.yaml INSTANCE MODULE STATE 10.0.12.11:8090 node installed 10.0.12.12:8090 node installed 10.0.12.13:8090 node installed 10.0.12.21:8090 node installed 10.0.12.22:8090 node installed 10.0.12.23:8090 node installed mycluster kubernetes installed myhelm helm installed mymetallb metallb installed [oracle@ocne-operator ~]$
建立 Kubernetes 應用程式
在這個區段中,您會建立一個使用 LoadBalancer 服務的 Kubernetes 應用程式。
在任何控制層節點上:
-
建立 Kubernetes 應用程式。
tee echo-oci-lb.yml > /dev/null << 'EOF' --- apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment labels: app: echo1 spec: replicas: 2 selector: matchLabels: app: echo1 template: metadata: labels: app: echo1 spec: containers: - name: echoserver image: k8s.gcr.io/echoserver:1.4 ports: - containerPort: 80 --- kind: Service apiVersion: v1 metadata: name: echo-lb-service spec: selector: app: echo1 type: LoadBalancer ports: - name: http port: 80 targetPort: 8080 EOF -
建立服務。
kubectl create -f echo-oci-lb.yml範例輸出:
[oracle@ocne-control01 ~]$ kubectl create -f echo-oci-lb.yml deployment.apps/echo-deployment created service/echo-lb-service created [oracle@ocne-control01 ~]$ -
確認 Kubernetes 部署正在執行中。
kubectl get deployments範例輸出:
[oracle@ocne-control01 ~]$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE echo-deployment 2/2 2 2 3m15s [oracle@ocne-control01~]$ -
顯示 Kubernetes 服務目前執行中。
kubectl get svc範例輸出:
[oracle@ocne-control01 ~]$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo-lb-service LoadBalancer 10.111.72.49 10.0.12.240 80:31727/TCP 4m47s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 58m [oracle@ocne-control01 ~]$請注意,
echo-lb-serviceLoadBalancer 的EXTERNAL-IP具有 IP 位址 10.0.12.240 。此 IP 位址由 MetalLB 提供,是您可以用來連線至應用程式的外部 IP 位址。
測試部署
下一步是測試新部署的應用程式。由於 EXTERNAL-IP 值是由 MetalLB 動態佈建 (在此範圍 10.0.12.240-10.0.12.250 之間),前兩個步驟會將此動態值儲存為作業系統變數。
-
(在任何控制層節點上) 擷取指定的
EXTERNAL-IP位址。LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service) -
擷取指定的連接埠號碼。
LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service) -
確認這些變數儲存為環境變數。
echo $LB echo $LBPORT範例輸出:
[oracle@ocne-control01 ~]$ echo $LB 10.0.12.240 [oracle@ocne-control01 ~]$ echo $LBPORT 80 [oracle@ocne-control01 ~]$ -
使用
curl連線至部署的應用程式。curl -i -w "\n" $LB:$LBPORT範例輸出:
[oracle@ocne-control01 ~]$ curl -i -w "\n" $LB:$LBPORT HTTP/1.1 200 OK Server: nginx/1.10.0 Date: Wed, 10 Aug 2022 10:52:10 GMT Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive CLIENT VALUES: client_address=10.244.2.0 command=GET real path=/ query=nil request_version=1.1 request_uri=http://10.0.12.240:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=10.0.12.240 user-agent=curl/7.61.1 BODY: -no body in request- [oracle@ocne-control01 ~]$
從非 Kubernetes 主機測試
-
(在 ocne-operator 上) 此最後一個測試可確認 MetalLB 正在回應外部要求。
curl -v http://10.0.12.240:80範例輸出:
[oracle@ocne-operator ~]$ curl -v http://10.0.12.240:80 * Rebuilt URL to: http://10.0.12.240:80/ * Trying 10.0.12.240... * TCP_NODELAY set * Connected to 10.0.12.240 (10.0.12.240) port 80 (#0) > GET / HTTP/1.1 > Host: 10.0.12.240 > User-Agent: curl/7.61.1 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.10.0 < Date: Wed, 10 Aug 2022 11:38:08 GMT < Content-Type: text/plain < Transfer-Encoding: chunked < Connection: keep-alive < CLIENT VALUES: client_address=10.244.0.0 command=GET real path=/ query=nil request_version=1.1 request_uri=http://10.0.12.240:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=10.0.12.240 user-agent=curl/7.61.1 BODY: * Connection #0 to host 10.0.12.240 left intact [oracle@ocne-operator ~]$
這可確認 MetalLB 已正確設定、已部署應用程式並已順利接受要求。
其他相關資訊
- Oracle Cloud Native Environment 文件
- Oracle Cloud Native Environment 訓練
- Oracle Linux Learning 訂閱
- Oracle Linux 課程
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或是存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,造訪 education.oracle.com/learning-explorer 成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Use MetalLB with Oracle Cloud Native Environment
F61364-03
September 2022
Copyright © 2022, Oracle and/or its affiliates.