当前位置: 首页 > 知识库问答 >
问题:

使用microk8s从主机简单入口?

井礼骞
2023-03-14

我想用MicroK8做两件事:

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

我的最终目标是创建一个位于Ubuntu主机上的单个节点库伯内特斯集群,然后使用入口将不同的域路由到服务中各自的pod。

在过去的几天里,我一直在尝试用MicroK8来实现这一点,但我对此束手无策。

>

  • 到目前为止,我得到的最好的是使用MetalLB创建负载均衡器。但这要求我使用本地网络上可用的免费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
    
    # 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
    
  • 共有3个答案

    充高扬
    2023-03-14

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

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

    首先我们需要一个测试:

    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
    

    最后一次测试。应该有用。

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

    锺离浩慨
    2023-03-14

    如果我理解正确的话,你可能会从几个方面来考虑。

    一个是你已经提到的MetalB。

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

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

    另一种方法是通过NodePort服务

    这种方法还有一些其他的局限性,我们应该注意:

    • 源IP地址

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

    您也可以使用主机网络

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

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

    我希望这能帮助你决定你的想法应该走哪条路。

    苏品
    2023-03-14

    将注释更新为kubernetes.io/ingres。类别:公共

    对于MicroK8s v1.21,正在运行

    microk8s enable ingress
    

    将在ingress命名空间中创建一个名为nginx-ingress-microk8s-控制器DaemonSet

    如果您对此进行检查,则会有一个标志来设置入口类:

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

    因此,为了在线处理大多数示例,您需要

    1. 删除参数--ingres class=public,使其默认为nginx
     类似资料:
    • MicroK8s 不通过虚拟机但与主机隔离方式,可快速轻巧安装 Kubernetes。通过在单个快照包中打包 Kubernetes,Docker.io,iptables 和 CNI 的所有上游二进制文件来实现此隔离。 snap 包是一个应用程序容器 - 您可以将其想象为 Docker 容器的轻量级版本。它使用了许多相同的底层技术进行隔离,而没有网络隔离的所有开销。最终结果是一种超越任何一个发行版的

    • 本质上,它的工作原理是服务器在http://example.com/message上从Twilio接收一个POST请求,该请求包含文本消息的正文。它将它写入~/app/.data/color.tmp的临时文件,客户端通过对http://example.com/color的jQuery.get()调用访问该文件,该调用返回 所以问题来了:我有一个版本的应用程序在Glitch.me上工作,所以我知道这

    • 我有一个代码库,需要强大的名称。 起初,我认为这将是一个简单的解决方案,因为我只是简单地为所需的ServiceStack程序集指定了强名称。由于ServiceStack内部对弱命名程序集的相互依赖性,此操作失败。然后,我咬紧牙关,使用我的密钥文件重新编译ServiceStack——这是不可取的,因为我没有看到一种方法可以在单个位置完成这项工作,并且必须将其添加到每个项目中。 即使如此,由于以下原因

    • 正在尝试制作一个android应用程序,该应用程序将与使用noSQL server(应用程序)的本地主机服务器(tomcat apache)通信- 这是我正在使用的界面: 这是我在应用程序中单击按钮时使用的代码: 所以,当我点击按钮时,什么也没发生。(它曾经被压碎,但它停止了)我确信按钮的功能正在被调用。

    • 我正在使用 Jenkins Build Flow 插件来实现并行化。Groovy DSL执行某些文件操作。即使选项设置为在特定从服务器上运行作业,DSL也会在主服务器上运行。这不是故意的。 有人能告诉我如何限制DSL在指定的从机上运行吗?即使有一种方法可以通过DSL访问从属文件系统,也应该有效。 一般来说,我们如何使用Groovy从主机访问节点从Jenkins文件? 工作区位于从属节点上,但是当我