標準:使用 NLB 1.0 設定基本負載平衡
版本 1.0 NLB 僅可在經典叢集中建立,無法在 VPC 叢集中建立。 若要平衡 VPC 叢集裡的負載,請參閱使用 VPC 的負載平衡器公開應用程式。
公開埠並使用可攜式 IP 位址,讓第 4 層網路負載平衡器 (NLB) 可以公開容器化應用程式。 如需 1.0 版 NLB 的相關資訊,請參閱 NLB 1.0 的元件和架構。
在多區域叢集裡設定 NLB 1.0
開始之前
-
若要在多個區域中建立公用網路負載平衡器 (NLB),則必須至少有一個公用 VLAN 在每個區域中都具有可用的可攜式子網路。 若要在多個區域中建立專用 NLB,則必須至少有一個專用 VLAN 在每個區域中都具有可用的可攜式子網路。 您可以遵循配置叢集子網路中的步驟,來新增子網路。
-
為 IBM Cloud 基礎架構帳戶啟用虛擬路由器功能 (VRF)。 若要啟用 VRF,請參閱 啟用 VRF。 若要檢查是否已啟用 VRF,請使用
ibmcloud account show指令。 如果您無法或不想啟用 VRF,請啟用 VLAN Spanning。 當啟用 VRF 或 VLAN 跨域功能時,NLB 1.0 即可將封包路由至該帳戶中的各個子網。 -
請確保您已安裝適用於
default命名空間的 作家 或 經理 IBM Cloud IAM 服務存取角色。 -
確定您具有必要的工作者節點數目:
- 標準叢集:如果您將網路資料流量限制為邊緣工作者節點,請確定在每個區域中至少啟用兩個邊緣工作者節點,以統一部署 NLB。
-
當重新載入叢集節點時,或當叢集主節點更新項目包含新的
keepalived映像檔時,負載平衡器虛擬 IP 會移至新節點的網路介面。 發生此情況時,必須重新建立與負載平衡器的任何長時間連線。 請考慮在應用程式中併入重試邏輯,以便快速嘗試重新建立連線。
若要在多區域叢集裡設定 NLB 1.0 服務,請執行下列動作:
-
將應用程式部署至叢集。 請務必在部署配置檔的 metadata 區段中新增標籤。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。
-
為您要公開至公用網際網路或專用網路的應用程式建立負載平衡器服務。
- 例如,建立名稱為
myloadbalancer.yaml的服務配置檔。 - 為您要公開的應用程式定義負載平衡器服務。 您可以指定區域、VLAN 及 IP 位址。
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>" service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> ``` `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type` : 用於指定 `private` 或 `public` 負載平衡器的註解。 若未指定此註解,且您的工作節點已連接到公共 VLAN,系統將建立一個公共的 `LoadBalancer` 服務。 如果工作者節點僅連接至專用 VLAN,則將建立專用 `LoadBalancer` 服務。 `service.kubernetes.io/ibm-load-balancer-cloud-provider-zone` : 用來指定負載平衡器服務要部署至其中之區域的註釋。 若要查看區域,請執行 `ibmcloud ks zone ls`。 `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan` : 用來指定負載平衡器服務要部署至其中之 VLAN 的註釋。 若要檢視 VLAN,請執行 `ibmcloud ks vlan ls --zone <zone>`。 `selector` : 您在應用程式部署 YAML 檔案的 `spec.template.metadata.labels` 區段中使用的標籤鍵(`<selector_key>` )與值(`<selector_value>` )。 `port` : 服務所接聽的埠。 `loadBalancerIP` : 選用項目:若要建立專用負載平衡器,或針對公用負載平衡器使用特定的可攜式 IP 位址,請指定您要使用的 IP 位址。 IP 位址必須位於您在註釋中指定的 VLAN 和區域上。 若未指定 IP 位址: : 如果叢集是在公用 VLAN 上,則會使用可攜式公用 IP 位址。 大部分叢集都在公用 VLAN 上。 : 如果叢集只能在專用 VLAN 上使用,則會使用可攜式專用 IP 位址。 這個配置檔範例用來建立專用 NLB 1.0 服務,其會使用 `2234945` 中專用 VLAN `dal12` 上指定的 IP 位址: ```yaml {: codeblock} apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945" spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: 172.21.xxx.xxx ``` 3. 可選:透過在「`spec.loadBalancerSourceRanges`」欄位中指定 IP 位址,將您的 NLB 服務的可用範圍限制在特定 IP 位址範圍內。`loadBalancerSourceRanges` 是由您叢集中的 `kube-proxy` 透過在工作節點上套用 iptables 規則來實現的。 如需更多資訊,請參閱 [Kubernetes 的文件](https://kubernetes.io/docs/concepts/services-networking/){: external}。 4. 在叢集裡建立服務。 ```sh {: pre} kubectl apply -f myloadbalancer.yaml ``` - 例如,建立名稱為
-
驗證已順利建立 NLB 服務。 這可能需要幾分鐘的時間,才能建立服務,並讓應用程式可供使用。
kubectl describe service myloadbalancer輸出範例:
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Zone: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancer -
如果您已建立公用 NLB,請從網際網路存取您的應用程式。
- 開啟偏好的 Web 瀏覽器。
- 輸入 NLB 的可攜式公用 IP 位址及埠。
http://169.xx.xxx.xxx:8080 ``` -
重複步驟 2 至 4,在每個區域中新增一個 1.0 NLB 實例。
-
如果您選擇針對 NLB 1.0 啟用來源 IP 保留,請將邊緣節點親緣性新增至應用程式 Pod,來確保在邊緣工作者節點上排定應用程式 Pod。 必須在邊緣節點上排定應用程式 Pod,才能接收送入要求。
-
選用項目:負載平衡器服務也可讓您的應用程式透過服務的 NodePort 提供使用。 叢集內每個節點的每個公用及專用 IP 位址上都可以存取 NodePort。 若要在使用 NLB 服務時封鎖流向 NodePort 的資料流量,請參閱控制網路負載平衡器 (NLB) 或 NodePort 服務的入埠資料流量。
接下來,您可以登錄 NLB 子網域。
在單一區域叢集裡設定 NLB 1.0
開始之前
-
您必須具有可指派給網路負載平衡器 (NLB) 服務的可用可攜式公用或專用 IP 位址。 如需相關資訊,請參閱配置叢集的子網路。
-
請確保您已安裝適用於
default命名空間的 作家 或 經理 IBM Cloud IAM 服務存取角色。 -
當重新載入叢集節點時,或當叢集主節點更新項目包含新的
keepalived映像檔時,負載平衡器虛擬 IP 會移至新節點的網路介面。 發生此情況時,必須重新建立與負載平衡器的任何長時間連線。 請考慮在應用程式中併入重試邏輯,以便快速嘗試重新建立連線。
若要在單一區域叢集裡建立 NLB 1.0 服務,請執行下列動作:
-
將應用程式部署至叢集。 請務必在部署配置檔的 metadata 區段中新增標籤。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。
-
為您要公開至公用網際網路或專用網路的應用程式建立負載平衡器服務。
-
例如,建立名稱為
myloadbalancer.yaml的服務配置檔。 -
為您要公開的應用程式定義負載平衡器服務。
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> ``` `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type` : 用於指定 `private` 或 `public` 負載平衡器的註解。 `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan` : 用來指定負載平衡器服務要部署至其中之 VLAN 的註釋。 若要檢視 VLAN,請執行 `ibmcloud ks vlan ls --zone <zone>`。 `selector` : 您在應用程式部署 YAML 檔案的 `spec.template.metadata.labels` 區段中使用的標籤鍵(`<selector_key>` )與值(`<selector_value>` )。 `port` : 服務所接聽的埠。 `loadBalancerIP` : 選用項目:若要建立專用負載平衡器,或針對公用負載平衡器使用特定的可攜式 IP 位址,請指定您要使用的 IP 位址。 IP 位址必須位於您在註釋中指定的 VLAN 上。 若未指定 IP 位址: : 如果叢集是在公用 VLAN 上,則會使用可攜式公用 IP 位址。 大部分叢集都在公用 VLAN 上。 : 如果叢集只能在專用 VLAN 上使用,則會使用可攜式專用 IP 位址。 這個配置檔範例用來建立專用 NLB 1.0 服務,其會使用專用 VLAN `2234945` 上指定的 IP 位址: ```yaml {: codeblock} apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945" spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: 172.21.xxx.xxx ``` 3. 可選:透過在「`spec.loadBalancerSourceRanges`」欄位中指定 IP 位址,將您的 NLB 服務的可用範圍限制在特定 IP 位址範圍內。`loadBalancerSourceRanges` 是由您叢集中的 `kube-proxy` 透過在工作節點上套用 iptables 規則來實現的。 如需更多資訊,請參閱 [Kubernetes 的文件](https://kubernetes.io/docs/concepts/services-networking/){: external}。 4. 在叢集裡建立服務。 ```sh {: pre} kubectl apply -f myloadbalancer.yaml ``` -
-
驗證已順利建立 NLB 服務。 這可能需要幾分鐘的時間,才能建立服務,並讓應用程式可供使用。
kubectl describe service myloadbalancer輸出範例:
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Location: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancerLoadBalancer Ingress IP 位址是已指派給 NLB 服務的可攜式 IP 位址。
-
如果您已建立公用 NLB,請從網際網路存取您的應用程式。
- 開啟偏好的 Web 瀏覽器。
- 輸入 NLB 的可攜式公用 IP 位址及埠。
http://169.xx.xxx.xxx:8080 ``` -
如果您選擇針對 NLB 1.0 啟用來源 IP 保留,請將邊緣節點親緣性新增至應用程式 Pod,來確保在邊緣工作者節點上排定應用程式 Pod。 必須在邊緣節點上排定應用程式 Pod,才能接收送入要求。
-
選用項目:負載平衡器服務也可讓您的應用程式透過服務的 NodePort 提供使用。 叢集內每個節點的每個公用及專用 IP 位址上都可以存取 NodePort。 若要在使用 NLB 服務時封鎖流向 NodePort 的資料流量,請參閱控制網路負載平衡器 (NLB) 或 NodePort 服務的入埠資料流量。
接下來,您可以登錄 NLB 子網域。
啟用來源 IP 保留
此特性僅適用於 1.0 版網路負載平衡器 (NLB)。 在 2.0 版 NLB 中,依預設會保留用戶端要求的來源 IP 位址。
將應用程式的用戶端要求傳送至叢集時,負載平衡器服務 Pod 會接收此要求。 如果與負載平衡器服務 Pod 位於同一工作節點上沒有任何應用程式 Pod,則 NLB 會將請求轉發至另一個工作節點。 該請求的來源 IP 位址已變更為執行負載平衡器服務 Pod 的工作節點之公開 IP 位址。
若要保留客戶端請求的原始來源 IP 位址,您可以為負載平衡服務 啟用來源 IP 功能。 TCP 連線會繼續一路連線至應用程式 Pod,讓應用程式可以看到起始器的實際來源 IP 位址。 舉例來說,當應用程式伺服器必須套用安全及存取控制原則時,保留用戶端的 IP 是很有用的。
在啟用來源 IP 之後,負載平衡器服務 Pod 必須將要求轉遞至僅部署至相同工作者節點的應用程式 Pod。 一般而言,負載平衡器服務 Pod 也會部署至應用程式 Pod 部署至其中的工作者節點。 不過,存在某些狀況,可能未在相同的工作者節點上排定負載平衡器 Pod 及應用程式 Pod。
- 您的邊緣節點已有污點,因此只有負載平衡器服務 Pod 可以部署至其中。 不允許將應用程式 Pod 部署至那些節點。
- 您的叢集連接至多個公用或專用 VLAN,但您的應用程式 Pod 可能部署至僅連接至某個 VLAN 的工作者節點。 負載平衡器服務 Pod 可能未部署至那些工作者節點,因為 NLB IP 位址連接至與工作者節點不同的 VLAN。
若要將您的應用程式強制部署至負載平衡器服務 Pod 也可以部署至其中的特定工作者節點,您必須將親緣性規則及容忍新增至您的應用程式部署。
新增邊緣節點親緣性規則及容忍
當您 將工作節點標記為邊緣節點,並同時 對這些邊緣節點設定污點時,負載平衡服務 Pod 只會部署到這些邊緣節點,而應用程式 Pod 則無法部署到邊緣節點。 當為 NLB 服務啟用來源 IP 功能時,邊緣節點上的負載平衡器 Pod 將無法將傳入的請求轉發至其他工作節點上的應用程式 Pod。
若要強制將應用程式的 Pod 部署至邊緣節點,請在應用程式部署中新增邊緣節點 親和性規則及 容錯設定。
具有邊緣節點親緣性及邊緣節點容忍的部署 YAML 檔案範例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: with-node-affinity
spec:
selector:
matchLabels:
<label_name>: <label_value>
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: dedicated
operator: In
values:
- edge
tolerations:
- key: dedicated
value: edge
...
affinity 和 tolerations 這兩部分,其「key」皆設定為 dedicated,而「value」則設定為 edge。
新增多個公用或專用 VLAN 的親緣性規則
當您的叢集連接至多個公用或專用 VLAN 時,您的應用程式 Pod 可能部署至僅連接至某個 VLAN 的工作者節點。 如果 NLB IP 位址連接至與這些工作者節點不同的 VLAN,則負載平衡器服務 Pod 不會部署至那些工作者節點。
啟用來源 IP 時,請將親緣性規則新增至應用程式部署,以在其 VLAN 與 NLB 的 IP 位址相同的工作者節點上排定應用程式 Pod。
開始之前:
請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
-
取得 NLB 服務的 IP 位址。 在 LoadBalancer Ingress 欄位中尋找 IP 位址。
kubectl describe service <loadbalancer_service_name> -
擷取 NLB 服務連接至其中的 VLAN ID。
- 列出叢集的可攜式公用 VLAN。
ibmcloud ks cluster get --cluster <cluster_name_or_ID> --show-resources ``` 輸出範例 ```sh {: screen} ... Subnet VLANs VLAN ID Subnet CIDR Public User-managed 2234947 10.xxx.xx.xxx/29 false false 2234945 169.36.5.xxx/29 true false ``` 2. 在 **Subnet VLANs** 下的輸出中,尋找符合您先前所擷取之 NLB IP 位址的子網路 CIDR,並記下 VLAN ID。 例如,如果 NLB 服務 IP 位址為 `169.36.5.xxx`,則前一個步驟之輸出範例中的相符子網路為 `169.36.5.xxx/29`。 子網路連接至其中的 VLAN ID 為 `2234945`。 -
針對上一步驟中記錄的 VLAN ID,在應用程式部署中 新增一則親和性規則。
比方說,如果您有數個 VLAN,但想要應用程式 Pod 僅部署至
2234945公用 VLAN 上的工作者節點,請執行下列指令:apiVersion: apps/v1 kind: Deployment metadata: name: with-node-affinity spec: selector: matchLabels: <label_name>: <label_value> template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: publicVLAN operator: In values: - "2234945" ...在 YAML 範例中,affinity 區段具有
publicVLAN作為key,以及具有"2234945"作為value。 -
套用已更新的部署配置檔。
kubectl apply -f with-node-affinity.yaml -
驗證部署至工作者節點的應用程式 Pod 是否已連接至指定的 VLAN。
- 列出叢集裡的 Pod。 請將「
<selector>」替換為您為該應用程式設定的標籤。
kubectl get pods -o wide app=<selector> ``` 輸出範例 ```sh {: screen} NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 10d 172.30.xxx.xxx 10.176.48.78 ``` 2. 在輸出中,識別應用程式的 Pod。 記下 Pod 所在之工作者節點的**節點** ID。 在前一個步驟的輸出範例中,應用程式 Pod `cf-py-d7b7d94db-vp8pq` 位於工作者節點 `10.176.48.78` 上。 3. 列出工作者節點的詳細資料。 ```sh {: pre} kubectl describe node <worker_node_ID> ``` 輸出範例 ```sh {: screen} NAME: 10.xxx.xx.xxx Role: Labels: arch=amd64 beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux failure-domain.beta.kubernetes.io/region=us-south failure-domain.beta.kubernetes.io/zone=dal10 ibm-cloud.kubernetes.io/encrypted-docker-data=true kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=2234945 publicVLAN=2234967 ... ``` 4. 在輸出的 **Labels** 區段中,驗證公用或專用 VLAN 是否為您在先前步驟中指定的 VLAN。 - 列出叢集裡的 Pod。 請將「