ingress可以很方便的把外部流量导入到内部的http服务里去。kubernetes只是提供了ingress的定义,但并未提供其实现,用户可以自己选择合适的ingress实现,例如nginx。
这里用的是nginx-ingress这个项目。
docker pull anjia0532/google-containers.defaultbackend:1.4
docker tag anjia0532/google-containers.defaultbackend:1.4 gcr.io/google_containers/defaultbackend:1.4
docker rmi anjia0532/google-containers.defaultbackend:1.4
docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0
quay.io的镜像很慢啊。
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
官方文档建议bear metal用NodePort方式暴漏服务,不过我做了一个修改,把nginx-ingress-controller改为了hostNetwork=true,这样我就可以直接用80/443访问x201了。
但不要删除 ingress-nginx 服务,否则controller会不停的报找不到。这应该是个bug,回头有空了我fix一下。
ingress好了得验证一下,正好前面部署的dashboard用了NodePort不太爽,改成用ingress吧!
由于dashboard加了https加密,所以配置起来稍微麻烦一点。
nginx对https的流量有三种做法,详细可以参考 tonybai 的这篇文章,非常详实。
下面是dashboard的ingress配置。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kube-system
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/secure-backends: "true"
ingress.kubernetes.io/ssl-redirect: "False"
spec:
tls:
- hosts:
- x201
- "*.x201"
secretName: kubernetes-dashboard-certs
rules:
- http:
paths:
- path: /
backend:
serviceName: kubernetes-dashboard
servicePort: 443
host: x201
这里用的是ssl termination方式,nginx.ingress.kubernetes.io/secure-backends: "true"
设置为true。
注意要重启一下ingress-controller,这应该也是个bug。
重启以后,就可以通过 https://x201
直接访问dashboard了。
是不是很方便?
ingress好了以后,可以做一些有意思的事,比如说example-app。
在dex这一章里,example-app每次开机都要命令行重新启动,比较麻烦,于是我做了一个镜像,可以部署到k8s上去,并且给它配置了一个ingress,这样就可以通过一个简单好记的域名直接访问了。
编排文件在这里
$ kubectl create secret generic dex.ca.pem --from-file ca.pem
$ kubectl apply -f example-app.yaml
本机上配置一下hosts文件,然后浏览器访问 example-app.ieevee.com 就可以了。