porkadot 0.19.1 → 0.22.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/porkadot/assets/bootstrap/manifests/kube-apiserver.bootstrap.yaml.erb +32 -0
  3. data/lib/porkadot/assets/bootstrap/manifests/kube-controller-manager.bootstrap.yaml.erb +23 -0
  4. data/lib/porkadot/assets/bootstrap/manifests/kube-scheduler.bootstrap.yaml.erb +23 -0
  5. data/lib/porkadot/assets/kubelet/install-deps.sh.erb +9 -0
  6. data/lib/porkadot/assets/kubelet/setup-containerd.sh.erb +8 -1
  7. data/lib/porkadot/assets/kubelet-default/install.sh.erb +14 -0
  8. data/lib/porkadot/assets/kubelet.rb +32 -0
  9. data/lib/porkadot/assets/kubernetes/install.secrets.sh.erb +8 -0
  10. data/lib/porkadot/assets/kubernetes/install.sh.erb +8 -1
  11. data/lib/porkadot/assets/kubernetes/kubeconfig.yaml.erb +19 -0
  12. data/lib/porkadot/assets/kubernetes/kustomization.yaml.erb +7 -0
  13. data/lib/porkadot/assets/kubernetes/manifests/{coredns.yaml.erb → addons/coredns/coredns.yaml.erb} +2 -1
  14. data/lib/porkadot/assets/kubernetes/manifests/{dns-horizontal-autoscaler.yaml.erb → addons/coredns/dns-horizontal-autoscaler.yaml.erb} +0 -2
  15. data/lib/porkadot/assets/kubernetes/manifests/addons/coredns/kustomization.yaml.erb +3 -0
  16. data/lib/porkadot/assets/kubernetes/manifests/{flannel.yaml.erb → addons/flannel/flannel.yaml.erb} +39 -10
  17. data/lib/porkadot/assets/kubernetes/manifests/addons/flannel/kustomization.yaml.erb +2 -0
  18. data/lib/porkadot/assets/kubernetes/manifests/{kubelet-rubber-stamp.yaml.erb → addons/kubelet-rubber-stamp/kubelet-rubber-stamp.yaml.erb} +1 -1
  19. data/lib/porkadot/assets/kubernetes/manifests/addons/kubelet-rubber-stamp/kustomization.yaml.erb +2 -0
  20. data/lib/porkadot/assets/kubernetes/manifests/addons/kustomization.yaml.erb +4 -0
  21. data/lib/porkadot/assets/kubernetes/manifests/addons/metallb/000-metallb.yaml.erb +7 -0
  22. data/lib/porkadot/assets/kubernetes/manifests/addons/metallb/kustomization.yaml.erb +4 -0
  23. data/lib/porkadot/assets/kubernetes/manifests/addons/metallb/metallb.config.yaml.erb +12 -0
  24. data/lib/porkadot/assets/kubernetes/manifests/{metallb.secrets.yaml.erb → addons/metallb/metallb.secrets.yaml.erb} +0 -0
  25. data/lib/porkadot/assets/kubernetes/manifests/{metallb.yaml.erb → addons/metallb/metallb.yaml.erb} +71 -41
  26. data/lib/porkadot/assets/kubernetes/manifests/addons/storage-version-migrator/kustomization.yaml.erb +2 -0
  27. data/lib/porkadot/assets/kubernetes/manifests/{storage-version-migrator.yaml.erb → addons/storage-version-migrator/storage-version-migrator.yaml.erb} +0 -0
  28. data/lib/porkadot/assets/kubernetes/manifests/kube-apiserver.secrets.yaml.erb +1 -0
  29. data/lib/porkadot/assets/kubernetes/manifests/kube-apiserver.yaml.erb +32 -0
  30. data/lib/porkadot/assets/kubernetes/manifests/kube-controller-manager.yaml.erb +20 -6
  31. data/lib/porkadot/assets/kubernetes/manifests/kube-scheduler.yaml.erb +20 -6
  32. data/lib/porkadot/assets/kubernetes/manifests/kubelet.yaml.erb +0 -1
  33. data/lib/porkadot/assets/kubernetes/manifests/kustomization.yaml.erb +8 -0
  34. data/lib/porkadot/assets/kubernetes.rb +94 -16
  35. data/lib/porkadot/assets.rb +13 -3
  36. data/lib/porkadot/cmd/cli.rb +16 -0
  37. data/lib/porkadot/cmd/install.rb +15 -0
  38. data/lib/porkadot/config.rb +9 -5
  39. data/lib/porkadot/configs/addons.rb +21 -0
  40. data/lib/porkadot/configs/kubelet.rb +26 -0
  41. data/lib/porkadot/configs/kubernetes.rb +29 -10
  42. data/lib/porkadot/default.yaml +25 -7
  43. data/lib/porkadot/install/kubelet.rb +25 -0
  44. data/lib/porkadot/install/kubernetes.rb +3 -2
  45. data/lib/porkadot/version.rb +1 -1
  46. data/lib/porkadot.rb +1 -2
  47. metadata +23 -11
  48. data/lib/porkadot/configs/cni.rb +0 -22
  49. data/lib/porkadot/configs/loadbalancer.rb +0 -26
