備註:

將 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 應用程式。

必要條件

本節列出可執行本教學課程步驟的主機系統。若要成功,需要:

設定實驗室環境

注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以瞭解連線和其他使用指示。

此實驗室涉及多個系統,每個系統都需要執行不同的步驟。建議您從開啟七個終端機視窗或頁籤開始,然後連線至每個節點。這樣可以避免您重複登入和登出。這些節點為:

重要事項:免費實驗室環境會在提供的節點上部署完全安裝的 Oracle Cloud Native Environment。此部署在啟動後大約需要 25-30 分鐘完成。因此,您可能想要在此次執行時離開,然後返回以完成實驗室。

  1. 開啟終端機,並透過 ssh 連線至每個節點。

    ssh oracle@<ip_address_of_ol_node>
    

驗證 Kubernetes 環境

  1. (在任何控制層節點上) 驗證 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 節點上:

  1. 建立 MetalLB 組態檔。

    cat << 'EOF' | tee metallb-config.yaml
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.0.12.240-10.0.12.250
    EOF
    
  2. 檢視組態檔內容。

    cat ~/myenvironment.yaml
    
  3. 新增 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
    
  4. 確認 HelmMetalLB 模組已新增至 myenviroment.yaml 檔案。

    cat ~/myenvironment.yaml
    
  5. 建立模組。

    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 ~]$
    
  6. 驗證模組。

    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 ~]$
    
  7. 安裝模組。

    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 ~]$
    
  8. 顯示已安裝的模組。

    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 應用程式。

任何控制層節點上:

  1. 建立 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
    
  2. 建立服務。

    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 ~]$ 
    
  3. 確認 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~]$
    
  4. 顯示 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-service LoadBalancer 的 EXTERNAL-IP 具有 IP 位址 10.0.12.240 。此 IP 位址由 MetalLB 提供,是您可以用來連線至應用程式的外部 IP 位址。

測試部署

下一步是測試新部署的應用程式。由於 EXTERNAL-IP 值是由 MetalLB 動態佈建 (在此範圍 10.0.12.240-10.0.12.250 之間),前兩個步驟會將此動態值儲存為作業系統變數。

  1. (在任何控制層節點上) 擷取指定的 EXTERNAL-IP 位址。

    LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
    
  2. 擷取指定的連接埠號碼

    LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
    
  3. 確認這些變數儲存為環境變數。

    echo $LB
    echo $LBPORT
    

    範例輸出:

    [oracle@ocne-control01 ~]$ echo $LB
    10.0.12.240
    [oracle@ocne-control01 ~]$ echo $LBPORT
    80
    [oracle@ocne-control01 ~]$
    
  4. 使用 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 主機測試

  1. (在 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 已正確設定、已部署應用程式並已順利接受要求。

其他相關資訊

其他學習資源

瀏覽 docs.oracle.com/learn 的其他實驗室,或是存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,造訪 education.oracle.com/learning-explorer 成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center