Traefik 2.0新增了暴露TCP服务,我们这里以Redis为例。
部署Redis
因为这里只是简单的实践以下暴露TCP服务,所以就用最简单的部署方式,YAML文件如下:
redis.yaml
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: redisnamespace: kube-opsspec:template:metadata:annotations:prometheus.io/scrape: "true"prometheus.io/port: "9121"labels:app: redisspec:containers:- name: redisimage: redis:4ports:- containerPort: 6379- name: redis-exporterimage: oliver006/redis_exporter:latestresources:requests:cpu: 100mmemory: 100Miports:- containerPort: 9121---kind: ServiceapiVersion: v1metadata:name: redisnamespace: kube-opsannotations:prometheus.io/scrape: "true"prometheus.io/port: "9121"prometheus.io/http-probe: "true"spec:selector:app: redisports:- name: redisport: 6379targetPort: 6379- name: promport: 9121targetPort: 9121
然后我们直接创建:
# kubectl apply -f redis.yaml
暴露TCP服务
由于Traefik使用路由配置需要SNI,而SNI又依赖TLS,所以我们需要证书才行。但是如果没有证书的话,我们可以使用通配符 * 进行配置,我们这里创建一个 IngressRouteTCP 类型的 CRD 对象(ingress-redis.yaml):
apiVersion: traefik.containo.us/v1alpha1kind: IngressRouteTCPmetadata:name: redisnamespace: kube-opsspec:entryPoints:- redisroutes:- match: HostSNI(`*`)services:- name: redisport: 6379
然后直接创建:
# kubectl apply -f ingress-redis.yaml
但是仅仅这样配置是不够的,我们注意到entryPoints部分,是根据我们启动的 Traefik 的静态配置中的 entryPoints 来决定的,比如我们可以自己添加一个用于 Redis 的专门的入口点,然后我们将redis暴露出来方便测试:
kind: DeploymentapiVersion: extensions/v1beta1metadata:name: traefiknamespace: kube-systemlabels:k8s-app: traefik-ingress-lbspec:selector:matchLabels:k8s-app: traefik-ingress-lbtemplate:metadata:labels:k8s-app: traefik-ingress-lbname: traefik-ingress-lbspec:serviceAccountName: traefik-ingress-controllertolerations:- operator: "Exists"nodeSelector:kubernetes.io/hostname: 172.16.0.33containers:- image: traefik:v2.0name: traefik-ingress-lbports:- name: webcontainerPort: 80- name: websecurecontainerPort: 443- name: admincontainerPort: 8080- name: rediscontainerPort: 6379args:- --entrypoints.web.Address=:80- --entrypoints.websecure.Address=:443- --entrypoints.redis.Address=:6379- --api.insecure=true- --providers.kubernetescrd- --api- --api.dashboard=true- --accesslog---kind: ServiceapiVersion: v1metadata:name: traefiknamespace: kube-systemspec:type: NodePortselector:k8s-app: traefik-ingress-lbports:- protocol: TCPport: 8080name: admin- name: webport: 80protocol: TCP- name: websecureport: 443protocol: TCP- name: redisport: 6379protocol: TCP
然后重新更新以下清单:
# kubectl apply -f traefik.yaml
现在我们可以在管理界面看到已经配置成功了。


使用命令验证redis:
可以看到TCP服务暴露成功。