@@ -11,6 +11,7 @@ data:
11
11
  kubelet-client.crt: <%= certs.kubernetes.to_base64(:kubelet_client_cert) %>
12
12
  kubelet-client.key: <%= certs.kubernetes.to_base64(:kubelet_client_key) %>
13
13
  sa.pub: <%= certs.kubernetes.to_base64(:sa_public_key) %>
14
+ sa.key: <%= certs.kubernetes.to_base64(:sa_private_key) %>
14
15
  kind: Secret
15
16
  metadata:
16
17
  name: kube-apiserver
@@ -24,6 +24,9 @@ spec:
24
24
  annotations:
25
25
  checkpointer.alpha.coreos.com/checkpoint: "true"
26
26
  spec:
27
+ securityContext:
28
+ seccompProfile:
29
+ type: RuntimeDefault
27
30
  containers:
28
31
  - name: kube-apiserver
29
32
  resources:
@@ -35,6 +38,35 @@ spec:
35
38
  <%- k8s.apiserver.args.each do |k, v| -%>
36
39
  - <%= k %><% if v ;%>=<%= v %><%; end %>
37
40
  <%- end -%>
41
+ livenessProbe:
42
+ failureThreshold: 8
43
+ httpGet:
44
+ host: 127.0.0.1
45
+ path: /livez
46
+ port: 6443
47
+ scheme: HTTPS
48
+ initialDelaySeconds: 10
49
+ periodSeconds: 10
50
+ timeoutSeconds: 15
51
+ readinessProbe:
52
+ failureThreshold: 3
53
+ httpGet:
54
+ host: 127.0.0.1
55
+ path: /readyz
56
+ port: 6443
57
+ scheme: HTTPS
58
+ periodSeconds: 1
59
+ timeoutSeconds: 15
60
+ startupProbe:
61
+ failureThreshold: 24
62
+ httpGet:
63
+ host: 127.0.0.1
64
+ path: /livez
65
+ port: 6443
66
+ scheme: HTTPS
67
+ initialDelaySeconds: 10
68
+ periodSeconds: 10
69
+ timeoutSeconds: 15
38
70
  env:
39
71
  - name: POD_IP
40
72
  valueFrom:
@@ -1,6 +1,6 @@
1
1
  <% k8s = global_config.k8s -%>
2
2
  ---
3
- apiVersion: policy/v1beta1
3
+ apiVersion: policy/v1
4
4
  kind: PodDisruptionBudget
5
5
  metadata:
6
6
  name: kube-controller-manager
@@ -69,6 +69,11 @@ spec:
69
69
  annotations:
70
70
  scheduler.alpha.kubernetes.io/critical-pod: ''
71
71
  spec:
72
+ securityContext:
73
+ seccompProfile:
74
+ type: RuntimeDefault
75
+ runAsNonRoot: true
76
+ runAsUser: 65534
72
77
  affinity:
73
78
  podAntiAffinity:
74
79
  preferredDuringSchedulingIgnoredDuringExecution:
@@ -97,10 +102,22 @@ spec:
97
102
  - <%= k %><% if v ;%>=<%= v %><%; end %>
