0

I have K0s in single node mode on AlmaLinux 9 (SELinux disabled). I'm trying to install MetalLB to expose apps via single external IP.

  • Public IP: 51.159.174.224
  • Private IP: 10.200.106.35

K0s config

[alma@scw-k8s ~]$ cat /etc/k0s/k0s.yaml
apiVersion: k0s.k0sproject.io/v1beta1
kind: ClusterConfig
metadata:
  creationTimestamp: null
  name: k0s
spec:
  api:
    address: 51.159.174.224
    k0sApiPort: 9443
    port: 6443
    sans:
    - 10.200.106.35
    - 10.244.0.1
    - 2001:bc8:1202:ca11::1
    - fe80::dc3c:54ff:fe06:5012
    - fe80::c8df:81ff:fe0d:811d
    - fe80::cc9e:7cff:fe1c:9da3
    - fe80::f80c:35ff:fefe:c5e2
    tunneledNetworkingMode: false
  controllerManager: {}
  extensions:
    helm:
      charts: null
      repositories: null
    storage:
      create_default_storage_class: true
      type: openebs_local_storage
  images:
    calico:
      cni:
        image: docker.io/calico/cni
        version: v3.24.1
      kubecontrollers:
        image: docker.io/calico/kube-controllers
        version: v3.24.1
      node:
        image: docker.io/calico/node
        version: v3.24.1
    coredns:
      image: docker.io/coredns/coredns
      version: 1.9.4
    default_pull_policy: IfNotPresent
    konnectivity:
      image: quay.io/k0sproject/apiserver-network-proxy-agent
      version: 0.0.32-k0s1
    kubeproxy:
      image: k8s.gcr.io/kube-proxy
      version: v1.25.2
    kuberouter:
      cni:
        image: docker.io/cloudnativelabs/kube-router
        version: v1.5.1
      cniInstaller:
        image: quay.io/k0sproject/cni-node
        version: 1.1.1-k0s.0
    metricsserver:
      image: k8s.gcr.io/metrics-server/metrics-server
      version: v0.6.1
    pushgateway:
      image: quay.io/k0sproject/pushgateway-ttl
      version: edge@sha256:7031f6bf6c957e2fdb496161fe3bea0a5bde3de800deeba7b2155187196ecbd9
  installConfig:
    users:
      etcdUser: etcd
      kineUser: kube-apiserver
      konnectivityUser: konnectivity-server
      kubeAPIserverUser: kube-apiserver
      kubeSchedulerUser: kube-scheduler
  konnectivity:
    adminPort: 8133
    agentPort: 8132
  network:
    calico: null
    clusterDomain: cluster.local
    dualStack: {}
    kubeProxy:
      mode: iptables
    kuberouter:
      autoMTU: true
      hairpinMode: false
      metricsPort: 8080
      mtu: 0
      peerRouterASNs: ""
      peerRouterIPs: ""
    podCIDR: 10.244.0.0/16
    provider: kuberouter
    serviceCIDR: 10.96.0.0/12
  scheduler: {}
  storage:
    etcd:
      externalCluster: null
      peerAddress: 10.200.106.35
    type: etcd
  telemetry:
    enabled: true
status: {}

MetalLB and nginx ingress controller are installed via Helm Charts:

  • MetalLB into metallb-system namespace
  • nginx-ingress-controller into default namespace:

metallb-system namespace has all needed annotations:

enter image description here

I've created ConfigMap with allocation addresses:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: production-public-ips
      protocol: layer2
      addresses:
      - 51.159.174.224

Added a new service:

...
---
apiVersion: v1
kind: Service
metadata:
  name: web-server-service
  namespace: web
  annotations:
    metallb.universe.tf/address-pool: production-public-ips
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

But services with LoadBalancer type can't get any external IP:

➜  kubectl get services --all-namespaces
NAMESPACE        NAME                                                  TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
default          kubernetes                                            ClusterIP      10.96.0.1       <none>        443/TCP                      28h
default          nginx-ingress-controller-1664428090                   LoadBalancer   10.104.57.67    <pending>     80:30762/TCP,443:30274/TCP   13h
default          nginx-ingress-controller-1664428090-default-backend   ClusterIP      10.103.23.177   <none>        80/TCP                       13h
kube-system      kube-dns                                              ClusterIP      10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP       28h
kube-system      metrics-server                                        ClusterIP      10.101.214.5    <none>        443/TCP                      28h
metallb-system   metallb-webhook-service                               ClusterIP      10.105.95.57    <none>        443/TCP                      14h
web              web-server-service                                    LoadBalancer   10.110.222.82   <pending>     80:31936/TCP                 2m4s

Any ideas, why LoadBalancer services can't get external IPs? Thank you.

f1nn
  • 6,989
  • 24
  • 69
  • 92

1 Answers1

1

No ideas and I don't think this will work but can you try 51.159.174.224/32 at ConfigMap instead of 51.159.174.224.