虽然 minikube 支持 LoadBalancer 类型的服务,但它并不会创建外部的负载均衡器,而是为这些服务开放一个 NodePort。这在使用 Ingress 时需要注意。

本节展示如何在 minikube 上开启 Ingress Controller 并创建和管理 Ingress 资源。

启动 Ingress Controller

minikube 已经内置了 ingress addon,只需要开启一下即可

  1. $ minikube addons enable ingress

稍等一会,nginx-ingress-controller 和 default-http-backend 就会起来

  1. $ kubectl get pods -n kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. default-http-backend-5374j 1/1 Running 0 1m
  4. kube-addon-manager-minikube 1/1 Running 0 2m
  5. kube-dns-268032401-rhrx6 3/3 Running 0 1m
  6. kubernetes-dashboard-xh74p 1/1 Running 0 2m
  7. nginx-ingress-controller-78mk6 1/1 Running 0 1m

创建 Ingress

首先启用一个 echo server 服务

  1. $ kubectl run echoserver --image=gcr.io/google_containers/echoserver:1.4 --port=8080
  2. $ kubectl expose deployment echoserver --type=NodePort
  3. $ minikube service echoserver --url
  4. http://192.168.64.36:31957

然后创建一个 Ingress,将 http://mini-echo.iohttp://mini-web.io/echo 转发到刚才创建的 echoserver 服务上

  1. $ cat <<EOF | kubectl create -f -
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: echo
  6. annotations:
  7. ingress.kubernetes.io/rewrite-target: /
  8. spec:
  9. backend:
  10. serviceName: default-http-backend
  11. servicePort: 80
  12. rules:
  13. - host: mini-echo.io
  14. http:
  15. paths:
  16. - path: /
  17. backend:
  18. serviceName: echoserver
  19. servicePort: 8080
  20. - host: mini-web.io
  21. http:
  22. paths:
  23. - path: /echo
  24. backend:
  25. serviceName: echoserver
  26. servicePort: 8080
  27. EOF

为了访问 mini-echo.iomini-web.io 这两个域名,手动在 hosts 中增加一个映射

  1. $ echo "$(minikube ip) mini-echo.io mini-web.io" | sudo tee -a /etc/hosts

然后,就可以通过 http://mini-echo.iohttp://mini-web.io/echo 来访问服务了。

使用 xip.io

前面的方法需要每次在使用不同域名时手动配置 hosts,借助 xip.io 可以省掉这个步骤。

跟前面类似,先启动一个 nginx 服务

  1. $ kubectl run nginx --image=nginx --port=80
  2. $ kubectl expose deployment nginx --type=NodePort

然后创建 Ingress,与前面不同的是 host 使用 nginx.$(minikube ip).xip.io

  1. $ cat <<EOF | kubectl create -f -
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: my-nginx-ingress
  6. spec:
  7. rules:
  8. - host: nginx.$(minikube ip).xip.io
  9. http:
  10. paths:
  11. - path: /
  12. backend:
  13. serviceName: nginx
  14. servicePort: 80
  15. EOF

然后就可以直接访问该域名了

  1. $ curl nginx.$(minikube ip).xip.io