98
103
  <%- end -%>
99
104
  livenessProbe:
105
+ failureThreshold: 8
100
106
  httpGet:
101
107
  path: /healthz
102
- port: 10252 # Note: Using default port. Update if --port option is set differently.
103
- initialDelaySeconds: 15
108
+ port: 10257
109
+ scheme: HTTPS
110
+ initialDelaySeconds: 10
111
+ periodSeconds: 10
112
+ timeoutSeconds: 15
113
+ startupProbe:
114
+ failureThreshold: 24
115
+ httpGet:
116
+ path: /healthz
117
+ port: 10257
118
+ scheme: HTTPS
119
+ initialDelaySeconds: 10
120
+ periodSeconds: 10
104
121
  timeoutSeconds: 15
105
122
  volumeMounts:
106
123
  - name: var-run-kubernetes
@@ -122,9 +139,6 @@ spec:
122
139
  priorityClassName: system-cluster-critical
123
140
  nodeSelector:
124
141
  k8s.unstable.cloud/master: ""
125
- securityContext:
126
- runAsNonRoot: true
127
- runAsUser: 65534
128
142
  serviceAccountName: kube-controller-manager
129
143
  tolerations:
130
144
  - key: CriticalAddonsOnly
@@ -1,6 +1,6 @@
1
1
  <% k8s = global_config.k8s -%>
2
2
  ---
3
- apiVersion: policy/v1beta1
3
+ apiVersion: policy/v1
4
4
  kind: PodDisruptionBudget
5
5
  metadata:
6
6
  name: kube-scheduler
@@ -113,6 +113,11 @@ spec:
113
113
  annotations:
114
114
  scheduler.alpha.kubernetes.io/critical-pod: ''
115
115
  spec:
116
+ securityContext:
117
+ seccompProfile:
118
+ type: RuntimeDefault
119
+ runAsNonRoot: true
120
+ runAsUser: 65534
116
121
  affinity:
117
122
  podAntiAffinity:
118
123
  preferredDuringSchedulingIgnoredDuringExecution:
@@ -141,17 +146,26 @@ spec:
141
146
  - <%= k %><% if v ;%>=<%= v %><%; end %>
142
147
  <%- end -%>
143
148
  livenessProbe:
149
+ failureThreshold: 8
144
150
  httpGet:
145
151
  path: /healthz
146
- port: 10251 # Note: Using default port. Update if --port option is set differently.
147
- initialDelaySeconds: 15
152
+ port: 10259
153
+ scheme: HTTPS
154
+ initialDelaySeconds: 10
155
+ periodSeconds: 10
156
+ timeoutSeconds: 15
157
+ startupProbe:
158
+ failureThreshold: 24
159
+ httpGet:
160
+ path: /healthz
161
+ port: 10259
162
+ scheme: HTTPS
163
+ initialDelaySeconds: 10
164
+ periodSeconds: 10
148
165
  timeoutSeconds: 15
149
166
  priorityClassName: system-cluster-critical
150
167
  nodeSelector:
151
168
  k8s.unstable.cloud/master: ""
152
- securityContext:
153
- runAsNonRoot: true
154
- runAsUser: 65534
155
169
  serviceAccountName: kube-scheduler
156
170
  tolerations:
157
171
  - key: CriticalAddonsOnly
@@ -15,7 +15,6 @@ roleRef:
15
15
  kind: ClusterRoleBinding
16
16
  apiVersion: rbac.authorization.k8s.io/v1
17
17
  metadata:
18
- name: auto-approve-csrs-for-group
19
18
  name: porkadot:node-autoapprove-bootstrap
20
19
  subjects:
21
20
  - kind: Group
@@ -0,0 +1,8 @@
1
+ resources:
2
+ - addons
3
+ - kube-apiserver.yaml
4
+ - kube-controller-manager.yaml
5
+ - kube-proxy.yaml
6
+ - kube-scheduler.yaml
7
+ - kubelet.yaml
8
+ - porkadot.yaml
@@ -17,31 +17,109 @@ module Porkadot; module Assets
17
17
 
18
18
  def render
19
19
  logger.info "--> Rendering kubernetes manifests"
