kubernetes traefik配置https实践操作记录

1.参考文档

http://traefik.cn/

2.访问方式简易说明

参考文档
https://tonybai.com/2018/06/25/the-kubernetes-ingress-practice-for-https-service/

前面一篇:traefik基础部署记录,介绍了最简单的http访问traefik,访问过程参考见下:

client --- (via http) ---> traefik ---- (via http) ----> services

现在要实践的是更安全也更复杂的https访问traefik,有两种访问过程,参考见下:

后端service是普通http的
即client与traefik间采用https加密通信,但traefik与svc间则是明文的http通信

client --- (via https) ---> traefik ---- (via http) ----> services

后端service是https的
即client与traefik间采用https加密通信,但traefik与svc也是采用https通信

client --- (via https) ---> traefik ---- (via https) ----> services

3.部署前需要了解的https基础知识

参考文档:
http://blog.jobbole.com/110354/

能不能用一句话总结HTTPS?
答案是不能,因为HTTPS本身实在太复杂。但是我还是尝试使用一段话来总结HTTPS:

HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。

为什么需要引入证书,上面那篇文章说得很棒。
进行ssl通讯,必须需要一个权威机构认证的证书(这个需要Money),我们是实验环境,自己建一个证书玩玩。除了证书,还需要web软件(这里是traefik)开启ssl支持并采用我们建立的证书。

4.配置证书

实验环境用现有的证书,用k8s集群的证书。

[[email protected] ~]# cd /etc/kubernetes/ssl/
[[email protected] ssl]# ls
admin.csr? ? ? apiserver-key.pem? ca.srl? ? ? ? ? ? ? ? ? ? ? kubernetes2-worker.csr? ? ? kubernetes3-worker-key.pem
admin-key.pem? apiserver.pem? ? ? kubernetes1-worker.csr? ? ? kubernetes2-worker-key.pem? kubernetes3-worker.pem
admin.pem? ? ? ca-key.pem? ? ? ?? kubernetes1-worker-key.pem? kubernetes2-worker.pem? ? ? openssl.cnf
apiserver.csr? ca.pem? ? ? ? ? ?? kubernetes1-worker.pem? ? ? kubernetes3-worker.csr? ? ? worker-openssl.cnf
[[email protected] ssl]#

注意操作目录,如果不是在此目录下操作,须指定绝对路径

[[email protected] ssl]# kubectl create secret generic traefik-cert --from-file=ca-key.pem --from-file=ca.pem -n kube-system
secret "traefik-cert" created
[[email protected] ssl]#

5.创建configmap,保存traefik的配置

这里的traefik中配置了把所有http请求全部rewrite为https的规则,并配置相应的证书位置:

[[email protected] config]# cat traefik.toml
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 = "/etc/kubernetes/ssl/ca.pem"
? ? ? keyFile = "/etc/kubernetes/ssl/ca-key.pem"
[[email protected] config]# kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system
configmap "traefik-conf" created
[[email protected] config]# kubectl get cm -n kube-system
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? DATA? ? ? AGE
extension-apiserver-authentication?? 6? ? ? ?? 70d
kube-flannel-cfg? ? ? ? ? ? ? ? ? ?? 2? ? ? ?? 70d
kube-proxy? ? ? ? ? ? ? ? ? ? ? ? ?? 2? ? ? ?? 70d
kubeadm-config? ? ? ? ? ? ? ? ? ? ?? 1? ? ? ?? 70d
kubernetes-dashboard-settings? ? ? ? 1? ? ? ?? 61d
mysql1.v1? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ?? 28d
traefik-conf? ? ? ? ? ? ? ? ? ? ? ?? 1? ? ? ?? 12s
[[email protected] config]#``

6.部署Traefik,这里主要是要关联创建的secret和configMap,并挂载相对应的主机目录。

备份下原有文件

[[email protected] k8s]# cp traefik-deployment.yaml traefik-deployment.yaml.bk
[[email protected] k8s]# ll

配置好的参考见下:

[[email protected] k8s]# cat traefik-deployment.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
? name: traefik-ingress-controller
? namespace: kube-system
---
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
? name: traefik-ingress-controller
? namespace: kube-system
? labels:
? ? k8s-app: traefik-ingress-lb
spec:
? 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
? ? ? hostNetwork: true
? ? ? volumes:
? ? ? - name: ssl
? ? ? ? secret:
? ? ? ? ? secretName: traefik-cert
? ? ? - name: config
? ? ? ? configMap:
? ? ? ? ? name: traefik-conf
? ? ? containers:
? ? ? - image: traefik
? ? ? ? name: traefik-ingress-lb
? ? ? ? volumeMounts:
? ? ? ? - mountPath: "/etc/kubernetes/ssl"
? ? ? ? ? name: "ssl"
? ? ? ? - mountPath: "/config"
? ? ? ? ? name: "config"
? ? ? ? ports:
? ? ? ? - name: http
? ? ? ? ? containerPort: 80
? ? ? ? - name: https
? ? ? ? ? containerPort: 443
? ? ? ? - name: admin
? ? ? ? ? containerPort: 8080
? ? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml
---
kind: Service
apiVersion: v1
metadata:
? name: traefik-ingress-service
? namespace: kube-system
spec:
? selector:
? ? k8s-app: traefik-ingress-lb
? ports:
? ? - protocol: TCP
? ? ? port: 80
? ? ? name: web
? ? - protocol: TCP
? ? ? port: 443
? ? ? name: https
? ? - protocol: TCP
? ? ? port: 8080
? ? ? name: admin
? type: NodePort
[[email protected] k8s]#

关于配置文件参数的一些解释和说明:

本操作记录是基于上一篇的操作环境,traefik-rbac.yaml这个是已经配置好了的。如果没有配置这个,请先配置。

kind: DaemonSet 官方默认是使用Deployment
hostNetwork: true 关于这个基础篇有解释

? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml?

这个参数是用来干嘛的呢?
这是参数,这里是容器启动时执行ENTRYPOINT命令引用的参数

看看traefik镜像的history

[[email protected] k8s]# docker history --no-trunc=true docker.io/traefik
IMAGE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? CREATED? ? ? ? ? ?? CREATED BY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? SIZE? ? ? ? ? ? ? ? COMMENT
sha256:11569c00178041f0502a3251a2d33196c9a153c564814bc9f712c704a85200c2?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? LABEL org.label-schema.vendor=Containous org.label-schema.url=https://traefik.io org.label-schema.name=Traefik org.label-schema.description=A modern reverse-proxy org.label-schema.version=v1.6.5 org.label-schema.docker.schema-version=1.0?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? ENTRYPOINT ["/traefik"]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? EXPOSE 80/tcp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop) COPY file:ba6114281de19b8e363e82ed5b30471e264464b79049c538a86b7eae309ab46e in /? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 52.2 MB? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 6 weeks ago? ? ? ?? /bin/sh -c #(nop) COPY file:d8282341d1fb7d2cc3d5d3523d0d4126066cc1ba8abe3f0047a459b3a63a5653 in /etc/ssl/certs/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 275 kB? ? ? ? ? ? ?
[[email protected] k8s]#

其实就是执行
&lt;missing&gt;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? ENTRYPOINT ["/traefik"] ??
时的参数

执行部署

[[email protected] k8s]# kubectl apply -f traefik-deployment.yaml
serviceaccount "traefik-ingress-controller" created
daemonset.extensions "traefik-ingress-controller" created
service "traefik-ingress-service" created
[[email protected] k8s]# kubectl get po -n kube-system
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? ?? STATUS? ? RESTARTS?? AGE
etcd-kubernetes1? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-apiserver-kubernetes1? ? ? ? ? ? ? 1/1? ? ?? Running?? 43? ? ? ?? 70d
kube-controller-manager-kubernetes1? ?? 1/1? ? ?? Running?? 42? ? ? ?? 70d
kube-dns-b4bd9576-db5hh? ? ? ? ? ? ? ?? 3/3? ? ?? Running?? 117? ? ? ? 70d
kube-flannel-ds-27wrd? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 73? ? ? ?? 70d
kube-flannel-ds-6lnj9? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 66? ? ? ?? 70d
kube-flannel-ds-xz87r? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 63? ? ? ?? 70d
kube-proxy-hhghb? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-proxy-hwvs9? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-proxy-jcxbz? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-scheduler-kubernetes1? ? ? ? ? ? ? 1/1? ? ?? Running?? 40? ? ? ?? 70d
kubernetes-dashboard-7d5dcdb6d9-5zkkl?? 1/1? ? ?? Running?? 6? ? ? ? ? 6d
tiller-deploy-5c688d5f9b-kfqwx? ? ? ? ? 1/1? ? ?? Running?? 12? ? ? ?? 14d
traefik-ingress-controller-8jxsb? ? ? ? 1/1? ? ?? Running?? 0? ? ? ? ? 6s
traefik-ingress-controller-h5wrh? ? ? ? 1/1? ? ?? Running?? 0? ? ? ? ? 6s

