空地址kubernetes入口

Dor*_*rin 15 kubernetes kubernetes-ingress

我尝试在kubernetes群集上配置入口。我按照文档安装了入口控制器并运行了以下命令

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
Run Code Online (Sandbox Code Playgroud)

在运行默认的http-backend和nginx-ingress-controller之后:

ingress-nginx   default-http-backend-846b65fb5f-6kwvp      1/1       Running   0          23h       192.168.2.28   node1
ingress-nginx   nginx-ingress-controller-d658896cd-6m76j   1/1       Running   0          6m        192.168.2.31   node1
Run Code Online (Sandbox Code Playgroud)

我尝试测试入口,并部署了以下服务:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
        - name: my-echo
          image: gcr.io/google_containers/echoserver:1.8
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver-svc
spec:
  selector:
    app: echo
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
Run Code Online (Sandbox Code Playgroud)

以及以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: happy-ingress
  annotations:
    INGRESS.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: happy.k8s.io
      http:
        paths:
          - path: /echoserver
            backend:
              serviceName: echoserver-svc
              servicePort: 8080
Run Code Online (Sandbox Code Playgroud)

当我运行命令“ kubectl get ing”时,我收到:

NAME            HOSTS          ADDRESS   PORTS     AGE
happy-ingress   happy.k8s.io             80        14m
Run Code Online (Sandbox Code Playgroud)

我没有解决ADDRESS,也无法弄清楚问题出在哪里,因为所有Pod都在运行。您能给我提示一下这个问题可能是什么吗?

谢谢

Jam*_*_SO 12

入口问题特定于您的实施,所以让我只讨论没有负载均衡器的裸机 LAN 实施。

入口资源的关键验证点是它获取一个地址(毕竟,如果入口没有与之关联的地址,我应该点击什么?)所以如果你这样做

kubectl get ingress some-ingress
Run Code Online (Sandbox Code Playgroud)

一遍又一遍(给它 30 秒左右)但它从来没有显示过地址 - 现在怎么办?

在裸机 LAN 上存在一些问题点。首先,确保您的 Ingress资源可以找到您的 Ingress控制器- 因此(暂时搁置控制器规范)您的资源需要能够通过以下方式找到您的控制器:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-api-ingress
  annotations:
    kubernetes.io/ingress.class: nginx

Run Code Online (Sandbox Code Playgroud)

您的控制器有如下条目:

Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.4
                          helm.sh/chart=ingress-nginx-4.0.6
Run Code Online (Sandbox Code Playgroud)

但现在让我们回退一步 - 您的控制器 - 它的设置是否适合您(在我的例子中)的裸机 LAN 实施?(云提供商使这一切变得非常简单,因此我为私有云社区中的朋友提供这个答案)

问题是,您需要在 Ingress控制器部署中将这一基本的 hostNetwork 设置设为 true。因此,不要使用基本的 yamil ( https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml ) - wget 它,并且修改它以设置部署规范模板的规范,以便 hostNetwork: true - 类似于(向下滚动到末尾):

# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.6
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.4
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/component: controller
  revisionHistoryLimit: 10
  minReadySeconds: 0
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/component: controller
    spec:
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: k8s.gcr.io/ingress-nginx/controller:v1.0.4@sha256:545cff00370f28363dad31e3b59a94ba377854d3a11f18988f5f9e56841ef9ef
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown
          args:
            - /nginx-ingress-controller
            - --election-id=ingress-controller-leader
            - --controller-class=k8s.io/ingress-nginx
            - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            runAsUser: 101
            allowPrivilegeEscalation: true
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: LD_PRELOAD
              value: /usr/local/lib/libmimalloc.so
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
            - name: webhook
              containerPort: 8443
              protocol: TCP
          volumeMounts:
            - name: webhook-cert
              mountPath: /usr/local/certificates/
              readOnly: true
          resources:
            requests:
              cpu: 100m
              memory: 90Mi
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      hostNetwork: true
      volumes:
        - name: webhook-cert
          secret:
            secretName: ingress-nginx-admission

Run Code Online (Sandbox Code Playgroud)

部署它,然后设置您的入口资源,如上所述。

您的关键测试是:

  • 我的入口在裸机实施中是否有专用节点?
  • 如果我点击入口节点上的端口 80,我会得到与点击 NodePort 相同的结果吗?(假设 NodePort 是 31207 - 我在入口节点上访问端口 80 是否会得到与在任何节点上访问端口 31207 相同的结果?)

最后说明:Ingress 在过去几年中发生了很大变化,教程经常提供未通过验证的示例 - 如果此答案已过时,请随时对此答案发表评论

  • 感谢添加 `kubernetes.io/ingress.class: nginx` 注释解决了我的问题。 (5认同)

Sha*_*uza 10

ingress addons创建入口规则之前,必须先通过命令启用。您还可以在执行任何其他命令之前启用它

$ minikube addons enable ingress
ingress was successfully enabled
Run Code Online (Sandbox Code Playgroud)

等到吊舱启动并运行。您可以通过执行以下命令来检查并等待类似的输出

kubectl get pods -n kube-system | grep nginx-ingress-controller

nginx-ingress-controller-5984b97644-jjng2   1/1       Running   2          1h
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 因为Deployment您必须指定containerPort和并且Service必须指定http协议。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: echoserver-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-echo
  template:
    metadata:
      labels:
        app: my-echo
    spec:
      containers:
        - name: my-echo
          image: gcr.io/kubernetes-e2e-test-images/echoserver:2.1
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver-svc
spec:
  selector:
    app: my-echo
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    name: http
Run Code Online (Sandbox Code Playgroud)

对于入口规则,将端口servicePort从8080 更改为默认的http端口80。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: happy-ingress
  annotations:
    INGRESS.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: happy.k8s.io
    http:
      paths:
      - path: /echoserver
        backend:
          serviceName: echoserver-svc
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

现在应用这些文件并创建您的Pod,服务和入口规则。请稍等片刻,这将花费一些时间来获取您的入口规则的地址。 在此处输入图片说明 现在,您可以使用minikube ip地址访问您的服务,但不能按主机名访问。为此,您必须在/etc/hosts文件中添加主机和相应的IP地址。因此/etc/hosts,请在您喜欢的编辑器中打开文件,然后在下面的行中添加minikube的实际IP地址

<minikube_ip> happy.k8s.io
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用主机名访问服务。验证以下命令

curl http://happy.k8s.io/echoserver
Run Code Online (Sandbox Code Playgroud)


Dyl*_*Lai 8

正如官方文件所说:

因为 NodePort 服务没有得到定义分配的 LoadBalancerIP,NGINX Ingress 控制器不会更新它管理的 Ingress 对象的状态

您已经按照安装指南中的描述部署了 NGINX Ingress 控制器,所以您的 ADDRESS 为空是正常的!

相反,外部客户端必须将分配给 ingress-nginx 服务的 NodePort 附加到 HTTP 请求。

附:这个问题不是关于 minikube

  • 在这种情况下谁是“外部客户”?另外,“将分配给 ingress-nginx 服务的 NodePort 附加到 HTTP 请求”是什么意思,你会附加到 HTTP 请求中,以及如何附加到 HTTP 请求中?谢谢! (2认同)

Cro*_*rou 5

hostname happy.k8s.io应该解析为 nginx-ingress-controller 的实际 IP 地址,该地址指向负载均衡器的前端。

您可以检查集群在哪个 IP 下工作:

bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube- 
system/services/kube-dns:dns/proxy
Run Code Online (Sandbox Code Playgroud)

使用以下命令测试集群的入口控制器curl

bash-3.2$ curl http://192.168.1.100:8080
default backend - 404
Run Code Online (Sandbox Code Playgroud)

最后,您应该将域条目添加到/etc/hosts

192.168.1.100   happy.k8s.io
Run Code Online (Sandbox Code Playgroud)


Ibr*_*bra 5

我不知道这是否会有所帮助,但我遇到了同样的问题。我没有安装任何入口控制器或一些人在 Github 上所说的任何东西,我只是创建了一个入口,以便能够将我的子域指向不同的服务,起初我的入口没有 IP 地址(它是空的)。

NAME      HOSTS                            ADDRESS   PORTS   AGE
ingress   delivereo.tk,back.delivereo.tk             80      39s
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我的前端应用程序和后端 api 的 2 个服务具有 LoadBalancer 的类型。我将其更改为 NodePort,因为它们现在不需要外部 ip,因为入口控制器将管理 url 的去向。

当我确实将我的服务类型更改为 NodePort 时,2 或 3 分钟后出现了 Ingress 的 IP 地址。当我将 Cloudflare DNS 指向新的 Ingress IP 时,我测试了我的子域并且它工作正常!

apiVersion: v1
kind: Service
metadata:
  name: delivereotk
spec:
  ports:
    - port: 80
  selector:
    app: delivereotk
  type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)

apiVersion: v1
kind: Service
metadata:
  name: delivereotk
spec:
  ports:
    - port: 80
  selector:
    app: delivereotk
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: delivereo.tk
    http:
      paths:
        - backend:
            serviceName: delivereotk
            servicePort: 80
  - host: back.delivereo.tk
    http:
      paths:
        - backend:
            serviceName: backdelivereotk
            servicePort: 80
Run Code Online (Sandbox Code Playgroud)