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