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,95 @@
1
+
2
+ module Porkadot; module Configs
3
+ class Etcd
4
+ include Porkadot::ConfigUtils
5
+
6
+ def initialize config
7
+ @config = config
8
+ @raw = config.raw.etcd
9
+ end
10
+
11
+ def advertise_client_urls
12
+ urls = []
13
+ config.etcd_nodes.each do |_, v|
14
+ urls += v.advertise_client_urls
15
+ end
16
+ return urls
17
+ end
18
+
19
+ end
20
+
21
+ class EtcdNode
22
+ include Porkadot::ConfigUtils
23
+ include Porkadot::Configs::CertsUtils
24
+ attr_reader :kubelet
25
+ attr_reader :name
26
+
27
+ def initialize config, name, raw
28
+ @config = config
29
+ @kubelet = config.nodes[name]
30
+ @name = name
31
+ @raw = raw || ::Porkadot::Raw.new
32
+ end
33
+
34
+ def member_name
35
+ return (self.raw.labels && self.raw.labels[Porkadot::ETCD_MEMBER_LABEL]) || self.raw.hostname || self.name
36
+ end
37
+
38
+ def member_address
39
+ return (self.raw.labels && self.raw.labels[Porkadot::ETCD_ADDRESS_LABEL]) || self.raw.hostname || self.name
40
+ end
41
+
42
+ def advertise_client_urls
43
+ ["https://#{member_address}:2379"]
44
+ end
45
+
46
+ def advertise_peer_urls
47
+ ["https://#{member_address}:2380"]
48
+ end
49
+
50
+ def listen_client_urls
51
+ self.advertise_client_urls + ["https://127.0.0.1:2379"]
52
+ end
53
+
54
+ def listen_peer_urls
55
+ self.advertise_peer_urls
56
+ end
57
+
58
+ def initial_cluster
59
+ return {}.tap do |rtn|
60
+ self.config.etcd_nodes.each do |_, v|
61
+ rtn[v.member_name] = "https://#{v.member_address}:2380"
62
+ end
63
+ end
64
+ end
65
+
66
+ def additional_sans
67
+ sans = []
68
+ [self.member_name, self.member_address].each do |san|
69
+ if self.ipaddr?(san)
70
+ sans << "IP:#{san}"
71
+ else
72
+ sans << "DNS:#{san}"
73
+ end
74
+ end
75
+ return sans
76
+ end
77
+
78
+ def target_path
79
+ File.join(self.kubelet.addon_path, 'etcd')
80
+ end
81
+
82
+ def ca_crt_path
83
+ File.join(self.target_path, 'ca.crt')
84
+ end
85
+
86
+ def etcd_key_path
87
+ File.join(self.target_path, 'etcd.key')
88
+ end
89
+
90
+ def etcd_crt_path
91
+ File.join(self.target_path, 'etcd.crt')
92
+ end
93
+
94
+ end
95
+ end; end
@@ -0,0 +1,61 @@
1
+ module Porkadot; module Configs
2
+ class Kubelet
3
+ include Porkadot::ConfigUtils
4
+ attr_reader :name
5
+ attr_reader :connection
6
+
7
+ def initialize config, name, raw
8
+ @config = config
9
+ @name = name
10
+ @raw = raw || ::Porkadot::Raw.new
11
+ hostname = @raw.hostname || name
12
+ con = { hostname: hostname }
13
+ gcon = config.connection.to_hash
14
+ lcon = @raw.connection ? @raw.connection.to_hash : {}
15
+ @connection = ::Porkadot::Raw.new(con.rmerge(gcon.rmerge(lcon)))
16
+ end
17
+
18
+ def apiserver?
19
+ self.raw.labels && self.raw.labels.include?(Porkadot::K8S_MASTER_LABEL)
20
+ end
21
+
22
+ def control_plane_endpoint
23
+ (self.raw.kubernetes && self.raw.kubernetes.control_plane_endpoint) || self.config.k8s.control_plane_endpoint
24
+ end
25
+
26
+ def labels_string
27
+ return '' unless self.raw.labels
28
+ return self.raw.labels.map{|v| v.compact.join('=')}.join(',')
29
+ end
30
+
31
+ def taints_string
32
+ return '' unless self.raw.taints
33
+ return self.raw.taints.map{|v| v.compact.join('=')}.join(',')
34
+ end
35
+
36
+ def hostname
37
+ self.raw.hostname || self.name
38
+ end
39
+
40
+ def target_path
41
+ File.join(self.config.assets_dir, 'kubelet', name)
42
+ end
43
+
44
+ def addon_path
45
+ File.join(self.target_path, 'addons')
46
+ end
47
+
48
+ def ca_crt_path
49
+ File.join(self.target_path, 'ca.crt')
50
+ end
51
+
52
+ def bootstrap_key_path
53
+ File.join(self.target_path, 'bootstrap.key')
54
+ end
55
+
56
+ def bootstrap_cert_path
57
+ File.join(self.target_path, 'bootstrap.crt')
58
+ end
59
+ end
60
+ end; end
61
+
@@ -0,0 +1,223 @@
1
+
2
+ module Porkadot; module Configs
3
+ class Kubernetes
4
+ include Porkadot::ConfigUtils
5
+ attr_reader :networking
6
+ attr_reader :proxy
7
+ attr_reader :apiserver
8
+ attr_reader :controller_manager
9
+ attr_reader :scheduler
10
+
11
+ def initialize config
12
+ @config = config
13
+ @raw = config.raw.kubernetes
14
+
15
+ @networking = Networking.new(config)
16
+ @proxy = Proxy.new(config)
17
+ @apiserver = Apiserver.new(config)
18
+ @controller_manager = ControllerManager.new(config)
19
+ @scheduler = Scheduler.new(config)
20
+ end
21
+
22
+ def cluster_name
23
+ self.raw.cluster_name || 'porkadot'
24
+ end
25
+
26
+ def target_path
27
+ File.join(self.config.assets_dir, 'kubernetes')
28
+ end
29
+
30
+ def manifests_path
31
+ File.join(self.target_path, 'manifests')
32
+ end
33
+
34
+ def control_plane_endpoint_host_and_port
35
+ endpoint = self.config.k8s.control_plane_endpoint
36
+ raise "kubernetes.control_plane_endpoint should not be nil" unless endpoint
37
+ index = endpoint.rindex(':')
38
+ return [endpoint[0, index], endpoint[index+1, 6]]
39
+ end
40
+
41
+ module Component
42
+ RECOMMENDED_LABEL_PREFIX = 'app.kubernetes.io'
43
+ def labels
44
+ self.instance_labels.merge({
45
+ "#{RECOMMENDED_LABEL_PREFIX}/name": self.component_name,
46
+ "#{RECOMMENDED_LABEL_PREFIX}/component": self.component_name,
47
+ "#{RECOMMENDED_LABEL_PREFIX}/instance": "#{self.component_name}-porkadot",
48
+ "#{RECOMMENDED_LABEL_PREFIX}/version": self.config.k8s.kubernetes_version,
49
+ "#{RECOMMENDED_LABEL_PREFIX}/part-of": 'kubernetes',
50
+ "#{RECOMMENDED_LABEL_PREFIX}/managed-by": 'porkadot',
51
+ })
52
+ end
53
+
54
+ def instance_labels
55
+ {
56
+
57
+ "#{RECOMMENDED_LABEL_PREFIX}/component": self.component_name,
58
+ "#{RECOMMENDED_LABEL_PREFIX}/instance": "#{self.component_name}-porkadot",
59
+ "#{RECOMMENDED_LABEL_PREFIX}/managed-by": 'porkadot',
60
+ }
61
+ end
62
+
63
+ def args
64
+ extra = {}
65
+ if self.extra_args
66
+ extra = self.extra_args.map{|i| i.split('=', 2)}.to_h
67
+ end
68
+ return self.default_args.merge(extra)
69
+ end
70
+
71
+ def log_level
72
+ config.kubernetes.log_level || raw.log_level || 2
73
+ end
74
+
75
+ end
76
+
77
+ class Apiserver
78
+ include Porkadot::ConfigUtils
79
+ include Component
80
+
81
+ def initialize config
82
+ @config = config
83
+ @raw = config.raw.kubernetes.apiserver
84
+ end
85
+
86
+ def component_name
87
+ 'kube-apiserver'
88
+ end
89
+
90
+ def default_args
91
+ return %W(
92
+ --advertise-address=$(POD_IP)
93
+ --allow-privileged=true
94
+ --authorization-mode=Node,RBAC
95
+ --bind-address=0.0.0.0
96
+ --client-ca-file=/etc/kubernetes/pki/kubernetes/ca.crt
97
+ --enable-bootstrap-token-auth=true
98
+ --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
99
+ --etcd-certfile=/etc/kubernetes/pki/etcd/etcd-client.crt
100
+ --etcd-keyfile=/etc/kubernetes/pki/etcd/etcd-client.key
101
+ --etcd-servers=#{config.etcd.advertise_client_urls.join(',')}
102
+ --kubelet-certificate-authority=/etc/kubernetes/pki/kubernetes/ca.crt
103
+ --kubelet-client-certificate=/etc/kubernetes/pki/kubernetes/kubelet-client.crt
104
+ --kubelet-client-key=/etc/kubernetes/pki/kubernetes/kubelet-client.key
105
+ --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
106
+ --proxy-client-cert-file=/etc/kubernetes/pki/kubernetes/front-proxy-client.crt
107
+ --proxy-client-key-file=/etc/kubernetes/pki/kubernetes/front-proxy-client.key
108
+ --requestheader-allowed-names=aggregator-client
109
+ --requestheader-client-ca-file=/etc/kubernetes/pki/kubernetes/front-proxy-ca.crt
110
+ --requestheader-extra-headers-prefix=X-Remote-Extra-
111
+ --requestheader-group-headers=X-Remote-Group
112
+ --requestheader-username-headers=X-Remote-User
113
+ --secure-port=#{self.bind_port}
114
+ --service-account-key-file=/etc/kubernetes/pki/kubernetes/sa.pub
115
+ --service-cluster-ip-range=#{config.k8s.networking.service_subnet}
116
+ --storage-backend=etcd3
117
+ --tls-cert-file=/etc/kubernetes/pki/kubernetes/apiserver.crt
118
+ --tls-private-key-file=/etc/kubernetes/pki/kubernetes/apiserver.key
119
+ --v=#{self.log_level}
120
+ ).map {|i| i.split('=', 2)}.to_h
121
+ end
122
+ end
123
+
124
+ class Scheduler
125
+ include Porkadot::ConfigUtils
126
+ include Component
127
+
128
+ def initialize config
129
+ @config = config
130
+ @raw = config.raw.kubernetes.scheduler
131
+ end
132
+
133
+ def component_name
134
+ 'kube-scheduler'
135
+ end
136
+
137
+ def default_args
138
+ return %W(
139
+ --leader-elect=true
140
+ --v=#{self.log_level}
141
+ ).map {|i| i.split('=', 2)}.to_h
142
+ end
143
+ end
144
+
145
+ class ControllerManager
146
+ include Porkadot::ConfigUtils
147
+ include Component
148
+
149
+ def initialize config
150
+ @config = config
151
+ @raw = config.raw.kubernetes.controller_manager
152
+ end
153
+
154
+ def component_name
155
+ 'kube-controller-manager'
156
+ end
157
+
158
+ def default_args
159
+ return %W(
160
+ --allocate-node-cidrs=true
161
+ --cluster-cidr=#{config.k8s.networking.pod_subnet}
162
+ --cluster-signing-cert-file=/etc/kubernetes/pki/kubernetes/ca.crt
163
+ --cluster-signing-key-file=/etc/kubernetes/pki/kubernetes/ca.key
164
+ --controllers=*,bootstrapsigner,tokencleaner
165
+ --leader-elect=true
166
+ --node-cidr-mask-size=24
167
+ --root-ca-file=/etc/kubernetes/pki/kubernetes/ca.crt
168
+ --service-account-private-key-file=/etc/kubernetes/pki/kubernetes/sa.key
169
+ --use-service-account-credentials=true
170
+ --v=#{self.log_level}
171
+ ).map {|i| i.split('=', 2)}.to_h
172
+ end
173
+ end
174
+
175
+ class Proxy
176
+ include Porkadot::ConfigUtils
177
+ include Component
178
+
179
+ def initialize config
180
+ @config = config
181
+ @raw = config.raw.kubernetes.proxy
182
+ end
183
+
184
+ def proxy_config kubeconfig=nil
185
+ self.raw.config['clusterCIDR'] = config.k8s.networking.pod_subnet
186
+ if kubeconfig
187
+ self.raw.config['clientConnection']['kubeconfig'] = kubeconfig
188
+ end
189
+ self.raw.config.to_hash.to_yaml
190
+ end
191
+
192
+ def component_name
193
+ 'kube-proxy'
194
+ end
195
+
196
+ def default_args
197
+ return %W(
198
+ --config=/var/lib/kube-proxy/config.conf
199
+ --hostname-override=$(NODE_NAME)
200
+ ).map {|i| i.split('=', 2)}.to_h
201
+ end
202
+ end
203
+
204
+ class Networking
205
+ include Porkadot::ConfigUtils
206
+
207
+ def initialize config
208
+ @config = config
209
+ @raw = config.raw.kubernetes.networking
210
+ end
211
+
212
+ def kubernetes_ip
213
+ cluster_ip_range = IPAddr.new(self.service_subnet)
214
+ cluster_ip_range.to_range.first(2)[1].to_s
215
+ end
216
+
217
+ def dns_ip
218
+ cluster_ip_range = IPAddr.new(self.service_subnet)
219
+ cluster_ip_range.to_range.first(11)[10].to_s
220
+ end
221
+ end
222
+ end
223
+ end; end
@@ -0,0 +1,26 @@
1
+
2
+ module Porkadot; module Configs
3
+ class Lb
4
+ include Porkadot::ConfigUtils
5
+ attr_reader :type
6
+
7
+ def initialize config
8
+ @config = config
9
+ @type = config.raw.lb.type
10
+ @raw = config.raw.lb.send(config.raw.lb.type.to_sym)
11
+ end
12
+
13
+ def target_path
14
+ File.join(self.config.assets_dir, 'kubernetes')
15
+ end
16
+
17
+ def manifests_path
18
+ File.join(self.target_path, 'manifests')
19
+ end
20
+
21
+ def lb_config
22
+ return self.raw.config
23
+ end
24
+
25
+ end
26
+ end; end
@@ -0,0 +1,8 @@
1
+
2
+ module Porkadot
3
+ ROOT = File.expand_path("../..", __FILE__)
4
+
5
+ K8S_MASTER_LABEL = "k8s.unstable.cloud/master"
6
+ ETCD_MEMBER_LABEL = "etcd.unstable.cloud/member"
7
+ ETCD_ADDRESS_LABEL = "etcd.unstable.cloud/address"
8
+ end
@@ -0,0 +1,123 @@
1
+ local:
2
+ assets_dir: ./assets
3
+
4
+ connection:
5
+ user: ubuntu
6
+ port: 22
7
+ keys: ["~/.ssh/id_rsa", "~/.ssh/id_dsa"]
8
+
9
+ nodes: {}
10
+
11
+ bootstrap: {}
12
+
13
+ cni:
14
+ type: flannel
15
+ flannel:
16
+ backend: vxlan
17
+
18
+ lb:
19
+ type: metallb
20
+ metallb:
21
+ config: |
22
+ address-pools:
23
+ - name: default
24
+ protocol: layer2
25
+ addresses:
26
+ - 192.168.1.240-192.168.1.250
27
+
28
+ etcd:
29
+ image_repository: gcr.io/etcd-development/etcd
30
+ image_tag: v3.3.10
31
+
32
+ kubernetes:
33
+ kubernetes_version: v1.17.3
34
+ image_repository: k8s.gcr.io
35
+
36
+ networking:
37
+ cni_version: v0.8.2
38
+ service_subnet: '10.254.0.0/24'
39
+ pod_subnet: '10.244.0.0/16'
40
+ dns_domain: 'cluster.local'
41
+
42
+ apiserver:
43
+ bind_port: 6443
44
+
45
+ scheduler: {}
46
+
47
+ controller_manager: {}
48
+
49
+ proxy:
50
+ config:
51
+ apiVersion: kubeproxy.config.k8s.io/v1alpha1
52
+ kind: KubeProxyConfiguration
53
+ bindAddress: 0.0.0.0
54
+ clientConnection:
55
+ acceptContentTypes: ""
56
+ burst: 10
57
+ contentType: application/vnd.kubernetes.protobuf
58
+ kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
59
+ qps: 5
60
+ # clusterCIDR: ${KUBE_CLUSTER_CIDR} # will be dynamically set
61
+ configSyncPeriod: 15m0s
62
+ conntrack:
63
+ maxPerCore: 32768
64
+ min: 131072
65
+ tcpCloseWaitTimeout: 1h0m0s
66
+ tcpEstablishedTimeout: 24h0m0s
67
+ enableProfiling: false
68
+ healthzBindAddress: 0.0.0.0:10256
69
+ hostnameOverride: ""
70
+ iptables:
71
+ masqueradeAll: false
72
+ masqueradeBit: 14
73
+ minSyncPeriod: 0s
74
+ syncPeriod: 30s
75
+ ipvs:
76
+ excludeCIDRs: null
77
+ minSyncPeriod: 0s
78
+ scheduler: ""
79
+ syncPeriod: 30s
80
+ metricsBindAddress: 127.0.0.1:10249
81
+ mode: "iptables"
82
+ nodePortAddresses: null
83
+ oomScoreAdj: -999
84
+ portRange: ""
85
+ udpIdleTimeout: 250ms
86
+
87
+ kubelet:
88
+ config:
89
+ apiVersion: kubelet.config.k8s.io/v1beta1
90
+ kind: KubeletConfiguration
91
+ authentication:
92
+ anonymous:
93
+ enabled: false
94
+ webhook:
95
+ cacheTTL: 0s
96
+ enabled: true
97
+ x509:
98
+ clientCAFile: /etc/kubernetes/pki/ca.crt
99
+ authorization:
100
+ mode: Webhook
101
+ webhook:
102
+ cacheAuthorizedTTL: 0s
103
+ cacheUnauthorizedTTL: 0s
104
+ cgroupDriver: cgroupfs
105
+ clusterDNS: []
106
+ clusterDomain: cluster.local
107
+ cpuManagerReconcilePeriod: 0s
108
+ evictionPressureTransitionPeriod: 0s
109
+ fileCheckFrequency: 0s
110
+ healthzBindAddress: 127.0.0.1
111
+ healthzPort: 10248
112
+ httpCheckFrequency: 0s
113
+ imageMinimumGCAge: 0s
114
+ nodeStatusReportFrequency: 0s
115
+ nodeStatusUpdateFrequency: 0s
116
+ resolvConf: /run/systemd/resolve/resolv.conf
117
+ rotateCertificates: true
118
+ runtimeRequestTimeout: 0s
119
+ serverTLSBootstrap: true
120
+ staticPodPath: /etc/kubernetes/manifests
121
+ streamingConnectionIdleTimeout: 0s
122
+ syncFrequency: 0s
123
+ volumeStatsAggPeriod: 0s
@@ -0,0 +1,5 @@
1
+ require 'sshkit/dsl'
2
+
3
+ module Porkadot; module Install
4
+ KUBE_TEMP = './kube_temp'
5
+ end; end
@@ -0,0 +1,76 @@
1
+ module Porkadot; module Install
2
+ class Bootstrap
3
+ KUBE_TEMP = File.join(Porkadot::Install::KUBE_TEMP, 'bootstrap')
4
+ include SSHKit::DSL
5
+ attr_reader :global_config
6
+ attr_reader :config
7
+ attr_reader :logger
8
+ attr_reader :host
9
+
10
+ def initialize global_config
11
+ @global_config = global_config
12
+ @config = global_config.bootstrap
13
+ @logger = global_config.logger
14
+ @host = Porkadot::Install::Kubelet.new(self.config.kubelet_config)
15
+ end
16
+
17
+ def install
18
+ global_config = self.global_config
19
+ config = self.config
20
+ on(host) do |host|
21
+ execute(:mkdir, '-p', Porkadot::Install::KUBE_TEMP)
22
+ if test("[ -d #{KUBE_TEMP} ]")
23
+ execute(:rm, '-rf', KUBE_TEMP)
24
+ end
25
+ upload! config.target_path, KUBE_TEMP, recursive: true
26
+
27
+ as user: 'root' do
28
+ execute(:bash, File.join(KUBE_TEMP, 'install.sh'))
29
+ end
30
+
31
+ endpoint = "https://127.0.0.1:#{global_config.k8s.apiserver.bind_port}/healthz"
32
+ info "Start to wait for Bootstrapping Kubernetes API: #{endpoint}"
33
+ while !test('curl', '-skf', endpoint)
34
+ info "Still wating for Bootstrapping Kubernetes API..."
35
+ sleep 5
36
+ end
37
+ end
38
+ end
39
+
40
+ def cleanup
41
+ global_config = self.global_config
42
+ config = self.config
43
+ on(host) do |host|
44
+ execute(:mkdir, '-p', Porkadot::Install::KUBE_TEMP)
45
+ if test("[ -d #{KUBE_TEMP} ]")
46
+ execute(:rm, '-rf', KUBE_TEMP)
47
+ end
48
+ upload! config.target_path, KUBE_TEMP, recursive: true
49
+
50
+ global_config.nodes.each do |k, node|
51
+ if node.apiserver?
52
+ endpoint = "https://#{node.hostname}:#{global_config.k8s.apiserver.bind_port}/healthz"
53
+ info "Start to wait api node #{node.hostname}"
54
+ while !test('curl', '-skf', endpoint)
55
+ info "Still waiting for API node: #{node.hostname}"
56
+ sleep 5
57
+ end
58
+ end
59
+ end
60
+
61
+ endpoint = "https://#{global_config.k8s.control_plane_endpoint}/healthz"
62
+ info "Start to wait api endpoint"
63
+ while !test('curl', '-skf', endpoint)
64
+ info "Still waiting for API: #{endpoint}"
65
+ sleep 5
66
+ end
67
+
68
+ as user: 'root' do
69
+ execute(:bash, File.join(KUBE_TEMP, 'cleanup.sh'))
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+
76
+ end; end
@@ -0,0 +1,63 @@
1
+ module Porkadot; module Install
2
+ class KubeletList
3
+ KUBE_TEMP = File.join(Porkadot::Install::KUBE_TEMP, 'kubelet')
4
+ include SSHKit::DSL
5
+ attr_reader :global_config
6
+ attr_reader :logger
7
+ attr_reader :kubelets
8
+
9
+ def initialize global_config
10
+ @global_config = global_config
11
+ @logger = global_config.logger
12
+ @kubelets = {}
13
+ global_config.nodes.each do |k, config|
14
+ @kubelets[k] = Kubelet.new(config)
15
+ end
16
+ end
17
+
18
+ def install hosts: nil, force: false
19
+ unless hosts
20
+ hosts = []
21
+ self.kubelets.each do |_, v|
22
+ hosts << v
23
+ end
24
+ end
25
+
26
+ on(hosts) do |host|
27
+ execute(:mkdir, '-p', Porkadot::Install::KUBE_TEMP)
28
+ if test("[ -d #{KUBE_TEMP} ]")
29
+ execute(:rm, '-rf', KUBE_TEMP)
30
+ end
31
+ upload! host.config.target_path, KUBE_TEMP, recursive: true
32
+
33
+ as user: 'root' do
34
+ unless test("[ -f /opt/bin/kubelet-#{host.global_config.k8s.kubernetes_version} ]") && !force
35
+ execute(:bash, File.join(KUBE_TEMP, 'install-deps.sh'))
36
+ end
37
+ execute(:bash, File.join(KUBE_TEMP, 'install-pkgs.sh'))
38
+ execute(:bash, File.join(KUBE_TEMP, 'install.sh'))
39
+ end
40
+ end
41
+ end
42
+
43
+ def [](name)
44
+ self.kubelets[name]
45
+ end
46
+ end
47
+
48
+ class Kubelet < SSHKit::Host
49
+ attr_reader :global_config
50
+ attr_reader :config
51
+ attr_reader :logger
52
+ attr_reader :connection
53
+
54
+ def initialize config
55
+ @config = config
56
+ @logger = config.logger
57
+ @global_config = config.config
58
+ @connection = config.connection.to_hash(symbolize_keys: true)
59
+ super(@connection)
60
+ end
61
+
62
+ end
63
+ end; end