我想对MicroK8做两件事:
我的最终目标是创建一个位于Ubuntu主机上的单节点Kubernetes集群,然后使用入口将不同的域路由到服务中各自的Pod。
在过去的几天里,我一直在尝试使用Microk8s进行此操作,但是无法将其包裹住。
到目前为止,我得到的最好的结果是使用MetalLB创建负载均衡器。但这要求我使用本地网络上可用的免费IP地址,而不是主机IP地址。
我还启用了default-http-backend
,并尝试导出和编辑这些配置文件,但均未成功。
作为示例,一旦启用了入口添加功能,它将在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
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
component: nginx
template:
metadata:
labels:
component: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
# nginx-cluster-ip-service
apiVersion: v1
kind: Service
metadata:
name: nginx-cluster-ip-service
spec:
type: ClusterIP
selector:
component: nginx
ports:
- port: 80
targetPort: 80
答案 0 :(得分:6)
更新注解为 kubernetes.io/ingress.class: public
对于 MicroK8s v1.21,运行
microk8s enable ingress
将在 DaemonSet
命名空间中创建一个名为 nginx-ingress-microk8s-controller
的 ingress
。
如果你检查一下,有一个标志来设置入口类:
- args:
... omitted ...
- --ingress-class=public
... omitted ...
因此,为了处理大多数在线示例,您需要
--ingress-class=public
参数,使其默认为 nginx
kubernetes.io/ingress.class: nginx
为 kubernetes.io/ingress.class: public
答案 1 :(得分:2)
如果我对您的理解正确,可能有几种看待方式。
一个就是您已经提到的MetalLB。
MetalLB为不在受支持的云提供程序上运行的Kubernetes群集提供了网络负载平衡器实现,从而有效地允许在任何群集中使用LoadBalancer Services。
您可以阅读详细的实现A pure software solution: MetalLB
另一种方法是Over a NodePort Service
这种方法还应注意其他一些限制:
- 源IP地址
类型为NodePort的服务默认情况下执行source address translation。这意味着从NGINX的角度来看,HTTP请求的源IP总是接收到请求的Kubernetes节点的IP地址。
您还可以使用host network
在没有可用的外部负载平衡器但不能使用NodePorts的设置中,可以配置
ingress-nginx
Pod以使用其运行的主机的网络,而不是专用的网络名称空间。这种方法的好处是,NGINX Ingress控制器可以将端口80和443直接绑定到Kubernetes节点的网络接口,而无需NodePort Services施加额外的网络转换。
您还必须记住,如果您在POD
内编辑配置,那么如果Pod重新启动或崩溃,它将消失。
我希望这可以帮助您确定采用哪种方法。
答案 2 :(得分:1)
语句“到目前为止,我得到的最好的结果是使用MetalLB创建负载均衡器。”是错的。您必须使用入口层进行主机流量路由。
在裸机环境中,您需要配置MetalLB以允许从主机到k8s的传入连接。
首先我们需要测试:
curl -H "Host: nginx.ioo" http://HOST_IP
结果如何?
如果出现网络错误,则需要MetalLB
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
最后一次测试。应该可以。
现在,您可以使用入口将不同的域路由到服务中各自的容器。
答案 3 :(得分:0)
在使用LoadBalancer(又名 metallb )时,几乎所有文档都缺少重要的步骤:
入口控制器需要暴露在金属负载均衡器中。
kubectl expose deploy nginx-deployment --port 80 --type LoadBalancer
这也可以由Yaml完成,但使用cli更容易。
经过几天的搜索,我终于看到了这个教程视频,使我大开眼界。
答案 4 :(得分:0)
如果您需要通过HTTPS和身份验证公开公开服务,则可能会涉及其中,因为您需要配置a)入口,b)TLS证书服务-即使用Lets Encrypt,c)身份验证代理,d)实施用户授权在您的应用中。
如果您的K8S群集运行在没有公共IP的服务器上,则将带来更多的麻烦,因为您需要穿透NAT。
https://github.com/gwrun/tutorials/tree/main/k8s/pod演示了如何使用Kubernetes仪表板作为示例服务,以OAuth身份验证和授权将没有公共IP的microk8s集群上运行的k8s服务安全地公开为可公开访问的HTTPS。
答案 5 :(得分:0)
ingress.class
从 nginx
更改为 public
建议 here 并设置 DNS 条目(使用我的外部提供商的控制台)从 *
到我的公共IP(不是主机名)是在金属上安装的 route
下复制 Openshift 风格的 microk8s
(又名“基于名称的虚拟主机”)的两个充分条件。
尽管没有安装 MetalLB(如 gcr.io/google-samples/hello-app
的输出所示),所有 pod 副本之间的负载平衡工作正常。由于入口控制器自动生成自签名证书,即使 HTTPS 也能开箱即用。