可能出现的错误

[[email protected] k8s]# kubectl logs traefik-ingress-controller-gpgss -n kube-system
time="2018-08-01T03:06:30Z" level=error msg="Unable to add a certificate to the entryPoint \"https\" : unable to generate TLS certificate : tls: failed to find any PEM data in certificate input"
time="2018-08-01T03:06:30Z" level=error msg="Error creating TLS config: No certificates found for TLS entrypoint https"
time="2018-08-01T03:06:30Z" level=fatal msg="Error preparing server: No certificates found for TLS entrypoint https" ?

这是路径问题导致:
见下面的配置参数

traefik.toml文件的路径

 [[entryPoints.https.tls.certificates]]
? ? ? certFile = "/etc/kubernetes/ssl/ca.pem"
? ? ? keyFile = "/etc/kubernetes/ssl/ca-key.pem"

##这个证书是存放在k8s node上的目录

?```
volumeMounts:
? ? ? ? - mountPath: "/etc/kubernetes/ssl"
? ? ? ? name: "ssl"
? ? ? ? - mountPath: "/config"
? ? ? ? ? name: "config"

##为什么这个目录要配置成和traefik.toml里的路径一样呢?思考下。注意这个挂载路径是会自动建立的

? ? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml

##原因就是因为这个引用,如果上面mountPath配置的路径不正确,将找不到配置的证书。?configfile引用traefik.toml,traefik.toml引用的路径是前面node上的,在容器里如果不建立一样的路径,traefik.toml在容器里去哪读取证书呢?

traefik已经部署成功。

7.traefik飞起来1

看看前面提到的访问过程示图:

client --- (via https) ---> traefik ---- (via http) ---->? services

先测试这个
简单介绍,在k8s集群中部署了wordpress(这是基于http80端口的服务),现在通过traefik https跳转访问wordpress

svc,po情况

[[email protected] ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.106.13.46 <none> 80/TCP 13d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 72d
mysql ClusterIP 10.97.84.51 <none> 3306/TCP 2d
wordpress ClusterIP 10.111.234.225 <none> 8080/TCP 2d
[[email protected] ~]#

[[email protected] ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
httpd-749bf8c6f4-bfjfw 1/1 Running 0 2h
httpd-749bf8c6f4-ghpzl 1/1 Running 0 2h
httpd-749bf8c6f4-xvrn4 1/1 Running 0 2h
mysql-5bbbf49b4f-wjw47 1/1 Running 4 2d
nginx-deployment-6b5c99b6fd-pscr6 1/1 Running 0 2h
nginx-deployment-6b5c99b6fd-zr2p7 1/1 Running 0 2h
node-exporter-4gbh9 1/1 Running 24 35d
node-exporter-8h9vp 1/1 Running 25 35d
wordpress-pod-7dd7659959-hc7mr 1/1 Running 4 2d
[[email protected] ~]#


ingress文件

[[email protected] ~]# cat wp/wordpress.ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
? name: wordpress-ingress
? namespace: default
spec:
? rules:
? - host: wordpress.ingress
? ? http:
? ? ? paths:
? ? ? - path: /
? ? ? ? backend:
? ? ? ? ? serviceName: wordpress
? ? ? ? ? servicePort: 8080
[[email protected] ~]#


执行部署

[[email protected] wp]# kubectl apply -f wordpress.ingress.yaml
ingress.extensions "wordpress-ingress" created

[[email protected] ~]# kubectl get ing
NAME? ? ? ? ? ? ? ? HOSTS? ? ? ? ? ? ?? ADDRESS?? PORTS? ?? AGE
httpd-svc-ingress?? httpd-svc.ingress? ? ? ? ? ?? 80? ? ? ? 5d
wordpress-ingress?? wordpress.ingress? ? ? ? ? ?? 80? ? ? ? 4d
[[email protected] ~]#



在访问的主机解析好域名,访问正常

8.traefik飞起来2

原文地址:http://blog.51cto.com/goome/2153602

时间: 2024-10-08 19:21:16

kubernetes traefik配置https实践操作记录的相关文章

?mysql使用pv和pvc实践操作记录

创建nfs存储目录 [[email protected] ~]# mkdir /data/k8s/mysqlpv1 创建pv [[email protected] ~]# cat mysql-pv.yml apiVersion: v1 kind: PersistentVolume metadata: name: mysqlpv1 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPol

Kubernetes 使用 ingress 配置 https 集群(十五)

目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2.4.为 Nginx Pod 创建 Service 三.升级为 https 3.1 首先我们要制作证书 3.2.创建 secret 资源 3.3 更改 ingress 资源 3.4 浏览器访问验证 四.ingress 资源介绍 4.1.通过访问路径过滤 4.2.基于名称解析的虚拟主机 4.3.http

squid代理http和https方式上网的操作记录

背景:公司IDC机房有一台服务器A,只有内网环境:192.168.1.150现在需要让这台服务器能对外访问,能正常访问http和https请求(即80端口和443端口) 思路:在IDC机房里另找其他两台有公网环境的服务器B(58.68.250.8/192.168.1.8)和服务器C(58.68.250.5/192.168.1.5),且这两台服务器和内网环境的服务器A能相互ping通.其中:在服务器B上部署squid的http代理,让服务器C通过它的squid代理上网,能成功访问http在服务器C

traefik Ingress https配置

环境 . kubernetes 1.14.3 . traefik V1.7.12 .IP 192.168.30.35 .kubectl label nodes ingress ingress=yes https证书申请 推荐使用acme.sh 申请免费证书,具体方法不做详细介绍使用自签证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=*.mddgame.co

关于Nginx配置Https server后,乱跳的问题解决记录

大部分的服务器上,我们会在一个Nginx服务下配置多个vhost,以最大化运用服务器资源.然而,为其中一个vhost域名启用 HTTPS 之后,发现百度统计的实时访客或入口页中,存在一些来自其它域名的请求.即通过 https://some-other-domain.com/some-url 来访问对应的 https://www.domain.com/some-url 结果就是 Google 浏览器显示了一个安全警告页面,认为这是一个不安全的网页.因为我只配置了 www.domain.com 的

深入玩转K8S之如何访问业务应用(Traefik-ingress配置https篇)

上篇我们简单介绍了下traefik以及如何http访问, 但是在实际生产环境中不仅仅只是http的转发访问,还有https的转发访问, 前面一篇:traefik基础部署记录,介绍了最简单的http访问traefik,访问过程参考见下: client --- (via http) ---> traefik ---- (via http) ---->  services 现在要实践的是更安全也更复杂的https访问traefik,有两种访问过程,参考见下: 后端service是普通http的 即c

8月最新基于kubernetes的应用编排实践

本文根据8月22日腾讯云研发工程师颜卫在DockOne社群线上直播分享整理.颜卫来自腾讯云容器服务团队,现在主要从事腾讯云容器服务应用编排和微服务相关开发工作. 1 今天交流的话题主要会分为三部分 1.为什么需要应用编排 2.kubernetes社区应用编排发展现状 3.腾讯云容器服务应用编排的实践这几个方面做介绍. 在腾讯云容器服务应用编排的实践部分,主要会涉及1.配置管理,2.应用模板管理,3.基于应用的服务组管理等内容. 为什么需要应用编排: "微服务"架构大家都知道,他具有开发

PHP如何抓取https内容?记录一下。

PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了.当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强.所以要是有特殊需求的话,还是用curl吧.不仅仅速度快,而且非常稳定,基本上用curl抓取失败的几率很小. 而且今天在抓优酷视频API接口中的信息时,发现了一个问题,由于优酷API的url请求是https安全协议,用file_get_contents()函数竟然无法获取到数据,然后用curl写了个代替函数,

SQL Server 审计功能-记录所有的操作记录

SQL Server 审计-记录所有的操作记录 说到审计这个话题,相信作为一个企业管理员都知道,比如一般作为一个AD管理员的话,一般都会通过Policy开启审计功能,记录一些自定义的事务日志.对于SQL Server来说,审计也是一样的,SQL Server审计对象收集单个实例的服务器或数据库级的动作和行为监控组. 审计是在SQL Server实例级. 可以有多个审计/ SQL服务器实例.当你定义一个审计,你指定位置的输出结果. 这是审计目标. 审计是在创建的禁用状态,不会自动审计任何行动. 启