跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Edge 文档 / 操作指南 / Kubernetes API 服务器前面的 MetalLB

20 Kubernetes API 服务器前面的 MetalLB

本指南演示如何使用 MetalLB 服务在包含三个控制平面节点的 HA K3s 群集上向外部公开 K3s API。为此,需要手动创建类型为 LoadBalancer 的 Kubernetes 服务,并创建端点。端点保留群集中所有控制平面节点的 IP。为了使端点与群集中发生的事件(添加/去除节点或节点脱机)持续保持同步,需要部署 Endpoint Copier Operator。该操作器监控默认 kubernetes 端点中发生的事件,并自动更新受管服务以使其保持同步。由于受管服务的类型为 LoadBalancer,因此 MetalLB 为其分配了静态 ExternalIP。此 ExternalIP 用于与 API 服务器通讯。

20.1 先决条件

  • 要在其上部署 K3s 的三台主机。

    • 请确保这些主机的主机名不同。

    • 对于测试目的,这些主机可以是虚拟机

  • 网络中至少有 2 个可用 IP(一个用于 Traefik,另一个用于受管服务)。

  • Helm

20.2 安装 K3s

注意
注意

如果您不想创建新群集,而是想要使用现有群集,请跳过此步骤并转到下一步。

首先,必须在网络中预留一个可用 IP,该 IP 稍后将用作受管服务的 ExternalIP

通过 SSH 连接到第一台主机并以群集模式安装 K3s,如下所示:

# Export the free IP mentioned above
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --cluster-init \
 --disable=servicelb --write-kubeconfig-mode=644 --tls-san=${VIP_SERVICE_IP} \
 --tls-san=https://${VIP_SERVICE_IP}.sslip.io" K3S_TOKEN=foobar sh -
注意
注意

确保在 k3s server 命令中提供 --disable=servicelb 标志。

重要
重要

从现在开始,应在本地计算机上运行命令。

要从外部访问 API 服务器,需使用 K3s VM 的 IP。

# Replace <node-ip> with the actual IP of the machine
export NODE_IP=<node-ip>
scp ${NODE_IP}:/etc/rancher/k3s/k3s.yaml ~/.kube/config && sed \
 -i '' "s/127.0.0.1/${NODE_IP}/g" ~/.kube/config && chmod 600 ~/.kube/config

20.3 配置现有的 K3s 群集

注意
注意

仅当您要使用现有的 K3s 群集时,此步骤才有效。

要使用现有的 K3s 群集,应禁用 servicelb LB 并修改 tls-san 标志。

要更改 K3s 标志,应在群集中的所有 VM 上修改 /etc/systemd/system/k3s.service

标志应插入到 ExecStart 中。例如:

# Replace the <vip-service-ip> with the actual ip
ExecStart=/usr/local/bin/k3s \
    server \
        '--cluster-init' \
        '--write-kubeconfig-mode=644' \
        '--disable=servicelb' \
        '--tls-san=<vip-service-ip>' \
        '--tls-san=https://<vip-service-ip>.sslip.io' \

然后应执行以下命令,让 K3s 加载新配置:

systemctl daemon-reload
systemctl restart k3s

20.4 安装 MetalLB

要部署 MetalLB,可以使用 K3s 上的 MetalLB 指南。

注意:确保 ip-pool IPAddressPool 的 IP 地址不与先前为 LoadBalancer 服务选择的 IP 地址重叠。

单独创建一个仅供受管服务使用的 IpAddressPool

# Export the VIP_SERVICE_IP on the local machine
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: kubernetes-vip-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - ${VIP_SERVICE_IP}/32
  serviceAllocation:
    priority: 100
    namespaces:
      - default
EOF
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: ip-pool-l2-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - ip-pool
  - kubernetes-vip-ip-pool
EOF

20.5 安装 Endpoint Copier Operator

helm repo add endpoint-copier-operator \
 https://suse-edge.github.io/endpoint-copier-operator

helm install --create-namespace -n endpoint-copier-operator \
 endpoint-copier-operator endpoint-copier-operator/endpoint-copier-operator

以上命令将在群集中部署三个不同的资源:

  1. 包含两个复本的 endpoint-copier-operator 操作器部署。其中一个复本是领导者,另一个复本在需要时接管领导者角色。

  2. default 名称空间中名为 kubernetes-vip 的 Kubernetes 服务,它是 kubernetes 服务的副本,但类型为 LoadBalancer

  3. default 名称空间中名为 kubernetes-vip 的端点资源,它是 kubernetes 端点的副本。

校验 kubernetes-vip 服务是否使用正确的 IP 地址:

kubectl get service kubernetes-vip -n default \
 -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'

确保 default 名称空间中的 kubernetes-vipkubernetes 端点资源指向相同的 IP。

kubectl get endpoints kubernetes kubernetes-vip

如果所有设置正确,剩下的最后一项操作就是在 Kubeconfig 中使用 VIP_SERVICE_IP

sed -i '' "s/${NODE_IP}/${VIP_SERVICE_IP}/g" ~/.kube/config

从现在开始,所有 kubectl 命令都将通过 kubernetes-vip 服务运行。

20.6 添加控制平面节点

要监控整个过程,可以打开另外两个终端选项卡。

第一个终端:

watch kubectl get nodes

第二个终端:

watch kubectl get endpoints

现在,在第二和第三个节点上执行以下命令。

# Export the VIP_SERVICE_IP in the VM
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
 --server https://${VIP_SERVICE_IP}:6443 --disable=servicelb \
 --write-kubeconfig-mode=644" K3S_TOKEN=foobar sh -