20
- unless File.directory?(config.manifests_path)
21
- FileUtils.mkdir_p(config.manifests_path)
22
- end
23
- unless File.directory?(config.manifests_secrets_path)
24
- FileUtils.mkdir_p(config.manifests_secrets_path)
25
- end
26
- lb = global_config.lb
27
- cni = global_config.cni
28
20
  render_erb 'manifests/porkadot.yaml'
29
21
  render_erb 'manifests/kubelet.yaml'
30
- render_erb "manifests/#{lb.type}.yaml"
31
- render_secrets_erb "manifests/#{lb.type}.secrets.yaml"
32
- render_erb "manifests/#{cni.type}.yaml"
33
- render_erb "manifests/coredns.yaml"
34
- render_erb "manifests/dns-horizontal-autoscaler.yaml"
35
22
  render_erb "manifests/kube-apiserver.yaml"
36
23
  render_secrets_erb "manifests/kube-apiserver.secrets.yaml"
37
24
  render_erb "manifests/kube-proxy.yaml"
38
25
  render_erb "manifests/kube-scheduler.yaml"
39
26
  render_erb "manifests/kube-controller-manager.yaml"
40
27
  render_secrets_erb "manifests/kube-controller-manager.secrets.yaml"
41
- render_erb "manifests/kubelet-rubber-stamp.yaml"
42
- render_erb "manifests/storage-version-migrator.yaml"
43
- render_erb 'install.sh'
28
+ render_secrets_erb "kubeconfig.yaml"
29
+ render_erb 'manifests/kustomization.yaml'
30
+ render_erb 'kustomization.yaml', force: false
31
+ render_erb 'install.sh', prune_allowlist: prune_allowlist
32
+ render_secrets_erb 'install.secrets.sh'
33
+
34
+ addons = Addons.new(global_config)
35
+ addons.render
36
+ end
37
+
38
+ def prune_allowlist
39
+ return %w[
40
+ apiextensions.k8s.io/v1/customresourcedefinition
41
+ apps/v1/daemonset
42
+ apps/v1/deployment
43
+ core/v1/configmap
44
+ core/v1/namespace
45
+ core/v1/service
46
+ core/v1/serviceaccount
47
+ policy/v1/poddisruptionbudget
48
+ policy/v1beta1/podsecuritypolicy
49
+ rbac.authorization.k8s.io/v1/clusterrole
50
+ rbac.authorization.k8s.io/v1/clusterrolebinding
51
+ rbac.authorization.k8s.io/v1/role
52
+ rbac.authorization.k8s.io/v1/rolebinding
53
+ ]
44
54
  end
55
+ end
56
+
57
+ class Addons
58
+ include Porkadot::Assets
59
+ TEMPLATE_DIR = File.join(File.dirname(__FILE__), "kubernetes", "manifests", "addons")
60
+ attr_reader :global_config
61
+ attr_reader :config
62
+ attr_reader :logger
63
+
64
+ def initialize global_config
65
+ @global_config = global_config
66
+ @config = global_config.addons
67
+ @logger = global_config.logger
68
+ end
69
+
70
+ def render
71
+ logger.info "--> Rendering kubernetes addons"
72
+ render_erb "kustomization.yaml"
73
+
74
+ self.config.enabled.each do |name|
75
+ manifests = @@manifests[name]
76
+ manifests.each do |m|
77
+ render_erb(m)
78
+ end
79
+ secrets = @@secrets_manifests[name]
80
+ secrets.each do |m|
81
+ render_secrets_erb(m)
82
+ end
83
+ end
84
+ end
85
+
86
+ def self.register_manifests name, manifests, secrets: []
87
+ @@manifests ||= {}
88
+ @@manifests[name] = manifests
89
+ @@secrets_manifests ||= {}
90
+ @@secrets_manifests[name] = secrets
91
+ end
92
+
93
+ register_manifests('flannel', [
94
+ 'flannel/flannel.yaml',
95
+ 'flannel/kustomization.yaml'
96
+ ])
97
+
98
+ register_manifests('coredns', [
99
+ 'coredns/coredns.yaml',
100
+ 'coredns/dns-horizontal-autoscaler.yaml',
101
+ 'coredns/kustomization.yaml'
102
+ ])
103
+
104
+ register_manifests('metallb', [
105
+ 'metallb/000-metallb.yaml',
106
+ 'metallb/metallb.yaml',
107
+ 'metallb/metallb.config.yaml',
108
+ 'metallb/kustomization.yaml'
109
+ ], secrets: [
110
+ 'metallb/metallb.secrets.yaml'
111
+ ])
112
+
113
+
114
+ register_manifests('kubelet-rubber-stamp', [
115
+ 'kubelet-rubber-stamp/kubelet-rubber-stamp.yaml',
116
+ 'kubelet-rubber-stamp/kustomization.yaml'
117
+ ])
118
+
119
+ register_manifests('storage-version-migrator', [
120
+ 'storage-version-migrator/storage-version-migrator.yaml',
121
+ 'storage-version-migrator/kustomization.yaml'
122
+ ])
45
123
 
