云原生或K8S 安装 APISIX
apisix
·
云原生或K8S 安装 APISIX
本篇主要以天翼云CCE集群部署方式为主,其他云原生集群类似
以下出现的ip以及密码为虚拟
一、基本概念
APISIX 是 Apache 下的一款云原生的 API 网关,支持全生命周期的 API 管理,在应用中可以作为所有 API 调用的统一入口。
APISIX 有一些基础概念如下:
- Upstream,或者叫做上游,是一组目标主机的抽象,上游一组节点提供实际的业务服务,一般需要指定负载均衡策略去调用。
- Route,路由定义了一组规则,指定如何匹配用户的请求并执行对应的插件,最后将请求转发到上游。
- Service,服务是一组上游和插件(不包括认证)的抽象,可以给多个路由复用,同时配置的变更也可以应用到全部的路由,解耦的同时还可以保持灵活性,服务和路由的关系通常是 1:N。
- Plugin,插件可以通过消费者或路由实现功能的扩展,从而满足用户对流量管理、权限认证、安全性、可观察性、请求/响应转换等方面的特定要求。
- Consumer,消费者就是请求 APISIX 服务的用户,消费者都会绑定认证和授权的插件,从而对身份进行识别,并且消费者配置的插件具有最高的优先级,APISIX 可以为不同的消费者配置不同的规则,实现比较灵活的功能。
知道了上面的一些基础概念,然后我们就开始搭建 APISIX 服务网关吧。
二、部署方式
APISIX 有 3 种部署方式,分别如下:
- traditional 这个是经典默认的部署方式,将数据平面和控制平面一块启动,方便管理。
- decoupled 这种是将控制平面和数据平面分离的部署方式,中间通过 mTLS 进行通信,这种适合在比较大规模的集群环境中使用。
- standalone 这种仅部署数据平面并且配置都从本地加载,这种部署方式常用在 Kubernetes 容器环境中,因为每次全量的配置都由 k8s 的配置中心生成并运行。
一般规模下比较常用的部署方式就是 traditional,无论是 traditional 还是 decoupled 都需要依赖外部的 etcd 保存配置,官网给出的 Docker 部署示例是将 etcd 集成到一个 compose 中,但是这样会失去 etcd 的高可用性,只适合测试环境,所以我们采用外部专用的 etcd 集群。
三、下载 APISIX 以及 APISIX-dashboard 镜像
- 下载自己需要的镜像
docker pull apache/apisix:3.7.0-debian
docker pull apache/apisix-dashboard:3.0.0-alpine
- 把镜像推送到云容器镜像服务
#打tag
docker tag apache/apisix:3.7.0-debian "镜像仓库的命名规则,如:域名/组织/镜像名称:tag"
#登录到远程镜像仓库
docker login "镜像仓库地址"
#推送到远程镜像仓库
docker push "镜像仓库的命名规则,如:域名/组织/镜像名称:tag"
#apisix-dashboard同上操作
四、修改配置文件
从安装包找到对应的配置文件进行修改
- 首先创建 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.host | etcd集群地址 |
deployment.etcd.user | 提供给apisix使用的用户名 |
deployment.etcd.password | 用户名密码 |
deployment.etcd.prefix | 前缀以/apisix开开头的key,具体可以更具etcd的认证配置更改 |
- 创建 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集群配置与密钥中创建配置项,主要是通过卷映射到容器内部
配置项名称 | 配置项键 | 配置项值 |
---|---|---|
apisix | config.yaml | 内容为上述配置文件内容 |
apisix-dashboard | dashboard.yaml | 内容为上述配置文件内容 |
五、通过YAML创建工作负载和服务
- 创建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
- 创建 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
更多推荐
已为社区贡献1条内容
所有评论(0)