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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +4 -0
  5. data/README.md +35 -0
  6. data/Rakefile +10 -0
  7. data/Vagrantfile +63 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/config/porkadot.yaml +25 -0
  11. data/config/unstable.yaml +49 -0
  12. data/exe/porkadot +5 -0
  13. data/lib/porkadot/assets/bootstrap/bootstrap/kube-proxy-bootstrap.yaml.erb +1 -0
  14. data/lib/porkadot/assets/bootstrap/bootstrap/kubeconfig-bootstrap.yaml.erb +18 -0
  15. data/lib/porkadot/assets/bootstrap/cleanup.sh.erb +12 -0
  16. data/lib/porkadot/assets/bootstrap/install.sh.erb +14 -0
  17. data/lib/porkadot/assets/bootstrap/manifests/kube-apiserver.bootstrap.yaml.erb +91 -0
  18. data/lib/porkadot/assets/bootstrap/manifests/kube-controller-manager.bootstrap.yaml.erb +69 -0
  19. data/lib/porkadot/assets/bootstrap/manifests/kube-proxy.bootstrap.yaml.erb +56 -0
  20. data/lib/porkadot/assets/bootstrap/manifests/kube-scheduler.bootstrap.yaml.erb +31 -0
  21. data/lib/porkadot/assets/bootstrap.rb +52 -0
  22. data/lib/porkadot/assets/certs/etcd.rb +21 -0
  23. data/lib/porkadot/assets/certs/front_proxy.rb +21 -0
  24. data/lib/porkadot/assets/certs/k8s.rb +90 -0
  25. data/lib/porkadot/assets/certs.rb +175 -0
  26. data/lib/porkadot/assets/etcd/etcd-server.yaml.erb +57 -0
  27. data/lib/porkadot/assets/etcd/install.sh.erb +12 -0
  28. data/lib/porkadot/assets/etcd.rb +109 -0
  29. data/lib/porkadot/assets/kubelet/bootstrap-kubelet.conf.erb +21 -0
  30. data/lib/porkadot/assets/kubelet/config.yaml.erb +36 -0
  31. data/lib/porkadot/assets/kubelet/install-deps.sh.erb +21 -0
  32. data/lib/porkadot/assets/kubelet/install-pkgs.sh.erb +33 -0
  33. data/lib/porkadot/assets/kubelet/install.sh.erb +35 -0
  34. data/lib/porkadot/assets/kubelet/kubelet.service.erb +22 -0
  35. data/lib/porkadot/assets/kubelet.rb +102 -0
  36. data/lib/porkadot/assets/kubernetes/install.sh.erb +7 -0
  37. data/lib/porkadot/assets/kubernetes/manifests/flannel.yaml.erb +602 -0
  38. data/lib/porkadot/assets/kubernetes/manifests/kube-apiserver.yaml.erb +129 -0
  39. data/lib/porkadot/assets/kubernetes/manifests/kube-controller-manager.yaml.erb +173 -0
  40. data/lib/porkadot/assets/kubernetes/manifests/kube-proxy.yaml.erb +132 -0
  41. data/lib/porkadot/assets/kubernetes/manifests/kube-scheduler.yaml.erb +162 -0
  42. data/lib/porkadot/assets/kubernetes/manifests/kubelet-rubber-stamp.yaml.erb +86 -0
  43. data/lib/porkadot/assets/kubernetes/manifests/kubelet.yaml.erb +40 -0
  44. data/lib/porkadot/assets/kubernetes/manifests/metallb.yaml.erb +323 -0
  45. data/lib/porkadot/assets/kubernetes/manifests/pod-checkpointer.yaml.erb +130 -0
  46. data/lib/porkadot/assets/kubernetes/manifests/porkadot.yaml.erb +69 -0
  47. data/lib/porkadot/assets/kubernetes.rb +39 -0
  48. data/lib/porkadot/assets.rb +24 -0
  49. data/lib/porkadot/cmd/cli.rb +45 -0
  50. data/lib/porkadot/cmd/install/bootstrap.rb +50 -0
  51. data/lib/porkadot/cmd/install.rb +36 -0
  52. data/lib/porkadot/cmd/render/certs.rb +68 -0
  53. data/lib/porkadot/cmd/render.rb +67 -0
  54. data/lib/porkadot/cmd.rb +4 -0
  55. data/lib/porkadot/config.rb +115 -0
  56. data/lib/porkadot/configs/bootstrap.rb +67 -0
  57. data/lib/porkadot/configs/certs/etcd.rb +33 -0
  58. data/lib/porkadot/configs/certs/front_proxy.rb +33 -0
  59. data/lib/porkadot/configs/certs/k8s.rb +89 -0
  60. data/lib/porkadot/configs/certs.rb +50 -0
  61. data/lib/porkadot/configs/cni.rb +22 -0
  62. data/lib/porkadot/configs/etcd.rb +95 -0
  63. data/lib/porkadot/configs/kubelet.rb +61 -0
  64. data/lib/porkadot/configs/kubernetes.rb +223 -0
  65. data/lib/porkadot/configs/loadbalancer.rb +26 -0
  66. data/lib/porkadot/const.rb +8 -0
  67. data/lib/porkadot/default.yaml +123 -0
  68. data/lib/porkadot/install/base.rb +5 -0
  69. data/lib/porkadot/install/bootstrap.rb +76 -0
  70. data/lib/porkadot/install/kubelet.rb +63 -0
  71. data/lib/porkadot/install/kubernetes.rb +33 -0
  72. data/lib/porkadot/utils/hash_recursive_merge.rb +73 -0
  73. data/lib/porkadot/utils.rb +25 -0
  74. data/lib/porkadot/version.rb +3 -0
  75. data/lib/porkadot.rb +41 -0
  76. data/porkadot.gemspec +42 -0
  77. 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