Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The ingress address can't access correctly #1803

Closed
sugangsky opened this issue Dec 6, 2017 · 10 comments
Closed

The ingress address can't access correctly #1803

sugangsky opened this issue Dec 6, 2017 · 10 comments

Comments

@sugangsky
Copy link

sugangsky commented Dec 6, 2017

ingress-nginx version: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
kubernetes version :Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.4", GitCommit:"9befc2b8928a9426501d3bf62f72849d5cbcd5a3", GitTreeState:"clean", BuildDate:"2017-11-20T05:28:34Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.4", GitCommit:"9befc2b8928a9426501d3bf62f72849d5cbcd5a3", GitTreeState:"clean", BuildDate:"2017-11-20T05:17:43Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
Environment:

  • Cloud provider or hardware configuration: bare-metal
  • OS (e.g. from /etc/os-release): centos7.4
  • Kernel :Linux node1 3.10.0-693.el7.x86_64 Basic structure  #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
  • Install tools: kubeadm
    What happened: when i excute kubectl get ingress -n kube-system,the result is
NAME         HOSTS         ADDRESS           PORTS     AGE
nginx-test   foo.bar.com   192.168.145.101   80        9m

my ingress adress is same with my baremetal node host ip. i can't use curl 192.168.145.101 to access http-svc. got wrong curl: (7) Failed connect to 192.168.145.101:80; Connection refused .why it happened?
Anything else we need to know:
my http-svc.yaml set:

kind: Deployment
metadata:
  name: http-svc
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: http-svc
    spec:
      containers:
      - name: http-svc
        image: gcr.io/google_containers/echoserver:1.8
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: http-svc
  namespace: kube-system
  labels:
    app: http-svc
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: http-svc

my ingress.yaml set:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  namespace: kube-system
spec:
  rules:
    - host: foo.bar.com
      http:
        paths:
        - path: /
          backend:
            # This assumes http-svc exists and routes to healthy endpoints
            serviceName: http-svc
            servicePort: 80

my ingress-nginx-controller.yaml set:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ingress-nginx
  template:
    metadata:
      labels:
        app: ingress-nginx
      annotations:
        prometheus.io/port: '10254'
        prometheus.io/scrape: 'true'
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
          args:
            - /nginx-ingress-controller
            - --apiserver-host=192.168.145.101
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --report-node-internal-ip-address=true
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
          - name: http
            containerPort: 80
          - name: https
            containerPort: 443
          livenessProbe:
            failureThreshold: 3
            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
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
@sugangsky
Copy link
Author

@aledbf

@aledbf
Copy link
Member

aledbf commented Dec 6, 2017

@sugangnb you are using a normal service and host using nodePort, hostPort or hostnetwork so using the IP address of the node will never work.

@aledbf aledbf closed this as completed Dec 6, 2017
@aledbf
Copy link
Member

aledbf commented Dec 6, 2017

Please reopen if you have more questions

@sugangsky
Copy link
Author

sugangsky commented Dec 6, 2017

@aledbf
my ingress-nginx is using nodePort, http-svc is using clusterIp like this.

[root@node1 bigdata]# kubectl get service --all-namespaces
NAMESPACE     NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default       kubernetes             ClusterIP   10.96.0.1        <none>        443/TCP                      5d
kube-system   calico-etcd            ClusterIP   10.96.232.136    <none>        6666/TCP                     5d
kube-system   default-http-backend   ClusterIP   10.108.245.70    <none>        80/TCP                       1d
kube-system   http-svc               ClusterIP   10.108.198.244   <none>        80/TCP                       11h
kube-system   ingress-nginx          NodePort    10.101.55.125    <none>        80:31490/TCP,443:30074/TCP   1d
kube-system   kube-dns               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP                5d
kube-system   kubernetes-dashboard   ClusterIP   10.99.113.249    <none>        443/TCP                      1d
kube-system   tiller-deploy          ClusterIP   10.100.61.13     <none>        44134/TCP                    5d

Your mean I need change http-svc using Nodeport?What can I do to make it work?

@aledbf
Copy link
Member

aledbf commented Dec 6, 2017

If you are using nodeport the correct address is http://192.168.145.101:31490

@sugangsky
Copy link
Author

@aledbf ,excuse me.
After I execut curl -v 192.168.145.101:31490
I got this result.

* About to connect() to 192.168.145.101 port 31490 (#0)
*   Trying 192.168.145.101...
* Connected to 192.168.145.101 (192.168.145.101) port 31490 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.145.101:31490
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< Server: nginx/1.13.7
< Date: Thu, 07 Dec 2017 08:07:45 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 21
< Connection: keep-alive
< Vary: Accept-Encoding
< Strict-Transport-Security: max-age=15724800; includeSubDomains;
< 
* Connection #0 to host 192.168.145.101 left intact
default backend - 404

the log of this commond

192.168.145.101 - [192.168.145.101] - - [07/Dec/2017:08:03:24 +0000] "GET / HTTP/1.1" 404 21 "-" "curl/7.29.0" 85 0.000 [upstream-default-backend] 192.168.166.132:8080 21 0.000 404

I don't understand why this happened

@aledbf
Copy link
Member

aledbf commented Dec 7, 2017

@sugangnb when you not send the host header you reach the default backend. Please check the ingress docs https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource
Running curl -v http://192.168.145.101:31490 -H 'Host: foo.bar.com'

@liuxiaopiao
Copy link

Hi @aledbf ,could you please explain more why cul command without header will reach the default backend? Thanks a lot. Still confused for this.

@aledbf
Copy link
Member

aledbf commented Jan 31, 2019

could you please explain more why cul command without header will reach the default backend?

Sure. Without a Host header nginx cannot decide to which server you need to be directed. For this scenario, there is a catch-all server that sends traffic to the default backend (returns 404)
Please check http://nginx.org/en/docs/http/request_processing.html

@liuxiaopiao
Copy link

@aledbf ,so nice of you. Thanks a lot for the info! Clear with it now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants