Kubernetes Ingress

Kubernetes Ingress是路由规则的集合,这些规则控制外部用户如何访问Kubernetes集群中运行的服务。

在Kubernetes中,有三种方式可以使内部Pod公开访问。

  • NodePort:使用Kubernetes Pod的NodePort,将Pod内应用程序公开到每个节点上的端口上。
  • Service LoadBalancer:使用Kubernetes Service,改功能会创建一个外部负载均衡器,使流量转向集群中的Kubernetes Pod。
  • Ingress Controller:

Node Port是在Kubernetes集群中每个节点(Node)上开放端口,Kubernetes直接将流量转向集群中Pod。Kubernetes集群中使用NodePort,则需要编辑防火墙规则,但是NodePort是范围在Kubernetes集群中默认设置的范围为 30000–32767,最终导致流量端口暴露在非标准端口之上。

LoadBalancer一般应用于云厂商提供的Kubernetes服务,如果自行在机器上部署Kubernetes集群,则需要自行配置LoadBalancer的实现,

Kubernetes Ingress,为Kubernetes中的抽象概念,实现为第三方代理实现,这种三方实现集合统称为Ingress Controller。Ingress Controller负责引入外部流量并将流量处理并转向对应的服务。

Kubernetes IngressController功能实现

上面只是说道,在Kubernetes集群中,如何将外部流量引入到Kubernetes集群服务中。

负载均衡

无论在Kubernetes集群中,无论采用什么方式进行流量引入,都需要在外部负载均衡完成,而后负载均衡将流量引入Kubernetes集群入口或内部中,

通常情况下,NodePort方式管理繁琐,一般不用于生产环境。

服务的Ingress选择

Kubernetes Ingress是选择正确的方法来管理引入外部流量到服务内部。一般选择也是具有多样性的。

  • Nginx Ingress Controller,Kubernetes默认推荐的Ingress,弊端①最终配置加载依赖config reload,②定制化开发较难,配置基本来源于config file。
  • Envoy & traefik api网关,支持tcp/udp/grpc/ws等多协议,支持流量控制,可观测性,多配置提供者。
  • 云厂商提供的Ingress。AWS ALB,GCP GLBG/GCE,Azure AGIC

Traefik介绍

traefik-现代反向代理,也可称为现代边缘路由;traefik原声兼容主流集群,Kubernetes,Docker,AWS等。官方的定位traefik是一个让开发人员将时间花费在系统研发与部署功能上,而非配置和维护。并且traefik官方也提供自己的服务网格解决方案

作为一个 modern edge router ,traefik拥有与envoy相似的特性

  • 基于go语言研发,目的是为了简化开发人员的配置和维护
  • tcp/udp支持
  • http L7支持
  • GRPC支持
  • 服务发现和动态配置
  • front/ edge prory支持
  • 可观测性
  • 流量管理
  • ...

traefik 术语

要了解trafik,首先需要先了解一下 有关trafik中的一些术语。

  • EntryPoints 入口点,是可以被下游客户端连接的命名网络位置,类似于envoy 的listener和nginx的listen
  • services 服务,负载均衡,上游主机接收来自traefik的连接和请求并返回响应。 类似于nginx upstream envoy的clusters
  • Providers 提供者,提供配置文件的后端,如file,kubernetes,consul,redis,etcd等,可使traefik自动更新
  • routers 路由器,承上启下,分析请求,将下游主机的请求处理转入到services
  • middlewares: 中间件,在将下游主机的请求转入到services时进行的流量调整

在Kubernetes中使用traefik网关作为Ingress

Traefik于2019年9月发布2.0 GA版,增加了很多新特性,包括IngressRoute Kubernetes CRD,TCP,最新版增加UDP等。

安装traefik

Traefik 支持两种方式创建路由规则,一是Traefik 自定义 Kubernetes CRD ,还有一种是 Kubernetes Ingress

创建traefik使用的Kubernetes CRD 资源

