k3s + MetalLB:metallb-controller 无法为“default/nginx”分配IP:没有可用的IP

Mar*_*ock 2 kubernetes kubernetes-ingress k3s metallb

我创建了一个 k3s 集群并禁用了服务负载均衡器和 traefik。我通过清单文件安装了 metallb。另外,我为 Metallb 创建了一个名为“config”的 ConfigMap,其中包含地址池,所以我不知道为什么 Metallb 控制器说“没有可用的 ips”。

ubuntu@mark:~$ k describe svc nginx
Name:                     nginx
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.43.29.17
IPs:                      10.43.29.17
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30584/TCP
Endpoints:                10.42.4.4:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason            Age   From                Message
  ----     ------            ----  ----                -------
  Warning  AllocationFailed  34s   metallb-controller  Failed to allocate IP for "default/nginx": no available IPs
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
      - name: default
    protocol: layer2
      addresses:
      - 192.168.136.206-192.168.136.209
Run Code Online (Sandbox Code Playgroud)

ffl*_*res 6

您正在使用 ConfigMap,而在文档中它说在较新的版本中您不应使用它:

以前版本的 MetalLB 可通过 configmap 进行配置。但是,从版本 v0.13.0 开始,只能通过 CR 进行配置。quay.io/metalb/configmaptocrs 下提供了一个将旧配置映射转换为 CR 的工具作为容器映像。

我也在做同样的事情,我有一个旧的存储库,我在其中使用了 ConfigMap,所以我决定重用它,但我阅读了文档并按照 MetalLB 网站的说明进行操作

安装中我执行了以下命令:

kubectl edit configmap -n kube-system kube-proxy

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
Run Code Online (Sandbox Code Playgroud)

,然后从配置中选择第 2 层配置设置。在 file.yaml 中添加以下代码:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250
Run Code Online (Sandbox Code Playgroud)

,然后使用 kubectl 应用它

kubectl apply -f file.yaml
Run Code Online (Sandbox Code Playgroud)

之后一切都很顺利。希望这个答案对那些使用旧方法的人有所帮助,如果我误解了,请纠正我。


小智 5

安装最新的稳定版本:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
Run Code Online (Sandbox Code Playgroud)

定义IP地址池

---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: nat
  namespace: metallb-system
spec:
  addresses:
    - 192.168.136.206-192.168.136.209
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system
Run Code Online (Sandbox Code Playgroud)