46
124
  end
47
125
  end; end
@@ -15,7 +15,7 @@ module Porkadot::Assets
15
15
  end
16
16
  end
17
17
 
18
- def render_erb file, opts={}
18
+ def render_erb file, **opts
19
19
  file = file.to_s
20
20
  opts[:config] = self.config
21
21
  opts[:global_config] = self.global_config
@@ -23,8 +23,15 @@ module Porkadot::Assets
23
23
  opts[:u] = ErbUtils.new
24
24
 
25
25
  logger.info "----> #{file}"
26
+ asset = config.asset_path(file)
27
+ if opts[:force] != nil && File.file?(asset)
28
+ logger.debug "------> Already exists: skipping #{file}"
29
+ return
30
+ end
31
+ asset_dir = File.dirname(asset)
32
+ FileUtils.mkdir_p(asset_dir) unless File.directory?(asset_dir)
26
33
  open(File.join(self.class::TEMPLATE_DIR, "#{file}.erb")) do |io|
27
- open(config.asset_path(file), 'w') do |out|
34
+ open(asset, 'w') do |out|
28
35
  out.write ERB.new(io.read, trim_mode: '-').result_with_hash(opts)
29
36
  end
30
37
  end
@@ -38,8 +45,11 @@ module Porkadot::Assets
38
45
  opts[:u] = ErbUtils.new
39
46
 
40
47
  logger.info "----> #{file}"
48
+ secret = config.secrets_path(file)
49
+ secret_dir = File.dirname(secret)
50
+ FileUtils.mkdir_p(secret_dir) unless File.directory?(secret_dir)
41
51
  open(File.join(self.class::TEMPLATE_DIR, "#{file}.erb")) do |io|
42
- open(config.secrets_path(file), 'w') do |out|
52
+ open(secret, 'w') do |out|
43
53
  out.write ERB.new(io.read, trim_mode: '-').result_with_hash(opts)
44
54
  end
45
55
  end
@@ -29,6 +29,22 @@ module Porkadot; module Cmd
29
29
  ""
30
30
  end
31
31
 
32
+ desc "setup-node", "Setup node default settings"
33
+ option :node, type: :string
34
+ option :force, type: :boolean, default: false
35
+ def setup_node
36
+ logger.info "Setup node default"
37
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
38
+ nodes = []
39
+ if node = options[:node]
40
+ nodes = kubelets[node]
41
+ else
42
+ nodes = kubelets.kubelets.values
43
+ end
44
+ kubelets.setup_default hosts: nodes, force: options[:force]
45
+ ""
46
+ end
47
+
32
48
  desc "set-config", "Set cluster to kubeconfig"
33
49
  def set_config
34
50
  name = config.k8s.cluster_name
@@ -26,6 +26,21 @@ module Porkadot; module Cmd; module Install
26
26
  ""
27
27
  end
28
28
 
29
+ desc "kubernetes", "Install kubernetes"
30
+ option :node, type: :string
31
+ def kubernetes
32
+ logger.info "Installing kubernetes"
33
+ kubelets = Porkadot::Install::KubeletList.new(self.config)
34
+ if node = options[:node]
35
+ nodes = kubelets[node]
36
+ else
37
+ nodes = Porkadot::Install::Bootstrap.new(self.config).host
38
+ end
39
+ k8s = Porkadot::Install::Kubernetes.new(self.config)
40
+ k8s.install(nodes)
41
+ ""
42
+ end
43
+
29
44
  desc "bootstrap", "Install bootstrap components"
30
45
  subcommand "bootstrap", Porkadot::Cmd::Install::Bootstrap::Cli
31
46
 
@@ -31,16 +31,15 @@ module Porkadot
31
31
  self.raw.connection
32
32
  end
33
33
 
34
+ def addons
35
+ @addons ||= Porkadot::Configs::Addons.new(self)
36
+ end
37
+
34
38
  def lb
35
39
  @lb ||= Porkadot::Configs::Lb.new(self)
36
40
  return @lb
37
41
  end
38
42
 
39
- def cni
40
- @cni ||= Porkadot::Configs::Cni.new(self)
41
- return @cni
42
- end
43
-
44
43
  def bootstrap
45
44
  @bootstrap ||= Porkadot::Configs::Bootstrap.new(self)
46
45
  return @bootstrap
@@ -57,6 +56,11 @@ module Porkadot
57
56
  return @etcd
58
57
  end
59
58
 
59
+ def kubelet_default
60
+ @kubelet_default ||= Porkadot::Configs::KubeletDefault.new(self)
61
+ return @kubelet_default
62
+ end
63
+
60
64
  def nodes
61
65
  @nodes ||= {}.tap do |nodes|
62
66
  self.raw.nodes.each do |k, v|
@@ -0,0 +1,21 @@
1
+
2
+ module Porkadot; module Configs
3
+ class Addons
4
+ include Porkadot::ConfigUtils
5
+
6
+ def initialize config
7
+ @config = config
8
+ @raw = config.raw.addons
9
+ end
10
+
11
+ def target_path
12
+ File.join(self.config.assets_dir, 'kubernetes', 'manifests', 'addons')
13
+ end
14
+
15
+ def target_secrets_path
16
+ File.join(self.config.secrets_root_dir, 'kubernetes', 'manifests', 'addons')
17
+ end
18
+
19
+ end
20
+ end; end
21
+
@@ -1,4 +1,30 @@
1
1
  module Porkadot; module Configs
2
+ class KubeletDefault
3
+ include Porkadot::ConfigUtils
4
+
5
+ def initialize config
6
+ @config = config
7
+ @raw = ::Porkadot::Raw.new
8
+ end
9
+
10
+ def target_path
11
+ File.join(self.config.assets_dir, 'kubelet-default')
12
+ end
13
+
14
+ def target_secrets_path
15
+ File.join(self.config.secrets_root_dir, 'kubelet-default')
16
+ end
17
+
18
+ def addon_path
19
+ File.join(self.target_path, 'addons')
20
+ end
21
+
22
+ def addon_secrets_path
23
+ File.join(self.target_secrets_path, 'addons')
24
+ end
25
+
26
+ end
27
+
2
28
  class Kubelet
3
29
  include Porkadot::ConfigUtils
4
30
  attr_reader :name
@@ -1,4 +1,3 @@
1
-
2
1
  module Porkadot; module Configs
3
2
  class Kubernetes
4
3
  include Porkadot::ConfigUtils
@@ -35,10 +34,6 @@ module Porkadot; module Configs
35
34
  File.join(self.target_path, 'manifests')
36
35
  end
37
36
 
38
- def manifests_secrets_path
39
- File.join(self.target_secrets_path, 'manifests')
40
- end
41
-
42
37
  def control_plane_endpoint_host_and_port
43
38
  endpoint = self.config.k8s.control_plane_endpoint
44
39
  raise "kubernetes.control_plane_endpoint should not be nil" unless endpoint
@@ -128,7 +123,9 @@ module Porkadot; module Configs
128
123
  --requestheader-group-headers=X-Remote-Group
129
124
  --requestheader-username-headers=X-Remote-User
130
125
  --secure-port=#{self.bind_port}
126
+ --service-account-issuer=https://kubernetes.default.svc#{self.config.k8s.networking.dns_domain}
131
127
  --service-account-key-file=/etc/kubernetes/pki/kubernetes/sa.pub
