porkadot 0.22.2 → 0.23.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89c9072a82772720ff6d492d2dcaf475ef31460bc108886be716b1b7b0e0a3d7
4
- data.tar.gz: edcc58e0f9e5a616020caa2348a46ecb06e796930fb565efcc6dfad25244d69b
3
+ metadata.gz: 8e2a062cd96fa6e9c56b2fd70f7d0dd4709265e1b5cf58057048cc19bf46868e
4
+ data.tar.gz: 4a18c93e458b1a822fe35b73d7af0b12804d4d4c174cbb8a3efc0daf30bbbc1e
5
5
  SHA512:
6
- metadata.gz: aa12a3f43721a233b17f46708cced2989430da72ccd3e90be46c72b4d2d01b675372f07f609050d0c49cb966d600c40b2eb209a591715e62c411d148a9ace680
7
- data.tar.gz: 2cacb639c73ecb17300b48ba50e923a15a02f95b619fec2c05d3c3ae50eef7f9b5ae5a62fc784c4957bcf8a04850384d1bca7ba6c623101d812d669cd8939423
6
+ metadata.gz: fef441fe9dc698fa5e993ae9b7d5a4e6270590aa2f8fcdbb3bca4601266faed8d6b5c96f545d3347716915bdbe0f78ebc1898caef201c1be50cc006955dec44d
7
+ data.tar.gz: a7bfadba85de2c3d631ebab8f74c4afaa75fcfdabeccbae6d20d4f23e2817185efc7d4174d4e901e19da8dbabcf4bdf522e12706dbc025113e6b0480d9b32826
@@ -1,3 +1,5 @@
1
+ namespace: metallb-system
2
+
1
3
  resources:
2
4
  - 000-metallb.yaml
3
5
  - metallb.config.yaml
