从互联网访问 kubernetes 外部 IP

Access kubernetes external IP from the internet

我目前正在设置一个 kubernetes 集群(裸 ubuntu 服务器)。我部署了 metallb 和 ingress-nginx 来处理 ip 和服务路由。这似乎工作正常。当我得到 ingress-nginx-controller 服务的 externalIP(在每个节点上工作)时,我得到了 nginx 的响应。但这仅适用于集群网络内部。我如何通过 node/master 服务器 ip 从 Internet 访问我的服务(ingress-nginx-controller,因为它进行路由)?我尝试用 iptables 设置路由,但它似乎不起作用。我做错了什么,这是最佳做法吗?

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

iptables -t nat -A PREROUTING -i eth0 -p tcp -d <Servers IP> --dport 80 -j DNAT --to <ExternalIP of nginx>:80

iptables -A FORWARD -p tcp -d <ExternalIP of nginx> --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

iptables -F

这里有更多信息:

kubectl get services -n ingress-nginx

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.103.219.111   198.51.100.1   80:31872/TCP,443:31897/TCP   41h
ingress-nginx-controller-admission   ClusterIP      10.108.194.136   <none>         443/TCP                      41h

请分享一些想法 乔纳斯

裸机集群的设置有点棘手,因为您需要创建和管理服务的联系点。在云环境中,这些都是按需提供的。

我关注了 this doc 并且可以假设您的负载平衡器似乎工作正常,因为您能够 curl 这个 IP 地址。但是,您在调用域时试图获得响应。为此,您需要在集群中安装一些应用程序 运行ning,它通过 Ingress 组件暴露给主机名。

我将指导您完成实现该目标的步骤。 首先,创建一个部署到 运行 一个网络服务,我将使用简单的 nginx 示例:

kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80 

其次,创建一个 LoadBalancer 类型的服务,以便能够从外部访问它。你可以通过简单地 运行ning 这个命令来做到这一点: kubectl expose deployment nginx-deployment --type=LoadBalancer --name=<service_name> 如果您的软件负载平衡器设置正确,这应该会为您之前创建的 Deployment 提供外部 IP 地址。

最后但同样重要的是,创建 Ingress 服务来管理外部访问和基于名称的虚拟主机。示例:

kind: Ingress
metadata:
  name: <ingress_name>
spec:
  rules:
    - host: <your_domain>
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: <service_name>
                port:
                  number: 80

现在,您应该可以使用您的域名作为集群的外部访问。

我最终在要将我的域解析到的机器上安装了 HAProxy。 HAProxy 监听端口 80 和 443 并将所有流量转发到我的入口控制器的外部 IP。您也可以在多台机器和 DNS 故障转移上执行此操作以实现高可用性。

我的haproxy.cfg

frontend unsecure
    bind 0.0.0.0:80
    default_backend unsecure_pass

backend unsecure_pass
    server unsecure_pass 198.51.100.0:80



frontend secure
    bind 0.0.0.0:443
    default_backend secure_pass


backend secure_pass
    server secure_pass 198.51.100.0:443