Google Cloud deployment script for kubernetes clusters using Global Load Balancer
npm install @vroomlabs/gsdk-deployThis tool provides an automated deployment in your Google Cloud project using a combination of
Docker, Kubernetes, Cloud Endpoints, Global Load Balancer, etc. It's intended for high-availablity
deployments across Google Cloud regions while providing the simplicity of Google AppEngine deployment.
A configuration file (yaml/json) is required to provide a minimum amount of information needed to deploy your image.
Each build type/configuration is represented by a root object. That object describes the parameters required to deploy
the service. Environment expansion is available in the following forms: $PLAIN, $(PLAIN), ${PLAIN}; however, this
can make it more difficult to run locally. You should prefer specifying the values under one build name and include that
in the other builds via the extends entry.
#### deploy.yaml
# =============================================================================
# = Deployment configuration
# =============================================================================
"dev":
"name": "$(SERVICE_NAME)-$(BRANCH)"
"google-project": "$GCLOUD_PROJECT"
"host": "$(SERVICE_NAME)-$(BRANCH).example.com"
"api-config": ["./service.pb", "./api_config.yaml"]
"env":
- name: NODE_ENV
value: "$BRANCH"
- name: "ENDPOINT_NAME"
- name: "ENDPOINT_VERSION"
"replicas": 2
"clusters":
- "us-central1-a"
"prod":
"extends": "dev"
"clusters":
- "us-central1-a"
- "us-east4-c"
- "us-west1-c"
# =============================================================================
* google-project - The Google Cloud Project you will be deploying to.
* name - The name of the Kubernetes service to use
* host - The hostname you will direct
* api-config - An array of file names that describes your api (open-api or grpc)
* clusters - An array of Kubernetes cluster names to use. These should either already exist, or simply include
the desired regional zone name anywhere in the text. Missing clusters will be created.
* extends - Copy all settings from another build configuration.
* port - default = 8080 The port number your container service listens on, defined as NODE_PORT inside the container.
* env - A list of {name,value} pairs to use for the docker image, alternatively specify only a name to copy from current environment.
* replicas - The number of pods you want to run in each region, usually 2 or more.
* nodePort - A port number in the range of 30000-32767 that should be unique to the service. One will be generated from the name if not specified.
* livenessProbe - default = "/_ah/health" The path of your service's health check.
* readinessProbe - default = "/_ah/health?isReady=true" The path of your service's ready check.
There are other options available that can be discovered by the following command:
gsdk-deploy -branch=dev test-config
1. First things first, you need a Google account, and a Cloud Project.
2. This tool was written on and for a linux machine, so if you have issues on other environments please
feel free submit a pull request to address your specific operating system.
3. You must enable enpoints on your google project at: https://console.cloud.google.com/endpoints
4. Since this service configuration assumes end-to-end SSL, you will **need a certifcate that matches the
hostname** from the configuration file you will provide. You can always generate a self-signed certificate
for testing via the following command:
openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \
-subj /C=US/ST=Delaware/L=Dover/O=ops/OU=dev/CN=example.org \
-keyout _path_ -out _path_
Basic command-line tool invocation:
sudo npm install -g @vroomlabs/gsdk-deploy
gsdk-deploy [command-name] -build=[build-name] (-arg=value ...)
Alternatively you can run as a local dev-package:
npm install @vroomlabs/gsdk-deploy --save-dev
./node_modules/.bin/gsdk-deploy [command-name] -build=[build-name] (-arg=value ...)
#### Full Deploy Example
gsdk-deploy full-deploy --build=dev --image=user/build
test-config - Light check on configuration full-deploy - Normal full deployment, create clusters, networks, etc-image=[local docker tag name]list-images - Display the list of docker tags from related repo kube-images - Display the images running in kube for each clusterkube-history - Display kube rollout history for each clusterskube-status - Display the current rollout status for each clusterkube-rollback - Perform a kube rollback for each clusterdeploy-api - Deploy only the Google Endpoints API configurationdeploy-tag - Update to a specific docker image tag name in each cluster-tag=[docker tag name from repo]deploy-image - Update to a specific docker image uri in each cluster-image=[full uri and tag]remove-deployment - Removes kubernetes deployment and load balancer-branch=[name] - REQUIRED*: name of config section from configuration file-config=[path] - Relative path to a yaml configuration file-image=[name] - default = user/build, specifies a docker image locally or remote-auth-env=[name] - The name of an environment variable with base64 json auth-auth-file=[path] - Relative path to json authentication file-artifacts=[path] - Relative path to an existing directory to store artifacts-log=[level] - Specifies log console level (warn,info,debug,verbose,silly) Arguments may be specified with one or two dash prefixes - following the name and either : or = to separate the value.
GCLOUD_COMMAND, DOCKER_COMMAND, and KUBECTL_COMMAND will control the command-line to these commands.GCLOUD_COMMAND=sudo /opt/gsdk/gcloudAUTO_UPDATE_SDK set to true to auto-upgrade gcloud sdkBRANCH - value of the -branch= argumentENDPOINT_NAME - value of the endpoints api nameENDPOINT_VERSION - value of the endpoints api versionARTIFACTS - folder for build artifacts and log filesBUILD_TIME - full build timestamp in yyyy-MM-ddThh-mm-ss-sssZSERVICE_NAME - the name of the service from deploy.yamlGCLOUD_PROJECT - the name of the google project from deploy.yamlHOSTNAME - the host value from the deploy.yaml fileNODE_PORT - the configured or generated port for the kube serviceFor those of you using CircleCI, here is a basic setup:
1. Following the direction here https://circleci.com/docs/1.0/google-auth/ to create the GCLOUD_SERVICE_KEY environment variable.
2. Create and commit a deploy.yaml configuration file in your root directory.
3. Configure your build etc as follows:
dependencies:
pre:
- "npm install -g @vroomlabs/gsdk-deploy"
compile:
override:
- docker build -t user/build .
deployment:
develop:
branch: [develop]
commands:
- "gsdk-deploy full-deploy -auth-env:GCLOUD_SERVICE_KEY_DEV -image:user/build -branch:dev"