空地址kubernetes入口

时间:2018-07-25 05:42:41

标签: kubernetes kubernetes-ingress

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

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

在运行default-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

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

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

以及以下入口:

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

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

NAME            HOSTS          ADDRESS   PORTS     AGE
happy-ingress   happy.k8s.io             80        14m

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

谢谢

8 个答案:

答案 0 :(得分:3)

我不知道这是否有帮助,但是我有同样的问题。 我没有安装入口控制器,也没有安装有人在Github上说的东西, 我刚刚创建了一个Ingress,以便能够将我的子域指向其他服务,但起初我的Ingress没有IP地址(该地址为空)。

NAME      HOSTS                            ADDRESS   PORTS   AGE
ingress   delivereo.tk,back.delivereo.tk             80      39s

我认为这是因为我为前端应用程序和后端api提供的2个服务都具有LoadBalancer类型。 我将其更改为NodePort,因为入口控制器将管理URL转到何处,因此它们不需要外部ip。

当我确实将服务类型更改为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

之后

apiVersion: v1
kind: Service
metadata:
  name: delivereotk
spec:
  ports:
    - port: 80
  selector:
    app: delivereotk
  type: NodePort

入口

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

答案 1 :(得分:3)

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

$ minikube addons enable ingress
ingress was successfully enabled

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

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

nginx-ingress-controller-5984b97644-jjng2   1/1       Running   2          1h

enter image description here 对于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

对于进入规则,将端口servicePort从默认的http端口8080更改为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

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

<minikube_ip> happy.k8s.io

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

curl http://happy.k8s.io/echoserver

答案 2 :(得分:2)

您的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

使用curl

为您的集群测试入口控制器
bash-3.2$ curl http://192.168.1.100:8080
default backend - 404

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

192.168.1.100   happy.k8s.io

答案 3 :(得分:1)

官方document说:

  

因为NodePort Services没有获得由分配的LoadBalancerIP   定义,NGINX Ingress控制器不会更新状态   它管理的入口对象

您已按照安装指南中的说明部署了NGINX Ingress控制器,因此您的地址为空是正常的!

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

ps。这个问题不是关于minikube

答案 4 :(得分:0)

我有一个类似的案例。我们编写的入口只是入口规则。为了使地址可用,我们还需要运行入口控制器容器。

只需检查控制器盒是否正在运行

kubectl get pods

您应该按照图中所示的方式运行控制器容器。如果没有,您可以使用头盔进行安装。

enter image description here

如果您使用的是helm2,只需使用以下命令:

helm install stable/nginx-ingress --name my-nginx

按照此文档了解不同的安装方式。 https://kubernetes.github.io/ingress-nginx/deploy/

在安装头盔时,如果未安装耕till机,则可能会遇到以下问题。

Error: could not find tiller

要对其进行修复,请按照以下说明安装分till:

kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller

要验证分till是否正常工作

kubectl get pods --namespace kube-system

答案 5 :(得分:0)

我遇到了类似的问题,意识到我需要:

  1. 启用NGINX Ingress控制器,运行以下命令:

    minikube addons enable ingress
    
  2. 验证NGINX Ingress控制器正在运行

    kubectl get pods -n kube-system
    

期望nginx-ingress-controller吊舱处于运行状态。

答案 6 :(得分:0)

我在GKE(Google Kubernetes Engine)上遇到了相同的问题。事实证明,入口设置存在问题,我为所需的服务使用了不正确的名称。您应该通过执行以下命令检查错误:

kubectl describe ingress <your-ingress-name>

答案 7 :(得分:0)

您正在寻找的是一种测试入口资源的方法。

您可以这样做:

  1. 查找入口控制器 pod/s 的 ip 地址,并将端口 80/443 与该 ip 一起使用。
  2. 查找暴露入口控制器部署的服务
  3. 如果没有服务,您可以创建一个并公开入口控制器部署
  4. 如果您需要主机名,则需要管理 dns 条目。