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

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

傅越
2023-03-14

我正在尝试使用入口公开部署,其中DeamonSet具有hostNetwork=true,这将允许我跳过额外的负载平衡器层,并直接在Kubernetes外部节点IP上公开我的服务。很遗憾,我无法从外部网络访问入口控制器。

我在GCP上运行库伯内特斯版本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 

不幸的是它超时了

在库伯内特斯GitHub上有一个关于ingress-nginx(主机-网络: true)设置的页面:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network

其中提到:

“此方法不利用任何服务对象公开NGINX Ingress controller。如果目标群集中存在Ingress NGINX服务,建议将其删除。”

我已尝试按照此操作删除ingress nginx服务:

kubectl delete svc --namespace ingress-nginx ingress-nginx-ingress-controller ingress-nginx-ingress-default-backend

但这没有帮助。

如何在节点外部IP上设置入口?我做错了什么?在没有LB的情况下可靠地运行入口的混乱程度让我不知所措。非常感谢您的帮助!

编辑:创建另一个使用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.111IP访问我的服务。

共有1个答案

卢承弼
2023-03-14

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

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

正在运行:

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

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

 类似资料:
  • 我对Kubernetes和Helm图表是新的,我想在这里找到我的问题的答案。 我一直认为是向外部公开集群的端口,而port是在内部服务上公开的端口,它路由到pods上的。我从这里得到了这个理解。 但是,我似乎可以打开或,但不能打开或。我希望能够通过访问104.198.205.71,而不是通过端口。我的理解不正确吗?

  • 工作节点1上的Curl对群集IP来说是最合适的(这是运行pod的节点) Curl在其他工作节点上也失败:

  • 什么起作用了? 使用Helm(启用RBAC)部署入口控制器 集群IP服务部署 什么不起作用? null K8S入口 注释中最后应用的配置(入口描述输出)显示入口资源清单。但是,我贴在下面作为参考 附加信息 null 任何关于我可能做错了什么的建议或见解将非常感谢。

  • 我正在尝试在minikube(Windows-10)上部署简单的spring boot REST服务。下面是我的配置 Docker文件 docker image运行良好,我能够运行该应用程序。 部署 服务 我无法使用< code > service-IP:node port/Uri < br > http://127 . 0 . 0 . 1:30008/hello访问restendpoint ht

  • 我正在尝试访问一个运行在Openshift吊舱中的Flask服务器。 为此,我创建了如下服务。 1)首先,我豆荚ping到另一个豆荚并得到响应。 但是,当我尝试时,它没有响应。 2) 之后,我尝试从一个pod访问集群IP。在这种情况下,都不可访问。 请告诉我哪里出错了。为什么上面的情况#1,#2失败。如何访问集群IP服务。 我对服务和访问服务完全陌生,因此我可能缺少一些基础知识。 我回答了其他问题

  • 我正在尝试使用三个虚拟机(Master–10.x.x.4、Node1–10.x.x.150、Node2–10.x.x.160)创建Kubernetes集群。 我能够通过此链接成功创建留言簿应用程序:http://kubernetes.io/v1.0/examples/guestbook/.我只对frontend-service.yaml做了一个更改:使用NodePort。我可以使用节点IP和端口号