Kubernetes traefik 系列|traefik摆设与利用

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

一、traefik简介

Traefik是一个功能强盛的负载均衡工具,它支持4层和7层的根本负载均衡操作,通过IngressRoute、IngressRouteTCP、IngressRouteUDP资源即可轻松实现。为了满意更复杂的负载均衡需求,Traefik还抽象出了TraefikService资源,答应实现加权轮询、流量复制等高级操作。整体流量走向为:外部流量起首通过entryPoints端口进入Traefik,然后由IngressRoute/IngressRouteTCP/IngressRouteUDP举行匹配,进入TraefikService举行高级负载均衡处理,最后将哀求转发至Kubernetes的service。除此之外,Traefik还支持7层的粘性会话、康健检查、传递哀求头、响应转发、故障转移等丰富功能,为微服务架构提供全面的负载均衡和流量管理能力。

官方文档:https://doc.traefik.io/traefik/getting-started/install-traefik/
gtihub地址:https://github.com/traefik/traefik-helm-chart

当启动Traefik时,需要定义entrypoints,然后通过entrypoints的路由来分析传入的哀求,来查看他们是否是一组规则匹配,如果匹配,则路由可能将哀求通过一系列的转换过来在发送到服务上去。
二、安装traefik

  1. # 添加repo
  2. [root@k8s-master traefik]# helm repo add traefik https://helm.traefik.io/traefik
  3. # 更新repo仓库资源
  4. [root@k8s-master traefik]# helm repo update
  5. # 查看repo仓库traefik
  6. [root@k8s-master traefik]# helm search repo traefik
  7. # 创建traefik名称空间
  8. [root@k8s-master traefik]# kubectl create ns traefik
  9. # 安装traefik
  10. [root@k8s-master traefik]# helm install --namespace=traefik traefik traefik/traefik
  11. # 查看helm列表
  12. [root@k8s-master traefik]# helm list -n traefik
  13. # 查看pod资源信息
  14. [root@k8s-master traefik]# kubectl get pod -n traefik
复制代码
域名访问dashboard服务
利用helm摆设的traefik默认利用LoadBalancer袒露服务,如果想利用此方式访问,起主要摆设MetalLB才能分配到EXTERNAL-IP
Kubernetes LoadBalancer系列|MetalLB配置摆设
  1. kubectl get svc -n traefik
