Skip to content

BGPでVMからKubernetesクラスタに疎通をとる ​

KubernetesのCNIをCalicoで実装した上で、BGPを使ってクラスタ外のVMからServiceに疎通をとります。

設定 ​

Kubernetesクラスタ ​

グローバルBGPピア作成 ​

クラスタに対して疎通を取りたいVMとピアリングをする設定を入れます。

cf. https://docs.tigera.io/calico/latest/networking/configuring/bgp

  • bpg-peer.yamlを下記で作成します:
yaml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: global-peer
spec:
  peerIP: ${疎通元VMのIP}
  asNumber: 65010
shell
kubectl create -f bpg-peer.yaml

Service CIDRをCalicoからBGPで広告 ​

KubernetesネットワークをBGPで広告します。

cf. https://docs.tigera.io/calico/latest/reference/resources/bgpconfig

  • ServiceのCIDRを確認します:
shell
# api-serverのPod名確認
kubectl get pods -n kube-system | grep kube-apiserver
shell
# ServiceのCIDR確認
kubectl -n kube-system get pod ${api-serverのPod名} -o jsonpath='{.spec.containers[0].command}' | jq . | grep service-cluster-ip-range
  • bgp-config.yamlを下記で作成します:
yaml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  asNumber: 65001
  serviceClusterIPs:
    - cidr: ${service-cluster-ip-range}
shell
kubectl create -f bgp-config.yaml

VM ​

bird設定 ​

cf. https://bird.nic.cz/doc/bird-3.3.2.html

  • birdをインストールします:
shell
sudo apt update
sudo apt install bird3
  • 設定ファイルを下記で作成します:
shell
sudo vim /etc/bird/bird.conf
ini
log syslog all;

protocol device {
}

protocol kernel {
    merge paths on;

    ipv4 {
        import none;
        export all;
    };
}

protocol direct {
    ipv4 {
        import all;
        export none;
    };
}

protocol bgp worker_node1 {
    local as 65010;
    neighbor ${worker-node01 IP} as 65001;

    ipv4 {
        import all;
        export none;
    };
}

protocol bgp worker_node2 {
    local as 65010;
    neighbor ${worker-node02 IP} as 65001;

    ipv4 {
        import all;
        export none;
    };
}
  • 構文チェックをします:
shell
sudo bird -p
  • サービスを起動します:
shell
sudo systemctl enable --now bird
  • セッションが確立しているかを確認します:
shell
sudo birdc show protocols | grep worker
$ sudo birdc show protocols | grep worker
worker_node1 BGP        ---        up     03:14:18.220  Established
worker_node2 BGP        ---        up     03:14:18.557  Established

この時点で、ServiceのCluster IPに対してVMから疎通をとることができます。

DNS設定 ​

  • kube-dns serviceのCluster IPを確認します:
shell
kubectl get svc -n kube-system | grep kube-dns
  • Service名で名前解決できるよう設定を追加します:
shell
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo vim /etc/systemd/resolved.conf.d/kubernetes.conf
ini
[Resolve]
DNS=${dns IP}
Domains=~cluster.local
  • サービスを再起動します:
shell
sudo systemctl restart systemd-resolved

sample-svc.default.svc.cluster.localなどのサービス名で疎通が取れます。