云原生或K8S 安装 APISIX

本篇主要以天翼云CCE集群部署方式为主,其他云原生集群类似

以下出现的ip以及密码为虚拟

一、基本概念

APISIX 是 Apache 下的一款云原生的 API 网关,支持全生命周期的 API 管理,在应用中可以作为所有 API 调用的统一入口。
APISIX 有一些基础概念如下:

  1. Upstream,或者叫做上游,是一组目标主机的抽象,上游一组节点提供实际的业务服务,一般需要指定负载均衡策略去调用。
  2. Route,路由定义了一组规则,指定如何匹配用户的请求并执行对应的插件,最后将请求转发到上游。
  3. Service,服务是一组上游和插件(不包括认证)的抽象,可以给多个路由复用,同时配置的变更也可以应用到全部的路由,解耦的同时还可以保持灵活性,服务和路由的关系通常是 1:N。
  4. Plugin,插件可以通过消费者或路由实现功能的扩展,从而满足用户对流量管理、权限认证、安全性、可观察性、请求/响应转换等方面的特定要求。
  5. Consumer,消费者就是请求 APISIX 服务的用户,消费者都会绑定认证和授权的插件,从而对身份进行识别,并且消费者配置的插件具有最高的优先级,APISIX 可以为不同的消费者配置不同的规则,实现比较灵活的功能。

知道了上面的一些基础概念,然后我们就开始搭建 APISIX 服务网关吧。

二、部署方式

APISIX 有 3 种部署方式,分别如下:

  1. traditional 这个是经典默认的部署方式,将数据平面和控制平面一块启动,方便管理。
  2. decoupled 这种是将控制平面和数据平面分离的部署方式,中间通过 mTLS 进行通信,这种适合在比较大规模的集群环境中使用。
  3. standalone 这种仅部署数据平面并且配置都从本地加载,这种部署方式常用在 Kubernetes 容器环境中,因为每次全量的配置都由 k8s 的配置中心生成并运行。

一般规模下比较常用的部署方式就是 traditional,无论是 traditional 还是 decoupled 都需要依赖外部的 etcd 保存配置,官网给出的 Docker 部署示例是将 etcd 集成到一个 compose 中,但是这样会失去 etcd 的高可用性,只适合测试环境,所以我们采用外部专用的 etcd 集群。

三、下载 APISIX 以及 APISIX-dashboard 镜像

  1. 下载自己需要的镜像
docker pull apache/apisix:3.7.0-debian
docker pull apache/apisix-dashboard:3.0.0-alpine
  1. 把镜像推送到云容器镜像服务
#打tag
docker tag apache/apisix:3.7.0-debian  "镜像仓库的命名规则,如:域名/组织/镜像名称:tag"
#登录到远程镜像仓库
docker login "镜像仓库地址"
#推送到远程镜像仓库
docker push "镜像仓库的命名规则,如:域名/组织/镜像名称:tag"
#apisix-dashboard同上操作

四、修改配置文件

从安装包找到对应的配置文件进行修改

  1. 首先创建 APISIX 的配置文件:conf/config.yaml,内容如下:
apisix:
  node_listen:
    - port: 9080
  enable_ipv6: true
  enable_control: true
  control:
    ip: 0.0.0.0
    port: 9092
deployment:
  role: traditional
  role_control_plane:
    config_provider: etcd
  admin:
    admin_listen:
      port: 9180
    allow_admin:
      - 127.0.0.0/24
    admin_key:
      - name: admin
        key: e8be69cadf2b1fc1239cd8d1ec216cad
        role: admin
      - name: viewer
        key: 77e080c4f7fe5dc12378980b8d5dd59d
        role: viewer
  etcd:
    host:
      - http://1.1.1.1:2379
      - http://1.1.1.2:2379
      - http://1.1.1.3:2379
    user: guyougao
    password: "aaa123"
    prefix: /apisix
    timeout: 30
plugin_attr:
  prometheus:
    export_addr:
      ip: 0.0.0.0
      port: 9091

参数配置解释(根据个人情况修改)
apisix.node_listen设置 APISIX 的用户访问端口,默认是 9080
apisix.control配置控制 API 所监听的地址和端口,地址默认监听所有 IPv4 和 IPv6 的网卡
deployment.role配置了部署方式为 traditional,同时指定了配置中心是 etcd
deployment.admin这个部分配置了 admin API 所监听的端口,以及访问 admin API 所需的 KEY。具体 KEY 可以按照下面的命令生成:openssl rand -hex 16
deployment.etcd.hostetcd集群地址
deployment.etcd.user提供给apisix使用的用户名
deployment.etcd.password用户名密码
deployment.etcd.prefix前缀以/apisix开开头的key,具体可以更具etcd的认证配置更改
  1. 创建 APISIX Dashboard 所需的配置文件:conf/dashboard.yaml,内容如下:
conf:
  listen:
    #    host: "::"
    port: 9000
  allow_list:             # If we don't set any IP list, then any IP access is allowed by default.
    - 127.0.0.1           # The rules are checked in sequence until the first match is found.
    - ::1                 # In this example, access is allowed only for IPv4 network 127.0.0.1, and for IPv6 network ::1.
    - 0.0.0.0/0
    # It also support CIDR like 192.168.1.0/24 and 2001:0db8::/32
  etcd:
    endpoints:
      - "http://1.1.1.1:2379"
      - "http://1.1.1.2:2379"
      - "http://1.1.1.3:2379"
    username: "guyougao"
    password: "aaa123"
    mtls:
      key_file: ""          # Path of your self-signed client side key
      cert_file: ""         # Path of your self-signed client side cert
      ca_file: ""           # Path of your self-signed ca cert, the CA is used to sign callers' certificates
    prefix: /apisix     # apisix config's prefix in etcd, /apisix by default

  log:
    error_log:
      level: warn       # supports levels, lower to higher: debug, info, warn, error, panic, fatal
      file_path:
        logs/error.log  # supports relative path, absolute path, standard output
      # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
    access_log:
      file_path:
        logs/access.log
  security:
    content_security_policy: "default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; frame-src *"

authentication:
  secret:
    a9173abd74f794d52123651eba1de42d
  expire_time: 3600
  users:
    - username: user1   # username and password for login `manager api`
      password: "aaa123"
    - username: user2
      password: "aaa123"

plugins:
  - api-breaker
  - authz-casbin
  - authz-casdoor
  - authz-keycloak
  - aws-lambda
  - azure-functions
  - basic-auth
  # - batch-requests
  - clickhouse-logger
  - client-control
  - consumer-restriction
  - cors
  - csrf
  - datadog
  # - dubbo-proxy
  - echo
  - error-log-logger
  # - example-plugin
  - ext-plugin-post-req
  - ext-plugin-post-resp
  - ext-plugin-pre-req
  - fault-injection
  - file-logger
  - forward-auth
  - google-cloud-logging
  - grpc-transcode
  - grpc-web
  - gzip
  - hmac-auth
  - http-logger
  - ip-restriction
  - jwt-auth
  - kafka-logger
  - kafka-proxy
  - key-auth
  - ldap-auth
  - limit-conn
  - limit-count
  - limit-req
  - loggly
  # - log-rotate
  - mocking
  # - node-status
  - opa
  - openid-connect
  - opentelemetry
  - openwhisk
  - prometheus
  - proxy-cache
  - proxy-control
  - proxy-mirror
  - proxy-rewrite
  - public-api
  - real-ip
  - redirect
  - referer-restriction
  - request-id
  - request-validation
  - response-rewrite
  - rocketmq-logger
  - server-info
  - serverless-post-function
  - serverless-pre-function
  - skywalking
  - skywalking-logger
  - sls-logger
  - splunk-hec-logging
  - syslog
  - tcp-logger
  - traffic-split
  - ua-restriction
  - udp-logger
  - uri-blocker
  - wolf-rbac
  - zipkin
  - elasticsearch-logge
  - openfunction
  - tencent-cloud-cls
  - ai
  - cas-auth

这个配置也比较好理解,需要注意的是 Dashboard 是通过 etcd 对 APISIX 间接管理的,因此不需要直接配置 APISIX 的地址,同样上面是端口和 etcd 相关的配置,然后日志部分的配置改成了标准错误和标准输出,如果有需要可以改成具体的路径然后通过卷映射到容器内部。

下面 authentication 部分的 secret 是 JWT 认证的密钥,同样按照上面的方法生成一下(openssl rand -hex 16),下面 users 是页面的登录用户,这里初始化了两个用户。

最后 plugins 是支持的插件,这个比较多,所以这里就列了几个,其余的参考官方给出了样例来填写即可。

五、CCE集群创建配置项

在cce集群配置与密钥中创建配置项,主要是通过卷映射到容器内部

配置项名称配置项键配置项值
apisixconfig.yaml内容为上述配置文件内容
apisix-dashboarddashboard.yaml内容为上述配置文件内容

五、通过YAML创建工作负载和服务

  1. 创建APISIX工作负载和服务
#常规部署需要修改的部分  用三个***表示
---
apiVersion: v1
kind: Service
metadata:
  #  ---------***---------
  #  设置服务名称
  name: cce-apisix-service
#  namespace: ctos
spec:
  selector:
    #    绑定的工作负载
    #      ---------***---------
    app: cce-apisix
    version: v1
  ports:
    - name: service-port1
      protocol: TCP
      port: 9180
      targetPort: 9180
    - name: service-port2
      protocol: TCP
      port: 9080
      targetPort: 9080
    - name: service-port3
      protocol: TCP
      port: 9091
      targetPort: 9091
    - name: service-port4
      protocol: TCP
      port: 9443
      targetPort: 9443
    - name: service-port5
      protocol: TCP
      port: 9092
      targetPort: 9092
  type: ClusterIP
#指定集群IP,暂时未使用
#  clusterIP: None
#  clusterIPs:
#    - None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  #      ---------***---------
  #  工作负载名称
  name: cce-apisix
  #  指定命名空间,可不指定,默认为default
#  namespace: ctos
spec:
  #      ---------***---------
  #  启动的实例个数
  replicas: 2
  selector:
    matchLabels:
      #      ---------***---------
      #  工作负载名称
      app: cce-apisix
      version: v1
  template:
    metadata:
      labels:
        #      ---------***---------
        #  工作负载名称
        app: cce-apisix
        version: v1
    spec:
      volumes:
        #      ---------***---------
        #            自定义卷积名称
        - name: vol-cce-apisix
          configMap:
            #      ---------***---------
            #            配置项名称
            name: cce-apisix
            defaultMode: 420
      containers:
        - name: container-apisix
          #      ---------***---------
          #          镜像地址: 域名/组织/容器名称:版本
          image: 镜像地址
          #          参数选择Always和IfNotPresent。Always参数开启后工作负载每次重启/升级均会重新拉取镜像,否则只会在节点上不存在同名同版本镜像时拉取镜像
          volumeMounts:
            - name: vol-cce-apisix
              readOnly: true
              mountPath: /usr/local/apisix/conf/config.yaml
              subPath: config.yaml
          imagePullPolicy: IfNotPresent
#          配置使用的密钥
#      imagePullSecrets:
#        - name: cce-secret


  1. 创建 APISIX Dashboard工作负载和服务
#常规部署需要修改的部分  用三个***表示
---
apiVersion: v1
kind: Service
metadata:
  #  ---------***---------
  #  设置服务名称
  name: cce-apisix-dashboard-service
#  namespace: ctos
spec:
  selector:
    #    绑定的工作负载
    #      ---------***---------
    app: cce-apisix-dashboard
    version: v1
  ports:
    - name: service-port1
      protocol: TCP
      port: 9000
      targetPort: 9000
  type: ClusterIP
#指定集群IP,暂时未使用
#  clusterIP: None
#  clusterIPs:
#    - None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  #      ---------***---------
  #  工作负载名称
  name: cce-apisix-dashboard
  #  指定命名空间,可不指定,默认为default
#  namespace: ctos
spec:
  #      ---------***---------
  #  启动的实例个数
  replicas: 2
  selector:
    matchLabels:
      #      ---------***---------
      #  工作负载名称
      app: cce-apisix-dashboard
      version: v1
  template:
    metadata:
      labels:
        #      ---------***---------
        #  工作负载名称
        app: cce-apisix-dashboard
        version: v1
    spec:
      volumes:
        #      ---------***---------
        #            自定义卷积名称
        - name: vol-cce-apisix-dashboard
          configMap:
            #      ---------***---------
            #            配置项名称
            name: cce-apisix-dashboard
            defaultMode: 420
      containers:
        - name: container-apisix-dashboard
          #      ---------***---------
          #          镜像地址: 域名/组织/容器名称:版本
          image: 镜像地址
          #          参数选择Always和IfNotPresent。Always参数开启后工作负载每次重启/升级均会重新拉取镜像,否则只会在节点上不存在同名同版本镜像时拉取镜像
          volumeMounts:
            - name: vol-cce-apisix-dashboard
              readOnly: true
              mountPath: /usr/local/apisix-dashboard/conf/conf.yaml
              subPath: dashboard.yaml
          imagePullPolicy: IfNotPresent
#          配置使用的密钥
#      imagePullSecrets:
#        - name: cce-secret

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