Вход Kubernetes (hostNetwork = true), не может достигнуть обслуживания по узлу IP - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь представить развертывание, используя Ingress, где DeamonSet имеет hostNetwork=true, что позволило бы мне пропустить дополнительный уровень LoadBalancer и выставить мой сервис непосредственно на IP внешнего узла Kubernetes.К сожалению, я не могу получить доступ к контроллеру Ingress из внешней сети.

Я использую Kubernetes версии 1.11.16-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

Iполучить внешний 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-nginx, рекомендуется удалить ее. "

Я пытался следоватьи удалите ingress-nginx сервисы:

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

, но это не поможет.

Есть идеи hДолжны ли настроить Ingress на узле внешний IP?Что я делаю не так?Количество путаницы по поводу надежного запуска Ingress без 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.111 IP.

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема в том, что на GCP отсутствуют правила брандмауэра.

Найден ответ: https://stackoverflow.com/a/42040506/2263395

Работает:

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

Где 80 - входной порт30301 - порт NodePort.На производстве вы можете использовать только входной порт.

...