gpt4 book ai didi

Kubernetes 入口(hostNetwork=true),无法通过节点 IP 访问服务 - GCP

转载 作者:行者123 更新时间:2023-12-02 11:37:23 24 4
gpt4 key购买 nike

我正在尝试使用 Ingress 公开部署,其中 DeamonSet 具有 hostNetwork=true这将允许我跳过额外的 LoadBalancer 层并直接在 Kubernetes 外部节点 IP 上公开我的服务。不幸的是,我无法从外部网络访问 Ingress Controller 。

我在 GCP 上运行 Kubernetes 版本 1.11.16-gke.2。

我像这样设置我的新集群:

gcloud container clusters get-credentials gcp-cluster

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller --upgrade

helm install --name ingress --namespace ingress-nginx --set rbac.create=true,controller.kind=DaemonSet,controller.service.type=ClusterIP,controller.hostNetwork=true stable/nginx-ingress

我运行部署:
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-node
spec:
selector:
matchLabels:
app: hello-node
template:
metadata:
labels:
app: hello-node
spec:
containers:
- name: hello-node
image: gcr.io/google-samples/node-hello:1.0
ports:
- containerPort: 8080
EOF

然后我创建服务:
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: hello-node
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: hello-node
EOF

和入口资源:
cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: hello-node-single-ingress
spec:
backend:
serviceName: hello-node
servicePort: 80
EOF

我得到节点外部IP:
12:50 $ kubectl get nodes -o json | jq '.items[] | .status .addresses[] | select(.type=="ExternalIP") | .address'
"35.197.204.75"

检查入口是否正在运行:
12:50 $ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
hello-node-single-ingress * 35.197.204.75 80 8m

12:50 $ kubectl get pods --namespace ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-ingress-controller-7kqgz 1/1 Running 0 23m
ingress-nginx-ingress-default-backend-677b99f864-tg6db 1/1 Running 0 23m

12:50 $ kubectl get svc --namespace ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-ingress-controller ClusterIP 10.43.250.102 <none> 80/TCP,443/TCP 24m
ingress-nginx-ingress-default-backend ClusterIP 10.43.255.43 <none> 80/TCP 24m

然后尝试从外部网络连接:
curl 35.197.204.75 

不幸的是它超时了

在 Kubernetes Github 上有一个关于 ingress-nginx (host-netork: true) 设置的页面:
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network

其中提到:

“这种方式没有利用任何Service对象来暴露NGINX Ingress Controller 。如果目标集群中存在ingress-nginx Service,建议删除它。”

我试图遵循并删除 ingress-nginx服务:
kubectl delete svc --namespace ingress-nginx ingress-nginx-ingress-controller ingress-nginx-ingress-default-backend

但这无济于事。

任何想法如何在节点外部 IP 上设置 Ingress?我做错了什么?在没有 LB 的情况下可靠地运行 Ingress 的困惑让我不知所措。非常感谢任何帮助!

编辑:
当另一个服务使用 NodePort 访问我的部署时被创建:
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: hello-node2
spec:
ports:
- port: 80
targetPort: 8080
type: NodePort
selector:
app: hello-node
EOF


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node ClusterIP 10.47.246.91 <none> 80/TCP 2m
hello-node2 NodePort 10.47.248.51 <none> 80:31151/TCP 6s

我仍然无法访问我的服务,例如使用: curl 35.197.204.75:31151 .

但是,当我使用 LoadBalancer 类型创建第三个服务时:
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: hello-node3
spec:
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
selector:
app: hello-node
EOF

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node ClusterIP 10.47.246.91 <none> 80/TCP 7m
hello-node2 NodePort 10.47.248.51 <none> 80:31151/TCP 4m
hello-node3 LoadBalancer 10.47.250.47 35.189.106.111 80:31367/TCP 56s

我可以使用外部 LB 访问我的服务: 35.189.106.111知识产权。

最佳答案

问题是缺少 GCP 上的防火墙规则。

找到答案:https://stackoverflow.com/a/42040506/2263395

运行:

gcloud compute firewall-rules create myservice --allow tcp:80,tcp:30301

哪里 80是入口端口和 30301是 NodePort 端口。在生产中,您可能只使用入口端口。

关于Kubernetes 入口(hostNetwork=true),无法通过节点 IP 访问服务 - GCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54533975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com