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

den*_*ski 8 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

Jus*_* W. 9

TLDR

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

为什么

对于 MicroK8s v1.21,运行

microk8s enable ingress
Run Code Online (Sandbox Code Playgroud)

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

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

      - args:
        ... omitted ... 
        - --ingress-class=public
        ... omitted ... 
Run Code Online (Sandbox Code Playgroud)

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

  1. 删除--ingress-class=public参数,所以它默认为nginx
  2. 更新注解喜欢kubernetes.io/ingress.class: nginxkubernetes.io/ingress.class: public


Cro*_*rou 6

如果我对您的理解正确,可能有几种看待方式。

一个就是您已经提到的MetalLB

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

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

另一种方法是通过NodePort服务

这种方法还有一些其他局限性,您应该意识到:

  • 源IP地址

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

您也可以使用主机网络

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

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

我希望这可以帮助您确定采用哪种方法。

  • 说到“ingress-nginx”,您可以使用“microk8s.enable ingress”启用入口,然后在入口资源定义中使用机器(节点)的IP地址,例如“host:myapp.192-168-0” -1.nip.io``,其中``192.168.0.1`` 是 microk8s 节点的 IP 地址。华泰 (2认同)

Fer*_*rro 6

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

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

首先我们需要一个测试:

curl -H "Host: nginx.ioo" http://HOST_IP
Run Code Online (Sandbox Code Playgroud)

结果是什么?

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

如果网络错误那么你需要 MetalLB

microk8s.enable metallb:$(curl ipinfo.io/ip)-$(curl ipinfo.io/ip) 
Run Code Online (Sandbox Code Playgroud)

再次运行测试。

如果网络错误那么你就有问题了。检查主机连接。

如果错误 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
Run Code Online (Sandbox Code Playgroud)

最后一次测试。它应该有效。

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