首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes入口(hostNetwork=true),不能通过节点IP - GCP到达服务。

Kubernetes入口(hostNetwork=true),不能通过节点IP - GCP到达服务。
EN

Stack Overflow用户
提问于 2019-02-05 12:00:58
回答 1查看 3.5K关注 0票数 4

我正在尝试使用DeamonSet有hostNetwork=true的侵入公开部署,这将允许我跳过其他LoadBalancer层并直接在Kubernetes外部节点IP上公开我的服务。不幸的是,我无法从外部网络连接到大会控制器。

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

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

代码语言:javascript
复制
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

我运行部署:

代码语言:javascript
复制
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

然后我创建服务:

代码语言:javascript
复制
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: hello-node
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-node
EOF

以及入口资源:

代码语言:javascript
复制
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:

代码语言:javascript
复制
12:50 $ kubectl get nodes -o json | jq '.items[] | .status .addresses[] | select(.type=="ExternalIP") | .address'
"35.197.204.75"

检查入口是否正在运行:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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侵入控制器。如果入口-nginx服务存在于目标集群中,建议将其删除。”

我尝试过这样做,并删除了ingress-nginx服务:

代码语言:javascript
复制
kubectl delete svc --namespace ingress-nginx ingress-nginx-ingress-controller ingress-nginx-ingress-default-backend

但这没什么用。

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

编辑:当另一个使用NodePort访问部署的服务被创建时:

代码语言:javascript
复制
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类型创建第三个服务时:

代码语言:javascript
复制
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 IP访问我的服务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 13:01:22

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

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

跑步:

代码语言:javascript
复制
gcloud compute firewall-rules create myservice --allow tcp:80,tcp:30301

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54533975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档