【问题标题】:Exposing Kubernetes cluster with MetalLB使用 MetalLB 公开 Kubernetes 集群
【发布时间】:2020-01-13 20:04:52
【问题描述】:

我有一个由一个主节点和 2 个工作节点组成的裸机集群。主节点有 2 个网络接口。其中一个网络接口分配了一个 PUBLIC_IP。

节点通过使用主节点中的第二个网络接口连接。如下:

kubeadm init --apiserver-advertise-address INTERNAL_MASTER_IP

然后,工人加入如下:

kubeadm join INTERNAL_MASTER_IP:6443 --token TOKEN --discovery-token-ca-cert-hash sha256:CERT

我已经安装了Weave,如下:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

到目前为止一切正常,状态如下:

kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
node0   Ready    master   3h44m   v1.17.0   PUBLIC_IP       <none>        Ubuntu 18.04.3 LTS   4.15.0-72-generic   docker://18.6.2
node1   Ready    <none>   3h40m   v1.17.0   10.6.129.228    <none>        Ubuntu 18.04.3 LTS   4.15.0-72-generic   docker://18.6.2
node2   Ready    <none>   3h40m   v1.17.0   10.6.129.47     <none>        Ubuntu 18.04.3 LTS   4.15.0-72-generic   docker://18.6.2

我正在尝试通过 PUBLIC_IP 公开服务。为此,我按如下方式安装了 MetalLB:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

ConfigMap如下:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - PUBLIC_IP

NGINX 部署如下:

kubectl run nginx --image=nginx --port=80
kubectl expose deployment nginx --type=LoadBalancer --name=nginx-service

但是,结果如下:

kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           31m


kubectl get services
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP      10.96.0.1      <none>        443/TCP        3h50m
nginx-service   LoadBalancer   10.96.114.88   <pending>     80:31246/TCP   31m


kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5578584966-vkgvv   1/1     Running   0          32m`enter code here`


kubectl describe service nginx-service
Name:                     nginx-service
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP:                       10.96.114.88
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31246/TCP
Endpoints:                10.36.0.0:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

可以看出,外部IP还是pending。你有什么想法吗?提前谢谢你:)

【问题讨论】:

    标签: kubernetes nginx-ingress metallb


    【解决方案1】:

    您需要在 metallb 配置中提供 IP 地址 range。您提供给 metallb 的 IP 也应该是虚拟 IP。不应该有一个端点已经使用该 IP。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: metallb-system
      name: config
    data:
      config: |
        address-pools:
        - name: default
          protocol: layer2
          addresses:
          - PUBLIC_IP-PUBLIC_IP      ## This line
    

    【讨论】:

    • 感谢您的回答。我已经更改了我的 ConfigMap 设置 - 10.96.114.1-10.96.114.10 重复这个过程,EXTERNAL-IP 现在是 10.96.114.1,然后我可以从工人那里卷曲。但是,如何通过 PUBLIC_IP 从外部访问?
    • IP 地址 10.96.114.1 是否可以从外部路由到您的集群?在第 2 层模式下,您提供给 metallb 的虚拟 IP 应该可以路由到集群网络。这意味着所有节点 IP 和额外的虚拟 IP 应该在同一个子网中 - shashankv.in/kubernetes/metallb-layer2-mode
    • 我在master中有2个网络接口。我将“- 10.6.129.1-10.6.129.10”设置为范围(在第二个以太网卡的范围内)并暴露了NGINX: $ kubectl run nginx --image=nginx --port=80 $ kubectl expose deployment nginx -- type=LoadBalancer --name=nginx-service 我可以从worker(curl 10.6.129.1)curl服务获取NGINX对应的默认404页面,但不能从master获取。我不知道为什么。也许两个网络接口。同时,我想通过我的公共IP从集群外部访问,但我不知道如何:(
    • 10.6.129.1是你第二个网卡上配置的IP吗?您可以使用此 ip 从您的桌面访问您的服务器吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2019-01-05
    • 1970-01-01
    • 2021-12-21
    • 2022-11-22
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多