128
+ --service-account-signing-key-file=/etc/kubernetes/pki/kubernetes/sa.key
132
129
  --service-cluster-ip-range=#{config.k8s.networking.service_subnet}
133
130
  --storage-backend=etcd3
134
131
  --tls-cert-file=/etc/kubernetes/pki/kubernetes/apiserver.crt
@@ -194,9 +191,9 @@ module Porkadot; module Configs
194
191
  --cluster-signing-key-file=/etc/kubernetes/pki/kubernetes/ca.key
195
192
  --controllers=*,bootstrapsigner,tokencleaner
196
193
  --leader-elect=true
197
- --node-cidr-mask-size=24
198
194
  --root-ca-file=/etc/kubernetes/pki/kubernetes/ca.crt
199
195
  --service-account-private-key-file=/etc/kubernetes/pki/kubernetes/sa.key
196
+ --service-cluster-ip-range=#{config.k8s.networking.service_subnet}
200
197
  --use-service-account-credentials=true
201
198
  --v=#{self.log_level}
202
199
  ).map {|i| i.split('=', 2)}.to_h
@@ -247,13 +244,35 @@ module Porkadot; module Configs
247
244
  end
248
245
 
249
246
  def kubernetes_ip
250
- cluster_ip_range = IPAddr.new(self.service_subnet)
251
- cluster_ip_range.to_range.first(2)[1].to_s
247
+ cluster_ip_range = IPAddr.new(self.default_service_subnet)
248
+ cluster_ip_range.to_range.first(2)[1]
252
249
  end
253
250
 
254
251
  def dns_ip
255
- cluster_ip_range = IPAddr.new(self.service_subnet)
256
- cluster_ip_range.to_range.first(11)[10].to_s
252
+ cluster_ip_range = IPAddr.new(self.default_service_subnet)
253
+ cluster_ip_range.to_range.first(11)[10]
254
+ end
255
+
256
+ def default_service_subnet
257
+ self.service_subnet.split(',')[0]
258
+ end
259
+
260
+ def pod_v4subnet
261
+ if ip = self._pod_subnet.find{ |net| net.ipv4? }
262
+ return "#{ip.to_s}/#{ip.prefix}"
263
+ end
264
+ end
265
+ alias enable_ipv4 pod_v4subnet
266
+
267
+ def pod_v6subnet
268
+ if ip = self._pod_subnet.find{ |net| net.ipv6? }
269
+ return "#{ip.to_s}/#{ip.prefix}"
270
+ end
271
+ end
272
+ alias enable_ipv6 pod_v6subnet
273
+
274
+ def _pod_subnet
275
+ self.pod_subnet.split(",").map{|net| IPAddr.new(net)}
257
276
  end
258
277
  end
259
278
  end
@@ -10,13 +10,25 @@ nodes: {}
10
10
 
11
11
  bootstrap: {}
12
12
 
13
- cni:
14
- type: flannel
13
+ addons:
14
+ enabled: [flannel, coredns, metallb, kubelet-rubber-stamp, storage-version-migrator]
15
+
15
16
  flannel:
16
17
  backend: vxlan
18
+ plugin_image_repository: rancher/mirrored-flannelcni-flannel-cni-plugin
19
+ plugin_image_tag: v1.0.1
20
+ daemon_image_repository: rancher/mirrored-flannelcni-flannel
21
+ daemon_image_tag: v0.17.0
22
+ resources:
23
+ requests:
24
+ cpu: "100m"
25
+ memory: "50Mi"
26
+ limits:
27
+ cpu: "100m"
28
+ memory: "50Mi"
29
+
30
+ coredns: {}
17
31
 
18
- lb:
19
- type: metallb
20
32
  metallb:
21
33
  config: |
22
34
  address-pools:
@@ -25,20 +37,26 @@ lb:
25
37
  addresses:
26
38
  - 192.168.1.240-192.168.1.250
27
39
 
40
+ kubelet-rubber-stamp: {}
41
+
42
+ storage-version-migrator: {}
43
+
28
44
  etcd:
29
45
  image_repository: gcr.io/etcd-development/etcd