复制代码
  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: IngressRoute
  3. metadata:
  4.   name: dashboard
  5.   namespace: traefik
  6. spec:
  7.   entryPoints:
  8.     - web
  9.   routes:
  10.     - match: Host(`traefik.zgh.com`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
  11.       kind: Rule
  12.       services:
  13.         - name: api@internal
  14.           kind: TraefikService
复制代码

三、traefik利用

IngressRoute
摆设myapp1实例
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myapp1
  5. spec:
  6.   selector:
  7.     matchLabels:
  8.       app: myapp1
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: myapp1
  13.     spec:
  14.       containers:
  15.       - name: myapp1
  16.         image: ikubernetes/myapp:v1
  17.         resources:
  18.           limits:
  19.             memory: "128Mi"
  20.             cpu: "500m"
  21.         ports:
  22.         - containerPort: 80
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27.   name: myapp1
  28. spec:
  29.   type: ClusterIP
  30.   selector:
  31.     app: myapp1
  32.   ports:
  33.   - port: 80
  34.     targetPort: 80
复制代码
摆设myapp2实例
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: myapp2
  5. spec:
  6. selector:
  7.    matchLabels:
  8.      app: myapp2
  9. template:
  10.    metadata:
  11.      labels:
  12.        app: myapp2
  13.    spec:
  14.      containers:
  15.      - name: myapp2
  16.        image: ikubernetes/myapp:v2
  17.        resources:
  18.          limits:
  19.            memory: "128Mi"
  20.            cpu: "500m"
  21.        ports:
  22.        - containerPort: 80
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27. name: myapp2
  28. spec:
  29. type: ClusterIP
  30. selector:
  31.    app: myapp2
  32. ports:
  33. - port: 80
  34.    targetPort: 80
复制代码
创建资源并访问测试
  1. [root@k8s-master ingress]# kubectl get pod
  2. NAME                                          READY   STATUS    RESTARTS   AGE
  3. myapp1-795d947b45-9lsm6                       1/1     Running   0          2m18s
  4. myapp2-6ffd54f76-ljkr9                        1/1     Running   0          66s
  5. [root@k8s-master ingress]# kubectl get svc
  6. NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                  44h
  7. myapp1       ClusterIP   10.104.91.200   <none>        80/TCP                                                                                   2m26s
  8. myapp2       ClusterIP   10.111.245.32   <none>        80/TCP                                                                                   100s
  9. [root@k8s-master ingress]# curl 10.104.91.200
  10. Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  11. [root@k8s-master ingress]# curl 10.111.245.32
  12. Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
复制代码
HTTP域名路由
实现目的:集群外部用户通过访问http://myapp1.test.com域名时,将哀求署理至myapp1应用。
创建ingressrouter规则文件
  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: IngressRoute
  3. metadata:
  4.   name: myapp1
  5. spec:
  6.   entryPoints:
  7.   - web
  8.   routes:
  9.   - match: Host(`myapp1.test.com`) # 域名
  10.     kind: Rule
  11.     services:
  12.       - name: myapp1  # 与svc的name一致
  13.         port: 80      # 与svc的port一致
复制代码
创建资源
  1. [root@k8s-master ingress]# kubectl apply -f myapp1-ingress.yaml
  2. ingressroute.traefik.containo.us/myapp1 created
  3. [root@k8s-master ingress]# kubectl get ingressroute
  4. dashboard  myapp1     
  5. [root@k8s-master ingress]# kubectl get ingressroute
  6. NAME        AGE
  7. dashboard   4h26m
  8. myapp1      20s
复制代码
客户端添加hosts记录192.168.93.128 myapp1.test.com,然后访问验证
192.168.93.128 为traefik 访问地址

示例

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: IngressRoute
  3. metadata:
  4.   name: amq
  5.   namespace: activemq-artemis-operator
  6. spec:
  7.   entryPoints:
  8.   - web
  9.   routes:
  10.   - match: Host(`amq.test.com`) # 域名
  11.     kind: Rule
  12.     services:
  13.       - name: amq # 与svc的name一致
  14.         port: 8161      # 与svc的port一致
复制代码
HTTPS域名路由(自有证书)
公网服务的话,可以在云厂商那里购买证书。内部服务的话,就直接用 openssl 来创建一个自签名的证书即可,要留意证书文件名称必须是 tls.crt 和 tls.key。接下来演示自签证书的配置。
创建自签证书
  1. root@k8s-master ingress]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=myapp2.test.com"
复制代码
创建Secret资源来引用证书文件
  1. [root@k8s-master ingress]# kubectl create secret tls myapp2-tls --cert=tls.crt --key=tls.key
  2. secret/myapp2-tls created
  3. [root@k8s-master ingress]# kubectl describe secrets myapp2-tls
  4. Name:         myapp2-tls
  5. Namespace:    default
  6. Labels:       <none>
  7. Annotations:  <none>
  8. Type:  kubernetes.io/tls
  9. Data
  10. ====
  11. tls.crt:  1131 bytes
  12. tls.key:  1704 bytes
复制代码
创建IngressRouter规则文件,集群外部用户通过访问https://myapp2.test.com域名时,将哀求署理至myapp2应用。
  1. [root@k8s-master ingress]# cat myapp2-ingress.yaml
  2. [root@k8s-master ingress]# cat myapp2-ingress.yaml
  3. apiVersion: traefik.containo.us/v1alpha1
  4. kind: IngressRoute
  5. metadata:
  6.   name: myapp2
  7. spec:
  8.   entryPoints:
  9.     - websecure                    # 监听 websecure 这个入口点,也就是通过 443 端口来访问
  10.   routes:
  11.   - match: Host(`myapp2.test.com`)
  12.     kind: Rule
  13.     services:
  14.     - name: myapp2
  15.       port: 80
  16.   tls:
  17.     secretName: myapp2-tls         # 指定tls证书名称
复制代码
  1. [root@k8s-master ingress]# kubectl apply -f myapp2-ingress.yaml
  2. ingressroute.traefik.containo.us/myapp2 created
  3. [root@k8s-master ingress]# kubectl get ingressroute
  4. NAME        AGE
  5. dashboard   5h11m
  6. myapp1      45m
  7. myapp2      2m55s
复制代码
客户端添加hosts记录10.10.101.15(traefik的地址) myapp2.test.com,然后访问验证,由于我们是自签名的证书,所以证书是不受信托的。

持续更新中,关注不含糊。。。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表