我试图使用入口,其中DeamonSet具有hostNetwork=true
这将让我跳过额外的负载平衡器层和直接在Kubernetes外部节点IP暴露我的服务来公开部署。不幸的是我不能达到从外部网络的入口控制器。
我正在运行的版本1.11.16 Kubernetes-gke.2的GCP。
我安装我的新集群是这样的:
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上有关于进入-nginx的页面(主机netork:真)设置:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network
其中提到:
“这种做法没有利用任何服务对象,以揭露NGINX入口控制器。如果入口-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
。
然而,当我创建负载平衡器类型3的服务:
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
35.189.106.111
IP:我可以使用外部LB访问我的服务。
这个问题是缺少GCP防火墙规则。
找到了答案:https://stackoverflow.com/a/42040506/2263395
运行:
gcloud compute firewall-rules create myservice --allow tcp:80,tcp:30301
凡80
是入口端口和30301
是NodePort端口。在生产,你会probabaly只使用入站端口。