-
Notifications
You must be signed in to change notification settings - Fork 0
/
deploy-heketi-configMap.yaml
234 lines (209 loc) · 6.4 KB
/
deploy-heketi-configMap.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
---
apiVersion: v1
kind: ConfigMap
metadata:
name: deploy-heketi
data:
deploy-heketi: |-
#!/bin/bash -e
set -x
mkdir -p /srv/asset/manifests/glusterfs
/hyperkube kubectl apply -f /var/heketi/manifests/heketi-storage.json
cp /var/heketi/manifests/heketi-storage.json /srv/asset/manifests/glusterfs/
cp /var/heketi/manifests/topology.json /srv/asset/manifests/glusterfs/
# delete all deploy-heketi resources
/hyperkube kubectl delete all,service,jobs,deployment,secret --selector="deploy-heketi"
rm -vf /srv/asset/manifests/glusterfs/deploy-heketi-deployment.yaml
/hyperkube kubectl apply -f /opt/bin/heketi-deployment.yaml
set +x
function create_dynamic_provision {
# using non-capturing groups
# posible to use dns?
heketiIP=`/hyperkube kubectl get svc heketi --no-headers -o yaml| grep -Po '(?<=clusterIP: ).*'`
[ -n ${heketiIP} ] && cat <<EOF | /hyperkube kubectl create -f -
---
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: default
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://$heketiIP:8080"
EOF
}
until create_dynamic_provision
do
echo "heketi service ip unable to find"
done
until /hyperkube kubectl create -f /opt/bin/pvc-test.yaml
do
/hyperkube kubectl delete -f /opt/bin/pvc-test.yaml
sleep 2
done
until /hyperkube kubectl get pvc pvc-test --no-headers | grep Bound
do
sleep 2
done
/hyperkube kubectl delete -f /opt/bin/pvc-test.yaml
pvc-test.yaml: |-
---
kind: "PersistentVolumeClaim"
apiVersion: "v1"
metadata:
name: "pvc-test"
annotations:
volume.beta.kubernetes.io/storage-class: "default"
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "1Gi"
heketi-deployment.yaml: |-
---
kind: Service
apiVersion: v1
metadata:
name: heketi
labels:
glusterfs: heketi-service
deploy-heketi: support
annotations:
description: Exposes Heketi Service
spec:
selector:
name: heketi
ports:
- name: heketi
port: 8080
targetPort: 8080
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: heketi
labels:
glusterfs: heketi-deployment
annotations:
description: Defines how to deploy Heketi
spec:
replicas: 1
template:
metadata:
name: heketi
labels:
name: heketi
glusterfs: heketi-pod
spec:
serviceAccountName: heketi-service-account
containers:
- image: heketi/heketi:dev
imagePullPolicy: IfNotPresent
name: heketi
env:
- name: HEKETI_EXECUTOR
value: kubernetes
- name: HEKETI_KUBE_USE_SECRET
value: "y"
- name: HEKETI_FSTAB
value: "/var/lib/heketi/fstab"
- name: HEKETI_SNAPSHOT_LIMIT
value: '14'
- name: HEKETI_KUBE_GLUSTER_DAEMONSET
value: "y"
ports:
- containerPort: 8080
volumeMounts:
- name: db
mountPath: "/var/lib/heketi"
readinessProbe:
timeoutSeconds: 3
initialDelaySeconds: 3
httpGet:
path: "/hello"
port: 8080
livenessProbe:
timeoutSeconds: 3
initialDelaySeconds: 30
httpGet:
path: "/hello"
port: 8080
volumes:
- name: db
glusterfs:
endpoints: heketi-storage-endpoints
path: heketidbstorage
---
apiVersion: v1
kind: ConfigMap
metadata:
name: heketi-topology
data:
provision: |-
#!/bin/bash
KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)
NODE_DEVICES="[ `echo $NODE_DEVICES_PATTERN | sed -e "s/ /','/g" -e "s/\(.*\)/'\1'/g"` ]"
function gluster_readiness {
curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/pods?labelSelector=glusterfs-node=pod > /tmp/gluster_pods.json 2>&1
python3 - <<EOF
import sys
import json
if __name__ == '__main__':
json_raw = json.loads(open('/tmp/gluster_pods.json').read())
pods = list((x for x in json_raw['items'] if next((c for c in x['status']['conditions'] if c['type'] == 'Ready' and c['status'] == 'True'), None) is not None))
sys.exit(int(len(pods) < 3))
EOF
}
until gluster_readiness
do
echo -ne "glusterfs needs 3 pods at least .."\\r
sleep 3
done
echo "glusterfs is ready"
function create_topology {
curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/nodes?labelSelector=storagenode=glusterfs > /tmp/nodes.json 2>&1
python3 - <<END
import sys
import json
import argparse
import os
raw = json.loads(open('/tmp/nodes.json','r').read())
def getAddrWithType(dic, t):
return next((x for x in dic['status']['addresses'] if x['type'] == t))['address']
if __name__ == '__main__':
devices = $NODE_DEVICES
topo = { 'clusters': [ { 'nodes': [] } ] }
for item in raw['items']:
ipv4 = getAddrWithType(item, 'LegacyHostIP')
hostname = getAddrWithType(item, 'Hostname')
node = {
'node': {
'hostnames': {
'manage' : [ ipv4 ] ,
'storage': [ hostname ]
},
'zone': 1
},
'devices': devices
}
topo['clusters'][0]['nodes'].append(node)
f = open('/topology.json', 'w')
f.write(json.dumps(topo))
f.close()
sys.exit(int(len(raw['items']) < 3))
END
}
until create_topology
do
echo "createing topology needs at least 3 nodes .."
done
echo "topology.json saved"
cp /topology.json /var/heketi/manifests/
heketi-cli topology load --json=/topology.json
sleep 6
result=`heketi-cli setup-openshift-heketi-storage 2>&1`
echo $result
if echo $result | grep -q "Error.*Volume.*heketidbstorage alreay exists"; then
exit 0
fi
cp -fv /heketi-storage.json /var/heketi/manifests/