从互联网访问 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
我目前正在设置一个 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