前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础指南:如何在K3s中配置Traefik?

基础指南:如何在K3s中配置Traefik?

作者头像
CNCF
发布2021-03-15 16:09:12
3.4K0
发布2021-03-15 16:09:12
举报
文章被收录于专栏:CNCFCNCF

云由临时的服务器组和向服务器分配容器的方法组成。容器是一种将应用程序打包到标准化单元中的方法,以便该应用程序可以在云中的任何服务器上平稳运行。经常出现的问题是需要将外部客户端的流量定向到云内的容器中,同时确保外部客户端不与云绑定。针对该问题,一个常见的解决方案是创建一个Ingress controller。

Kubernetes的Ingress

Kubernetes Ingress有两个要求:

  • Ingress controller
  • Ingress

这是为Kubernetes配置Ingress的端到端设置示例,以便集群的外部客户端可以Ingress controller访问集群内运行的Pod。一旦流量被引导到pod,流量将被引导至该Pod内的正确容器中。在本文中我们将K3s部署到树莓派上构建集群。您可以参考我们往期教程,了解如何在树莓派上搭建K3s集群:

超强教程!在树莓派上构建多节点K8S集群!

上图描述了以下组件的工作:

客户端希望将流量发送到Pod。通过创建ClusterIP服务,将Pod部署到K3s集群并在集群内公开。客户端无法访问此服务,但是Ingress Controller可以访问该服务。Ingress controller执行Ingress定义的路由规则。Ingress controller通过NodePort服务向客户端公开。

Kubernetes并不部署Ingress controller,但是K3s会默认部署一个。上图展示了K3s部署Traefik作为Ingress controller的实现。因此,Traefik将会负责满足Ingress的请求。Ingress 请求由K3s提交,根据不同的HTTP属性实例化传入流量的路由规则。

上图中描述的Ingress在Traefik上创建了一个路由规则,这样传入的流量如何路径与“/”后面的内容相匹配,就会被重定向到80端口的nginx-svc服务。

创建K3s Ingress 资源

以下指南将根据上一部分的例子来构建对应的Ingress配置。

运行Traefik 仪表盘

K3s为Ingress controller创建了一个Traefik 部署,但默认情况下,仪表盘是禁用的。在启用仪表盘的情况下运行Traefik,可以实现应用Ingress创建的路由规则的概念。

必须编辑Traefik的ConfigMap才能启用仪表盘。

代码语言:javascript
复制
kubectl -n kube-system edit cm traefik

该命令允许你在终端中编辑ConfigMap:

