来自主机的microk8s的简单进入?

时间:2019-02-03 18:45:13

标签: kubernetes kubernetes-ingress microk8s

我想对MicroK8做两件事:

  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

6 个答案:

答案 0 :(得分:6)

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: nginxkubernetes.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

结果如何?

  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

最后一次测试。应该可以。

现在,您可以使用入口将不同的域路由到服务中各自的容器。

答案 3 :(得分:0)

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

入口控制器需要暴露在金属负载均衡器中。

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

这也可以由Yaml完成,但使用cli更容易。

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

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

答案 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.classnginx 更改为 public 建议 here 并设置 DNS 条目(使用我的外部提供商的控制台)从 * 到我的公共IP(不是主机名)是在金属上安装的 route 下复制 Openshift 风格的 microk8s(又名“基于名称的虚拟主机”)的两个充分条件。

  • 更多信息

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