traefik官网提供了创建时所需要的 yaml文件,这里仅需要使用官网提供的Definitions与RBAC即可。

在官网提供的yaml文件缺少 ServiceAccount,需要自行创建。

apiVersion: v1
kind: ServiceAccount
metadata:
namespace: default
name: traefik-ingress-controller

创建控制器

官方文件中,暂未找到所需运行traefik的控制器,需要自己创建一个。

traefik配置一般分为静态和动态配置,此处的静态是指,大部分时间内,不改变的配置(如nginx.conf),动态配置指,经常情况下改变的配置(可以理解为 nginx中 virtual host的每个独立配置文件)。

traefik提供配置的提供者也有很多种,此处使用命令行方式设置不长改变静态配置,也可以使用配置文件方式进行配置提供。

apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
selector:
app: traefik-ingress
type: NodePort
ports:
- name: web
port: 80
targetPort: 80
- name: ssl
port: 443
targetPort: 443
- name: dashboard
port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik-ingress-controller-deployment
labels:
app: traefik-ingress
spec:
replicas: 1
selector:
matchLabels:
app: traefik-ingress
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
name: traefik-ingress
labels:
app: traefik-ingress
spec:
serviceAccountName: traefik-ingress-controller
volumes:
- name: ssl
hostPath:
path: /etc/kubernetes/pki
type: DirectoryOrCreate
containers:
- image: traefik:v2.3.3
name: traefik-ingress-lb
imagePullPolicy: IfNotPresent
volumeMounts:
- name: ssl
mountPath: /usr/local/pki
ports:
- name: web
containerPort: 80
hostPort: 1880
- name: ssl
containerPort: 443
hostPort: 18443
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
args:
- --entrypoints.web.address=:80
- --entrypoints.ssl.address=:443
- --providers.kubernetescrd
- --providers.kubernetesingress
- --api=true
- --ping=true
- --api.dashboard=true
- --serverstransport.insecureskipverify=true
- --serverstransport.rootcas=/usr/local/pki/ca.crt
- --accesslog
livenessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5

配置文件方式,仅需参考官网,把--agrs中的参数转换为配置文件并引入到pod后。替换启动参数

args:
- --configfile=/config/traefik.yaml

使用CRD配置Traefik的流量管理

官网提供的基于Kubernetes CRD方式配置不是很多,可以参考动态配置中Kubernetes CRD Resources小结。

基于traefik dashboard方式配置增加HTTP router

前面使用官方提供CRD文件注册了Kubernetes CRD资源,所以traefik 中的资源类型,可作为kubernetes中资源使用。如 kubectl get Middleware

dashboard是traefik自己提供的服务所需的services为自己,traefik的entryPoints,当开启--api.dashboard=true 会增加一个8080端口作为traefik dashboard使用。而 api@internal 是traefik自己提供的services资源。

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard-route
spec:
entryPoints:
- traefik
routes:
- match: Host(`10.0.0.5`)
kind: Rule
services:
- name: api@internal
port: 8080
kind: TraefikService

为Kubernetes dashboard增加HTTP路由

基于kubernetes crd作为提供者运行的traefik中,后端service可以是traefik的services也可以是kubernetes资源中的service。

基于kubernetes sevices

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: kubernetes-dashboard-route
namespace: kubernetes-dashboard
annotations:
traefik.ingress.kubernetes.io/ssl-redirect: "true"
spec:
entryPoints:
- ssl
tls:
secretName: k8s-ca routes:
- match: PathPrefix(`/ui`)
kind: Rule
middlewares:
- name: strip-ui
services:
- name: kubernetes-dashboard # kubernetes中的service对应的名称
kind: Service # kubernetes中的service
port: 443
namespace: kubernetes-dashboard # kubernetes中的service对应的名称空间。
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-ui
namespace: kubernetes-dashboard
spec:
stripPrefix:
prefixes:
- "/ui"
- "/ui/"

