Deploy Kubernetes service and store retrieved information in the Consul K/V store
Install pew (python environment wrapper)
pip2 install pewCreate required project dirs
mkdir -p /data/pew/virtualenvs
mkdir -p /etc/k8s-deployer
mkdir -p /var/log/k8s-deployerClone repo
git clone https://<fqdn>/<username>/k8s-deployer.git /data/pew/k8s-deployer
cd /data/pew/k8s-deployerCreate a new virtualenv for k8s-deployer project
WORKON_HOME="/data/pew/virtualenvs" pew new -a /data/pew/k8s-deployer -r requirements.txt k8s-deployerEnter virtualenv (previous commad will also enter virtualenv at the end)
WORKON_HOME=/data/pew/virtualenvs pew workon k8s-deployerCopy and modify k8s-deployer configuration file
cp /data/pew/k8s-deployer/config.json /etc/k8s-deployer/config.jsonCopy and modify supervisor configuration file
cp /data/pew/k8s-deployer/supervisor/k8s-deployer.conf /etc/supervisor/conf.d/k8s-deployer.confAdd and start service
supervisorctl reread
supervisorctl add k8s-deployer
Supported environment variables
Note: Environment variables have precedence over configuration file
| Env Keys | Env (default) Values | Value Examples | Description |
|---|---|---|---|
| K8S_DEPLOYER_KUBE_SCHEME | http | Scheme http or https | |
| K8S_DEPLOYER_KUBE_HOST | localhost | Kubernetes API hostname or IP address | |
| K8S_DEPLOYER_KUBE_PORT | 8080 | Kubernetes API port | |
| K8S_DEPLOYER_KUBE_API_HEADERS | none | key1__value1,key2__value2,keyN__valueN | HTTP request headers |
| K8S_DEPLOYER_CONSUL_SCHEME | http | Scheme http or https | |
| K8S_DEPLOYER_CONSUL_HOST | localhost | Consul API hostname or IP address | |
| K8S_DEPLOYER_CONSUL_PORT | 8500 | Consul API port | |
| K8S_DEPLOYER_CONSUL_KEY_PATH | kubernetes | kubernetes/prod | Consul K/V store path where all the data will be stored |
| K8S_DEPLOYER_CONSUL_SPECS_RETENT | 5 | How many specifications have to be preserved at any time |
Build and run
docker build --no-cache -t k8s-deployer .
docker run -it -d --name k8s-deployer -p 8089:8089 k8s-deployer
For quick test deploy you can use deploy.sh script located in examples dir, in this dir you will also find echoserver.json specification descriptor that will be used for echoserver service deployment
cd examples
./deploy.shSpecification descriptor:
{
"id": null,
"namespace": null,
"objects": {
"deployments": {
"specification": {
"### Kubernetes deployment object spec goes here"
}
},
"services": {
"specification": {
"### Kubernetes service object spec goes here"
}
}
}
}If you already have yaml spec files you can use kubectl to convert these locally to json format
Note: Only services of type NodePort will be registered in the Consul service catalog
kubectl convert -f echoserver-deployment.yaml --local -o json > echoserver-deployment.json
kubectl convert -f echoserver-service.yaml --local -o json > echoserver-service.jsonAfter successful yaml => json conversion you can use k8s-specgen.py script to easily generate k8s-deployer specification file
k8s-specgen.py -d echoserver-deployment.json -s echoserver-service.json -o echoserver.jsonKubernetes documentation regarding deployment and service objects
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
https://kubernetes.io/docs/concepts/services-networking/service/
Kubernetes API references
https://kubernetes.io/docs/reference/
In the following example we're going to explain how we can deploy echoserver service in default namespace
Note: by default max 5 specifications for the same service will be preserved on the Consul K/V store at any time, you can modify this value in the configuration file or through environment variable $K8S_DEPLOYER_CONSUL_SPECS_RETENT
Note: after successful transaction, specification ID will be returned as value of Location header
curl -X POST -isSL -H 'Content-Type: application/json' --data '@echoserver.json' http://localhost:8089/specifications/default/echoservercurl -isSL http://localhost:8089/specifications/default/echoservercurl -isSL http://localhost:8089/specifications/default/echoserver/latestNote: if we omit specification ID, latest specification will be used
Note: after every successful build deployed spec will be created on this Consul K/V path $K8S_DEPLOYER_CONSUL_KEY_PATH/specifications/<namespace>/<service_name>
curl -X PUT -isSL http://localhost:8089/deployments/default/echoserveror you can explicitly set specification ID
curl -X PUT -isSL http://localhost:8089/deployments/default/echoserver/1490691025506482_1650b288-e79c-4247-9b3b-95f1051302c4Note: it's going to delete all the service related objects from Kubernetes and service definition from the Consul K/V store
curl -X DELETE -isSL http://localhost:8089/deployments/default/echoserverUpdate existing service definitions that have been manually modified on the Kubernetes side or
populate Consul K/V store with new service definitions for services that are not deployed through k8s-deployer (register service on Consul)
Note: Deletion of services that are not fully deployed through k8s-deployer API will not be possible via API itself
curl -X PUT -isSL http://localhost:8089/registration/default/echoserverNext go to consul-template