@@ -0,0 +1,480 @@
1
+ apiVersion: policy/v1beta1
2
+ kind: PodSecurityPolicy
3
+ metadata:
4
+ labels:
5
+ app: metallb
6
+ name: controller
7
+ spec:
8
+ allowPrivilegeEscalation: false
9
+ allowedCapabilities: []
10
+ allowedHostPaths: []
11
+ defaultAddCapabilities: []
12
+ defaultAllowPrivilegeEscalation: false
13
+ fsGroup:
14
+ ranges:
15
+ - max: 65535
16
+ min: 1
17
+ rule: MustRunAs
18
+ hostIPC: false
19
+ hostNetwork: false
20
+ hostPID: false
21
+ privileged: false
22
+ readOnlyRootFilesystem: true
23
+ requiredDropCapabilities:
24
+ - ALL
25
+ runAsUser:
26
+ ranges:
27
+ - max: 65535
28
+ min: 1
29
+ rule: MustRunAs
30
+ seLinux:
31
+ rule: RunAsAny
32
+ supplementalGroups:
33
+ ranges:
34
+ - max: 65535
35
+ min: 1
36
+ rule: MustRunAs
37
+ volumes:
38
+ - configMap
39
+ - secret
40
+ - emptyDir
41
+ ---
42
+ apiVersion: policy/v1beta1
43
+ kind: PodSecurityPolicy
44
+ metadata:
45
+ labels:
46
+ app: metallb
47
+ name: speaker
48
+ spec:
49
+ allowPrivilegeEscalation: false
50
+ allowedCapabilities:
51
+ - NET_RAW
52
+ allowedHostPaths: []
53
+ defaultAddCapabilities: []
54
+ defaultAllowPrivilegeEscalation: false
55
+ fsGroup:
56
+ rule: RunAsAny
57
+ hostIPC: false
58
+ hostNetwork: true
59
+ hostPID: false
60
+ hostPorts:
61
+ - max: 7472
62
+ min: 7472
63
+ - max: 7946
64
+ min: 7946
65
+ privileged: true
66
+ readOnlyRootFilesystem: true
67
+ requiredDropCapabilities:
68
+ - ALL
69
+ runAsUser:
70
+ rule: RunAsAny
71
+ seLinux:
72
+ rule: RunAsAny
73
+ supplementalGroups:
74
+ rule: RunAsAny
75
+ volumes:
76
+ - configMap
77
+ - secret
78
+ - emptyDir
79
+ ---
80
+ apiVersion: v1
81
+ kind: ServiceAccount
82
+ metadata:
83
+ labels:
84
+ app: metallb
85
+ name: controller
86
+ namespace: metallb-system
87
+ ---
88
+ apiVersion: v1
89
+ kind: ServiceAccount
90
+ metadata:
91
+ labels:
92
+ app: metallb
93
+ name: speaker
94
+ namespace: metallb-system
95
+ ---
96
+ apiVersion: rbac.authorization.k8s.io/v1
97
+ kind: ClusterRole
98
+ metadata:
99
+ labels:
100
+ app: metallb
101
+ name: metallb-system:controller
102
+ rules:
103
+ - apiGroups:
104
+ - ''
105
+ resources:
106
+ - services
107
+ verbs:
108
+ - get
109
+ - list
110
+ - watch
111
+ - apiGroups:
112
+ - ''
113
+ resources:
114
+ - services/status
115
+ verbs:
116
+ - update
117
+ - apiGroups:
118
+ - ''
119
+ resources:
120
+ - events
121
+ verbs:
122
+ - create
123
+ - patch
124
+ - apiGroups:
125
+ - policy
126
+ resourceNames:
127
+ - controller
128
+ resources:
129
+ - podsecuritypolicies
130
+ verbs:
131
+ - use
132
+ ---
133
+ apiVersion: rbac.authorization.k8s.io/v1
134
+ kind: ClusterRole
135
+ metadata:
136
+ labels:
137
+ app: metallb
138
+ name: metallb-system:speaker
139
+ rules:
140
+ - apiGroups:
141
+ - ''
142
+ resources:
143
+ - services
144
+ - endpoints
145
+ - nodes
146
+ verbs:
147
+ - get
148
+ - list
149
+ - watch
150
+ - apiGroups: ["discovery.k8s.io"]
151
+ resources:
152
+ - endpointslices
153
+ verbs:
154
+ - get
155
+ - list
156
+ - watch
157
+ - apiGroups:
158
+ - ''
159
+ resources:
160
+ - events
161
+ verbs:
162
+ - create
163
+ - patch
164
+ - apiGroups:
165
+ - policy
166
+ resourceNames:
167
+ - speaker
168
+ resources:
169
+ - podsecuritypolicies
170
+ verbs:
171
+ - use
172
+ ---
173
+ apiVersion: rbac.authorization.k8s.io/v1
174
+ kind: Role
175
+ metadata:
176
+ labels:
177
+ app: metallb
178
+ name: config-watcher
179
+ namespace: metallb-system
180
+ rules:
181
+ - apiGroups:
182
+ - ''
183
+ resources:
184
+ - configmaps
185
+ verbs:
186
+ - get
187
+ - list
188
+ - watch
189
+ ---
190
+ apiVersion: rbac.authorization.k8s.io/v1
191
+ kind: Role
192
+ metadata:
193
+ labels:
194
+ app: metallb
195
+ name: pod-lister
196
+ namespace: metallb-system
197
+ rules:
198
+ - apiGroups:
199
+ - ''
200
+ resources:
201
+ - pods
202
+ verbs:
203
+ - list
204
+ ---
205
+ apiVersion: rbac.authorization.k8s.io/v1
206
+ kind: Role
207
+ metadata:
208
+ labels:
209
+ app: metallb
210
+ name: controller
211
+ namespace: metallb-system
212
+ rules:
213
+ - apiGroups:
214
+ - ''
215
+ resources:
216
+ - secrets
217
+ verbs:
218
+ - create
219
+ - apiGroups:
220
+ - ''
221
+ resources:
222
+ - secrets
223
+ resourceNames:
224
+ - memberlist
225
+ verbs:
226
+ - list
227
+ - apiGroups:
228
+ - apps
229
+ resources:
230
+ - deployments
231
+ resourceNames:
232
+ - controller
233
+ verbs:
234
+ - get
235
+ ---
236
+ apiVersion: rbac.authorization.k8s.io/v1
237
+ kind: ClusterRoleBinding
238
+ metadata:
239
+ labels:
240
+ app: metallb
241
+ name: metallb-system:controller
242
+ roleRef:
243
+ apiGroup: rbac.authorization.k8s.io
244
+ kind: ClusterRole
245
+ name: metallb-system:controller
246
+ subjects:
247
+ - kind: ServiceAccount
248
+ name: controller
249
+ namespace: metallb-system
250
+ ---
251
+ apiVersion: rbac.authorization.k8s.io/v1
252
+ kind: ClusterRoleBinding
253
+ metadata:
254
+ labels:
255
+ app: metallb
256
+ name: metallb-system:speaker
257
+ roleRef:
258
+ apiGroup: rbac.authorization.k8s.io
259
+ kind: ClusterRole
260
+ name: metallb-system:speaker
261
+ subjects:
262
+ - kind: ServiceAccount
263
+ name: speaker
264
+ namespace: metallb-system
265
+ ---
266
+ apiVersion: rbac.authorization.k8s.io/v1
267
+ kind: RoleBinding
268
+ metadata:
269
+ labels:
270
+ app: metallb
271
+ name: config-watcher
272
+ namespace: metallb-system
273
+ roleRef:
274
+ apiGroup: rbac.authorization.k8s.io
275
+ kind: Role
276
+ name: config-watcher
277
+ subjects:
278
+ - kind: ServiceAccount
279
+ name: controller
280
+ - kind: ServiceAccount
281
+ name: speaker
282
+ ---
283
+ apiVersion: rbac.authorization.k8s.io/v1
284
+ kind: RoleBinding
285
+ metadata:
286
+ labels:
287
+ app: metallb
288
+ name: pod-lister
289
+ namespace: metallb-system
290
+ roleRef:
291
+ apiGroup: rbac.authorization.k8s.io
292
+ kind: Role
293
+ name: pod-lister
294
+ subjects:
295
+ - kind: ServiceAccount
296
+ name: speaker
297
+ ---
298
+ apiVersion: rbac.authorization.k8s.io/v1
299
+ kind: RoleBinding
300
+ metadata:
301
+ labels:
302
+ app: metallb
303
+ name: controller
304
+ namespace: metallb-system
305
+ roleRef:
306
+ apiGroup: rbac.authorization.k8s.io
307
+ kind: Role
308
+ name: controller
309
+ subjects:
310
+ - kind: ServiceAccount
311
+ name: controller
312
+ ---
313
+ apiVersion: apps/v1
314
+ kind: DaemonSet
315
+ metadata:
316
+ labels:
317
+ app: metallb
318
+ component: speaker
319
+ name: speaker
320
+ namespace: metallb-system
321
+ spec:
322
+ selector:
323
+ matchLabels:
324
+ app: metallb
325
+ component: speaker
326
+ template:
327
+ metadata:
328
+ annotations:
329
+ prometheus.io/port: '7472'
330
+ prometheus.io/scrape: 'true'
331
+ labels:
332
+ app: metallb
333
+ component: speaker
334
+ spec:
335
+ containers:
336
+ - args:
337
+ - --port=7472
338
+ - --config=config
339
+ - --log-level=info
340
+ env:
341
+ - name: METALLB_NODE_NAME
342
+ valueFrom:
343
+ fieldRef:
344
+ fieldPath: spec.nodeName
345
+ - name: METALLB_HOST
346
+ valueFrom:
347
+ fieldRef:
348
+ fieldPath: status.hostIP
349
+ - name: METALLB_ML_BIND_ADDR
350
+ valueFrom:
351
+ fieldRef:
352
+ fieldPath: status.podIP
353
+ # needed when another software is also using memberlist / port 7946
354
+ # when changing this default you also need to update the container ports definition
355
+ # and the PodSecurityPolicy hostPorts definition
356
+ #- name: METALLB_ML_BIND_PORT
357
+ # value: "7946"
358
+ - name: METALLB_ML_LABELS
359
+ value: "app=metallb,component=speaker"
360
+ - name: METALLB_ML_SECRET_KEY
361
+ valueFrom:
362
+ secretKeyRef:
363
+ name: memberlist
364
+ key: secretkey
365
+ image: quay.io/metallb/speaker:v0.12.1
366
+ name: speaker
367
+ ports:
368
+ - containerPort: 7472
369
+ name: monitoring
370
+ - containerPort: 7946
371
+ name: memberlist-tcp
372
+ - containerPort: 7946
373
+ name: memberlist-udp
374
+ protocol: UDP
375
+ livenessProbe:
376
+ httpGet:
377
+ path: /metrics
378
+ port: monitoring
379
+ initialDelaySeconds: 10
380
+ periodSeconds: 10
381
+ timeoutSeconds: 1
382
+ successThreshold: 1
383
+ failureThreshold: 3
384
+ readinessProbe:
385
+ httpGet:
386
+ path: /metrics
387
+ port: monitoring
388
+ initialDelaySeconds: 10
389
+ periodSeconds: 10
390
+ timeoutSeconds: 1
391
+ successThreshold: 1
392
+ failureThreshold: 3
393
+ securityContext:
394
+ allowPrivilegeEscalation: false
395
+ capabilities:
396
+ add:
397
+ - NET_RAW
398
+ drop:
399
+ - ALL
400
+ readOnlyRootFilesystem: true
401
+ hostNetwork: true
402
+ nodeSelector:
403
+ kubernetes.io/os: linux
404
+ serviceAccountName: speaker
405
+ terminationGracePeriodSeconds: 2
406
+ tolerations:
407
+ - effect: NoSchedule
408
+ key: node-role.kubernetes.io/master
409
+ operator: Exists
410
+ ---
411
+ apiVersion: apps/v1
412
+ kind: Deployment
413
+ metadata:
414
+ labels:
415
+ app: metallb
416
+ component: controller
417
+ name: controller
418
+ namespace: metallb-system
419
+ spec:
420
+ revisionHistoryLimit: 3
421
+ selector:
422
+ matchLabels:
423
+ app: metallb
424
+ component: controller
425
+ template:
426
+ metadata:
427
+ annotations:
428
+ prometheus.io/port: '7472'
429
+ prometheus.io/scrape: 'true'
430
+ labels:
431
+ app: metallb
432
+ component: controller
433
+ spec:
434
+ containers:
435
+ - args:
436
+ - --port=7472
437
+ - --config=config
438
+ - --log-level=info
439
+ env:
440
+ - name: METALLB_ML_SECRET_NAME
441
+ value: memberlist
442
+ - name: METALLB_DEPLOYMENT
443
+ value: controller
444
+ image: quay.io/metallb/controller:v0.12.1
445
+ name: controller
446
+ ports:
447
+ - containerPort: 7472
448
+ name: monitoring
449
+ livenessProbe:
450
+ httpGet:
451
+ path: /metrics
452
+ port: monitoring
453
+ initialDelaySeconds: 10
454
+ periodSeconds: 10
455
+ timeoutSeconds: 1
456
+ successThreshold: 1
457
+ failureThreshold: 3
458
+ readinessProbe:
459
+ httpGet:
460
+ path: /metrics
461
+ port: monitoring
462
+ initialDelaySeconds: 10
463
+ periodSeconds: 10
464
+ timeoutSeconds: 1
465
+ successThreshold: 1
466
+ failureThreshold: 3
467
+ securityContext:
468
+ allowPrivilegeEscalation: false
469
+ capabilities:
470
+ drop:
471
+ - all
472
+ readOnlyRootFilesystem: true
473
+ nodeSelector:
474
+ kubernetes.io/os: linux
475
+ securityContext:
476
+ runAsNonRoot: true
477
+ runAsUser: 65534
478
+ fsGroup: 65534
479
+ serviceAccountName: controller
480
+ terminationGracePeriodSeconds: 0
@@ -4,7 +4,6 @@ metadata:
4
4
  labels:
5
5
  app: metallb
6
6
  name: controller
7
- namespace: metallb-system
8
7
  spec:
9
8
  allowPrivilegeEscalation: false
10
9
  allowedCapabilities: []
@@ -46,7 +45,6 @@ metadata:
46
45
  labels:
47
46
  app: metallb
48
47
  name: speaker
49
- namespace: metallb-system
50
48
  spec:
51
49
  allowPrivilegeEscalation: false
52
50
  allowedCapabilities:
@@ -338,6 +336,7 @@ spec:
338
336
  - args:
339
337
  - --port=7472
340
338
  - --config=config
339
+ - --log-level=info
341
340
  env:
342
341
  - name: METALLB_NODE_NAME
343
342
  valueFrom:
@@ -363,7 +362,7 @@ spec:
363
362
  secretKeyRef:
364
363
  name: memberlist
365
364
  key: secretkey
366
- image: quay.io/metallb/speaker:v0.10.2
365
+ image: quay.io/metallb/speaker:v0.12.1
367
366
  name: speaker
368
367
  ports:
369
368
  - containerPort: 7472
@@ -373,6 +372,24 @@ spec:
373
372
  - containerPort: 7946
374
373
  name: memberlist-udp
375
374
  protocol: UDP
375
+ livenessProbe:
376
+ httpGet:
377
+ path: /metrics
378
+ port: monitoring
379
+ initialDelaySeconds: 10
380
+ periodSeconds: 10
381
+ timeoutSeconds: 1
382
+ successThreshold: 1
383
+ failureThreshold: 3
384
+ readinessProbe:
385
+ httpGet:
386
+ path: /metrics
387
+ port: monitoring
388
+ initialDelaySeconds: 10
389
+ periodSeconds: 10
390
+ timeoutSeconds: 1
391
+ successThreshold: 1
392
+ failureThreshold: 3
376
393
  securityContext:
377
394
  allowPrivilegeEscalation: false
378
395
  capabilities:
@@ -418,16 +435,35 @@ spec:
418
435
  - args:
419
436
  - --port=7472
420
437
  - --config=config
438
+ - --log-level=info
421
439
  env:
422
440
  - name: METALLB_ML_SECRET_NAME
423
441
  value: memberlist
424
442
  - name: METALLB_DEPLOYMENT
425
443
  value: controller
426
- image: quay.io/metallb/controller:v0.10.2
444
+ image: quay.io/metallb/controller:v0.12.1
427
445
  name: controller
428
446
  ports:
429
447
  - containerPort: 7472
430
448
  name: monitoring
449
+ livenessProbe:
450
+ httpGet:
451
+ path: /metrics
452
+ port: monitoring
453
+ initialDelaySeconds: 10
454
+ periodSeconds: 10
455
+ timeoutSeconds: 1
456
+ successThreshold: 1
457
+ failureThreshold: 3
458
+ readinessProbe:
459
+ httpGet:
460
+ path: /metrics
461
+ port: monitoring
462
+ initialDelaySeconds: 10
463
+ periodSeconds: 10
464
+ timeoutSeconds: 1
465
+ successThreshold: 1
466
+ failureThreshold: 3
431
467
  securityContext:
432
468
  allowPrivilegeEscalation: false
433
469
  capabilities:
@@ -439,5 +475,6 @@ spec:
439
475
  securityContext:
440
476
  runAsNonRoot: true
441
477
  runAsUser: 65534
478
+ fsGroup: 65534
442
479
  serviceAccountName: controller
443
480
  terminationGracePeriodSeconds: 0
@@ -106,8 +106,6 @@ module Porkadot; module Assets
106
106
  'metallb/metallb.yaml',
107
107
  'metallb/metallb.config.yaml',
108
108
  'metallb/kustomization.yaml'
109
- ], secrets: [
110
- 'metallb/metallb.secrets.yaml'
111
109
  ])
112
110
 
113
111
 
@@ -13,15 +13,22 @@ module Porkadot; module Cmd
13
13
  desc "install", "Install kubernetes"
14
14
  subcommand "install", Porkadot::Cmd::Install::Cli
15
15
 
16
+ desc "etcd", "Interact with etcd"
17
+ subcommand "etcd", Porkadot::Cmd::Etcd::Cli
18
+
16
19
  desc "setup-containerd", "Setup containerd"
17
20
  option :node, type: :string
18
21
  option :force, type: :boolean, default: false
22
+ option :bootstrap, type: :boolean, default: false
19
23
  def setup_containerd
20
24
  logger.info "Setup containerd"
21
25
  kubelets = Porkadot::Install::KubeletList.new(self.config)
22
26
  nodes = []
23
27
  if node = options[:node]
24
28
  nodes = kubelets[node]
29
+ elsif options[:bootstrap]
30
+ bootstrap = Porkadot::Install::Bootstrap.new(self.config)
31
+ nodes = bootstrap.host
25
32
  else
26
33
  nodes = kubelets.kubelets.values
27
34
  end
@@ -32,12 +39,16 @@ module Porkadot; module Cmd
32
39
  desc "setup-node", "Setup node default settings"
33
40
  option :node, type: :string
34
41
  option :force, type: :boolean, default: false
42
+ option :bootstrap, type: :boolean, default: false
35
43
  def setup_node
36
44
  logger.info "Setup node default"
37
45
  kubelets = Porkadot::Install::KubeletList.new(self.config)
38
46
  nodes = []
39
47
  if node = options[:node]
40
48
  nodes = kubelets[node]
49
+ elsif options[:bootstrap]
50
+ bootstrap = Porkadot::Install::Bootstrap.new(self.config)
51
+ nodes = bootstrap.host
41
52
  else
42
53
  nodes = kubelets.kubelets.values
43
54
  end