代码语言:javascript
复制
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  traefik.toml: |
    # traefik.toml
    logLevel = "info"
    defaultEntryPoints = ["http","https"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
      compress = true
      [entryPoints.https]
      address = ":443"
      compress = true
        [entryPoints.https.tls]
          [[entryPoints.https.tls.certificates]]
          CertFile = "/ssl/tls.crt"
          KeyFile = "/ssl/tls.key"
      [entryPoints.prometheus]
      address = ":9100"
    [ping]
    entryPoint = "http"
    [kubernetes]
      [kubernetes.ingressEndpoint]
      publishedService = "kube-system/traefik"
    [traefikLog]
      format = "json"
    [api]
      dashboard = true
    [metrics]
      [metrics.prometheus]
        entryPoint = "prometheus"
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: traefik
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2020-10-02T13:59:32Z"
  labels:
    app: traefik
    app.kubernetes.io/managed-by: Helm
    chart: traefik-1.81.0
    heritage: Helm
    release: traefik
  name: traefik
  namespace: kube-system
  resourceVersion: "3405531"

必须添加31行和32行才能够启用仪表盘。在添加这些行后,键入esc + : + wq,保存文件。

重启Traefik部署

代码语言:javascript
复制
kubectl -n kube-system scale deploy traefik --replicas 0
kubectl -n kube-system scale deploy traefik --replicas 1

端口转发Traefik仪表盘

代码语言:javascript
复制
kubectl -n kube-system port-forward deployment/traefik 8080

在你的浏览器中,访问http://localhost:8080,打开仪表盘。

配置Traefik路由规则

我们的例子可以很容易地在不创建yaml文件的情况下完成;然而,yaml文件允许你保存你的工作,并轻松地启动和拆除整个配置设置。接下来的例子将使用yaml文件而不是命令行命令来构建Ingress的Kubernetes资源。

创建deployment

必须有一个最终将流量路由到的后备Pod。运行nginx即可。将以下文件另存为deployment.yaml。

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      # manage pods with the label app: nginx
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
代码语言:javascript
复制
kubectl create -f deployment.yaml

创建服务

Ingress在Ingress controller,Traefik上配置路由规则。Traefik检查传入的HTTP流量,并将流量引导到已触发规则的服务,最后从服务流向Pod。现在我们将创建这个Service,将以下文件保存为servcie.yaml:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
  selector:
    # apply service to any pod with label app: nginx
    app: nginx
代码语言:javascript
复制
kubectl create -f service.yaml

创建Ingress

Ingress使用路由规则配置Traefik。这个示例将使用基于路径的路由规则。通过检查传入网址的上下文来评估基于路径的路由规则。此处,路径前缀为/。路径/捕捉所有传入的流量,所以类似/context1,/context2/anything的上下文将会触发在Traefik上的路由规则,因为所有这些上下文的前缀都是/。将以下文件保存为ingress.yaml:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: nginx-svc
          servicePort: 80
代码语言:javascript
复制
kubectl create -f ingress.yaml

路由规则可以在Traefik的仪表盘上查看:

使用NodePort暴露Ingress controller到外部流量

nginx app的Ingress规则已经被定义,但是Traefik尚未被暴露到外部流量。创建Nodeport类型的服务将会暴露Traefik到客户端。保存以下文件nodeport.yaml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: traefik
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - name: traefik
      port: 80
      nodePort: 30182
      targetPort: 80
  selector:
    app: traefik
代码语言:javascript
复制
kubectl create -f nodeport.yaml

作为外部客户端

集群的外部客户端现在可以向Ingress controller发出请求。Ingress controller会将流量重定向到nginx-svc服务,而nginx-svc又会将流量导向pod nignx。要作为外部客户端,我们需要Cluster中的一台服务器的IP地址。

代码语言:javascript
复制
kubectl get nodes -o wide

将任何INTERNAL-IP和我们的Traefik服务的NodePort 30182粘贴到浏览器中。将显示NGINX的默认页面。请注意,外部客户端必须与Cluster在同一个网络上才能工作。

结 论

Ingress在云原生环境中是一个极为重要的概念。Kubernetes提供Ingress,但将Ingress controller的实现留给开发人员。K3s默认提供Traefik作为ingress controller,如果没有ingress controller,创建Ingress将无济于事。Ingress controller本身就是一个pod,必须暴露给外部流量。在此示例中,我们使用NodePort进行公开。在评估路由规则(该规则通过提交Ingress进行配置)后,命中的Ingress controller流量将重定向到配置的服务。

附录

本指南中的各个文件可以合并为一个文件。通过维护一个文件,很容易创建和销毁整个Ingress设置,将以下文件另存为nginx-ingres-full.yaml。

创建

代码语言:javascript
复制
kubectl create -f nginx-ingress-full.yaml

销毁

代码语言:javascript
复制
kubectl delete -f nginx-ingress-full.yaml
代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      # manage pods with the label app: nginx
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
  selector:
    # apply service to any pod with label app: nginx
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: nginx-svc
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: traefik
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - name: traefik
      port: 80
      nodePort: 30182
      targetPort: 80
  selector:
    app: traefik

原文链接:

https://levelup.gitconnected.com/a-guide-to-k3s-ingress-using-traefik-with-nodeport-6eb29add0b4b

推荐阅读

在边缘设备上部署Prometheus,实现远程监控K3s集群!

保姆级教程!使用k3d实现K3s高可用!

一文搞定全场景K3s离线安装

About k3s

k3s 是首个进入 CNCF 沙箱项目的 K8S 发行版,同时也是当前全球用户量最大的 CNCF 认证轻量级 K8S 发行版。自2019年3月发布以来,备受全球开发者们关注,至今GitHub Star数已超过 15,700,成为了开源社区最受欢迎的边缘计算 K8S 解决方案。截至目前,K3s全球下载量超过100万次,每周平均被安装超过2万次,其中30%的下载量来自中国。

k3s 专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计,将满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的发布,为开发者们提供了以“Rancher 2.X + k3s”为核心的从数据中心到云到边到端的 K8S 即服务(Kubernetes-as-a-Service),推动 Kubernetes Everywhere。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档