您好,欢迎来到独旅网。
搜索
您的当前位置:首页ingress之tls和path使用

ingress之tls和path使用

来源:独旅网
ingress之tls和path使⽤

ingress tls

上节课给⼤家展⽰了 traefik 的安装使⽤以及简单的 ingress 的配置⽅法,这节课我们来学习⼀下 ingress tls 以及 path 路径在 ingress 对象中的使⽤⽅法。

TLS 认证

在现在⼤部分场景下⾯我们都会使⽤ https 来访问我们的服务,这节课我们将使⽤⼀个⾃签名的证书,当然你有在⼀些正规机构购买的 CA证书是最好的,这样任何⼈访问你的服务的时候都是受浏览器信任的证书。使⽤下⾯的 openssl 命令⽣成 CA 证书:

$ openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -out tls.crt

现在我们有了证书,我们可以使⽤ kubectl 创建⼀个 secret 对象来存储上⾯的证书:

$ kubectl create secret generic traefik-cert --from-file=tls.crt --from-file=tls.key -n kube-system

配置 Traefik

前⾯我们使⽤的是 Traefik 的默认配置,现在我们来配置 Traefik,让其⽀持 https:

defaultEntryPoints = [\"http\[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 ⽂件了:

kind: Deployment

apiVersion: extensions/v1beta1metadata:

name: traefik-ingress-controller namespace: kube-system labels:

k8s-app: traefik-ingress-lbspec:

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:

$ 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 了。

配置 ingress

其实上⾯的 TLS 认证⽅式已经成功了,接下来我们通过⼀个实例来说明下 ingress 中 path 的⽤法,这⾥我们部署了3个简单的 web 服务,通过⼀个环境变量来标识当前运⾏的是哪个服务:(backend.yaml)

kind: Deployment

apiVersion: extensions/v1beta1metadata: 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/v1beta1metadata: name: svc2spec:

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/v1beta1metadata: name: svc3spec:

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: ServiceapiVersion: v1metadata: labels:

app: svc1 name: svc1spec:

type: ClusterIP ports:

- port: 8080 name: http selector: app: svc1---kind: ServiceapiVersion: v1metadata: labels:

app: svc2 name: svc2spec:

type: ClusterIP ports:

- port: 8080 name: http selector: app: svc2---kind: ServiceapiVersion: v1metadata: labels:

app: svc3 name: svc3spec:

type: ClusterIP ports:

- port: 8080 name: http selector: app: svc3

可以看到上⾯我们定义了3个 Deployment,分别对应3个 Service:

$ kubectl create -f backend.yaml

deployment.extensions \"svc1\" createddeployment.extensions \"svc2\" createddeployment.extensions \"svc3\" createdservice \"svc1\" createdservice \"svc2\" createdservice \"svc3\" created

然后我们创建⼀个 ingress 对象来访问上⾯的3个服务:(example-ingress.yaml)

apiVersion: extensions/v1beta1kind: Ingressmetadata:

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 AGEexample-web-app example.haimaxy.com 80 1m$ kubectl describe ingress example-web-appName: example-web-appNamespace: defaultAddress:

Default backend: default-http-backend:80 ()Rules:

Host Path Backends ---- ---- -------- example.haimaxy.com

/s1 svc1:8080 () /s2 svc2:8080 () / svc3:8080 ()Annotations:

kubernetes.io/ingress.class: traefikEvents:

现在我们可以在本地 hosts ⾥⾯给域名 example.haimaxy.com 添加对应的 hosts 解析,然后就可以在浏览器中访问,可以看到默认也会跳转

到 https 的页⾯:

这⾥我们需要注意的是根路径/必须在 ingress 对象中声明的时候必须放在最后⾯,不然就都被/匹配到拦截到了,⼤家可以尝试下把/这个 path 放在最上⾯,然后访问下 s1 和 s2 这两个 path,看看得到的结果是怎样的?

有的同学可能有这样的需求,就是不同的 ingress 对象是供不同的域名进⾏使⽤的,然后不同的域名的证书还不相同,这样我们想使⽤上⾯traefik 给⼤家提供的统⼀的 https 证书就不⾏了,这个时候我们就可以单独为当前的服务提供单独的证书就可以,同样⽤证书⽂件创建⼀个secret 对象,然后在 ingress 对象中声明⼀个 tls 对象即可,⽐如上⾯的 example.haimaxy.com 我们可以单独指定⼀个证书⽂件:

apiVersion: extensions/v1beta1kind: Ingressmetadata:

name: example-web-app annotations:

kubernetes.io/ingress.class: \"traefik\"spec: tls:

- secretName: traefik-cert rules: - host:...

实际项⽬:tomcat-admin-ingress.yamlservice-admin服务之前就有直接对应上就⾏

apiVersion: extensions/v1beta1kind: Ingressmetadata:

name: tomcat-admin annotations:

kubernetes.io/ingress.class: \"traefik\"spec: rules:

- host: admin.fuyuteng.com http: paths: - path: backend:

serviceName: service-admin servicePort: 80

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- dcrkj.com 版权所有 赣ICP备2024042791号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务