Kubernetes 使用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后端,并尝试导出

我想用MicroK8s做两件事:

  • 将主机(Ubuntu 18.04)端口80/443路由到Microk8s
  • 使用文档中定义的简单入口
  • 我的最终目标是创建一个位于Ubuntu主机上的单节点Kubernetes集群,然后使用入口将不同的域路由到服务中各自的pod

    在过去的几天里,我一直在尝试用MicroK8来实现这一点,但我还是无法完全理解

    • 到目前为止,我得到的最好的结果是使用创建一个负载平衡器。但这要求我使用本地网络上可用的免费IP地址,而不是主机IP地址

    • 我还启用了
      默认http后端
      ,并尝试导出和编辑这些配置文件,但没有成功

    例如,启用ingress加载项后,这将在
    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地址
    默认情况下,类型为的服务将执行。这意味着HTTP请求的源IP总是从NGINX的角度来看,接收请求的Kubernetes节点的IP地址

    您也可以使用

    在没有可用的外部负载平衡器但不使用NodePorts的设置中,可以配置
    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
    
    结果如何

  • 网络错误
  • 错误404或503
  • 工作 如果出现网络错误,则需要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
    
    最后一次测试。它应该会起作用


    现在,您可以使用入口将不同的域路由到服务中各自的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
    to
    kubernetes.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 ...