在之前的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