Skip to content

Instantly share code, notes, and snippets.

@topikachu
Last active September 14, 2017 17:54
Show Gist options
  • Save topikachu/1d4c526a84481529d24e5a39886817eb to your computer and use it in GitHub Desktop.
Save topikachu/1d4c526a84481529d24e5a39886817eb to your computer and use it in GitHub Desktop.
kubernetes stateful elasticsearch cluster
---
apiVersion: v1
kind: Service
metadata:
name: es-client
labels:
app: es-client
spec:
ports:
- port: 9200
name: http
targetPort: 9200
selector:
app: es-client
---
apiVersion: v1
kind: ReplicationController
metadata:
name: es-client
spec:
replicas: 1
template:
metadata:
labels:
app: es-client
annotations:
pod.beta.kubernetes.io/init-containers: '[
{
"name": "sysctl",
"image": "busybox",
"imagePullPolicy": "IfNotPresent",
"command": ["sysctl", "-w", "vm.max_map_count=262144"],
"securityContext": {
"privileged": true
}
}
]'
spec:
containers:
- name: es-client
image: elasticsearch:5.1.1
env:
- name: ES_JAVA_OPTS
value: -Xms256m -Xmx256m
args:
- -Ecluster.name=k8s
- -Enode.name=${HOSTNAME}
- -Ediscovery.zen.ping.unicast.hosts=es-master.default.svc.cluster.local
- -Enode.master=false
- -Enode.data=false
- -Enode.ingest=false
ports:
- containerPort: 9300
name: transport
- containerPort: 9200
name: http
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: data-volume
volumes:
- name: data-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: es-data
labels:
app: es-data
spec:
ports:
- port: 9300
name: transport
clusterIP: None
selector:
app: es-data
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: es-data
spec:
serviceName: "es-data"
replicas: 1
template:
metadata:
labels:
app: es-data
annotations:
pod.beta.kubernetes.io/init-containers: '[
{
"name": "sysctl",
"image": "busybox",
"imagePullPolicy": "IfNotPresent",
"command": ["sysctl", "-w", "vm.max_map_count=262144"],
"securityContext": {
"privileged": true
}
}
]'
spec:
terminationGracePeriodSeconds: 10
containers:
- name: es-data
image: elasticsearch:5.1.1
env:
- name: ES_JAVA_OPTS
value: -Xms256m -Xmx256m
args:
- -Ecluster.name=k8s
- -Enode.name=${HOSTNAME}
- -Ediscovery.zen.ping.unicast.hosts=es-master.default.svc.cluster.local
- -Enode.master=false
- -Enode.data=true
- -Enode.ingest=false
ports:
- containerPort: 9300
name: transport
- containerPort: 9200
name: http
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: data-volume
volumeClaimTemplates:
- metadata:
name: data-volume
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: es-master
labels:
app: es-master
spec:
ports:
- port: 9300
name: transport
clusterIP: None
selector:
app: es-master
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: es-master
spec:
serviceName: "es-master"
replicas: 3
template:
metadata:
labels:
app: es-master
annotations:
pod.beta.kubernetes.io/init-containers: '[
{
"name": "sysctl",
"image": "busybox",
"imagePullPolicy": "IfNotPresent",
"command": ["sysctl", "-w", "vm.max_map_count=262144"],
"securityContext": {
"privileged": true
}
}
]'
spec:
terminationGracePeriodSeconds: 10
containers:
- name: es-master
image: elasticsearch:5.1.1
env:
- name: ES_JAVA_OPTS
value: -Xms256m -Xmx256m
args:
- -Ecluster.name=k8s
- -Enode.name=${HOSTNAME}
- -Ediscovery.zen.ping.unicast.hosts=es-master.default.svc.cluster.local
- -Ediscovery.zen.minimum_master_nodes=2
- -Enode.master=true
- -Enode.data=false
- -Enode.ingest=false
ports:
- containerPort: 9300
name: transport
- containerPort: 9200
name: http
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: data-volume
volumeClaimTemplates:
- metadata:
name: data-volume
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi
@topikachu
Copy link
Author

It works in a virtualbox having 8G memory with latest minikube.
Just submit the yaml to the k8s cluster one by one.

In the production, you need to create real persistent volume leverage your environment rather than the "anything"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment