一文搞懂 Traefik2.1 的使用( 五 )

直接创建上面的资源对象:
$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEv1-77cfb86999-wfbl21/1Running094sv2-6f45d498b7-g6qjt1/1Running091s$ kubectl get svc NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEv1ClusterIP10.96.218.173<none>80/TCP99sv2ClusterIP10.99.98.48<none>80/TCP96s现在我们创建一个 IngressRoute 对象,将服务 v1 的流量复制 50% 到服务 v2,如下资源对象所示:(mirror-ingress-route.yaml)
apiVersion: traefik.containo.us/v1alpha1kind: TraefikServicemetadata:name: app-mirrorspec:mirroring:name: v1 # 发送 100% 的请求到 K8S 的 Service "v1"port: 80mirrors:- name: v2 # 然后复制 50% 的请求到 v2percent: 50port: 80---apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata:name: mirror-ingress-routenamespace: defaultspec:entryPoints:- webroutes:- match: Host(`mirror.qikqiak.com`)kind: Ruleservices:- name: app-mirrorkind: TraefikService # 使用声明的 TraefikService 服务,而不是 K8S 的 Service然后直接创建这个资源对象即可:
$ kubectl apply -f mirror-ingress-route.yaml ingressroute.traefik.containo.us/mirror-ingress-route createdtraefikservice.traefik.containo.us/mirroring-example created这个时候我们在浏览器中去连续访问4次 mirror.qikqiak.com 可以发现有一半的请求也出现在了 v2 这个服务中:

一文搞懂 Traefik2.1 的使用

文章插图
 
TCP另外 Traefik2.0 已经支持了 TCP 服务的,下面我们以 mongo 为例来了解下 Traefik 是如何支持 TCP 服务得 。
简单 TCP 服务首先部署一个普通的 mongo 服务,资源清单文件如下所示:(mongo.yaml)
apiVersion: apps/v1kind: Deploymentmetadata:name: mongo-traefiklabels:app: mongo-traefikspec:selector:matchLabels:app: mongo-traefiktemplate:metadata:labels:app: mongo-traefikspec:containers:- name: mongoimage: mongo:4.0ports:- containerPort: 27017---apiVersion: v1kind: Servicemetadata:name: mongo-traefikspec:selector:app: mongo-traefikports:- port: 27017直接创建 mongo 应用:
$ kubectl apply -f mongo.yamldeployment.apps/mongo-traefik createdservice/mongo-traefik created创建成功后就可以来为 mongo 服务配置一个路由了 。由于 Traefik 中使用 TCP 路由配置需要 SNI,而 SNI 又是依赖 TLS 的,所以我们需要配置证书才行,如果没有证书的话,我们可以使用通配符 * 进行配置,我们这里创建一个 IngressRouteTCP 类型的 CRD 对象(前面我们就已经安装了对应的 CRD 资源):(mongo-ingressroute-tcp.yaml)
apiVersion: traefik.containo.us/v1alpha1kind: IngressRouteTCPmetadata:name: mongo-traefik-tcpspec:entryPoints:- mongoroutes:- match: HostSNI(`*`)services:- name: mongo-traefikport: 27017要注意的是这里的 entryPoints 部分,是根据我们启动的 Traefik 的静态配置中的 entryPoints 来决定的,我们当然可以使用前面我们定义得 80 和 443 这两个入口点,但是也可以可以自己添加一个用于 mongo 服务的专门入口点:
......- image: traefik:2.1.1name: traefikports:- name: webcontainerPort: 80hostPort: 80- name: websecurecontainerPort: 443hostPort: 443- name: mongohostPort: 27017containerPort: 27017args:- --entryPoints.web.address=:80- --entryPoints.websecure.address=:443- --entryPoints.mongo.address=:27017......这里给入口点添加 hostPort 是为了能够通过节点的端口访问到服务,关于 entryPoints 入口点的更多信息,可以查看文档 entrypoints 了解更多信息 。然后更新 Traefik 后我们就可以直接创建上面的资源对象:
$ mongo-ingressroute-tcp.yamlingressroutetcp.traefik.containo.us/mongo-traefik-tcp created创建完成后,同样我们可以去 Traefik 的 Dashboard 页面上查看是否生效:
一文搞懂 Traefik2.1 的使用

文章插图
traefik-tcp-mongo-1
然后我们配置一个域名 mongo.local 解析到 Traefik 所在的节点,然后通过 27017 端口来连接 mongo 服务:
$ mongo --host mongo.local --port 27017mongo(75243,0x1075295c0) malloc: *** malloc_zone_unregister() failed for 0x7fffa56f4000MongoDB shell version: 2.6.1connecting to: mongo.local:27017/test> show dbsadmin0.000GBconfig0.000GBlocal0.000GB到这里我们就完成了将 mongo(TCP)服务暴露给外部用户了 。
带 TLS 证书的 TCP上面我们部署的 mongo 是一个普通的服务,然后用 Traefik 代理的,但是有时候为了安全 mongo 服务本身还会使用 TLS 证书的形式提供服务,下面是用来生成 mongo tls 证书的脚本文件:(generate-certificates.sh)
#!/bin/bash## From https://medium.com/@rajanmaharjan/secure-your-mongodb-connections-ssl-tls-92e2addb3c89set -eu -o pipefailDOMAINS="${1}"CERTS_DIR="${2}"[ -d "${CERTS_DIR}" ]CURRENT_DIR="$(cd "$(dirname "${0}")" && pwd -P)"GENERATION_DIRNAME="$(echo "${DOMAINS}" | cut -d, -f1)"rm -rf "${CERTS_DIR}/${GENERATION_DIRNAME:?}" "${CERTS_DIR}/certs"echo "== Checking Requirements..."command -v go >/dev/null 2>&1 || echo "Golang is required"command -v minica >/dev/null 2>&1 || go get github.com/jsha/minica >/dev/nullecho "== Generating Certificates for the following domains: ${DOMAINS}..."cd "${CERTS_DIR}"minica --ca-cert "${CURRENT_DIR}/minica.pem" --ca-key="${CURRENT_DIR}/minica-key.pem" --domains="${DOMAINS}"mv "${GENERATION_DIRNAME}" "certs"cat certs/key.pem certs/cert.pem > certs/mongo.pemecho "== Certificates Generated in the directory ${CERTS_DIR}/certs"


推荐阅读