上节课给你们展现了 traefik 的安装使用以及简单的 ingress 的配置方法,这节课咱们来学习一下 ingress tls 以及 path 路径在 ingress 对象中的使用方法。node
在如今大部分场景下面咱们都会使用 https 来访问咱们的服务,这节课咱们将使用一个自签名的证书,固然你有在一些正规机构购买的 CA 证书是最好的,这样任何人访问你的服务的时候都是受浏览器信任的证书。使用下面的 openssl 命令生成 CA 证书:web
$ openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -out tls.crt
如今咱们有了证书,咱们可使用 kubectl 建立一个 secret 对象来存储上面的证书:shell
$ kubectl create secret generic traefik-cert --from-file=tls.crt --from-file=tls.key -n kube-system
前面咱们使用的是 Traefik 的默认配置,如今咱们来配置 Traefik,让其支持 https:api
defaultEntryPoints = ["http", "https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key"
上面的配置文件中咱们配置了 http 和 https 两个入口,而且配置了将 http 服务强制跳转到 https 服务,这样咱们全部经过 traefik 进来的服务都是 https 的,要访问 https 服务,固然就得配置对应的证书了,能够看到咱们指定了 CertFile 和 KeyFile 两个文件,因为 traefik pod 中并无这两个证书,因此咱们要想办法将上面生成的证书挂载到 Pod 中去,是否是前面咱们讲解过 secret 对象能够经过 volume 形式挂载到 Pod 中?至于上面的 traefik.toml 这个文件咱们要怎么让 traefik pod 可以访问到呢?还记得咱们前面讲过的 ConfigMap 吗?咱们是否是能够将上面的 traefik.toml 配置文件经过一个 ConfigMap 对象挂载到 traefik pod 中去:浏览器
$ kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system
如今就能够更改下上节课的 traefik pod 的 yaml 文件了:tomcat
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 volumes: - name: ssl secret: secretName: traefik-cert - name: config configMap: name: traefik-conf tolerations: - operator: "Exists" nodeSelector: kubernetes.io/hostname: master containers: - image: traefik name: traefik-ingress-lb volumeMounts: - mountPath: "/ssl" name: "ssl" - mountPath: "/config" name: "config" ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 args: - --configfile=/config/traefik.toml - --api - --kubernetes - --logLevel=INFO
和以前的比较,咱们增长了 443 的端口配置,以及启动参数中经过 configfile 指定了 traefik.toml 配置文件,这个配置文件是经过 volume 挂载进来的。而后更新下 traefik pod:app
$ kubectl apply -f traefik.yaml
$ kubectl logs -f traefik-ingress-controller-7dcfd9c6df-v58k7 -n kube-system
time="2018-08-26T11:26:44Z" level=info msg="Server configuration reloaded on :80" time="2018-08-26T11:26:44Z" level=info msg="Server configuration reloaded on :443" time="2018-08-26T11:26:44Z" level=info msg="Server configuration reloaded on :8080"
更新完成后咱们查看 traefik pod 的日志,若是出现相似于上面的一些日志信息,证实更新成功了。如今咱们去访问 traefik 的 dashboard 会跳转到 https 的地址,并会提示证书相关的报警信息,这是由于咱们的证书是咱们自建的,并不受浏览器信任,若是你是正规机构购买的证书并不会出现改报警信息,你应该能够看到咱们常见的绿色标志: 学习
点击下面的高级,咱们能够强制让其跳转,这样咱们就能够正常访问 traefik 的 dashboard 了。spa
其实上面的 TLS 认证方式已经成功了,接下来咱们经过一个实例来讲明下 ingress 中 path 的用法,这里咱们部署了3个简单的 web 服务,经过一个环境变量来标识当前运行的是哪一个服务:(backend.yaml)日志
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: svc1 spec: replicas: 1 template: metadata: labels: app: svc1 spec: containers: - name: svc1 image: cnych/example-web-service env: - name: APP_SVC value: svc1 ports: - containerPort: 8080 protocol: TCP --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: svc2 spec: replicas: 1 template: metadata: labels: app: svc2 spec: containers: - name: svc2 image: cnych/example-web-service env: - name: APP_SVC value: svc2 ports: - containerPort: 8080 protocol: TCP --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: svc3 spec: replicas: 1 template: metadata: labels: app: svc3 spec: containers: - name: svc3 image: cnych/example-web-service env: - name: APP_SVC value: svc3 ports: - containerPort: 8080 protocol: TCP --- kind: Service apiVersion: v1 metadata: labels: app: svc1 name: svc1 spec: type: ClusterIP ports: - port: 8080 name: http selector: app: svc1 --- kind: Service apiVersion: v1 metadata: labels: app: svc2 name: svc2 spec: type: ClusterIP ports: - port: 8080 name: http selector: app: svc2 --- kind: Service apiVersion: v1 metadata: labels: app: svc3 name: svc3 spec: type: ClusterIP ports: - port: 8080 name: http selector: app: svc3
能够看到上面咱们定义了3个 Deployment,分别对应3个 Service:
$ kubectl create -f backend.yaml
deployment.extensions "svc1" created deployment.extensions "svc2" created deployment.extensions "svc3" created service "svc1" created service "svc2" created service "svc3" created
而后咱们建立一个 ingress 对象来访问上面的3个服务:(example-ingress.yaml)
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-web-app annotations: kubernetes.io/ingress.class: "traefik" spec: rules: - host: example.haimaxy.com http: paths: - path: /s1 backend: serviceName: svc1 servicePort: 8080 - path: /s2 backend: serviceName: svc2 servicePort: 8080 - path: / backend: serviceName: svc3 servicePort: 8080
注意咱们这里定义的 ingress 对象和以前有一个不一样的地方是咱们增长了 path 路径的定义,不指定的话默认是 '/',建立该 ingress 对象:
$ kubectl create -f test-ingress.yaml
ingress.extensions "example-web-app" created $ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE example-web-app example.haimaxy.com 80 1m $ kubectl describe ingress example-web-app Name: example-web-app Namespace: default Address: Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- example.haimaxy.com /s1 svc1:8080 (<none>) /s2 svc2:8080 (<none>) / svc3:8080 (<none>) Annotations: kubernetes.io/ingress.class: traefik Events: <none>
如今咱们能够在本地 hosts 里面给域名 example.haimaxy.com 添加对应的 hosts 解析,而后就能够在浏览器中访问,能够看到默认也会跳转到 https 的页面:
咱们能够看到访问上面的域名获得的结果是 svc3 service!这是由于上面在 ingress 中咱们为域名的跟路径匹配的是 svc3 这个 service,一样的,咱们访问http://example.haimaxy.com/s1 获得的应该就是 svc1 这个 service 了:
访问http://example.haimaxy.com/s2 获得的应该就是 svc2 这个 service 了:
这里咱们须要注意的是根路径
/
必须在 ingress 对象中声明的时候必须放在最后面,否则就都被/
匹配到拦截到了,你们能够尝试下把/
这个 path 放在最上面,而后访问下 s1 和 s2 这两个 path,看看获得的结果是怎样的?
有的同窗可能有这样的需求,就是不一样的 ingress 对象是供不一样的域名进行使用的,而后不一样的域名的证书还不相同,这样咱们想使用上面 traefik 给你们提供的统一的 https 证书就不行了,这个时候咱们就能够单独为当前的服务提供单独的证书就能够,一样用证书文件建立一个 secret 对象,而后在 ingress 对象中声明一个 tls 对象便可,好比上面的 example.haimaxy.com 咱们能够单独指定一个证书文件:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-web-app annotations: kubernetes.io/ingress.class: "traefik" spec: tls: - secretName: traefik-cert rules: - host: ...
实际项目:tomcat-admin-ingress.yaml
service-admin服务以前就有直接对应上就行
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: tomcat-admin annotations: kubernetes.io/ingress.class: "traefik" spec: rules: - host: admin.fuyuteng.com http: paths: - path: backend: serviceName: service-admin servicePort: 80