my-dlq / blog-example

博客中的示例文件,包含 Kubernetes、Jenkins、Go、Java、SpringBoot、SpringCloud 知识示例等,将结合博客逐步讲解整体的知识内容体系。
http://www.mydlq.club
532 stars 436 forks source link

【请教】部署traefik后https访问返回403 #7

Closed quanzaiyu closed 4 years ago

quanzaiyu commented 4 years ago

你好,很荣幸能看到这个项目以及相关的文章。

通过这个YAML部署后,traefik成功部署,但是https却无法成功访问,返回403,请教一下是什么问题。

接下来我具体描述一下我的部署过程。


通过Helm部署

最开始我并没有看到这个项目,我就直接通过Helm部署了,相关命令如下:

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
kubectl create ns traefik
helm install traefik traefik/traefik -n traefik
kubectl apply -f traefik/route.yaml

其中 traefik/route.yaml 如下:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: traefik
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`traefik.dashboard.com`)
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService

---

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard-tls
  namespace: traefik
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`traefik.dashboard.com`)
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService
  tls:
    secretName: traefik-dashboard-tls

其中 traefik-dashboard-tls 为我的自签证书:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=traefik.dashboard.com"
kubectl create secret tls traefik-dashboard-tls --key tls.key --cert tls.crt -n traefik

image

image

但是访问时,通过http能够正常访问,而https返回403.

效果如下:

image

image

通过本项目部署

然后我直接将chart下下来,看了一圈,也没看出个头绪,于是就在网上查询解决方案,很幸运找到这个项目以及对应文章。

我就按照文章中的步骤,一步一步创建YAML并部署。

当然,首先是干掉之前的那个命名空间:

kubectl delete ns traefik

然后按照文章,一步一步地创建文件,同时部署:

image

我只修改了一个地方,就是 Service 中的 type:

apiVersion: v1
kind: Service
metadata:
  name: traefik
spec:
  ports:
    - name: web
      port: 80
    - name: websecure
      port: 443
    - name: admin
      port: 8080
  type: LoadBalancer
  selector:
    app: traefik

最终,应用成功部署:

image

但是,通过http访问没问题,https仍然返回403,排查了半天,还是不知道原因。

请问下阁下,有没有什么解决方案,或者一些好的排查方法。望不吝赐教,感激不尽。

my-dlq commented 4 years ago

返回http状态码403,而不是404,说明流量已经流入服务器,没有通过验证。具体问题,可以猜一下:

1.检查证书是否有误。 2.本人使用的ingress的部署文件deployment资源中指定端口为hostport模式,即使用物理机的端口。检查traefik容器所运行的服务器端口是否能正常访问。 3.试试代理别的服务,如nginx服务,配置一个traefik https路由规则进行代理,进行尝试。 4.可以降低traefik配置文件中的日志级别,访问出错后观察容器日志,查看有无相关错误信息。

大晚上睡觉前暂时只能想这么多,实在不行可以将配置发我邮箱 mynamedlq@163.com 给看下。

quanzaiyu commented 4 years ago

我是用的是Docker Desktop中继承的Kubernetes,没使用虚拟机。

image

尝试代理其他服务也是一样的,比如Nginx:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nginx-route
  namespace: nginx
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`nginx.test.com`)
      kind: Rule
      services:
        - name: nginx
          port: 80

---

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nginx-route
  namespace: nginx
spec:
  entryPoints:
    - websecure
  tls:
    secretName: nginx-test-tls
    hosts:
      - nginx.test.com
  routes:
    - match: Host(`nginx.test.com`)
      kind: Rule
      services:
        - name: nginx
          port: 80

结果如下: HTTP: image HTTPS: image

域名均加入hosts,证书都是使用OpenSSL生成的,应该没问题。

image

我把部署脚本整理一下发你邮箱,麻烦帮我看看,谢谢!

quanzaiyu commented 4 years ago

您好,相关的部署脚本我已发送到您的邮箱,麻烦查收一下。

image

quanzaiyu commented 4 years ago

弄出来了,还需要装一个metallb,云环境比如ECS中是自带了的,但本地还得自己配。

image