【问题标题】:Ingress-Nginx w/ Kubernetes not getting IP address带有 Kubernetes 的 Ingress-Nginx 没有获得 IP 地址
【发布时间】:2019-05-30 10:45:19
【问题描述】:

我是 Kubernetes 新手,正在尝试让 Ingress-Nginx 在我的本地 k8s 集群上工作。

我已经安装并运行了:

$ kubectl get pods --namespace=ingress-nginx
  NAME                                       READY   STATUS    RESTARTS   AGE
  nginx-ingress-controller-76f97b74b-bbb6h   1/1     Running   0          13h

然后我创建了两个nginx服务(想测试基于名称的路由):

$ kubectl get svc
  NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        20h
    nginx        NodePort    10.102.188.253   <none>        80:32025/TCP   36m
    nginx2       NodePort    10.109.43.89     <none>        80:32458/TCP   35m

我创建了我的入口:

$ kubectl get ingress -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    creationTimestamp: 2018-10-25T12:27:44Z
    generation: 1
    name: test
    namespace: default
    resourceVersion: "98114"
    selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/test
    uid: 5fbc2e9e-d851-11e8-995f-2ae1e5e17bac
  spec:
    rules:
    - host: test-ingress.chbresser.com
      http:
        paths:
        - backend:
            serviceName: nginx
            servicePort: 80
    - host: test-ingress2.chbresser.com
      http:
        paths:
        - backend:
            serviceName: nginx2
            servicePort: 80
  status:
    loadBalancer: {}
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

据我了解,这就是我应该做的所有事情,但它没有获得 IP 地址:

$ kubectl get ingress
  NAME   HOSTS                                                    ADDRESS   PORTS   AGE
    test   test-ingress.chbresser.com,test-ingress2.chbresser.com             80      33m

我错过了哪一步?为什么我没有获得 IP?

编辑:

kubectl logs nginx-ingress-controller-76f97b74b-bbb6h --namespace=ingress-nginx:

W1025 05:44:10.003587       9 queue.go:130] requeuing &ObjectMeta{Name:sync status,GenerateName:,Namespace:,SelfLink:,UID:,ResourceVersion:,Generation:0,CreationTimestamp:0001-01-01 00:00:00 +0000 UTC,DeletionTimestamp:<nil>,DeletionGracePeriodSeconds:nil,Labels:map[string]string{},Annotations:map[string]string{},OwnerReferences:[],Finalizers:[],ClusterName:,Initializers:nil,}, err services "ingress-nginx" not found

【问题讨论】:

  • 在创建入口定义时您是否尝试过 kubectl logs nginx-ingress-controller-76f97b74b-bbb6h --watch。您应该会看到入口控制器在执行此操作时在日志中记录了更新消息。如果没有更新,可能发现不起作用。
  • 查看我的编辑。看起来它正在寻找一个名为 ingress-nginx 的服务,但文档只让您使用:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml 部署它,它根本没有提到服务。
  • 您是否尝试使用命令kubectl get svc --namespace=ingress-nginx 来查看您的入口控制器的服务?
  • 是的,它就在那里。

标签: nginx kubernetes


【解决方案1】:

我使用裸机并通过使用--report-node-internal-ip-address=true 获取 IP 地址 标记ingress-controller

这是我的ingress-controlleryaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: nginx-ingress-controller
spec: 
  replicas: 1
  revisionHistoryLimit: 3
  template: 
    metadata: 
      labels: 
        k8s-app: ingress-nginx
    spec: 
      containers: 
        - args: 
            - /nginx-ingress-controller
            - "--default-backend-service=default/my-app"
            - "--report-node-internal-ip-address=true"
          env: 
            - name: POD_NAME
              valueFrom: 
                fieldRef: 
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom: 
                fieldRef: 
                  fieldPath: metadata.namespace
          image: "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.15.0"
          name: nginx-ingress-controller
          ports: 
            - containerPort: 80
              hostPort: 80
              name: http
              protocol: TCP

我的ingressyaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: my-app
  annotations: 
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: my-app.example.com
    http: 
     paths:
     - path: /
       backend:
        serviceName: my-app
        servicePort: 80

结果:

$ kubectl get ing
NAME     HOSTS   ADDRESS        PORTS   AGE
my-app   *       192.168.1.78   80      40h

$ kubectl get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          8d
my-app            ClusterIP   10.110.152.216   <none>        80/TCP,443/TCP   8d

$ kubectl get po
NAME                                        READY   STATUS    RESTARTS   AGE
my-app-rc-d7lw9                             1/1     Running   0          8d
my-app-rc-spvjb                             1/1     Running   0          8d
my-app-rc-tvkrw                             1/1     Running   0          8d
nginx-ingress-controller-6c6c899467-d9sg6   1/1     Running   0          16m

更多详情,请参阅this issues

【讨论】:

    【解决方案2】:

    如果它与你的问题有关,你能检查一下这个问题吗?您可能需要升级入口控制器。

    git issue for ingress controller

    查看您的编辑。您似乎没有为您的 nginx 控制器应用服务,因此它无法找到相关的 srvc 。

    通过运行以下命令检查命名空间 ingress-nginx 下是否有 srvc

    kubectl 获取 svc -n ingress-nginx

    如果不存在,请应用提供商特定的服务。

    例如,下面是裸机供应商

    kubectl 应用 -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml

    【讨论】:

    • 我认为这是一个不同的nginx-ingress,它看起来是由 nginxinc 创建的,而我正在使用one made by kubernetes
    • 你能检查“kubectl get svc -n kube-system”,看看你的 nginx 控制器是否有一个 svc 以及 kubectl get svc --all-namespaces
    • nginx 控制器好像没有申请服务。你能检查一下申请服务吗?首先检查命名空间“ingress-nginx”下是否有服务。你可以检查使用 kubectl get svc -n ingress-nginx
    • 我没有申请服务,我已经申请了。但仍然没有入口 IP。
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多