Skip to content

Instantly share code, notes, and snippets.

@chaitanya9186
Forked from kocolosk/deployment-couchdb.yaml
Created September 23, 2016 22:58
Show Gist options
  • Save chaitanya9186/03539bd9c314cb49cfe544c768ae78d1 to your computer and use it in GitHub Desktop.
Save chaitanya9186/03539bd9c314cb49cfe544c768ae78d1 to your computer and use it in GitHub Desktop.
CouchDB 2.0 in Kubernetes
# Start a 3 node cluster and join it together automatically. Uses
# local ephemeral disk for database storage.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: couchdb
spec:
replicas: 3
template:
metadata:
labels:
run: couchdb
spec:
containers:
- name: couchdb
image: kocolosk/couchdb:2.0-prod
imagePullPolicy: Always
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: ERL_FLAGS
value: "-name couchdb@$(POD_IP) -setcookie monster"
ports:
- name: couchdb
containerPort: 5984
- name: epmd
containerPort: 4369
- containerPort: 9100
volumeMounts:
- name: database-storage
mountPath: /var/lib/couchdb
- name: mem3-kube
image: kocolosk/mem3-kube
imagePullPolicy: Always
volumes:
- name: database-storage
emptyDir: {}
FROM debian:jessie
MAINTAINER Adam Kocoloski adam@kocolosk.net
RUN groupadd -r couchdb && useradd -d /opt/couchdb -g couchdb couchdb
# Download dependencies
RUN apt-get update -y -qq && apt-get install -y --no-install-recommends \
python python-pip \
&& pip install requests
COPY mem3_kube.py /opt/mem3_kube/
USER couchdb
WORKDIR /opt/mem3_kube
CMD ["mem3_kube.py"]
ENTRYPOINT ["/usr/bin/python"]
# This file just grabs the list of pod IP addresses for the service
# called "couchdb" and feeds those as `couchdb@PODIP` nodes to mem3.
# It's just a proof of concept; the proper solution is likely a module
# in mem3 itself.
import json
import os
import requests
import time
def discover_peers():
f = open("/var/run/secrets/kubernetes.io/serviceaccount/token", 'r')
token = f.read()
uri = 'https://{0}:{1}/api/v1/namespaces/{2}/endpoints/{3}'.format(
os.environ.get("KUBERNETES_PORT_443_TCP_ADDR", "10.0.0.1"),
os.environ.get("KUBERNETES_PORT_443_TCP_PORT", "443"),
os.environ.get("POD_NAMESPACE", "default"),
os.environ.get("COUCHDB_SERVICE", "couchdb")
)
headers = {
'Authorization': "Bearer {0}".format(token)
}
resp = requests.get(uri, headers=headers, verify=False)
if resp.status_code == 200:
body = resp.json()
for key in ('addresses', 'notReadyAddresses'):
addresses = body['subsets'][0].get(key, [])
ips = [addr['ip'] for addr in addresses]
print key, ips
connect_the_dots(ips)
sleep_forever()
else:
print 'Error'
print resp.text
def connect_the_dots(ips):
for ip in ips:
uri = "http://localhost:5986/_nodes/couchdb@{0}".format(ip)
doc = {}
r = requests.put(uri, data = json.dumps(doc))
print ip, r.status_code
def sleep_forever():
while True:
time.sleep(5)
if __name__ == '__main__':
print os.environ
discover_peers()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment