Kubernetes 使用microk8s从主机简单进入?
我想用MicroK8s做两件事:Kubernetes 使用microk8s从主机简单进入?,kubernetes,kubernetes-ingress,microk8s,Kubernetes,Kubernetes Ingress,Microk8s,我想用MicroK8s做两件事: 将主机(Ubuntu 18.04)端口80/443路由到Microk8s 使用文档中定义的简单入口 我的最终目标是创建一个位于Ubuntu主机上的单节点Kubernetes集群,然后使用入口将不同的域路由到服务中各自的pod 在过去的几天里,我一直在尝试用MicroK8来实现这一点,但我还是无法完全理解 到目前为止,我得到的最好的结果是使用创建一个负载平衡器。但这要求我使用本地网络上可用的免费IP地址,而不是主机IP地址 我还启用了默认http后端,并尝试导出
- 到目前为止,我得到的最好的结果是使用创建一个负载平衡器。但这要求我使用本地网络上可用的免费IP地址,而不是主机IP地址
- 我还启用了
,并尝试导出和编辑这些配置文件,但没有成功默认http后端
Minikube
上起作用,此示例显示群集IP上端口80处的基本Nginx服务器映像:
# ingress-service.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
# - host: nginx.ioo
- http:
paths:
- path: /
backend:
serviceName: nginx-cluster-ip-service
servicePort: 80
如果我理解正确的话,你可能会从以下几个方面来考虑 您已经提到过一个。
kubectl expose deploy nginx-deployment --port 80 --type LoadBalancer
为不在受支持的云提供商上运行的Kubernetes群集提供网络负载平衡器实现,有效地允许在任何群集内使用负载平衡器服务
您可以阅读详细的实现
另一种方法是
这种方法还有一些其他的局限性,我们应该注意:
- 源IP地址
ingress nginx
Pods以使用它们运行的主机的网络,而不是专用的网络名称空间。这种方法的好处是,NGINX入口控制器可以将端口80和443直接绑定到Kubernetes节点的网络接口,而无需NodePort服务施加额外的网络转换
您还必须记住,如果您在POD
内编辑配置,如果POD重新启动或崩溃,配置将消失
我希望这有助于您确定采用哪种方法来实现您的想法。当使用负载平衡器(又名metallb)时,几乎所有文档都缺少一个重要步骤:
入口控制器需要暴露于metallb负载平衡器。
kubectl expose deploy nginx-deployment --port 80 --type LoadBalancer
这也可以通过yaml完成,但其方式更易于使用cli
经过几天的谷歌搜索,我终于看到了这段教程视频,让我大开眼界
关于“到目前为止我得到的最好结果是使用MetalLB创建负载平衡器”的说法是错误的。您必须使用入口层进行主机流量路由
在裸机环境中,您需要配置MetalLB以允许从主机到k8s的传入连接
首先,我们需要一个测试:
curl -H "Host: nginx.ioo" http://HOST_IP
结果如何
microk8s.enable metallb:$(curl ipinfo.io/ip)-$(curl ipinfo.io/ip)
再次运行测试
如果网络出错,那么您就有问题了。检查主机连接
如果出现错误404(有时为503),则需要一个入口规则
# ingress-service.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.ioo
- http:
paths:
- path: /
backend:
serviceName: nginx-cluster-ip-service
servicePort: 80
最后一次测试。它应该会起作用
现在,您可以使用入口将不同的域路由到服务中各自的POD。如果您需要使用HTTPS和身份验证公开服务,这可能会变得相当复杂,因为您需要配置a)入口,b)TLS证书服务-即使用Lets加密,c)身份验证代理,d)在应用程序中实现用户授权 如果您的K8S群集运行在没有公共IP的服务器上,这会带来额外的复杂性,因为您需要穿透NAT 演示如何使用Kubernetes Dashboard作为示例服务,通过OAuth身份验证和授权,将运行在microk8s群集(没有公共IP)上的k8s服务安全地公开为可公开访问的HTTPS。TLDR 将注释更新为
kubernetes.io/ingres.class:public
为什么?
对于MicroK8s v1.21,正在运行
microk8s enable ingress
将在ingres
命名空间中创建名为nginx-ingres-microk8s-controller
的守护程序集
如果检查,则有一个标志用于设置入口等级:
- args:
... omitted ...
- --ingress-class=public
... omitted ...
因此,为了在线处理大多数示例,您需要
删除--ingres class=public
参数,使其默认为nginx
更新注释如kubernetes.io/ingres.class:nginx
tokubernetes.io/ingres.class:public
建议将ingres.class
从nginx
更改为public
,并将DNS条目(使用我的外部提供商控制台)从*
设置为我的公共IP(不是主机名),这是复制Openshift样式路由
(也称为“基于名称的虚拟主机”)的两个充分条件在安装在金属上的microk8s下
- 更多信息
尽管没有安装MetalLB,但所有pod副本之间的负载平衡工作正常(从gcr.io/google samples/hello app的输出可以看出)。由于入口控制器自动生成的自签名证书,甚至HTTPS也可以开箱即用。说到ingress nginx
您可以使用microk8s启用入口。启用入口
,然后在入口资源定义中使用您的机器(节点)ip地址,例如主机:myapp.192-168-0-1.nip.io
,其中1
- args:
... omitted ...
- --ingress-class=public
... omitted ...