Kubernetes - Ingress on docker driver - minikube 1.16

1/22/2021

I'm trying to setup ingress on docker driver for minikube 1.16 on windows 10 home (build 19042). Ingress on docker driver wasn't supported before but it is now on minikube 1.16: https://github.com/kubernetes/minikube/pull/9761

I've been trying something by myself but i got ERR_CONNECTION_REFUSED when connecting to the ingress at 127.0.0.1 OR kubernetes.docker.internal

Steps:

  1. minikube start
  2. minikube addons enable ingress
  3. create deployment
  4. create ClusterIP
  5. Ingress config

Here is my configuration:

#cluster ip service
apiVersion: v1
kind: Service
metadata:
  name: client-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: web
  ports:
  - port: 3000
    targetPort: 3000

# not posting deployment code because it's not relevant, but there is a deployment with selector 'component:web' and it's exposing port 3000.


#ingress service
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: kubernetes.docker.internal
      http:
        paths:
          - path: /?(.*)
            pathType: Prefix
            backend:
              service:
                name: client-cluster-ip-service
                port:
                  number: 3000

I have dns redirect in hosts file.

I've also tried "minikube tunnel" on another terminal but no luck either.

Thanks!

-- tony
docker
kubectl
kubernetes
minikube

1 Answer

1/22/2021

There is a mistake in your ingress object definition under rules field:

  rules:
    - host: kubernetes.docker.internal
    - http:
        paths:

The exact problem is the - sing in front the http which makes the host and http separate arrays.

Take a look how your converter yaml looks like in json:

{
  "spec": {
    "rules": [
      {
        "host": "kubernetes.docker.internal"
      },
      {
        "http": {
          "paths": [
            {
              "path": "/?(.*)",
              "pathType": "Prefix",
              "backend": {
---

This is how annotations looks like with your ingress definition.

spec:
  rules:
    - host: kubernetes.docker.internal
      http:
        paths:
          - path: /?(.*)
            pathType: Prefix

And now notice how this yaml converted to json looks like:

{
  "spec": {
    "rules": [
      {
        "host": "kubernetes.docker.internal",
        "http": {
          "paths": [
            {
              "path": "/?(.*)",
              "pathType": "Prefix",
              "backend": {
---

You can easily visualize this even better using yaml-viewer

-- acid_fuji
Source: StackOverflow