## Apache APISIX for Kubernetes

Apache APISIX is a dynamic, real-time, high-performance API gateway.

APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more.

You can use Apache APISIX to handle traditional north-south traffic, as well as east-west traffic between services. It can also be used as a [k8s ingress controller](https://github.com/apache/apisix-ingress-controller/).

This chart bootstraps all the components needed to run Apache APISIX on a Kubernetes Cluster using [Helm](https://helm.sh).

## Prerequisites

* Kubernetes v1.14+
* Helm v3+

## Install

To install the chart with the release name `my-apisix`:

```sh
helm repo add apisix https://charts.apiseven.com
helm repo update

helm install [RELEASE_NAME] apisix/apisix --namespace ingress-apisix --create-namespace
```

## Uninstall

 To uninstall/delete a Helm release `my-apisix`:

 ```sh
helm delete [RELEASE_NAME] --namespace ingress-apisix
 ```

The command removes all the Kubernetes components associated with the chart and deletes the release.

## Parameters

The following tables lists the configurable parameters of the apisix chart and their default values per section/component:

### Global parameters

| Parameter                 | Description                                     | Default                                                 |
|---------------------------|-------------------------------------------------|---------------------------------------------------------|
| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` (does not add image pull secrets to deployed pods) |

### apisix parameters

| Parameter                                         | Description                                                                                                                                                                                                                                                                                                                  | Default                                                |
|---------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|
| `apisix.enabled`                                  | Enable or disable Apache APISIX itself                                                                                                                                                                                                                                                                                       | `true`                                                 |
| `apisix.enableIPv6`                               | Enable nginx IPv6 resolver                                                                                                                                                                                                                                                                                                   | `true`                                                 |
| `apisix.enableCustomizedConfig`                   | Enable full customized `config.yaml`                                                                                                                                                                                                                                                                                         | `false`                                                 |
| `apisix.customizedConfig`                         | If `apisix.enableCustomizedConfig` is true, full customized `config.yaml`. Please note that other settings about APISIX config will be ignored                                                                                                                                                                               | `{}`                                                 |
| `apisix.image.repository`                         | Apache APISIX image repository                                                                                                                                                                                                                                                                                               | `apache/apisix`                                        |
| `apisix.image.tag`                                | Apache APISIX image tag                                                                                                                                                                                                                                                                                                      | `{TAG_NAME}` (the latest Apache APISIX image tag)      |
| `apisix.image.pullPolicy`                         | Apache APISIX image pull policy                                                                                                                                                                                                                                                                                              | `IfNotPresent`                                         |
| `apisix.kind`                                     | Apache APISIX kind use a `DaemonSet` or `Deployment`                                                                                                                                                                                                                                                                         | `Deployment`                                                     |
| `apisix.replicaCount`                             | Apache APISIX deploy replica count,kind is DaemonSet,replicaCount not become effective                                                                                                                                                                                                                                       | `1`                                                    |
| `apisix.podAnnotations`                           | Annotations to add to each pod                                                                                                                                                                                                                                                                                               | `{}`                                                   |
| `apisix.podSecurityContext`                       | Set the securityContext for Apache APISIX pods                                                                                                                                                                                                                                                                               | `{}`                                                   |
| `apisix.securityContext`                          | Set the securityContext for Apache APISIX container                                                                                                                                                                                                                                                                          | `{}`                                                   |
| `apisix.podDisruptionBudget.enabled`              | Enable or disable podDisruptionBudget                                                                                                                                                                                                                                                                                        | `false`                                                |
| `apisix.podDisruptionBudget.minAvailable`         | Set the `minAvailable` of podDisruptionBudget. You can specify only one of `maxUnavailable` and `minAvailable` in a single PodDisruptionBudget. See [Specifying a Disruption Budget for your Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget) for more details | `Not set` |
| `apisix.podDisruptionBudget.maxUnavailable`       | Set the maxUnavailable of podDisruptionBudget                                                                                                                                                                                                                                                                                | `1`                                                    |
| `apisix.resources`                                | Set pod resource requests & limits                                                                                                                                                                                                                                                                                           | `{}`                                                   |
| `apisix.nodeSelector`                             | Node labels for Apache APISIX pod assignment                                                                                                                                                                                                                                                                                 | `{}`                                                   |
| `apisix.tolerations`                              | List of node taints to tolerate                                                                                                                                                                                                                                                                                              | `{}`                                                   |
| `apisix.affinity`                                 | Set affinity for Apache APISIX deploy                                                                                                                                                                                                                                                                                        | `{}`                                                   |
| `apisix.podAntiAffinity.enabled`                  | Enable or disable podAntiAffinity                                                                                                                                                                                                                                                                                            | `false`                                                |
| `apisix.setIDFromPodUID`                          | Whether to use the Pod UID as the APISIX instance id, see [apache/apisix#5417](https://github.com/apache/apisix/issues/5417) to decide whether you should enable this setting)                                                                                                                                               | `false` |
| `apisix.enableServerTokens`                       | Set the `enable_server_tokens` (Whether the APISIX version number should be shown in Server header)                                                                                                                                                                                                                          | `Not Set`                                              |
| `apisix.customLuaSharedDicts`                     | Add custom [lua_shared_dict](https://github.com/openresty/lua-nginx-module#toc88) settings, click [here](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml#L27-L30) to learn the format of a shared dict                                                                                     | `[]` |
| `apisix.pluginAttrs`                              | Set APISIX plugin attributes, see [config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L376) for more details                                                                                                                                                                         | `{}` |
| `apisix.luaModuleHook.enabled`                    | Whether to add a custom lua module                                                                                                                                                                                                                                                                                           | `false` |
| `apisix.luaModuleHook.luaPath`                    | Configure `LUA_PATH` so that your own lua module codes can be located                                                                                                                                                                                                                                                        | `""` |
| `apisix.luaModuleHook.hookPoint`                  | The entrypoint of your lua module, use Lua require syntax, like `"module.say_hello"`                                                                                                                                                                                                                                         | `""` |
| `apisix.luaModuleHook.configMapRef.name`          | Name of the ConfigMap where the lua module codes store                                                                                                                                                                                                                                                                       | "" |
| `apisix.luaModuleHook.configMapRef.mounts[].key`  | Name of the ConfigMap key, for setting the mapping relationship between ConfigMap key and the lua module code path.                                                                                                                                                                                                          | `""` |
| `apisix.luaModuleHook.configMapRef.mounts[].path` | Filepath of the plugin code, for setting the mapping relationship between ConfigMap key and the lua module code path.                                                                                                                                                                                                        | `""` |
| `apisix.httpRouter`                               | HTTP routing strategy. See [APISIX Router](https://apisix.apache.org/docs/apisix/terminology/router/) for the detail.                                                                                                                                                                                                    | `[]` |
| `extraVolumes`                                    | Additional `volume`, See [Kubernetes Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.                                                                                                                                                                                                          | `[]` |
| `extraVolumeMounts`                               | Additional `volumeMounts`, See [Kubernetes Volumes](https://kubernetes.io/docs/concepts/storage/volumes/) for the detail.                                                                                                                                                                                                    | `[]` |

### gateway parameters

Apache APISIX service parameters, this determines how users can access itself.

| Parameter                       | Description                                                                                                                                                                         | Default    |
|---------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
| `gateway.type`                  | Apache APISIX service type for user access itself                                                                                                                                   | `NodePort` |
| `gateway.externalTrafficPolicy` | Setting how the Service route external traffic                                                                                                                                      | `Cluster`  |
| `gateway.http`                  | Apache APISIX service settings for http                                                                                                                                             |            |
| `gateway.tls`                   | Apache APISIX service settings for tls                                                                                                                                              |            |
| `gateway.tls.existingCASecret`  | Specifies the name of Secret contains trusted CA certificates in the PEM format used to verify the certificate when APISIX needs to do SSL/TLS handshaking with external services (e.g. etcd) | `""`       |
| `gateway.tls.certCAFilename`    | Filename be used in the `gateway.tls.existingCASecret`                                                                                                                                          | `""`       |
| `gateway.tls.sslProtocols`    |   TLS protocols allowed to use.  | `"TLSv1.2 TLSv1.3"`       |
| `gateway.stream`                | Apache APISIX service settings for stream                                                                                                                                           |            |
| `gateway.ingress`               | Using ingress access Apache APISIX service                                                                                                                                          |            |
| `gateway.ingress.annotations`   | Ingress annotations                                                                                                                                                                 | `[]`       |
| `gateway.ingress.className`     | `ingressClassName` replaces `annotations kubernetes.io/ingress.class`, required Kubernetes `>=1.18`                                                                                   |            |

### admin parameters

| Parameter                  | Description                                                                      | Default                                                 |
|----------------------------|----------------------------------------------------------------------------------|---------------------------------------------------------|
| `admin.enabled`            | Enable or disable Apache APISIX admin API                                        | `true`                                                  |
| `admin.port`               | which port to use for Apache APISIX admin API                                    | `9180`                                                  |
| `admin.servicePort`        | Service port to use for Apache APISIX admin API                                  | `9180`                                                  |
| `admin.type`               | Apache APISIX admin API service type                                             | `ClusterIP`                                             |
| `admin.externalIPs`        | IPs for which nodes in the cluster will also accept traffic for the servic       | `[]`                                                    |
| `admin.cors`               | Apache APISIX admin API support CORS response headers                            | `true`                                                  |
| `admin.credentials.admin`  | Apache APISIX admin API admin role credentials                                   | `edd1c9f034335f136f87ad84b625c8f1`                      |
| `admin.credentials.viewer` | Apache APISIX admin API viewer role credentials                                  | `4054f7cf07e344346cd3f287985e76a2`                      |
| `admin.allow.ipList`       | the IP range allowed to Apache APISIX admin API                                  | `true`                                                  |

### custom configuration snippet parameters

| Parameter                        | Description                                                                                        | Default |
|----------------------------------|----------------------------------------------------------------------------------------------------|---------|
| `configurationSnippet.main`      | Add custom Nginx configuration (main block) to nginx.conf                                          | `{}`    |
| `configurationSnippet.httpStart` | Add custom Nginx configuration (http block) to nginx.conf                                          | `{}`    |
| `configurationSnippet.httpEnd`   | Add custom Nginx configuration (http block) to nginx.conf, will be put at the bottom of http block | `{}`    |
| `configurationSnippet.httpSrv`   | Add custom Nginx configuration (server block) to nginx.conf                                        | `{}`    |
| `configurationSnippet.httpAdmin` | Add custom Nginx configuration (Admin API server block) to nginx.conf                              | `{}`    |
| `configurationSnippet.stream`    | Add custom Nginx configuration (stream block) to nginx.conf                                        | `{}`    |

### etcd parameters

| Parameter                       | Description                                                                                                                                                      | Default                     |
|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
| `etcd.enabled`                  | use built-in etcd                                                                                                                                                | `true`                      |
| `etcd.host`                     | if `etcd.enabled` is false, use external etcd, support multiple address, if your etcd cluster enables TLS, please use https scheme, e.g. https://127.0.0.1:2379. | `["http://etcd.host:2379"]` |
| `etcd.prefix`                   | apisix configurations prefix                                                                                                                                     | `/apisix`                   |
| `etcd.timeout`                  | Set the timeout value in seconds for subsequent socket operations from apisix to etcd cluster                                                                    | `30`                        |
| `etcd.auth.rbac.create`        | Switch to enable RBAC authentication                                                                                                                                             | `false`                     |
| `etcd.auth.rbac.user`           | root username for etcd                                                                                                                                           | `""`                        |
| `etcd.auth.rbac.password`       | root password for etcd                                                                                                                                           | `""`                        |
| `etcd.auth.tls.enabled`         | enable etcd client certificate                                                                                                                                   | `false`                     |
| `etcd.auth.tls.existingSecret`  | name of the secret contains etcd client cert                                                                                                                     | `""`                        |
| `etcd.auth.tls.certFilename`    | etcd client cert filename using in `etcd.auth.tls.existingSecret`                                                                                                | `""`                        |
| `etcd.auth.tls.certKeyFilename` | etcd client cert key filename using in `etcd.auth.tls.existingSecret`                                                                                            | `""`                        |
| `etcd.auth.tls.verify`          | whether to verify the etcd endpoint certificate when setup a TLS connection to etcd                                                                              | `true`                      |
| `etcd.auth.tls.sni`            | specify the TLS [Server Name Indication](https://en.wikipedia.org/wiki/Server_Name_Indication) extension,  the ETCD endpoint hostname will be used when this setting is unset. | `""` |

If etcd.enabled is true, set more values of bitnami/etcd helm chart use etcd as prefix.

### plugins and stream_plugins parameters

Default enabled plugins. See [configmap template](https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/templates/configmap.yaml) for details.


### external plugin parameters

| Parameter                       | Description                                                                                                                                                      | Default                     |
|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
| `extPlugin.enabled` | Enable External Plugins. See [external plugin](https://apisix.apache.org/docs/apisix/next/external-plugin/) | `false` |
| `extPlugin.cmd` | the command and its arguements to run as a subprocess | `{}` |

### custom plugin parameters

| Parameter                       | Description                                                                                                                                                      | Default                     |
|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
| `apisix.customPlugins.enabled` | Whether to configure some custom plugins | `false` |
| `apisix.customPlugins.luaPath` | Configure `LUA_PATH` so that custom plugin codes can be located | `""` |
| `apisix.customPlugins.plugins[].name` | Custom plugin name | `""` |
| `apisix.customPlugins.plugins[].attrs` | Custom plugin attributes | `{}` |
| `apisix.customPlugins.plugins[].configMap.name` | Name of the ConfigMap where the plugin codes store | `""` |
| `apisix.customPlugins.plugins[].configMap.mounts[].key` | Name of the ConfigMap key, for setting the mapping relationship between ConfigMap key and the plugin code path. | `""` |
| `apisix.customPlugins.plugins[].configMap.mounts[].path` | Filepath of the plugin code, for setting the mapping relationship between ConfigMap key and the plugin code path. | `""` |

### discovery parameters

| Parameter                       | Description                                                                                                                                                                         | Default    |
|---------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
| `discovery.enabled`                  | Enable or disable Apache APISIX integration service discovery | `false` |
| `discovery.registry`                  | Registry is the same to the one in APISIX [config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281), and refer to such file for more setting details. also refer to [this documentation for integration service discovery](https://apisix.apache.org/docs/apisix/discovery) | nil |

If you have enabled this feature,  here is an example:

```yaml
discovery:
  enabled: true
  registry:
    eureka:
      host:
        - "http://${username}:${password}@${eureka_host1}:${eureka_port1}"
        - "http://${username}:${password}@${eureka_host2}:${eureka_port2}"
      prefix: "/eureka/"
      fetch_interval: 30
      weight: 100
      timeout:
        connect: 2000
        send: 2000
        read: 5000
```

### logs parameters

| Parameter                       | Description                                                                                                                                                                         | Default    |
|---------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
| `logs.enableAccessLog`                  | Enable access log or not, default true | `true` |
| `logs.accessLog`                  | Access log path | `/dev/stdout` |
| `logs.accessLogFormat`                  | Access log format | `$remote_addr - $remote_user [$time_local] $http_host \"$request\" $status $body_bytes_sent $request_time \"$http_referer\" \"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time \"$upstream_scheme://$upstream_host$upstream_uri\"` |
| `logs.accessLogFormatEscape`                  | Allows setting json or default characters escaping in variables | `default` |
| `logs.errorLog`                  | Error log path | `/dev/stderr` |
| `logs.errorLogLevel`                  | Error log level | `warn` |

### dashboard parameters

Configurations for apisix-dashboard sub chart.

### ingress-controller parameters

Configurations for Apache APISIX ingress-controller sub chart.

### serviceMonitor parameters

| Parameter                      | Description                                                  | Default                      |
| ------------------------------ | ------------------------------------------------------------ | ---------------------------- |
| `serviceMonitor.enabled`       | Enable or disable Apache APISIX serviceMonitor               | `false`                      |
| `serviceMonitor.namespace`     | Namespace where the serviceMonitor is deployed               | `""`                         |
| `serviceMonitor.interval`      | Interval at which metrics should be scraped                  | `15s`                        |
| `serviceMonitor.path`          | Path of the Prometheus metrics endpoint                      | `/apisix/prometheus/metrics` |
| `serviceMonitor.containerPort` | Container port which Prometheus metrics are exposed          | `9091`                       |
| `serviceMonitor.labels`        | ServiceMonitor extra labels                                  | `{}`                         |
| `serviceMonitor.annotations`   | ServiceMonitor annotations                                   | `{}`                         |

### initContainers parameters

| Parameter                      | Description          | Default   |
|--------------------------------|----------------------|-----------|
| `initContainer.image`          | Init container image | `busybox` |
| `initContainer.tag`            | Init container tag   | `1.28`    |

### vault integration parameters

| Parameter                  | Description                                                                                      | Default                                                 |
|----------------------------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------|
| `vault.enabled`            | Enable or disable the vault integration                                                          | `false`                                                 |
| `vault.host`               | The host address where the vault server is running.                                              |                                                         |
| `vault.timeout`            | HTTP timeout for each request.                                                                   |                                                         |
| `vault.token`              | The generated token from vault instance that can grant access to read data from the vault.       |                                                         |
| `vault.prefix`             | Prefix allows you to better enforcement of policies.                                             |                                                         |

