乐趣区

关于apisix:想在-KubeSphere-中进行自定义监控来瞧瞧这

11 月初,KubeSphere 公布了 3.2.0 版本 ,新版本为我的项目网关增配了整套监控及治理页面,同时引入了集群网关来提供集群层面全局的 Ingress 网关能力。

为了让用户更理解如何在新版 KubeSphere 中部署应用第三方 Ingress Controller,本文将以 Apache APISIX Ingress Controller 为例,为大家展现通过 KubeSphere 疾速为 Kubernetes 集群应用不同类型的网关并进行状态监控。

筹备工作

装置 KubeSphere

装置 KubeSphere 有两种办法:

  • 在 Linux 上间接装置
  • 在已有 Kubernetes 中装置 [2]

KubeSphere 最小化装置版本曾经蕴含了监控模块,因而不须要额定启用,能够通过「零碎组件」页面中的「监控」标签页确认装置状态。

部署 httpbin 演示利用

因为须要演示网关的访问控制能力,咱们必须要先有一个能够拜访的利用作为网关的后盾服务。这里咱们应用 httpbin.org 提供的 kennethreitz/httpbin 容器利用作为演示利用。

在 KubeSphere 中,咱们能够先创立新的我的项目或应用已有的我的项目,进入我的项目页面后,抉择「利用负载」下的「服务」间接创立无状态工作负载并生成配套服务。

应用 kennethreitz/httpbin 容器默认的 80 端口作为服务端口,创立实现后确保在「工作负载」和「服务」页面下都能够看到 httpbin 的对应条目,如下图所示。

### 我的项目网关细节补充

我的项目网关是 KubeSphere 3.0 之后上线的性能:KubeSphere 我的项目中的网关是一个 NGINX Ingress 控制器。KubeSphere 内置用于 HTTP 负载平衡的机制称为利用路由,它定义了从内部到集群服务的连贯规定。如需容许从内部拜访服务,用户可创立路由资源来定义 URI 门路、后端服务名称等信息。

承接上文中已部署的 httpbin 服务项目,在「我的项目设置」中关上「网关设置」页面,而后执行「开启网关」操作。不便起见,间接抉择 NodePort 作为「拜访形式」即可。

确定后回到网关页面,稍等片刻后刷新页面,能够失去如下图显示的部署实现状态,在这里能够看到 NodePort 默认被赋予了两个节点端口。接招咱们通过右上角的「治理」按钮「查看详情」。

此时咱们看到的便是 3.2.0 版本对于我的项目 / 集群网关的新监控页面。上面咱们就须要为 httpbin 服务创立利用路由。

从「利用负载」进入「利用路由」页面,开始「创立」路由。为路由取名为 httpbin 后,咱们指定一个不便测试的域名,并设置「门路」为 /, 抉择「服务」httpbin 和「端口」80

间接下一步跳过高级设置后实现路由创立,能够失去如下图所示的 httpbin 利用路由项。

接下来咱们就能够通过我的项目网关的 NodePort 地址及指定域名(如这里是 http://httpbin.ui:32516)来拜访 httpbin 应用服务,随便刷新或操作一下页面的申请生成性能,再进入网关的详情页面,便能够看到在「监控」面板上曾经呈现了网关的一些内置的监控指标展现。

指定 NodePort 节点端口

对于私有云环境,如果应用 NodePort 形式向外裸露拜访能力,凋谢端口通常是无限且受控的,因而对于网关所应用的 NodePort 咱们须要对它进行批改。

因为网关是被 KubeSphere 对立治理的,要批改网关服务的 NodePort 须要具备拜访 kubesphere-controls-system 的我的项目权限。进入该我的项目后,通过「利用负载」的「服务」页面即可找到命名为 kubesphere-router-<project-namespace> 模式且内部拜访已凋谢 NodePort 的网关服务。NodePort 服务端口须要通过「编辑 YAML」来间接批改。

开始应用集群网关

KubeSphere 3.2.0 开始反对集群级别的全局网关,所有我的项目可共用同一个网关,之前已创立的我的项目网关也不会受到集群网关的影响。也能够对立纳管所有我的项目的网关,对其进行集中管理和配置,管理员用户再也不须要切换到不同的企业空间中去配置网关了。

如果您应用的是 KubeSphere 3.2.0 版本,咱们更举荐大家应用集群网关的性能来对立整个集群的利用路由。要启用集群网关也非常简单:应用具备集群管理权限的账号,进入其可治理的某个集群(如咱们这里以 default 集群为例),在「集群设置」的「网关设置」中即可「开启网关」,同时查看「我的项目网关」。

集群网关开启的形式以及对齐 NodePort 拜访端口的批改和之前我的项目网关的操作根本完全一致,这里就不多赘述了。

但有一点须要特地留神 :集群网关开启后,曾经开启的我的项目网关还会保留;但尚未创立网关的我的项目是无奈再创立独自的网关的,会间接应用集群网关。

下图展现了已创立网关的我的项目,在同时领有我的项目及集群网关后,在「网关设置」页面所出现的所有网关概览。

疾速应用 Apache APISIX Ingress Controller

Apache APISIX 是一款开源的高性能、动静云原生网关,由深圳干流科技有限公司于 2019 年捐献给 Apache 基金会,目前已成为 Apache 基金会的顶级开源我的项目,也是 GitHub 上最沉闷的网关我的项目。Apache APISIX 目前已笼罩 API 网关、LB、Kubernetes Ingress、Service Mesh 等多种场景。

如何部署

首先增加 Apache APISIX Helm Chart 仓库。之后选定一个企业空间,通过「利用治理」下的「利用仓库」来增加如下一个 Apache APISIX 的仓库(仓库 URL:https://charts.apiseven.com)。

接下来创立一个名为 apisix-system 的我的项目。进入我的项目页面后,抉择在「利用负载」中创立「利用」的形式来部署 Apache APISIX,并抉择 apisix 利用模版开始进行部署。

为何是间接部署 Apache APISIX 利用的 Helm Chart,而不是间接部署 Apache APISIX Ingress Controller? 这是因为 Apache APISIX Ingress Controller 目前和 Apache APISIX 网关是强关联的(如下图所示),且目前通过 Apache APISIX Helm Charts 同时部署 Apache APISIX Gateway + Dashboard + Ingress Controller 是最不便的,因而本文举荐间接应用 Apache APISIX 的 Helm Chart 进行整套组件的部署。

将利用命名为 apisix 以防止多个组件(Gateway, Dashboard, Ingress Controller)的工作负载及服务名称产生不匹配的状况;在装置步骤中编辑的「利用设置」的局部,请参照以下配置进行填写( 请特地留神带有【留神】标记的正文局部的阐明,其余能够按需自行编辑批改 )。

global:
  imagePullSecrets: []
  
apisix:
  enabled: true
  customLuaSharedDicts: []
  image:
    repository: apache/apisix
    pullPolicy: IfNotPresent
    tag: 2.10.1-alpine
  replicaCount: 1
  podAnnotations: {}
  podSecurityContext: {}
  securityContext: {}
  resources: {}
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAntiAffinity:
    enabled: false
    
nameOverride: ''fullnameOverride:''

gateway:
  type: NodePort
  externalTrafficPolicy: Cluster
  http:
    enabled: true
    servicePort: 80
    containerPort: 9080
  tls:
    enabled: false
    servicePort: 443
    containerPort: 9443
    existingCASecret: ''certCAFilename:''
    http2:
      enabled: true
  stream:
    enabled: false
    only: false
    tcp: []
    udp: []
  ingress:
    enabled: false
    annotations: {}
    hosts:
      - host: apisix.local
        paths: []
    tls: []
    
admin:
  enabled: true
  type: ClusterIP
  externalIPs: []
  port: 9180
  servicePort: 9180
  cors: true
  credentials:
    admin: edd1c9f034335f136f87ad84b625c8f1
    viewer: 4054f7cf07e344346cd3f287985e76a2
  allow:
    ipList:
      - 0.0.0.0/0
      
plugins:
  - api-breaker
  - authz-keycloak
  - basic-auth
  - batch-requests
  - consumer-restriction
  - cors
  - echo
  - fault-injection
  - grpc-transcode
  - hmac-auth
  - http-logger
  - ip-restriction
  - ua-restriction
  - jwt-auth
  - kafka-logger
  - key-auth
  - limit-conn
  - limit-count
  - limit-req
  - node-status
  - openid-connect
  - authz-casbin
  - prometheus
  - proxy-cache
  - proxy-mirror
  - proxy-rewrite
  - redirect
  - referer-restriction
  - request-id
  - request-validation
  - response-rewrite
  - serverless-post-function
  - serverless-pre-function
  - sls-logger
  - syslog
  - tcp-logger
  - udp-logger
  - uri-blocker
  - wolf-rbac
  - zipkin
  - traffic-split
  - gzip
  - real-ip
  #【留神】增加此插件以配合 Dashboard 展现服务信息
  - server-info

stream_plugins:
  - mqtt-proxy
  - ip-restriction
  - limit-conn

customPlugins:
  enabled: true
  luaPath: /opts/custom_plugins/?.lua
  #【留神】如下配置保障 Prometheus 插件可对外裸露指标
  plugins:
   - name: prometheus
     attrs:
       export_addr:
         ip: 0.0.0.0
          port: 9091
      configMap:
       name: prometheus
        mounts: []

dns:
  resolvers:
    - 127.0.0.1
    - 172.20.0.10
    - 114.114.114.114
    - 223.5.5.5
    - 1.1.1.1
    - 8.8.8.8
  validity: 30
  timeout: 5

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  targetMemoryUtilizationPercentage: 80

configurationSnippet:
  main: ''httpStart:''
  httpEnd: ''httpSrv:''
  httpAdmin: ''stream:''

etcd:
  enabled: true
  host:
    - 'http://etcd.host:2379'
  prefix: /apisix
  timeout: 30
  auth:
    rbac:
      enabled: false
      user: ''password:''
    tls:
      enabled: false
      existingSecret: ''certFilename:''
      certKeyFilename: ''
      verify: true
  service:
    port: 2379
  replicaCount: 3

dashboard:
  enabled: true
  #【留神】为 Dashboard 开启 NodePort 不便后续应用
  service:
   type: NodePort

ingress-controller:
  enabled: true
  config:
    apisix:
     #【留神】肯定要设置 gateway 所在的 namespace
      serviceNamespace: apisix-system
  serviceMonitor:
    enabled: true
    namespace: 'apisix-system'
    interval: 15s

部署胜利后,点击利用名称进入详情页面,能够在「资源状态」标签页下看到如下的服务部署和工作状态运行状态展现。

💡 Apache APISIX 我的项目另有的两个 Helm Chart 对应的默认配置参数能够别离参考:Dashboard 和 Ingress Controller 的 values.yaml

Dashboard 妙用

Apache APISIX 利用部署实现后,可通过 Apache APISIX Dashboard 来测验一下 Apache APISIX 网关的以后状态。

从利用负载 - 服务页面能够找到 apisix-dashboard 服务,因为咱们在利用配置中已为 Dashboard 开启了 NodePort,所以这里能够间接通过 NodePort 端口来拜访 Dashboard。

应用默认用户名及明码 admin 登录 Apache APISIX Dashboard,能够进入「零碎信息」页面查看到以后连贯治理的「Apache APISIX 节点」信息。

如何应用

接下来让咱们回到「利用路由」页面,再新建一个路由(如 apisix-httpbin),设置门路为 /* httpbin 80 并为其增加 kubernetes.io/ingress.class: apisix 的键值。

验证利用路由失效

回到 Apache APISIX Dashboard 进入「路由」页面,能够看到新建的利用路由已被 Apache APISIX Ingress Controller 辨认后主动增加到了 Apache APISIX 网关中,在「上游」页面也能够看到主动创立的一个上游条目。

接下来回到 apisix-system 我的项目「服务」页面,找到 apisix-gateway 服务对应的端口,由此拜访 <apisix-httpbin 利用路由指定的域名 >:<apisix-gateway 内部拜访端口 >(例如此处为 httpbin.ui:30408)即可拜访到 apisix-httpbin 利用路由所关联的后盾服务。

自定义监控 Apache APISIX 网关

应用 Apache APISIX 网关时可通过 Prometheus 插件以及 KubeSphere 自带的自定义监控能力来进行监控能力的加持。

裸露相干 Prometheus 监控指标

因为咱们在前边部署 Apache APISIX 利用时曾经开启了 Prometheus 插件,所以接下来只须要把 Prometheus 监控指标的接口裸露进去即可。

进入 apisix-system 我的项目,在「工作负载」页面找到 apisix 并进入部署详情页面,随后在左侧操作面板的「更多操作」中抉择「编辑设置」。

在弹出的面板中,进入到 apisix 容器编辑界面,找到「端口设置」,增加一个新的名为 prom 的端口映射到容器的 9091 端口,保留后 apisix 工作负载会重启。

为监控指标创立 ServiceMonitor

接下来咱们须要将已裸露的指标接口接入到 KubeSphere 自带的 Prometheus 中使之可被拜访(被抓取指标数据)。

因为 KubeSphere 是通过 Prometheus Operator 来保护外部 Prometheus 零碎,所以最快捷的形式天然是间接创立 ServiceMonitor 资源来实现指标接口的接入。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: apisix
  namespace: apisix-system
spec:
  endpoints:
    - scheme: http
     #【留神】应用上一步中工作负载裸露的容器端口名称
     targetPort: prom
     #【留神】须要正确绑定 apisix 对应的指标接口门路
     path: /apisix/prometheus/metrics
      interval: 15s
  namespaceSelector:
    matchNames:
      - apisix-system
  selector:
    matchLabels:
      app.kubernetes.io/name: apisix
      app.kubernetes.io/version: 2.10.0
      helm.sh/chart: apisix-0.7.2

应用 kubectl apply -f your_service_monitor.yaml 创立 ServiceMonitor 资源。创立胜利后,如果有集群管理权限,也能够在集群的 CRD 治理页面中搜寻查看 ServiceMonitor 资源并找到名为 apisix 的自定义资源,也能够在这里做后续的 YAML 批改。

指标接入自定义监控面板

在我的项目左侧菜单列表中找到「监控告警」中的「自定义监控」,开始「创立」自定义监控面板。

在弹出窗口中填入「名称」,抉择「自定义」监控模版,并进入「下一步」的监控面板创立。

进入编辑页面后当初左侧点击 + 区域,在右侧的「数据」区域进行 Prometheus 监控指标的配置。例如这里咱们能够用 sum(apisix_nginx_http_current_connections) 来统计 Apache APISIX 网关实时的连贯总数。

保留后在页面右下角找到「+ 增加监控项」,并抉择「折线图」创立 Nginx connection state 指标:应用 sum(apisix_nginx_http_current_connections) by (state) 作为指标、{{state}} 用作图例名称、「图例类型」为重叠图,即可失去相似下图的后果。保留模版后即可失去第一个自定义监控面板!

Apache APISIX 网关目前提供的 Prometheus 指标能够参见官网文档的可有的指标局部。

因为指标配置过程比拟麻烦,举荐在集群层面的「自定义监控」中间接导入 Apache APISIX Grafana 模版(下载 JSON 并通过「本地上传」进行导入)。

创立实现后可间接呈现出十分丰盛的 Apache APISIX 网关监控面板。KubeSphere 也同时在踊跃推动将 Grafana 模版导入的性能引入到我的项目的自定义监控能力中去,敬请期待!

总结

通过本文十分具体的步骤介绍,大家可充沛理解并追随上手体验到如何「将 Apache APISIX Ingress 网关接入 KubeSphere 并进行自定义监控」。心愿通过浏览本文,能够加深各位对 Apache APISIX Ingress Controller 与 Apache APISIX 利用了解。

对于作者

作者张海立,驭势科技云平台研发总监。开源爱好者,云原生社区上海站 PMC 成员,KubeSphere Ambassador。

对于 Apache APISIX

Apache APISIX 是一个动静、实时、高性能的开源 API 网关,提供负载平衡、动静上游、灰度公布、服务熔断、身份认证、可观测性等丰盛的流量治理性能。Apache APISIX 能够帮忙企业疾速、平安地解决 API 和微服务流量,包含网关、Kubernetes Ingress 和服务网格等。

Apache APISIX 落地用户(仅局部)

  • Apache APISIX GitHub:https://github.com/apache/apisix
  • Apache APISIX 官网:https://apisix.apache.org/
  • Apache APISIX 文档:https://apisix.apache.org/zh/…
退出移动版