30
- image_tag: v3.4.3
46
+ image_tag: v3.4.13
31
47
  extra_env: []
32
48
 
33
49
  kubernetes:
34
- kubernetes_version: v1.19.6
50
+ kubernetes_version: v1.22.8
51
+ crictl_version: v1.22.0
35
52
  image_repository: k8s.gcr.io
36
53
 
37
54
  networking:
38
- cni_version: v0.8.2
55
+ cni_version: v1.0.1
39
56
  service_subnet: '10.254.0.0/24'
40
57
  pod_subnet: '10.244.0.0/16'
41
58
  dns_domain: 'cluster.local'
59
+ additional_domains: []
42
60
 
43
61
  apiserver:
44
62
  bind_port: 6443
@@ -2,6 +2,7 @@ module Porkadot; module Install
2
2
  class KubeletList
3
3
  KUBE_TEMP = File.join(Porkadot::Install::KUBE_TEMP, 'kubelet')
4
4
  KUBE_SECRETS_TEMP = File.join(Porkadot::Install::KUBE_TEMP, '.kubelet')
5
+ KUBE_DEFAULT_TEMP = File.join(Porkadot::Install::KUBE_TEMP, '.default')
5
6
  include SSHKit::DSL
6
7
  attr_reader :global_config
7
8
  attr_reader :logger
@@ -40,6 +41,30 @@ module Porkadot; module Install
40
41
  end
41
42
  end
42
43
 
44
+ def setup_default hosts: nil, force: false
45
+ unless hosts
46
+ hosts = []
47
+ self.kubelets.each do |_, v|
48
+ hosts << v
49
+ end
50
+ end
51
+
52
+ on(hosts) do |host|
53
+ execute(:mkdir, '-p', Porkadot::Install::KUBE_TEMP)
54
+ if test("[ -d #{KUBE_TEMP} ]")
55
+ execute(:rm, '-rf', KUBE_TEMP)
56
+ execute(:rm, '-rf', KUBE_SECRETS_TEMP)
57
+ end
58
+ upload! host.global_config.kubelet_default.target_path, KUBE_TEMP, recursive: true
59
+ upload! host.global_config.kubelet_default.target_secrets_path, KUBE_SECRETS_TEMP, recursive: true
60
+ execute(:cp, '-r', KUBE_SECRETS_TEMP + '/*', KUBE_TEMP)
61
+
62
+ as user: 'root' do
63
+ execute(:bash, File.join(KUBE_TEMP, 'install.sh'))
64
+ end
65
+ end
66
+ end
67
+
43
68
  def install hosts: nil, force: false
44
69
  unless hosts
45
70
  hosts = []
@@ -24,9 +24,10 @@ module Porkadot; module Install
24
24
  end
25
25
  upload! config.target_path, KUBE_TEMP, recursive: true
26
26
  upload! config.target_secrets_path, KUBE_SECRETS_TEMP, recursive: true
27
- execute(:cp, '-r', KUBE_SECRETS_TEMP + '/*', KUBE_TEMP)
28
27
 
29
- as user: 'root' do
28
+ # as user: 'root' do
29
+ with KUBECONFIG: File.join(KUBE_SECRETS_TEMP, 'kubeconfig.yaml') do
30
+ execute(:bash, File.join(KUBE_SECRETS_TEMP, 'install.secrets.sh'))
30
31
  execute(:bash, File.join(KUBE_TEMP, 'install.sh'))
31
32
  end
32
33
  end
@@ -1,3 +1,3 @@
1
1
  module Porkadot
2
- VERSION = "0.19.1"
2
+ VERSION = "0.22.2"
3
3
  end
data/lib/porkadot.rb CHANGED
@@ -20,8 +20,7 @@ require 'porkadot/configs/kubernetes'
20
20
  require 'porkadot/configs/etcd'
21
21
  require 'porkadot/configs/bootstrap'
22
22
  require 'porkadot/configs/kubernetes'
23
- require 'porkadot/configs/loadbalancer'
24
- require 'porkadot/configs/cni'
23
+ require 'porkadot/configs/addons'
25
24
 
26
25
  require 'porkadot/assets/certs'
27
26
  require 'porkadot/assets/kubelet'