Kind – Load Balancer

graph TD

A[Load Balancer] --> B[Docker Network]
A --> C[Kind Cluster]
B --> D[Tuntap]
D --> E[Route]
C --> F[Create Cluster]
F --> G[MetalLB]

以下分兩部份說明,Docker Network是相關於網路部份,無論是使用k8s制訂的loadbalancer或是istio這類service mesh,我們都會需要這部份的操作,而Kind Cluster則是配合使用的k8s環境,Kind Cluster可重覆新建移除,但Docker Network只需要操作一次。

至於為什麼用Kind,主要是實際體驗比minikube好,這部份就不在此詳述。

Docker Network

在MacOS裡,host和docker bridge的網路是不能互通的,解決的方式是用一個已經不再維護的Project - tuntap,建一個模擬的網卡與tunnel將host與docker bridge連起來。

再將要往docker bridge的封包導到模擬的網卡。

Kind Cluster

在kind中要使用Load balancer需要裝相關的實作,MetalLB是其中的一個選擇,會採用MetalLB的主要原因是Kind的官方有詳細的說明,避免走冤枉路所以就用了,提供一組ip區段讓MetalLB做為pool,這樣kind就能正常提供load balancer的功能。

Tuntap

installation
brew cask install tuntap
download

自github 上的 docker-tuntap-osx 提供了將docker與tuntap連接起來所需要的script。

git clone https://github.com/AlmirKadric-Published/docker-tuntap-osx.git

Clone 後執行installup兩個shell.

./sbin/docker_tap_install.sh
./sbin/docker_tap_up.sh
verify

上列指令執行完成後,會新增一張名為tap1的網卡

> ifconfig

tap1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether e6:81:c5:c4:c7:27
    inet 10.0.75.1 netmask 0xfffffffc broadcast 10.0.75.3
    media: autoselect
    status: active
    open (pid 9994)
remove

如果之後不要了可以用uninstall移除。

./sbin/docker_tap_uninstall.sh
Modify Route

再來就是將要往docker bridge的封包導到剛才建立的的網卡tap1

check network
  1. 確認名為"kind"的network已存在
> docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
7b09c7531575   bridge    bridge    local
29ecd3095ae0   host      host      local
6ba80b8bccbe   kind      bridge    local
48359945082a   none      null      local
  1. 確認subnet範圍
> docker network inspect kind

[
    {
        "Name": "kind",
        "Id": "6ba80b8bccbe6475396b88f6a12ca0a2cb2f66f9fc26d88956a531094c755758",
        "Created": "2022-01-26T07:15:23.777898533Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                },
                {
                    "Subnet": "fc00:f853:ccd:e793::/64",
                    "Gateway": "fc00:f853:ccd:e793::1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
        },
        "Options": {
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

如果太複雜就用下列指令

> docker network inspect -f &#039;{{.IPAM.Config}}&#039; kind

[{172.18.0.0/16  172.18.0.1 map[]} {fc00:f853:ccd:e793::/64  fc00:f853:ccd:e793::1 map[]}]

可以得知kind使用的網段為172.18.0.0/16與Gateway為172.18.0.1

Add Route

再將kind使用的gateway接到先前用tuntap產生的網卡tap1

sudo route -v add -net 172.18.0.1 -netmask 255.255.0.0 10.0.75.2

如此就可以透過網卡tap1連到kind的內部網段

Metallb

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/master/manifests/namespace.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" 
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/master/manifests/metallb.yaml

Check network

> docker network inspect -f &#039;{{.IPAM.Config}}&#039; kind

[{172.18.0.0/16  172.18.0.1 map[]} {fc00:f853:ccd:e793::/64  fc00:f853:ccd:e793::1 map[]}]

再來決定LoadBalancer要用的IP Pool,這裡將172.18.0.150-172.18.0.200做為Pool使用的範圍。

將下列config map存為檔案後apply

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.18.0.150-172.18.0.200
k apply -f metallb_configmap.yaml

驗証

接下來可以參考Kind 官方文件 - Using LoadBalancer來測試結果

> k get services
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
foo-service   LoadBalancer   10.96.163.224   172.18.0.151   5678:31472/TCP   71s

看到EXTERNAL-IP有值就沒問題了。簡單用curl去呼叫,多call幾次會看到barfoo輪流出現。

> curl http://172.18.0.151:5678

bar
foo
bar

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料