Appearance
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: 65010shell
kubectl create -f bpg-peer.yamlService 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-apiservershell
# ServiceのCIDR確認
kubectl -n kube-system get pod ${api-serverのPod名} -o jsonpath='{.spec.containers[0].command}' | jq . | grep service-cluster-ip-rangebgp-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.yamlVM
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.confini
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.confini
[Resolve]
DNS=${dns IP}
Domains=~cluster.local- サービスを再起動します:
shell
sudo systemctl restart systemd-resolvedsample-svc.default.svc.cluster.localなどのサービス名で疎通が取れます。