mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Merge 9fa4be55037ccf047e12bee4df73dc5719ee595f into 35e35ecd57c64eaca5f30c81e90223a4f5d45737
This commit is contained in:
commit
2fe17c453b
52
k8s/3scale-apicast/apicast-dep.yaml
Normal file
52
k8s/3scale-apicast/apicast-dep.yaml
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: openresty-instance-1-dep
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: openresty-instance-1-dep
|
||||||
|
spec:
|
||||||
|
terminationGracePeriodSeconds: 10
|
||||||
|
containers:
|
||||||
|
- name: nginx-openresty
|
||||||
|
image: bigchaindb/nginx_3scale:unstable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
env:
|
||||||
|
- name: THREESCALE_PORTAL_ENDPOINT
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: apicast-secret
|
||||||
|
key: portal-endpoint
|
||||||
|
- name: RESOLVER
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: vars
|
||||||
|
key: cluster-dns-server-ip
|
||||||
|
- name: APICAST_LOG_LEVEL
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: apicast-config
|
||||||
|
key: api-log-level
|
||||||
|
- name: APICAST_MANAGEMENT_API
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: apicast-config
|
||||||
|
key: mgmt-api-mode
|
||||||
|
- name: BIGCHAINDB_BACKEND_HOST
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: vars
|
||||||
|
key: bdb-instance-name
|
||||||
|
- name: BIGCHAINDB_API_PORT
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: vars
|
||||||
|
key: bigchaindb-api-port
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 8090
|
||||||
|
protocol: TCP
|
||||||
25
k8s/3scale-apicast/apicast-svc.yaml
Normal file
25
k8s/3scale-apicast/apicast-svc.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: openresty-instance-1
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
name: openresty-instance-1
|
||||||
|
annotations:
|
||||||
|
# NOTE: the following annotation is a beta feature and
|
||||||
|
# only available in GCE/GKE and Azure as of now
|
||||||
|
# Ref: https://kubernetes.io/docs/tutorials/services/source-ip/
|
||||||
|
service.beta.kubernetes.io/external-traffic: OnlyLocal
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: openresty-instance-1-dep
|
||||||
|
ports:
|
||||||
|
- port: 8080
|
||||||
|
targetPort: 8080
|
||||||
|
name: apicast-svc
|
||||||
|
- port: 8090
|
||||||
|
targetPort: 8090
|
||||||
|
name: apicast-mgmt
|
||||||
|
protocol: TCP
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
16
k8s/3scale-apicast/container/Dockerfile
Normal file
16
k8s/3scale-apicast/container/Dockerfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
FROM openresty/openresty:xenial
|
||||||
|
LABEL maintainer "dev@bigchaindb.com"
|
||||||
|
WORKDIR /opt/apicast
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get -y upgrade \
|
||||||
|
&& apt-get autoremove \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& apt-get install wget
|
||||||
|
COPY nginx_openresty_entrypoint.bash /
|
||||||
|
|
||||||
|
# The following ports are the values we use to run the NGINX+3scale container.
|
||||||
|
# 80 for http, 8080 for the 3scale api, 8888 for health-check, 27017 for
|
||||||
|
# MongoDB
|
||||||
|
EXPOSE 8080 8090 8888
|
||||||
|
|
||||||
|
ENTRYPOINT ["/nginx_openresty_entrypoint.bash"]
|
||||||
60
k8s/3scale-apicast/container/README.md
Normal file
60
k8s/3scale-apicast/container/README.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# nginx_3scale agent
|
||||||
|
nginx_3scale agent is a module that is responsible for providing authentication,
|
||||||
|
authorization and metering of BigchainDB API users, by communicating with 3scale.
|
||||||
|
We use the openresty for this, which is nginx bundled with lua libraries.
|
||||||
|
More information at their [website](openresty.org/en)
|
||||||
|
|
||||||
|
It validates the tokens sent by users in HTTP headers.
|
||||||
|
The user tokens map directly to the Application Plan specified in 3scale.
|
||||||
|
|
||||||
|
## Build and Push the Latest Container
|
||||||
|
Use the `docker_build_and_push.bash` script to build the latest docker image
|
||||||
|
and upload it to Docker Hub.
|
||||||
|
Ensure that the image tag is updated to a new version number to properly
|
||||||
|
reflect any changes made to the container.
|
||||||
|
|
||||||
|
|
||||||
|
## Working
|
||||||
|
|
||||||
|
* We define a [lua module](./nginx.lua.template) and
|
||||||
|
custom hooks (lua functions to be executed at certain phases of the nginx
|
||||||
|
request processing lifecycle) to authenticate an API request.
|
||||||
|
|
||||||
|
* Download the template available from 3scale which pre-defines all the
|
||||||
|
rules defined using the 3scale UI for monitoring, and the basic nginx
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
* We heavily modify these templates to add our custom functionality.
|
||||||
|
|
||||||
|
* The nginx_3scale image reads the environment variables and accordingly
|
||||||
|
creates the nginx.conf and nginx.lua files from the templates.
|
||||||
|
|
||||||
|
* Every request calls the `_M.access()` function. This function extracts the
|
||||||
|
`app_id` and `app_key` from the HTTP request headers and forwards it to
|
||||||
|
3scale to see if a request is allowed to be forwarded to the BigchainDB
|
||||||
|
backend. The request also contains the
|
||||||
|
various parameters that one would like to set access policies on. If the
|
||||||
|
`app_id` and `app_key` is successful, the access rules for the parameters
|
||||||
|
passed with the request are checked to see if the request can pass through.
|
||||||
|
For example, we can send a parameter, say `request_body_size`, to the 3scale
|
||||||
|
auth API. If we have defined a rule in the 3scale dashboard to drop
|
||||||
|
`request_body_size` above a certain threshold, the authorization will fail
|
||||||
|
even if the `app_id` and `app_key` are valid.
|
||||||
|
|
||||||
|
* A successful response from the auth API causes the request to be proxied to
|
||||||
|
the backend. After a backend response, the `_M.post_action_content` hook is
|
||||||
|
called. We calculate details about all the metrics we are interested in and
|
||||||
|
form a payload for the 3scale reporting API. This ensures that we update
|
||||||
|
parameters of every metric defined in the 3scale UI after every request.
|
||||||
|
|
||||||
|
* Note: We do not cache the keys in nginx so that we can validate every request
|
||||||
|
with 3scale and apply plan rules immediately. We can add auth caching to
|
||||||
|
improve performance, and in case we move to a fully post-paid billing model.
|
||||||
|
|
||||||
|
* Refer to the references made in the [lua module](./nginx.lua.template) for
|
||||||
|
more details about how nginx+lua+3scale works
|
||||||
|
|
||||||
|
* For HTTPS support, we also need to add the signed certificate and the
|
||||||
|
corresponding private key to the folder
|
||||||
|
`/usr/local/openresty/nginx/conf/ssl/`. Name the pem-encoded certificate as
|
||||||
|
`cert.pem` and the private key as `cert.key`.
|
||||||
5
k8s/3scale-apicast/container/docker_build_and_push.bash
Executable file
5
k8s/3scale-apicast/container/docker_build_and_push.bash
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
docker build -t bigchaindb/nginx_3scale:unstable .
|
||||||
|
|
||||||
|
docker push bigchaindb/nginx_3scale:unstable
|
||||||
37
k8s/3scale-apicast/container/nginx_openresty_entrypoint.bash
Executable file
37
k8s/3scale-apicast/container/nginx_openresty_entrypoint.bash
Executable file
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
BASE_DIR=$(pwd)
|
||||||
|
APICAST_RELEASE="3.1.0"
|
||||||
|
BASE_GIT_URL="https://github.com/3scale/apicast/archive"
|
||||||
|
|
||||||
|
# Set Default config
|
||||||
|
export APICAST_CONFIGURATION_LOADER="boot" # Overriding apicast default lazy config loader
|
||||||
|
export APICAST_MANAGEMENT_API="debug" # Overriding apicast default fo 'status' mode to be
|
||||||
|
# able to update bigchaindb backen service endpoint
|
||||||
|
|
||||||
|
# Sanity Check
|
||||||
|
if [[ -z "${THREESCALE_PORTAL_ENDPOINT:?THREESCALE_PORTAL_ENDPOINT not specified. Exiting!}" || \
|
||||||
|
-z "${BIGCHAINDB_BACKEND_HOST:?BIGCHAINDB_BACKEND_HOST not specified. Exiting!}" || \
|
||||||
|
-z "${BIGCHAINDB_API_PORT:?BIGCHAINDB_API_PORT not specified. Exiting!}" ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export THREESCALE_PORTAL_ENDPOINT=`printenv THREESCALE_PORTAL_ENDPOINT`
|
||||||
|
|
||||||
|
# Print Current Configs
|
||||||
|
echo "Apicast Release: ${APICAST_RELEASE}"
|
||||||
|
echo "Apicast Download URL: ${BASE_GIT_URL}"
|
||||||
|
echo "APICAST_CONFIGURATION_LOADER: ${APICAST_CONFIGURATION_LOADER}"
|
||||||
|
echo "BIGCHAINDB_BACKEND_HOST: ${BIGCHAINDB_BACKEND_HOST}"
|
||||||
|
echo "BIGCHAINDB_API_PORT: ${BIGCHAINDB_API_PORT}"
|
||||||
|
|
||||||
|
# Download and Install Apicast
|
||||||
|
wget "${BASE_GIT_URL}/v${APICAST_RELEASE}.tar.gz"
|
||||||
|
tar -xvzf "v${APICAST_RELEASE}.tar.gz"
|
||||||
|
|
||||||
|
eval luarocks make apicast-${APICAST_RELEASE}/apicast/*.rockspec --tree /usr/local/openresty/luajit
|
||||||
|
|
||||||
|
# Start nginx
|
||||||
|
echo "INFO: starting nginx..."
|
||||||
|
exec apicast-${APICAST_RELEASE}/apicast/bin/apicast -b -e production -v -v -v
|
||||||
Loading…
x
Reference in New Issue
Block a user