Traefik-Ingress 初步实践记录

在之前的K3S的配置的部分,有一个很诡异的问题就是,80和443 的端口的路由是直接走到了ingress层上面去,导致 nginx 的80端口的规则被 overwrite掉了。
但是ingress 是整个容器集群十分重要的一环。是连接容器内外网络的重要部分。
traefik 使用了label 来对ingress 来进行配置,使得路由走到不同的 service,最终走到Container。

在这一篇里面,主要是对目前现有的 ingress 实践来进行总结。

基础概念理解

k8s 的容器网络可以分为三层

  • Container
  • Service
  • Ingress

容器层面,可以使用容器的名字配合端口在 容器网络中互相访问。
但是这个IP是会变的,也就是说就是理解为一个随机的IP
为了固定这个IP就有了service 层,这个层可以来绑定一个 Deployment,并且对其内部的pod可以进行负载均衡。有了 service 就可以理解为有了一个固定的IP,根据service的名字,就可以直接来请求到对应POD提供的服务,而不需要关注POD的具体网络情况。也可以直接使用 NodePort 来占领HOST的端口
Ingress 层这一层十分重要,可以理解为一个Nginx类似的功能,根据路由和host或者其他规则来实现,外部流量到容器内部网络的分发

基于 Ingress 的nginx 配置

这里来记录一个使用 K8S 的网络模型来部署起来的一个应用。

Deployment

    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在这里配置 Contailer 本身暴露80端口出来,这个端口通过容器(POD)IP可以访问

Service

在Server 层,相当于给所有的容器来绑定一个统一的入口。通过 selector来对容器进行选择。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    traefik.ingress.kubernetes.io/load-balancer-method: drr
spec:
  template:
    metadata:
      labels:
        name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - name: web
    port: 80    # service端口
    targetPort: 80 # 容器端口

Ingress

Ingress 层对外部流量使用规则来进行统一转发。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: nginx.vm.12ms.xyz
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: web

K3S traekif 开启 API(dashboard)

traefik本来是自带一个 dashboard的,但是由于安全原因,默认是不放通的。
所以这里需要来把这个功能打开。
这里也是没有资料自己研究出来的功能。看了 pod 的describe,发现traefik实际上已经配置了dash的8080端口。所以理论上讲,直接配置一个service 和 ingress 即可。

Ports:         80/TCP, 8880/TCP, 443/TCP, 8080/TCP, 9100/TCP
Host Ports:    0/TCP, 0/TCP, 0/TCP, 0/TCP, 0/TCP

所以我写了下面的配置

apiVersion: v1
kind: Service
metadata:
  name: traefik-ui-svc
  namespace: kube-system
spec:
  selector:
    app: traefik
    release: traefik
  ports:
  - name: dash
    port: 8080
    targetPort: dash
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: traefik.vm.me
    http:
      paths:
      - backend:
          serviceName: traefik-ui-svc
          servicePort: dash

按理来说已经可以进行转发了,因为看到 service 和 ingress 已经有对应的绑定关系了,但是访问会报错 bad gateway 看样子像是 dashboard 没通。
上一个container来 curl 一下,看下实际情况,发现 80/443 都通。8080 不通。
之后上官网起查询,看看原因,发现 dashboard的功能默认是不开启的,需要我们在配置文件中配置这个入口,配置内容如下

[api]
    entryPoint = "traefik"
    dashboard = true
    debug = false

如果使用的是 Helm 来进行部署的话,这里可以直接使用,在yaml 里面的配置。

dashboard:
      enabled: true
accessLogs:
      enabled: true

参考

留下点什么吧