@@ -0,0 +1,68 @@
1
+
2
+ module Porkadot; module Cmd; module Etcd
3
+ class Cli < Porkadot::SubCommandBase
4
+ include Porkadot::Utils
5
+
6
+ default_task :all
7
+ desc "all", "Interact with etcd"
8
+ def all
9
+ "Use restore or backup sub commands."
10
+ end
11
+
12
+ desc "backup", "Backup etcd data"
13
+ option :node, type: :string
14
+ option :path, type: :string, default: "./backup", desc: "Directory where etcd backup data will be stored."
15
+ def backup
16
+ require 'date'
17
+
18
+ filename = "etcd-#{DateTime.now.to_s}.db"
19
+ path = File.join(options[:path], filename)
20
+
21
+ logger.info "Backing up etcd data to #{path}"
22
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
23
+ kubelets.backup_etcd host: options[:node], path: path
24
+ ""
25
+ end
26
+
27
+ desc "start", "Start etcd"
28
+ option :node, type: :string
29
+ def start
30
+ logger.info "Start etcd"
31
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
32
+ kubelets.start_etcd hosts: options[:node]
33
+ ""
34
+ end
35
+
36
+ desc "stop", "Stop etcd"
37
+ option :node, type: :string
38
+ def stop
39
+ logger.info "Start etcd"
40
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
41
+ kubelets.stop_etcd hosts: options[:node]
42
+ ""
43
+ end
44
+
45
+ desc "restore", "Restore etcd data"
46
+ option :path, type: :string, default: "./backup", desc: "Directory where etcd backup data is stored."
47
+ def restore
48
+ invoke :stop, [], options
49
+
50
+ path = Dir.glob(File.join(options[:path], "etcd-*.db")).sort.reverse[0]
51
+ unless path
52
+ return "No backup data found...: #{options[:path]}"
53
+ end
54
+
55
+ logger.info "Restore etcd from #{path}"
56
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
57
+ kubelets.restore_etcd path: path
58
+
59
+ invoke :start, [], options
60
+ ""
61
+ end
62
+
63
+ def self.subcommand_prefix
64
+ 'etcd'
65
+ end
66
+ end
67
+ end; end; end
68
+
@@ -9,6 +9,9 @@ module Porkadot; module Configs
9
9
  end
10
10
 
11
11
  def ipaddr?(addr)
12
+ if addr.nil?
13
+ return false
14
+ end
12
15
  IPAddr.new(addr)
13
16
  return true
14
17
  rescue IPAddr::InvalidAddressError
@@ -39,6 +39,33 @@ module Porkadot; module Configs
39
39
  return (self.raw.labels && self.raw.labels[Porkadot::ETCD_ADDRESS_LABEL]) || self.raw.hostname || self.name
40
40
  end
41
41
 
42
+ def listen_address label_key
43
+ listen_address = nil
44
+ if self.raw.labels
45
+ listen_address = self.raw.labels[label_key] || self.raw.labels[Porkadot::ETCD_LISTEN_ADDRESS_LABEL]
46
+ end
47
+
48
+ if !listen_adress
49
+ if self.ipaddr?(self.raw.hostname)
50
+ listen_address = self.raw.hostname
51
+ elsif self.ipaddr?(self.raw.name)
52
+ listen_address = self.raw.name
53
+ else
54
+ listen_address = '0.0.0.0'
55
+ end
56
+ end
57
+
58
+ return listen_address
59
+ end
60
+
61
+ def listen_client_address
62
+ return self.listen_address(Porkadot::ETCD_LISTEN_CLIENT_ADDRESS_LABEL)
63
+ end
64
+
65
+ def listen_peer_address
66
+ return self.listen_address(Porkadot::ETCD_LISTEN_PEER_ADDRESS_LABEL)
67
+ end
68
+
42
69
  def advertise_client_urls
43
70
  ["https://#{member_address}:2379"]
44
71
  end
@@ -48,11 +75,16 @@ module Porkadot; module Configs
48
75
  end
49
76
 
50
77
  def listen_client_urls
51
- self.advertise_client_urls + ["https://127.0.0.1:2379"]
78
+ address = self.listen_client_address
79
+ if address != '0.0.0.0'
80
+ return ["https://#{address}:2379", "https://127.0.0.1:2379"]
81
+ else
82
+ return ["https://#{address}:2379"]
83
+ end
52
84
  end
53
85
 
54
86
  def listen_peer_urls
55
- self.advertise_peer_urls
87
+ ["https://#{self.listen_client_address}:2380"]
56
88
  end
57
89
 
58
90
  def initial_cluster
@@ -72,6 +104,7 @@ module Porkadot; module Configs
72
104
  sans << "DNS:#{san}"
73
105
  end
74
106
  end
107
+ sans << "IP:127.0.0.1"
75
108
  return sans
76
109
  end
77
110
 
@@ -5,4 +5,7 @@ module Porkadot
5
5
  K8S_MASTER_LABEL = "k8s.unstable.cloud/master"
6
6
  ETCD_MEMBER_LABEL = "etcd.unstable.cloud/member"
7
7
  ETCD_ADDRESS_LABEL = "etcd.unstable.cloud/address"
8
+ ETCD_LISTEN_ADDRESS_LABEL = "etcd.unstable.cloud/listen-address"
9
+ ETCD_LISTEN_CLIENT_ADDRESS_LABEL = "etcd.unstable.cloud/listen-client-address"
10
+ ETCD_LISTEN_PEER_ADDRESS_LABEL = "etcd.unstable.cloud/listen-client-address"
8
11
  end
@@ -47,8 +47,8 @@ etcd:
47
47
  extra_env: []
48
48
 
49
49
  kubernetes:
50
- kubernetes_version: v1.22.8
51
- crictl_version: v1.22.0
50
+ kubernetes_version: v1.23.5
51
+ crictl_version: v1.23.0
52
52
  image_repository: k8s.gcr.io
53
53
 
54
54
  networking:
@@ -3,6 +3,7 @@ module Porkadot; module Install
3
3
  KUBE_TEMP = File.join(Porkadot::Install::KUBE_TEMP, 'kubelet')
4
4
  KUBE_SECRETS_TEMP = File.join(Porkadot::Install::KUBE_TEMP, '.kubelet')
5
5
  KUBE_DEFAULT_TEMP = File.join(Porkadot::Install::KUBE_TEMP, '.default')
6
+ ETCD_TEMP = '/opt/porkadot'
6
7
  include SSHKit::DSL
7
8
  attr_reader :global_config
8
9
  attr_reader :logger
@@ -93,6 +94,114 @@ module Porkadot; module Install
93
94
  end
94
95
  end
95
96
 
97
+ def backup_etcd host: nil, path: "./backup/etcd.db"
98
+ unless host
99
+ self.kubelets.each do |_, v|
100
+ if v.etcd?
101
+ host = v
102
+ end
103
+ end
104
+ end
105
+
106
+ on(:local) do |local|
107
+ execute(:mkdir, '-p', File.dirname(path))
108
+ end
109
+
110
+ options = self.etcd_options
111
+ on(host) do |host|
112
+ execute(:mkdir, '-p', KUBE_TEMP)
113
+ execute(:"/opt/bin/etcdctl", *options, "snapshot", "save", "#{KUBE_TEMP}/etcd.db")
114
+ download! "#{KUBE_TEMP}/etcd.db", path
115
+ end
116
+ end
117
+
118
+ def restore_etcd path: "./backup/etcd.db"
119
+ require 'date'
120
+ hosts = []
121
+ self.kubelets.each do |_, v|
122
+ hosts << v if v.etcd?
123
+ end
124
+
125
+ options = self.etcd_options
126
+ on(hosts) do |host|
127
+ if test("[ -d #{KUBE_TEMP} ]")
128
+ execute(:rm, '-rf', KUBE_TEMP)
129
+ execute(:rm, '-rf', KUBE_SECRETS_TEMP)
130
+ end
131
+ execute(:mkdir, '-p', KUBE_TEMP)
132
+ upload! path, "#{KUBE_TEMP}/etcd.db"
133
+
134
+ as user: 'root' do
135
+ execute(:mkdir, '-p', ETCD_TEMP)
136
+ if test('[ -d /var/lib/etcd ]')
137
+ execute(:mv, '/var/lib/etcd', "${ETCD_TEMP}/data-#{DateTime.now.to_s}")
138
+ end
139
+ execute(:"/opt/bin/etcdctl", *options, "snapshot", "restore", "#{KUBE_TEMP}/etcd.db")
140
+ end
141
+ end
142
+ end
143
+
144
+ def start_etcd hosts: nil
145
+ unless hosts
146
+ hosts = []
147
+ self.kubelets.each do |_, v|
148
+ hosts << v if v.etcd?
149
+ end
150
+ end
151
+
152
+ on(hosts) do |host|
153
+ as user: 'root' do
154
+ execute(:mkdir, '-p', ETCD_TEMP)
155
+
156
+ result = capture(:"/opt/bin/crictl", 'ps', '-q', '--name', 'etcd')
157
+ with(container_runtime_endpoint: "unix:///run/containerd/containerd.sock") do
158
+ if result.empty?
159
+ info 'Trying to start etcd'
160
+ execute(:mv, "${ETCD_TEMP}/etcd-server.yaml", "/etc/kubernetes/manifests/etcd-server.yaml")
161
+ else
162
+ info 'etcd is already started...'
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ def stop_etcd hosts: nil
170
+ unless hosts
171
+ hosts = []
172
+ self.kubelets.each do |_, v|
173
+ hosts << v if v.etcd?
174
+ end
175
+ end
176
+
177
+ on(hosts) do |host|
178
+ as user: 'root' do
179
+ execute(:mkdir, '-p', ETCD_TEMP)
180
+
181
+ info "Waiting for etcd to stop..."
182
+ with(container_runtime_endpoint: "unix:///run/containerd/containerd.sock") do
183
+ unless capture(:"/opt/bin/crictl", 'ps', '-q', '--name', 'etcd').empty?
184
+ execute(:mv, "/etc/kubernetes/manifests/etcd-server.yaml", "${ETCD_TEMP}/etcd-server.yaml")
185
+ while capture(:"/opt/bin/crictl", 'ps', '-q', '--name', 'etcd') != ''
186
+ info 'Still waiting for stopping etcd...'
187
+ sleep 5
188
+ end
189
+ end
190
+ end
191
+ info 'etcd was stopped.'
192
+ end
193
+ end
194
+ end
195
+
196
+ def etcd_options
197
+ %w(
198
+ --cacert /etc/etcd/pki/ca.crt
199
+ --cert /etc/etcd/pki/etcd.crt
200
+ --key /etc/etcd/pki/etcd.key
201
+ --endpoints=https://127.0.0.1:2379
202
+ )
203
+ end
204
+
96
205
  def [](name)
97
206
  self.kubelets[name]
98
207
  end
@@ -112,5 +221,8 @@ module Porkadot; module Install
112
221
  super(@connection)
113
222
  end
114
223
 
224
+ def etcd?
225
+ return self.config.raw.labels && self.config.raw.labels[Porkadot::ETCD_MEMBER_LABEL]
226
+ end
115
227
  end
116
228
  end; end
@@ -1,3 +1,3 @@
1
1
  module Porkadot
2
- VERSION = "0.22.2"
2
+ VERSION = "0.23.0"
3
3
  end
data/lib/porkadot.rb CHANGED
@@ -37,4 +37,5 @@ require 'porkadot/cmd/render/certs'
37
37
  require 'porkadot/cmd/render'
38
38
  require 'porkadot/cmd/install/bootstrap'
39
39
  require 'porkadot/cmd/install'
40
+ require 'porkadot/cmd/etcd'
40
41
  require 'porkadot/cmd'
data/porkadot.gemspec CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency "thor", "~> 1.0"
37
37
  spec.add_dependency "hashie", "~> 4.1"
38
38
  spec.add_dependency "sshkit", "~> 1.20"
39
+ spec.add_dependency "net-ssh", "= 7.0.1"
39
40
  spec.add_development_dependency "bundler", "~> 2.0"
40
41
  spec.add_development_dependency "rake", "~> 13.0"
41
42
  spec.add_development_dependency "minitest", "~> 5.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: porkadot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.2
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OTSUKA, Yuanying
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-09 00:00:00.000000000 Z
11
+ date: 2022-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.20'
55
+ - !ruby/object:Gem::Dependency
56
+ name: net-ssh
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 7.0.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 7.0.1
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +172,7 @@ files:
158
172
  - lib/porkadot/assets/kubernetes/manifests/addons/metallb/000-metallb.yaml.erb
159
173
  - lib/porkadot/assets/kubernetes/manifests/addons/metallb/kustomization.yaml.erb
160
174
  - lib/porkadot/assets/kubernetes/manifests/addons/metallb/metallb.config.yaml.erb
161
- - lib/porkadot/assets/kubernetes/manifests/addons/metallb/metallb.secrets.yaml.erb
175
+ - lib/porkadot/assets/kubernetes/manifests/addons/metallb/metallb.yaml
162
176
  - lib/porkadot/assets/kubernetes/manifests/addons/metallb/metallb.yaml.erb
163
177
  - lib/porkadot/assets/kubernetes/manifests/addons/storage-version-migrator/kustomization.yaml.erb
164
178
  - lib/porkadot/assets/kubernetes/manifests/addons/storage-version-migrator/storage-version-migrator.yaml.erb
@@ -173,6 +187,7 @@ files:
173
187
  - lib/porkadot/assets/kubernetes/manifests/porkadot.yaml.erb
174
188
  - lib/porkadot/cmd.rb
175
189
  - lib/porkadot/cmd/cli.rb
190
+ - lib/porkadot/cmd/etcd.rb
176
191
  - lib/porkadot/cmd/install.rb
177
192
  - lib/porkadot/cmd/install/bootstrap.rb
178
193
  - lib/porkadot/cmd/render.rb
@@ -218,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
218
233
  - !ruby/object:Gem::Version
219
234
  version: '0'
220
235
  requirements: []
221
- rubygems_version: 3.1.2
236
+ rubygems_version: 3.3.7
222
237
  signing_key:
223
238
  specification_version: 4
224
239
  summary: Porkadot is a CLI tool to deploy Kubernetes cluster.
@@ -1,13 +0,0 @@
1
- <% require 'securerandom' -%>
2
- <% k8s = global_config.k8s -%>
3
- ---
4
- apiVersion: v1
5
- stringData:
6
- secretkey: <%= SecureRandom.base64(128) %>
7
- kind: Secret
8
- metadata:
9
- name: memberlist
10
- namespace: metallb-system
11
- labels:
12
- app: metallb
13
- type: Opaque