Kubernetes 外部ip始终<;无>;或<;待定>;在库伯内特斯

Kubernetes 外部ip始终<;无>;或<;待定>;在库伯内特斯,kubernetes,raspberry-pi3,nginx-ingress,Kubernetes,Raspberry Pi3,Nginx Ingress,最近,我开始使用一些树莓pi构建自己的kubernetes集群 我已经到了我有一个集群正在运行的地步 关于如何设置集群的一些背景信息,我使用 但是现在,当我想要部署和公开应用程序时,我会遇到一些问题 在kubernetes教程之后,我部署了nginx,运行良好。当我进行端口转发时,我可以在本地主机上看到默认的nginx页面 现在是棘手的部分,创建一个服务并通过入口将流量从internet路由到该服务 我已执行以下命令的 kubectl expose deployment/nginx --type

最近,我开始使用一些树莓pi构建自己的kubernetes集群

我已经到了我有一个集群正在运行的地步

关于如何设置集群的一些背景信息,我使用

但是现在,当我想要部署和公开应用程序时,我会遇到一些问题

在kubernetes教程之后,我部署了nginx,运行良好。当我进行端口转发时,我可以在本地主机上看到默认的nginx页面

现在是棘手的部分,创建一个服务并通过入口将流量从internet路由到该服务

我已执行以下命令的

kubectl expose deployment/nginx --type="NodePort" --port 80
kubectl expose deployment/nginx --type="Loadbalancer" --port 80
这些结果如下

NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          25h
nginx        NodePort    10.103.77.5   <none>        80:30106/TCP   7m50s
对于ip地址,我有
192.168.178.102
10.44.0.1

$ kubectl describe pod nginx-688b66fb9c-jtc98
Node:               k8s-worker-2/192.168.178.102
IP:                 10.44.0.1

但是当我用nodeport在浏览器中输入这些ip地址时,我仍然看不到nginx页面。我做错什么了吗?

您的任何工作节点的IP地址都将用于
NodePort
(或
LoadBalancer
)服务。发件人:

如果将
类型
字段设置为
节点端口
,则Kubernetes控制平面从
--服务节点端口范围
标志指定的范围(默认值:30000-32767)分配端口。每个节点将该端口(每个节点上的端口号相同)代理到您的服务中

如果您不知道这些IP地址
kubectl get nodes
可以告诉您;如果您计划定期给他们打电话,那么在集群前面设置负载平衡器或配置DNS(或两者兼而有之!)会很有帮助

在您的示例中,假设某个节点的IP地址为10.20.30.40(您直接登录到Raspberry PI并运行
ifconfig
,这是主机的地址);您可以在
http://10.20.30.40:31332


EXTERNAL-IP
字段永远不会填写
NodePort
服务,或者当您不在可以为您提供外部负载平衡器的云环境中时。这并不影响这种情况,对于这两种服务类型,您仍然可以直接调用节点上的端口。

由于您不在云提供商中,因此需要使用以使LoadBalancer功能正常工作

Kubernetes没有为裸机集群提供网络负载平衡器(LoadBalancer类型的服务)的实现。Kubernetes提供的网络LB的实现都是调用各种IaaS平台(GCP、AWS、Azure…)的粘合代码。如果您没有在受支持的IaaS平台(GCP、AWS、Azure…)上运行,则负载平衡器在创建时将无限期地保持“挂起”状态

裸机集群运营商只剩下两个较小的工具将用户流量引入其集群,“NodePort”和“externalIPs”服务。这两种选择对生产使用都有很大的不利影响,这使得裸机集群成为Kubernetes生态系统中的二等公民

MetalLB旨在通过提供与标准网络设备集成的网络LB实现来纠正这种不平衡,以便裸机集群上的外部服务也尽可能“正常工作”

MetalLB非常简单:

kubectl应用-fhttps://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

这将在MetalLB系统命名空间下将MetalLB部署到集群

您需要创建具有要使用的ip范围的configMap,请创建一个名为
metallb-cf.yaml
的文件:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250 <= Select the range you want.
参考资料:


我希望这能有所帮助。

如果我正确理解这一点,我可以使用MetalLB而不是ingress和nginx ingress控制器?或者两者兼得有用吗?(明天我会试试,如果对我有效的话,我会接受你的答案!)Metallb只需提供一个“抽象层”,将网络的ip分配给服务/入口。您可以同时拥有这两个节点,它们不会相互干扰。@Ricardo
ingress
只是
ingress controller
的一个配置片,它反过来可以部署在
NodePort
LoadBalancer
类型的服务上。通过
LoadBalancer
部署它将为您提供其所有优势,主要是单一的稳定VIP。现在,Ingress在HTTP级别上运行,为您提供了所有L7优势,如虚拟主机、URL重写、报头中的真实客户端IP等,这是负载平衡器无法单独为您提供的。所以有一个MetalLB和ingress肯定是有意义的:)目前,我正在努力让ingress控制器在pi上运行。因为这还不起作用。但我已经安装了金属lb,并提供了负载平衡器类型的入口服务。根据文档,应该有一个外部op。但事实并非如此。所以我一离开入口控制器就会发布更新issue@rabello我今晚或明天去看看这个。还没有时间玩我的集群。但是非常感谢你的帮助!非常感谢。期待今晚或明天接受的旗帜:)
$ kubectl describe pod nginx-688b66fb9c-jtc98
Node:               k8s-worker-2/192.168.178.102
IP:                 10.44.0.1
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250 <= Select the range you want.
sudo sysctl net.bridge.bridge-nf-call-iptables=1
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy