1. Background 1.1 Problem to be solved
For APISIX 1.* and 2.* versions, the DP (DataPlane) plane and the CP (ControlPlane) plane reuse the same port (9080) by default. Although we clearly distinguish the different responsibilities of DP and CP in the deployment architecture diagram of APISIX, due to the lack of API gateway architecture understanding and security experience for open source users, they are not changed to separate deployment methods in production environments, it makes the user's CP insecure and vulnerable to attack. For example, APISIX fixed one security issue, the API caller use the batch-request plugin to bypass local IP restrictions and directly access Admin API. Because DP and CP are not deployed separately, the security of APISIX is greatly reduced. 1.2 The benefits of solving this problem 1. The DP and CP use different listening port(same port is not allowed), improving security. 2. Make it easier for users to choose the correct deployment way. 3. Reduce the difficulty for users to deploy APISIX DP/CP separately 4. The communication protocol between DP and CP, the communication protocol between CP and configuration center, the two protocols are no longer unified. If the communication protocol between the CP and the configuration center is updated, there is no need to do any update between the DP and the CP. 2. How to solve the problem Add new deployment, the users can use it to specify the deployment role, here is a full example: ``` deployment: role: traditional # traditional or data_plane or control_plane role_traditional: config_provider: etcd # only supports etcd now role_control_plan: config_provider: etcd # only supports etcd now config_listen: 0.0.0.0:9280 # data plane will connect to this service for fetching # config data, eg: route, service and so on. role_data_plane: config_provider: control_plane # control_plane or yaml control_plane: host: - xxxx:9280 - xxxx:9280 timeout: 30 # second certs: # if the role is data_plane or control_plane, you need # to set it. The connection between the DP and CP is # via mTLS, this configuration is used to specify the # dependent certificates. # cert: /path/to/ca-cert # cert_key: /path/to/ca-cert # ca_cert: /path/to/ca-cert etcd: # if the role is traditional or control_plane, you need # to set it host: - http://xxxx - https://xxxx prefix: /apisix timeout: 30 ... ... ``` When starting the APISIX service, if APISIX found that some configurations are not related to the current deployment role (such as starting in Control plane mode, but configuring Admin API ),an alarm message will be output during startup, indicating that these configurations are invalid, and the information will also be recorded in the error log file. For role , the user has three options: traditional, data_plane, control_plane. The different deployment options for users to use APISIX are summarized here, mainly including these three typical use cases. Different users (developers, production users) use APISIX in different deployment ways. 1. all-in-one:DP + CP were deployed together, all of the services were run in one instance. NOTE: In this mode, when the service starts, a prompt is printed in the screen output and in the error log: “The APISIX you started, which enables both the data plane and the control plane.This deployment mode is not recommended for production environments." Demo Configuration: ``` deployment: role: traditional role_traditional: config_provider: etcd etcd: host: - http://xxxx - http://xxxx prefix: /apisix timeout: 30 ... ... ``` NOTE: • We will use same deployment way, only the DP and CP run in one instance. • Between DP and CP, APISIX will use HTTP protocol, and it uses HTTP protocol between Admin API and conf server. • The conf server will listen on `unix: conf/config_listen`. 2. decoupled: DP and CP are deployed independently data_plane a. Fetch route data from the control plane, the default port is 9280 b. Before the DP service starts, it will perform a health check on all CP addresses ▪ If all CP addresses are unavailable, the startup fails and an exception message is output to the screen. ▪ If at least one CP address is available (eg /status can get a normal response from the interface), print the unhealthy CP check result log, and then start the APISIX service. ▪ If all CP addresses are normal, start the APISIX service normally. c. Handling user requests. Demo Configuration(DP): ``` deployment: role: data_plane role_data_plane: config_provider: control_plane # control_plane or yaml control_plane: host: - xxxx:9280 - xxxx:9280 timeout: 30 certs: cert: /path/to/ca-cert cert_key: /path/to/ca-cert ca_cert: /path/to/ca-cert ``` control_plane a. Provide Admin API for Admin user, listening on 9180(default) b. Provide conf server for data plane and control plane, listening on 9280(default) Demo Configuration(CP): ``` deployment: role: control_plane # traditional or data_plane or control_plane role_control_plan: config_provider: etcd config_listen: 0.0.0.0:9280 etcd: host: - https://xxxx - https://xxxx prefix: /apisix timeout: 30 ... ... certs: cert: /path/to/ca-cert cert_key: /path/to/ca-cert ca_cert: /path/to/ca-cert ``` 3. standalone: only for data plane, load the route data from local yaml file Demo Configuration: ``` deployment: role: data_plane role_data_plane: config_provider: yaml # control_plane or yaml ``` There are no changes other than specifying the service as standalone using role, no more change, same as before.