porkadot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/Vagrantfile +63 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/porkadot.yaml +25 -0
- data/config/unstable.yaml +49 -0
- data/exe/porkadot +5 -0
- data/lib/porkadot/assets/bootstrap/bootstrap/kube-proxy-bootstrap.yaml.erb +1 -0
- data/lib/porkadot/assets/bootstrap/bootstrap/kubeconfig-bootstrap.yaml.erb +18 -0
- data/lib/porkadot/assets/bootstrap/cleanup.sh.erb +12 -0
- data/lib/porkadot/assets/bootstrap/install.sh.erb +14 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-apiserver.bootstrap.yaml.erb +91 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-controller-manager.bootstrap.yaml.erb +69 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-proxy.bootstrap.yaml.erb +56 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-scheduler.bootstrap.yaml.erb +31 -0
- data/lib/porkadot/assets/bootstrap.rb +52 -0
- data/lib/porkadot/assets/certs/etcd.rb +21 -0
- data/lib/porkadot/assets/certs/front_proxy.rb +21 -0
- data/lib/porkadot/assets/certs/k8s.rb +90 -0
- data/lib/porkadot/assets/certs.rb +175 -0
- data/lib/porkadot/assets/etcd/etcd-server.yaml.erb +57 -0
- data/lib/porkadot/assets/etcd/install.sh.erb +12 -0
- data/lib/porkadot/assets/etcd.rb +109 -0
- data/lib/porkadot/assets/kubelet/bootstrap-kubelet.conf.erb +21 -0
- data/lib/porkadot/assets/kubelet/config.yaml.erb +36 -0
- data/lib/porkadot/assets/kubelet/install-deps.sh.erb +21 -0
- data/lib/porkadot/assets/kubelet/install-pkgs.sh.erb +33 -0
- data/lib/porkadot/assets/kubelet/install.sh.erb +35 -0
- data/lib/porkadot/assets/kubelet/kubelet.service.erb +22 -0
- data/lib/porkadot/assets/kubelet.rb +102 -0
- data/lib/porkadot/assets/kubernetes/install.sh.erb +7 -0
- data/lib/porkadot/assets/kubernetes/manifests/flannel.yaml.erb +602 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-apiserver.yaml.erb +129 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-controller-manager.yaml.erb +173 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-proxy.yaml.erb +132 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-scheduler.yaml.erb +162 -0
- data/lib/porkadot/assets/kubernetes/manifests/kubelet-rubber-stamp.yaml.erb +86 -0
- data/lib/porkadot/assets/kubernetes/manifests/kubelet.yaml.erb +40 -0
- data/lib/porkadot/assets/kubernetes/manifests/metallb.yaml.erb +323 -0
- data/lib/porkadot/assets/kubernetes/manifests/pod-checkpointer.yaml.erb +130 -0
- data/lib/porkadot/assets/kubernetes/manifests/porkadot.yaml.erb +69 -0
- data/lib/porkadot/assets/kubernetes.rb +39 -0
- data/lib/porkadot/assets.rb +24 -0
- data/lib/porkadot/cmd/cli.rb +45 -0
- data/lib/porkadot/cmd/install/bootstrap.rb +50 -0
- data/lib/porkadot/cmd/install.rb +36 -0
- data/lib/porkadot/cmd/render/certs.rb +68 -0
- data/lib/porkadot/cmd/render.rb +67 -0
- data/lib/porkadot/cmd.rb +4 -0
- data/lib/porkadot/config.rb +115 -0
- data/lib/porkadot/configs/bootstrap.rb +67 -0
- data/lib/porkadot/configs/certs/etcd.rb +33 -0
- data/lib/porkadot/configs/certs/front_proxy.rb +33 -0
- data/lib/porkadot/configs/certs/k8s.rb +89 -0
- data/lib/porkadot/configs/certs.rb +50 -0
- data/lib/porkadot/configs/cni.rb +22 -0
- data/lib/porkadot/configs/etcd.rb +95 -0
- data/lib/porkadot/configs/kubelet.rb +61 -0
- data/lib/porkadot/configs/kubernetes.rb +223 -0
- data/lib/porkadot/configs/loadbalancer.rb +26 -0
- data/lib/porkadot/const.rb +8 -0
- data/lib/porkadot/default.yaml +123 -0
- data/lib/porkadot/install/base.rb +5 -0
- data/lib/porkadot/install/bootstrap.rb +76 -0
- data/lib/porkadot/install/kubelet.rb +63 -0
- data/lib/porkadot/install/kubernetes.rb +33 -0
- data/lib/porkadot/utils/hash_recursive_merge.rb +73 -0
- data/lib/porkadot/utils.rb +25 -0
- data/lib/porkadot/version.rb +3 -0
- data/lib/porkadot.rb +41 -0
- data/porkadot.gemspec +42 -0
- metadata +205 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
kind: ClusterRoleBinding
|
3
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
4
|
+
metadata:
|
5
|
+
name: porkadot:node-bootstrapper
|
6
|
+
subjects:
|
7
|
+
- kind: Group
|
8
|
+
name: porkadot:node-bootstrappers
|
9
|
+
apiGroup: rbac.authorization.k8s.io
|
10
|
+
roleRef:
|
11
|
+
kind: ClusterRole
|
12
|
+
name: system:node-bootstrapper
|
13
|
+
apiGroup: rbac.authorization.k8s.io
|
14
|
+
---
|
15
|
+
kind: ClusterRoleBinding
|
16
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
17
|
+
metadata:
|
18
|
+
name: auto-approve-csrs-for-group
|
19
|
+
name: porkadot:node-autoapprove-bootstrap
|
20
|
+
subjects:
|
21
|
+
- kind: Group
|
22
|
+
name: porkadot:node-bootstrappers
|
23
|
+
apiGroup: rbac.authorization.k8s.io
|
24
|
+
roleRef:
|
25
|
+
kind: ClusterRole
|
26
|
+
name: system:certificates.k8s.io:certificatesigningrequests:nodeclient
|
27
|
+
apiGroup: rbac.authorization.k8s.io
|
28
|
+
---
|
29
|
+
kind: ClusterRoleBinding
|
30
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
31
|
+
metadata:
|
32
|
+
name: auto-approve-renewals-for-nodes
|
33
|
+
subjects:
|
34
|
+
- kind: Group
|
35
|
+
name: system:nodes
|
36
|
+
apiGroup: rbac.authorization.k8s.io
|
37
|
+
roleRef:
|
38
|
+
kind: ClusterRole
|
39
|
+
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
|
40
|
+
apiGroup: rbac.authorization.k8s.io
|
@@ -0,0 +1,323 @@
|
|
1
|
+
<% k8s = global_config.k8s -%>
|
2
|
+
apiVersion: v1
|
3
|
+
kind: Namespace
|
4
|
+
metadata:
|
5
|
+
labels:
|
6
|
+
app: metallb
|
7
|
+
name: metallb-system
|
8
|
+
---
|
9
|
+
apiVersion: policy/v1beta1
|
10
|
+
kind: PodSecurityPolicy
|
11
|
+
metadata:
|
12
|
+
labels:
|
13
|
+
app: metallb
|
14
|
+
name: speaker
|
15
|
+
namespace: metallb-system
|
16
|
+
spec:
|
17
|
+
allowPrivilegeEscalation: false
|
18
|
+
allowedCapabilities:
|
19
|
+
- NET_ADMIN
|
20
|
+
- NET_RAW
|
21
|
+
- SYS_ADMIN
|
22
|
+
fsGroup:
|
23
|
+
rule: RunAsAny
|
24
|
+
hostNetwork: true
|
25
|
+
hostPorts:
|
26
|
+
- max: 7472
|
27
|
+
min: 7472
|
28
|
+
privileged: true
|
29
|
+
runAsUser:
|
30
|
+
rule: RunAsAny
|
31
|
+
seLinux:
|
32
|
+
rule: RunAsAny
|
33
|
+
supplementalGroups:
|
34
|
+
rule: RunAsAny
|
35
|
+
volumes:
|
36
|
+
- '*'
|
37
|
+
---
|
38
|
+
apiVersion: v1
|
39
|
+
kind: ServiceAccount
|
40
|
+
metadata:
|
41
|
+
labels:
|
42
|
+
app: metallb
|
43
|
+
name: controller
|
44
|
+
namespace: metallb-system
|
45
|
+
---
|
46
|
+
apiVersion: v1
|
47
|
+
kind: ServiceAccount
|
48
|
+
metadata:
|
49
|
+
labels:
|
50
|
+
app: metallb
|
51
|
+
name: speaker
|
52
|
+
namespace: metallb-system
|
53
|
+
---
|
54
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
55
|
+
kind: ClusterRole
|
56
|
+
metadata:
|
57
|
+
labels:
|
58
|
+
app: metallb
|
59
|
+
name: metallb-system:controller
|
60
|
+
rules:
|
61
|
+
- apiGroups:
|
62
|
+
- ''
|
63
|
+
resources:
|
64
|
+
- services
|
65
|
+
verbs:
|
66
|
+
- get
|
67
|
+
- list
|
68
|
+
- watch
|
69
|
+
- update
|
70
|
+
- apiGroups:
|
71
|
+
- ''
|
72
|
+
resources:
|
73
|
+
- services/status
|
74
|
+
verbs:
|
75
|
+
- update
|
76
|
+
- apiGroups:
|
77
|
+
- ''
|
78
|
+
resources:
|
79
|
+
- events
|
80
|
+
verbs:
|
81
|
+
- create
|
82
|
+
- patch
|
83
|
+
---
|
84
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
85
|
+
kind: ClusterRole
|
86
|
+
metadata:
|
87
|
+
labels:
|
88
|
+
app: metallb
|
89
|
+
name: metallb-system:speaker
|
90
|
+
rules:
|
91
|
+
- apiGroups:
|
92
|
+
- ''
|
93
|
+
resources:
|
94
|
+
- services
|
95
|
+
- endpoints
|
96
|
+
- nodes
|
97
|
+
verbs:
|
98
|
+
- get
|
99
|
+
- list
|
100
|
+
- watch
|
101
|
+
- apiGroups:
|
102
|
+
- ''
|
103
|
+
resources:
|
104
|
+
- events
|
105
|
+
verbs:
|
106
|
+
- create
|
107
|
+
- patch
|
108
|
+
- apiGroups:
|
109
|
+
- extensions
|
110
|
+
resourceNames:
|
111
|
+
- speaker
|
112
|
+
resources:
|
113
|
+
- podsecuritypolicies
|
114
|
+
verbs:
|
115
|
+
- use
|
116
|
+
---
|
117
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
118
|
+
kind: Role
|
119
|
+
metadata:
|
120
|
+
labels:
|
121
|
+
app: metallb
|
122
|
+
name: config-watcher
|
123
|
+
namespace: metallb-system
|
124
|
+
rules:
|
125
|
+
- apiGroups:
|
126
|
+
- ''
|
127
|
+
resources:
|
128
|
+
- configmaps
|
129
|
+
verbs:
|
130
|
+
- get
|
131
|
+
- list
|
132
|
+
- watch
|
133
|
+
---
|
134
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
135
|
+
kind: ClusterRoleBinding
|
136
|
+
metadata:
|
137
|
+
labels:
|
138
|
+
app: metallb
|
139
|
+
name: metallb-system:controller
|
140
|
+
roleRef:
|
141
|
+
apiGroup: rbac.authorization.k8s.io
|
142
|
+
kind: ClusterRole
|
143
|
+
name: metallb-system:controller
|
144
|
+
subjects:
|
145
|
+
- kind: ServiceAccount
|
146
|
+
name: controller
|
147
|
+
namespace: metallb-system
|
148
|
+
---
|
149
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
150
|
+
kind: ClusterRoleBinding
|
151
|
+
metadata:
|
152
|
+
labels:
|
153
|
+
app: metallb
|
154
|
+
name: metallb-system:speaker
|
155
|
+
roleRef:
|
156
|
+
apiGroup: rbac.authorization.k8s.io
|
157
|
+
kind: ClusterRole
|
158
|
+
name: metallb-system:speaker
|
159
|
+
subjects:
|
160
|
+
- kind: ServiceAccount
|
161
|
+
name: speaker
|
162
|
+
namespace: metallb-system
|
163
|
+
---
|
164
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
165
|
+
kind: RoleBinding
|
166
|
+
metadata:
|
167
|
+
labels:
|
168
|
+
app: metallb
|
169
|
+
name: config-watcher
|
170
|
+
namespace: metallb-system
|
171
|
+
roleRef:
|
172
|
+
apiGroup: rbac.authorization.k8s.io
|
173
|
+
kind: Role
|
174
|
+
name: config-watcher
|
175
|
+
subjects:
|
176
|
+
- kind: ServiceAccount
|
177
|
+
name: controller
|
178
|
+
- kind: ServiceAccount
|
179
|
+
name: speaker
|
180
|
+
---
|
181
|
+
apiVersion: apps/v1
|
182
|
+
kind: DaemonSet
|
183
|
+
metadata:
|
184
|
+
labels:
|
185
|
+
app: metallb
|
186
|
+
component: speaker
|
187
|
+
name: speaker
|
188
|
+
namespace: metallb-system
|
189
|
+
spec:
|
190
|
+
selector:
|
191
|
+
matchLabels:
|
192
|
+
app: metallb
|
193
|
+
component: speaker
|
194
|
+
template:
|
195
|
+
metadata:
|
196
|
+
annotations:
|
197
|
+
prometheus.io/port: '7472'
|
198
|
+
prometheus.io/scrape: 'true'
|
199
|
+
labels:
|
200
|
+
app: metallb
|
201
|
+
component: speaker
|
202
|
+
spec:
|
203
|
+
initContainers:
|
204
|
+
- command:
|
205
|
+
- "iptables"
|
206
|
+
- "-P"
|
207
|
+
- "FORWARD"
|
208
|
+
- "ACCEPT"
|
209
|
+
image: <%= k8s.image_repository %>/hyperkube:<%= k8s.kubernetes_version %>
|
210
|
+
imagePullPolicy: IfNotPresent
|
211
|
+
name: default-iptables
|
212
|
+
securityContext:
|
213
|
+
allowPrivilegeEscalation: false
|
214
|
+
capabilities:
|
215
|
+
add:
|
216
|
+
- NET_ADMIN
|
217
|
+
- NET_RAW
|
218
|
+
drop:
|
219
|
+
- ALL
|
220
|
+
readOnlyRootFilesystem: true
|
221
|
+
containers:
|
222
|
+
- args:
|
223
|
+
- --port=7472
|
224
|
+
- --config=config
|
225
|
+
env:
|
226
|
+
- name: METALLB_NODE_NAME
|
227
|
+
valueFrom:
|
228
|
+
fieldRef:
|
229
|
+
fieldPath: spec.nodeName
|
230
|
+
- name: METALLB_HOST
|
231
|
+
valueFrom:
|
232
|
+
fieldRef:
|
233
|
+
fieldPath: status.hostIP
|
234
|
+
image: metallb/speaker:v0.8.2
|
235
|
+
imagePullPolicy: IfNotPresent
|
236
|
+
name: speaker
|
237
|
+
ports:
|
238
|
+
- containerPort: 7472
|
239
|
+
name: monitoring
|
240
|
+
resources:
|
241
|
+
limits:
|
242
|
+
cpu: 100m
|
243
|
+
memory: 100Mi
|
244
|
+
securityContext:
|
245
|
+
allowPrivilegeEscalation: false
|
246
|
+
capabilities:
|
247
|
+
add:
|
248
|
+
- NET_ADMIN
|
249
|
+
- NET_RAW
|
250
|
+
- SYS_ADMIN
|
251
|
+
drop:
|
252
|
+
- ALL
|
253
|
+
readOnlyRootFilesystem: true
|
254
|
+
hostNetwork: true
|
255
|
+
nodeSelector:
|
256
|
+
beta.kubernetes.io/os: linux
|
257
|
+
serviceAccountName: speaker
|
258
|
+
terminationGracePeriodSeconds: 0
|
259
|
+
tolerations:
|
260
|
+
- effect: NoSchedule
|
261
|
+
key: node-role.kubernetes.io/master
|
262
|
+
---
|
263
|
+
apiVersion: apps/v1
|
264
|
+
kind: Deployment
|
265
|
+
metadata:
|
266
|
+
labels:
|
267
|
+
app: metallb
|
268
|
+
component: controller
|
269
|
+
name: controller
|
270
|
+
namespace: metallb-system
|
271
|
+
spec:
|
272
|
+
revisionHistoryLimit: 3
|
273
|
+
selector:
|
274
|
+
matchLabels:
|
275
|
+
app: metallb
|
276
|
+
component: controller
|
277
|
+
template:
|
278
|
+
metadata:
|
279
|
+
annotations:
|
280
|
+
prometheus.io/port: '7472'
|
281
|
+
prometheus.io/scrape: 'true'
|
282
|
+
labels:
|
283
|
+
app: metallb
|
284
|
+
component: controller
|
285
|
+
spec:
|
286
|
+
containers:
|
287
|
+
- args:
|
288
|
+
- --port=7472
|
289
|
+
- --config=config
|
290
|
+
image: metallb/controller:v0.8.2
|
291
|
+
imagePullPolicy: IfNotPresent
|
292
|
+
name: controller
|
293
|
+
ports:
|
294
|
+
- containerPort: 7472
|
295
|
+
name: monitoring
|
296
|
+
resources:
|
297
|
+
limits:
|
298
|
+
cpu: 100m
|
299
|
+
memory: 100Mi
|
300
|
+
securityContext:
|
301
|
+
allowPrivilegeEscalation: false
|
302
|
+
capabilities:
|
303
|
+
drop:
|
304
|
+
- all
|
305
|
+
readOnlyRootFilesystem: true
|
306
|
+
nodeSelector:
|
307
|
+
beta.kubernetes.io/os: linux
|
308
|
+
securityContext:
|
309
|
+
runAsNonRoot: true
|
310
|
+
runAsUser: 65534
|
311
|
+
serviceAccountName: controller
|
312
|
+
terminationGracePeriodSeconds: 0
|
313
|
+
---
|
314
|
+
apiVersion: v1
|
315
|
+
kind: ConfigMap
|
316
|
+
metadata:
|
317
|
+
labels:
|
318
|
+
app: metallb
|
319
|
+
name: config
|
320
|
+
namespace: metallb-system
|
321
|
+
data:
|
322
|
+
config: |
|
323
|
+
<%= u.indent(global_config.lb.lb_config, 4) %>
|
@@ -0,0 +1,130 @@
|
|
1
|
+
<% k8s = global_config.k8s -%>
|
2
|
+
---
|
3
|
+
apiVersion: v1
|
4
|
+
kind: ServiceAccount
|
5
|
+
metadata:
|
6
|
+
name: pod-checkpointer
|
7
|
+
namespace: kube-system
|
8
|
+
---
|
9
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
10
|
+
kind: Role
|
11
|
+
metadata:
|
12
|
+
name: pod-checkpointer
|
13
|
+
namespace: kube-system
|
14
|
+
rules:
|
15
|
+
- apiGroups: [""] # "" indicates the core API group
|
16
|
+
resources: ["pods"]
|
17
|
+
verbs: ["get", "watch", "list"]
|
18
|
+
- apiGroups: [""] # "" indicates the core API group
|
19
|
+
resources: ["secrets", "configmaps"]
|
20
|
+
verbs: ["get"]
|
21
|
+
---
|
22
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
23
|
+
kind: RoleBinding
|
24
|
+
metadata:
|
25
|
+
name: pod-checkpointer
|
26
|
+
namespace: kube-system
|
27
|
+
roleRef:
|
28
|
+
apiGroup: rbac.authorization.k8s.io
|
29
|
+
kind: Role
|
30
|
+
name: pod-checkpointer
|
31
|
+
subjects:
|
32
|
+
- kind: ServiceAccount
|
33
|
+
name: pod-checkpointer
|
34
|
+
namespace: kube-system
|
35
|
+
---
|
36
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
37
|
+
kind: ClusterRole
|
38
|
+
metadata:
|
39
|
+
name: pod-checkpointer
|
40
|
+
rules:
|
41
|
+
- apiGroups: [""]
|
42
|
+
resources: ["nodes", "nodes/proxy"]
|
43
|
+
verbs: ["get"]
|
44
|
+
---
|
45
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
46
|
+
kind: ClusterRoleBinding
|
47
|
+
metadata:
|
48
|
+
name: pod-checkpointer
|
49
|
+
roleRef:
|
50
|
+
apiGroup: rbac.authorization.k8s.io
|
51
|
+
kind: ClusterRole
|
52
|
+
name: pod-checkpointer
|
53
|
+
subjects:
|
54
|
+
- kind: ServiceAccount
|
55
|
+
name: pod-checkpointer
|
56
|
+
namespace: kube-system
|
57
|
+
---
|
58
|
+
apiVersion: apps/v1
|
59
|
+
kind: DaemonSet
|
60
|
+
metadata:
|
61
|
+
name: pod-checkpointer
|
62
|
+
namespace: kube-system
|
63
|
+
labels:
|
64
|
+
tier: control-plane
|
65
|
+
k8s-app: pod-checkpointer
|
66
|
+
spec:
|
67
|
+
selector:
|
68
|
+
matchLabels:
|
69
|
+
tier: control-plane
|
70
|
+
k8s-app: pod-checkpointer
|
71
|
+
template:
|
72
|
+
metadata:
|
73
|
+
labels:
|
74
|
+
tier: control-plane
|
75
|
+
k8s-app: pod-checkpointer
|
76
|
+
annotations:
|
77
|
+
checkpointer.alpha.coreos.com/checkpoint: "true"
|
78
|
+
spec:
|
79
|
+
containers:
|
80
|
+
- name: pod-checkpointer
|
81
|
+
image: quay.io/coreos/pod-checkpointer:83e25e5968391b9eb342042c435d1b3eeddb2be1
|
82
|
+
command:
|
83
|
+
- /checkpoint
|
84
|
+
- --lock-file=/var/run/lock/pod-checkpointer.lock
|
85
|
+
- --kubeconfig=/etc/checkpointer/kubeconfig
|
86
|
+
- --checkpoint-grace-period=5m
|
87
|
+
env:
|
88
|
+
- name: NODE_NAME
|
89
|
+
valueFrom:
|
90
|
+
fieldRef:
|
91
|
+
fieldPath: spec.nodeName
|
92
|
+
- name: POD_NAME
|
93
|
+
valueFrom:
|
94
|
+
fieldRef:
|
95
|
+
fieldPath: metadata.name
|
96
|
+
- name: POD_NAMESPACE
|
97
|
+
valueFrom:
|
98
|
+
fieldRef:
|
99
|
+
fieldPath: metadata.namespace
|
100
|
+
imagePullPolicy: Always
|
101
|
+
volumeMounts:
|
102
|
+
- mountPath: /etc/checkpointer
|
103
|
+
name: kubeconfig
|
104
|
+
- mountPath: /etc/kubernetes
|
105
|
+
name: etc-kubernetes
|
106
|
+
- mountPath: /var/run
|
107
|
+
name: var-run
|
108
|
+
serviceAccountName: pod-checkpointer
|
109
|
+
hostNetwork: true
|
110
|
+
nodeSelector:
|
111
|
+
k8s.unstable.cloud/master: ""
|
112
|
+
restartPolicy: Always
|
113
|
+
tolerations:
|
114
|
+
- key: node-role.kubernetes.io/master
|
115
|
+
operator: Exists
|
116
|
+
effect: NoSchedule
|
117
|
+
volumes:
|
118
|
+
- name: kubeconfig
|
119
|
+
configMap:
|
120
|
+
name: kubeconfig-in-cluster
|
121
|
+
- name: etc-kubernetes
|
122
|
+
hostPath:
|
123
|
+
path: /etc/kubernetes
|
124
|
+
- name: var-run
|
125
|
+
hostPath:
|
126
|
+
path: /var/run
|
127
|
+
updateStrategy:
|
128
|
+
rollingUpdate:
|
129
|
+
maxUnavailable: 1
|
130
|
+
type: RollingUpdate
|
@@ -0,0 +1,69 @@
|
|
1
|
+
<% k8s = global_config.k8s -%>
|
2
|
+
---
|
3
|
+
apiVersion: v1
|
4
|
+
kind: Service
|
5
|
+
metadata:
|
6
|
+
annotations:
|
7
|
+
labels:
|
8
|
+
provider: porkadot
|
9
|
+
name: porkadot-kubernetes
|
10
|
+
namespace: kube-system
|
11
|
+
spec:
|
12
|
+
selector:
|
13
|
+
app.kubernetes.io/component: kube-apiserver
|
14
|
+
app.kubernetes.io/managed-by: porkadot
|
15
|
+
<%- host, port = global_config.k8s.control_plane_endpoint_host_and_port -%>
|
16
|
+
loadBalancerIP: <%= host %>
|
17
|
+
ports:
|
18
|
+
- name: https
|
19
|
+
port: <%= port %>
|
20
|
+
protocol: TCP
|
21
|
+
targetPort: <%= global_config.k8s.apiserver.bind_port %>
|
22
|
+
sessionAffinity: None
|
23
|
+
type: LoadBalancer
|
24
|
+
---
|
25
|
+
apiVersion: v1
|
26
|
+
kind: Service
|
27
|
+
metadata:
|
28
|
+
annotations:
|
29
|
+
labels:
|
30
|
+
provider: porkadot
|
31
|
+
name: porkadot-kubernetes-latest
|
32
|
+
namespace: kube-system
|
33
|
+
spec:
|
34
|
+
selector:
|
35
|
+
<%- k8s.apiserver.labels.each do |k, v| -%>
|
36
|
+
<%= k.to_s %>: <%= v %>
|
37
|
+
<%- end -%>
|
38
|
+
<%- _, port = global_config.k8s.control_plane_endpoint_host_and_port -%>
|
39
|
+
loadBalancerIP: <%= host %>
|
40
|
+
ports:
|
41
|
+
- name: https
|
42
|
+
port: <%= port %>
|
43
|
+
protocol: TCP
|
44
|
+
targetPort: <%= global_config.k8s.apiserver.bind_port %>
|
45
|
+
sessionAffinity: None
|
46
|
+
type: ClusterIP
|
47
|
+
---
|
48
|
+
apiVersion: v1
|
49
|
+
kind: ConfigMap
|
50
|
+
metadata:
|
51
|
+
name: kubeconfig-in-cluster
|
52
|
+
namespace: kube-system
|
53
|
+
data:
|
54
|
+
kubeconfig: |
|
55
|
+
apiVersion: v1
|
56
|
+
clusters:
|
57
|
+
- name: local
|
58
|
+
cluster:
|
59
|
+
server: https://<%= k8s.control_plane_endpoint %>
|
60
|
+
certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
61
|
+
users:
|
62
|
+
- name: service-account
|
63
|
+
user:
|
64
|
+
# Use service account token
|
65
|
+
tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
|
66
|
+
contexts:
|
67
|
+
- context:
|
68
|
+
cluster: local
|
69
|
+
user: service-account
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Porkadot; module Assets
|
5
|
+
class Kubernetes
|
6
|
+
include Porkadot::Assets
|
7
|
+
TEMPLATE_DIR = File.join(File.dirname(__FILE__), "kubernetes")
|
8
|
+
attr_reader :global_config
|
9
|
+
attr_reader :config
|
10
|
+
attr_reader :logger
|
11
|
+
|
12
|
+
def initialize global_config
|
13
|
+
@global_config = global_config
|
14
|
+
@config = global_config.kubernetes
|
15
|
+
@logger = global_config.logger
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
logger.info "--> Rendering kubernetes manifests"
|
20
|
+
unless File.directory?(config.manifests_path)
|
21
|
+
FileUtils.mkdir_p(config.manifests_path)
|
22
|
+
end
|
23
|
+
lb = global_config.lb
|
24
|
+
cni = global_config.cni
|
25
|
+
render_erb 'manifests/porkadot.yaml'
|
26
|
+
render_erb 'manifests/kubelet.yaml'
|
27
|
+
render_erb "manifests/#{lb.type}.yaml"
|
28
|
+
render_erb "manifests/#{cni.type}.yaml"
|
29
|
+
render_erb "manifests/kube-apiserver.yaml"
|
30
|
+
render_erb "manifests/kube-proxy.yaml"
|
31
|
+
render_erb "manifests/kube-scheduler.yaml"
|
32
|
+
render_erb "manifests/kube-controller-manager.yaml"
|
33
|
+
render_erb "manifests/pod-checkpointer.yaml"
|
34
|
+
render_erb "manifests/kubelet-rubber-stamp.yaml"
|
35
|
+
render_erb 'install.sh'
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end; end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Porkadot::Assets
|
2
|
+
class ErbUtils
|
3
|
+
def indent(text, space=2)
|
4
|
+
space = space.times.map{' '}.join('')
|
5
|
+
text.lines.map{|line| "#{space}#{line}"}.join('')
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def render_erb file, opts={}
|
10
|
+
file = file.to_s
|
11
|
+
opts[:config] = self.config
|
12
|
+
opts[:global_config] = self.global_config
|
13
|
+
opts[:certs] = Porkadot::Assets::Certs.new(self.global_config)
|
14
|
+
opts[:u] = ErbUtils.new
|
15
|
+
|
16
|
+
logger.info "----> #{file}"
|
17
|
+
open(File.join(self.class::TEMPLATE_DIR, "#{file}.erb")) do |io|
|
18
|
+
open(config.asset_path(file), 'w') do |out|
|
19
|
+
out.write ERB.new(io.read, trim_mode: '-').result_with_hash(opts)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Cmd
|
3
|
+
class Cli < Thor
|
4
|
+
include Porkadot::Utils
|
5
|
+
|
6
|
+
class_option :config, type: :string,
|
7
|
+
default: './porkadot.yaml',
|
8
|
+
desc: 'Path to porkadot config file'
|
9
|
+
|
10
|
+
desc "render", "Render assets to deploy Kubernetes"
|
11
|
+
subcommand "render", Porkadot::Cmd::Render::Cli
|
12
|
+
|
13
|
+
desc "install", "Install kubernetes"
|
14
|
+
subcommand "install", Porkadot::Cmd::Install::Cli
|
15
|
+
|
16
|
+
desc "set-config", "Set cluster to kubeconfig"
|
17
|
+
def set_config
|
18
|
+
name = config.k8s.cluster_name
|
19
|
+
certs = Porkadot::Assets::Certs.new(config)
|
20
|
+
`kubectl config set-cluster #{name} \
|
21
|
+
--server=https://#{config.k8s.control_plane_endpoint}`
|
22
|
+
`kubectl config set \
|
23
|
+
clusters.#{name}.certificate-authority-data \
|
24
|
+
"#{certs.kubernetes.to_base64(:ca_cert)}"`
|
25
|
+
`kubectl config set-credentials #{name}-admin`
|
26
|
+
`kubectl config set \
|
27
|
+
users.#{name}-admin.client-certificate-data \
|
28
|
+
"#{certs.kubernetes.to_base64(:client_cert)}"`
|
29
|
+
`kubectl config set \
|
30
|
+
users.#{name}-admin.client-key-data \
|
31
|
+
"#{certs.kubernetes.to_base64(:client_key)}"`
|
32
|
+
`kubectl config set-context #{name} \
|
33
|
+
--cluster=#{name} \
|
34
|
+
--user=#{name}-admin`
|
35
|
+
`kubectl config use-context #{name}`
|
36
|
+
end
|
37
|
+
|
38
|
+
default_task :all
|
39
|
+
desc "all", "Render and install Kubernetes cluster"
|
40
|
+
def all
|
41
|
+
invoke :render, [], options
|
42
|
+
invoke :install, [], options
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end; end
|