porkadot 0.22.2 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
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