此处使用了TLS的,开启了TLS,默认traefik是进行双向认证的,而kubernetes的dashboard的证书的ca并不知道,在访问时会出现Internal Server Error,目前没有找到有效的双向认证方法,普遍使用的方法都是调过认证--serverstransport.insecureskipverify=true

reference

https://stackoverflow.com/questions/49412376/internal-server-error-with-traefik-https-backend-on-port-443

https://github.com/traefik/traefik/issues/6821

负载均衡

负载均衡使用到的是traefik的services部分。

apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: LoadBalancer
spec:
weighted:
services:
- name: prod-v1.2
port: 443
weight: 1
kind: Service
- name: prod-v1
port: 443
weight: 2
kind: Service
---

流量镜像

apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: mirror1
spec:
mirroring:
name: s1
port: 80
mirrors:
- name: s3
percent: 20
port: 80
- name: mirror2
kind: TraefikService
percent: 20

traefik ingress Controller使用的更多相关文章

  1. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  2. Kubernetes 服务入口管理 Traefik Ingress Controller

    前面部署了 kubernetes/ingress-nginx 作为 Ingress Controller,使用 Nginx 反向代理与负载,通过 Ingress Controller 不断的跟 Kub ...

  3. Kubernetes Ingress Controller的使用及高可用落地

    Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...

  4. Kubernetes 服务入口管理与 Nginx Ingress Controller

    Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...

  5. k8s之ingress及ingress controller

    1.ingress概述 图解:第一个service起到的作用是:引入外部流量,也可以不用此方式,以DaemonSet控制器的方式让Pod共享节点网络,第二个service的作用是:对后端pod分组,不 ...

  6. kubernetes Traefik ingress配置详解

    理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方向代 ...

  7. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  8. Kubernetes 学习11 kubernetes ingress及ingress controller

    一.上集回顾 1.Service 3种模型:userspace,iptables,ipvs 2.Service类型 ClusterIP,NodePort NodePort:client -> N ...

  9. 11. Ingress及Ingress Controller(主nginx ingress controller)

    11. Ingress,Ingress Controller拥有七层代理调度能力 什么是Ingress: Ingress是授权入站连接到达集群服务的规则集合 Ingress是一个Kubernetes资 ...

随机推荐

  1. MySQL-索引简介

    一.索引是什么? 索引是本质是一种数据结构,索引的目的在于提高查询效率.[排好序的快速查找的数据结构] 每个节点包含索引键值和一个指向对应数据记录物理地址的指针. 索引往往以索引文件的形式存储在磁盘. ...

  2. 0802_转载-nn模块中的网络层介绍

    0802_转载-nn 模块中的网络层介绍 目录 一.写在前面 二.卷积运算与卷积层 2.1 1d 2d 3d 卷积示意 2.2 nn.Conv2d 2.3 转置卷积 三.池化层 四.线性层 五.激活函 ...

  3. 剑指Offer 55. 数组中的逆序对

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4]输出: 5 思路:运用归并排序的特点 ...

  4. 1036 Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  5. 1086 Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...

  6. 1089 Insert or Merge

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  7. 【JVM】JVM中的垃圾收集器

    垃圾收集器组合 Serial+Serial Old Serial+CMS ParNew+CMS ParNew+Serial Old Paralle Scavenge + Serial Old Para ...

  8. hdu4450 不错的贪心

    题意: 卡片游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total S ...

  9. Linux下磁盘分区、卸载和磁盘配额

    目录 一:查看磁盘信息 二:Linux磁盘分区 三:Linux分区的卸载 四:Linux磁盘配额 一:查看磁盘信息 fdisk : 这个命令是磁盘分区表操作工具,fdisk能将磁盘分区,同时也能为每个 ...

  10. 网站指纹识别工具Whatweb的使用

    目录 whatweb 一些常见的Whatweb的扫描 常规扫描 批量扫描 详细回显扫描 扫描强度等级控制 快速本地扫描(扫描内网的主机) 将扫描结果导出至文件内 whatweb whatweb 是ka ...