26

我想用 MicroK8s 做两件事:

  1. 将主机(Ubuntu 18.04)端口 80/443 路由到 Microk8s
  2. 使用类似kubernetes.io文档中定义的简单入口

我的最终目标是创建一个位于 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
4

8 回答 8

19

TLDR

将注释更新为kubernetes.io/ingress.class: public

为什么

对于 MicroK8s v1.21,运行

microk8s enable ingress

将在命名空间中创建一个DaemonSet被调用。nginx-ingress-microk8s-controlleringress

如果您检查,有一个标志来设置入口类:

      - args:
        ... omitted ... 
        - --ingress-class=public
        ... omitted ... 

因此,为了使用大多数在线示例,您需要

  1. 删除参数,--ingress-class=public使其默认为nginx
  2. kubernetes.io/ingress.class: nginx更新注释喜欢kubernetes.io/ingress.class: public
于 2021-04-11T03:32:15.263 回答
14

如果我对您的理解正确,您可能会看到几种方法。

一个是您已经提到的MetalLB 。

MetalLB为不在受支持的云提供商上运行的 Kubernetes 集群提供网络负载均衡器实现,从而有效地允许在任何集群中使用 LoadBalancer 服务。

可以阅读详细实现纯软件解决方案:MetalLB

另一种方法是通过 NodePort 服务

这种方法还有一些其他的限制需要注意:

  • 源 IP 地址

NodePort类型的服务默认执行 源地址转换 。这意味着从 NGINX 的角度来看,HTTP 请求的源 IP 始终 是接收请求的 Kubernetes 节点的 IP 地址

您还可以使用主机网络

在没有可用的外部负载均衡器但不能使用 NodePorts 的设置中,可以将 Pod 配置ingress-nginx为使用它们运行的​​主机的网络,而不是专用的网络命名空间。这种方法的好处是 NGINX Ingress 控制器可以将端口 80 和 443 直接绑定到 Kubernetes 节点的网络接口,而无需 NodePort 服务强加的额外网络转换。

您还必须记住,如果您在 中编辑配置POD,如果 Pod 重新启动或崩溃,它将消失。

我希望这可以帮助您确定采用哪种方式来实现您的想法。

于 2019-02-04T16:43:34.587 回答
4

声明“到目前为止,我得到的最好的结果是使用 MetalLB 创建负载均衡器。” 是错的。您必须使用入口层进行主机流量路由。

在裸机环境中,您需要配置 MetalLB 以允许从主机到 k8s 的传入连接。

首先我们需要一个测试:

curl -H "Host: nginx.ioo" http://HOST_IP

结果是什么?

  1. 网络错误
  2. 错误 404 或 503
  3. 作品!!

如果网络错误,那么你需要 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

最后一次测试。它应该工作。

现在,您可以使用 ingress 将不同的域路由到服务内各自的 pod。

于 2020-10-25T10:34:33.227 回答
1

使用 LoadBalancer (又名metallb)时,几乎所有文档中都缺少一个重要步骤:

入口控制器需要暴露给 metallb LoadBalancer。

kubectl expose deploy nginx-deployment --port 80 --type LoadBalancer

这也可以通过 yaml 来完成,但它更容易使用 cli。

经过几天的谷歌搜索,我终于看到了这个让我大开眼界的教程视频。

https://www.youtube.com/watch?v=xYiYIjlAgHY

于 2020-05-05T14:53:06.457 回答
0

如果您需要使用 HTTPS 和身份验证公开公开服务,这可能会变得相当复杂,因为您需要配置 a) 入口,b) TLS 证书服务 - 即使用 Lets Encrypt,c) 身份验证代理,d) 在您的应用程序中实现用户授权.

如果您的 K8S 集群在没有公共 IP 的服务器上运行,则会带来额外的复杂性,因为您需要穿透 NAT。

https://github.com/gwrun/tutorials/tree/main/k8s/pod以 Kubernetes Dashboard 为例,演示了如何安全地将运行在没有公共 IP 的 microk8s 集群上的 k8s 服务公开为具有 OAuth 身份验证和授权的可公开访问 HTTPS服务。

于 2020-11-03T04:39:42.397 回答
0

使用 Microk8s 1.21+ 时,运行后的 Ingress 配置应如下所示microk8s enable ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
spec:
  rules:
    - host: staging.resplendentdata.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 80

  ingressClassName: public
于 2021-10-15T18:07:26.747 回答
0

从这里提议的ingress.class从更改nginx到设置 DNS 条目(使用我的外部提供商的控制台)从我的公共 IP(不是主机名)是复制 Openshift 样式(又名“基于名称的虚拟主机”)的两个充分条件安装在金属上。public*routemicrok8s

  • 更多信息

尽管没有安装 MetalLB,但所有 pod 副本之间的负载平衡工作正常(从 的输出中可以看出gcr.io/google-samples/hello-app)。由于入口控制器自动生成自签名证书,甚至 HTTPS 也可以开箱即用。

于 2021-05-04T09:28:35.497 回答
0

要安装 nginx 使其与ingressClass=nginx使用一起工作:

#https://kubernetes.github.io/ingress-nginx/deploy/
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace
于 2021-11-22T08:09:04.560 回答