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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/Vagrantfile +63 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/porkadot.yaml +25 -0
- data/config/unstable.yaml +49 -0
- data/exe/porkadot +5 -0
- data/lib/porkadot/assets/bootstrap/bootstrap/kube-proxy-bootstrap.yaml.erb +1 -0
- data/lib/porkadot/assets/bootstrap/bootstrap/kubeconfig-bootstrap.yaml.erb +18 -0
- data/lib/porkadot/assets/bootstrap/cleanup.sh.erb +12 -0
- data/lib/porkadot/assets/bootstrap/install.sh.erb +14 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-apiserver.bootstrap.yaml.erb +91 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-controller-manager.bootstrap.yaml.erb +69 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-proxy.bootstrap.yaml.erb +56 -0
- data/lib/porkadot/assets/bootstrap/manifests/kube-scheduler.bootstrap.yaml.erb +31 -0
- data/lib/porkadot/assets/bootstrap.rb +52 -0
- data/lib/porkadot/assets/certs/etcd.rb +21 -0
- data/lib/porkadot/assets/certs/front_proxy.rb +21 -0
- data/lib/porkadot/assets/certs/k8s.rb +90 -0
- data/lib/porkadot/assets/certs.rb +175 -0
- data/lib/porkadot/assets/etcd/etcd-server.yaml.erb +57 -0
- data/lib/porkadot/assets/etcd/install.sh.erb +12 -0
- data/lib/porkadot/assets/etcd.rb +109 -0
- data/lib/porkadot/assets/kubelet/bootstrap-kubelet.conf.erb +21 -0
- data/lib/porkadot/assets/kubelet/config.yaml.erb +36 -0
- data/lib/porkadot/assets/kubelet/install-deps.sh.erb +21 -0
- data/lib/porkadot/assets/kubelet/install-pkgs.sh.erb +33 -0
- data/lib/porkadot/assets/kubelet/install.sh.erb +35 -0
- data/lib/porkadot/assets/kubelet/kubelet.service.erb +22 -0
- data/lib/porkadot/assets/kubelet.rb +102 -0
- data/lib/porkadot/assets/kubernetes/install.sh.erb +7 -0
- data/lib/porkadot/assets/kubernetes/manifests/flannel.yaml.erb +602 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-apiserver.yaml.erb +129 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-controller-manager.yaml.erb +173 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-proxy.yaml.erb +132 -0
- data/lib/porkadot/assets/kubernetes/manifests/kube-scheduler.yaml.erb +162 -0
- data/lib/porkadot/assets/kubernetes/manifests/kubelet-rubber-stamp.yaml.erb +86 -0
- data/lib/porkadot/assets/kubernetes/manifests/kubelet.yaml.erb +40 -0
- data/lib/porkadot/assets/kubernetes/manifests/metallb.yaml.erb +323 -0
- data/lib/porkadot/assets/kubernetes/manifests/pod-checkpointer.yaml.erb +130 -0
- data/lib/porkadot/assets/kubernetes/manifests/porkadot.yaml.erb +69 -0
- data/lib/porkadot/assets/kubernetes.rb +39 -0
- data/lib/porkadot/assets.rb +24 -0
- data/lib/porkadot/cmd/cli.rb +45 -0
- data/lib/porkadot/cmd/install/bootstrap.rb +50 -0
- data/lib/porkadot/cmd/install.rb +36 -0
- data/lib/porkadot/cmd/render/certs.rb +68 -0
- data/lib/porkadot/cmd/render.rb +67 -0
- data/lib/porkadot/cmd.rb +4 -0
- data/lib/porkadot/config.rb +115 -0
- data/lib/porkadot/configs/bootstrap.rb +67 -0
- data/lib/porkadot/configs/certs/etcd.rb +33 -0
- data/lib/porkadot/configs/certs/front_proxy.rb +33 -0
- data/lib/porkadot/configs/certs/k8s.rb +89 -0
- data/lib/porkadot/configs/certs.rb +50 -0
- data/lib/porkadot/configs/cni.rb +22 -0
- data/lib/porkadot/configs/etcd.rb +95 -0
- data/lib/porkadot/configs/kubelet.rb +61 -0
- data/lib/porkadot/configs/kubernetes.rb +223 -0
- data/lib/porkadot/configs/loadbalancer.rb +26 -0
- data/lib/porkadot/const.rb +8 -0
- data/lib/porkadot/default.yaml +123 -0
- data/lib/porkadot/install/base.rb +5 -0
- data/lib/porkadot/install/bootstrap.rb +76 -0
- data/lib/porkadot/install/kubelet.rb +63 -0
- data/lib/porkadot/install/kubernetes.rb +33 -0
- data/lib/porkadot/utils/hash_recursive_merge.rb +73 -0
- data/lib/porkadot/utils.rb +25 -0
- data/lib/porkadot/version.rb +3 -0
- data/lib/porkadot.rb +41 -0
- data/porkadot.gemspec +42 -0
- metadata +205 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Cmd; module Install; module Bootstrap
|
3
|
+
class Cli < Porkadot::SubCommandBase
|
4
|
+
include Porkadot::Utils
|
5
|
+
|
6
|
+
def initialize(*arg)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
default_task :all
|
11
|
+
desc "all", "Install all bootstrap components"
|
12
|
+
def all
|
13
|
+
invoke :node
|
14
|
+
invoke :kubernetes
|
15
|
+
invoke :cleanup
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "node", "Install bootstrap node"
|
19
|
+
def node
|
20
|
+
logger.info "Installing bootstrap node"
|
21
|
+
bootstrap = Porkadot::Install::Bootstrap.new(self.config)
|
22
|
+
kubelets = Porkadot::Install::KubeletList.new(self.config)
|
23
|
+
kubelets.install hosts: [bootstrap.host]
|
24
|
+
bootstrap.install
|
25
|
+
""
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "kubernetes", "Install bootstrap kubernetes"
|
29
|
+
def kubernetes
|
30
|
+
logger.info "Installing bootstrap kubernetes"
|
31
|
+
bootstrap = Porkadot::Install::Bootstrap.new(self.config)
|
32
|
+
k8s = Porkadot::Install::Kubernetes.new(self.config)
|
33
|
+
k8s.install(bootstrap.host)
|
34
|
+
""
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "cleanup", "Cleanup bootstrap node"
|
38
|
+
def cleanup
|
39
|
+
logger.info "Cleanup bootstrap node"
|
40
|
+
bootstrap = Porkadot::Install::Bootstrap.new(self.config)
|
41
|
+
bootstrap.cleanup
|
42
|
+
""
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.subcommand_prefix
|
46
|
+
'install bootstrap'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end; end; end; end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Cmd; module Install
|
3
|
+
class Cli < Porkadot::SubCommandBase
|
4
|
+
include Porkadot::Utils
|
5
|
+
|
6
|
+
default_task :all
|
7
|
+
desc "all", "Install Kubernetes cluster"
|
8
|
+
def all
|
9
|
+
invoke :kubelet, [], options
|
10
|
+
invoke :bootstrap, [], options
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "kubelet", "Install kubelet to nodes"
|
14
|
+
option :node, type: :string
|
15
|
+
option :force, type: :boolean, default: false
|
16
|
+
def kubelet
|
17
|
+
logger.info "Installing kubelet"
|
18
|
+
kubelets = Porkadot::Install::KubeletList.new(self.config)
|
19
|
+
nodes = []
|
20
|
+
if node = options[:node]
|
21
|
+
nodes = kubelets[node]
|
22
|
+
else
|
23
|
+
nodes = kubelets.kubelets.values
|
24
|
+
end
|
25
|
+
kubelets.install hosts: nodes, force: options[:force]
|
26
|
+
""
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "bootstrap", "Install bootstrap components"
|
30
|
+
subcommand "bootstrap", Porkadot::Cmd::Install::Bootstrap::Cli
|
31
|
+
|
32
|
+
def self.subcommand_prefix
|
33
|
+
'install'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end; end; end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Porkadot; module Cmd; module Render; module Certs
|
4
|
+
class Cli < Porkadot::SubCommandBase
|
5
|
+
include Porkadot::Utils
|
6
|
+
|
7
|
+
def initialize(*arg)
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
default_task :all
|
12
|
+
desc "all", "Render all certificates to deploy Kubernetes cluster"
|
13
|
+
def all
|
14
|
+
invoke :etcd
|
15
|
+
invoke :kubernetes
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'etcd', "Render certificates to deploy Etcd"
|
19
|
+
def etcd
|
20
|
+
logger.info "Generating etcd certificates"
|
21
|
+
certs = Porkadot::Assets::Certs.new(config).etcd
|
22
|
+
logger.info "--> CA key and certs"
|
23
|
+
certs.ca_key
|
24
|
+
certs.ca_cert(true)
|
25
|
+
logger.info "--> Client key and certs"
|
26
|
+
certs.client_key
|
27
|
+
certs.client_cert(true)
|
28
|
+
''
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'kubernetes', "Render certificates to deploy Kubernetes"
|
32
|
+
def kubernetes
|
33
|
+
logger.info "Generating kubernetes certificates"
|
34
|
+
certs = Porkadot::Assets::Certs.new(config).kubernetes
|
35
|
+
logger.info "--> CA key and certs"
|
36
|
+
certs.ca_key
|
37
|
+
certs.ca_cert(true)
|
38
|
+
logger.info "--> API server key and certs"
|
39
|
+
certs.apiserver_key
|
40
|
+
certs.apiserver_cert(true)
|
41
|
+
logger.info "--> Kubelet client key and certs"
|
42
|
+
certs.kubelet_client_key
|
43
|
+
certs.kubelet_client_cert
|
44
|
+
# logger.info "--> Bootstrap client key and certs"
|
45
|
+
# bootstrap_client_key = self.private_key(self.assets.k8s_bootstrap_key_path)
|
46
|
+
# self.client_cert(self.assets.k8s_bootstrap_cert_path, '/O=porkadot:node-bootstrappers/CN=node-bootstrapper', bootstrap_client_key, ca_cert, ca_key)
|
47
|
+
logger.info "--> Admin client key and certs"
|
48
|
+
certs.client_key
|
49
|
+
certs.client_cert(true)
|
50
|
+
logger.info "--> Private key for signing service account tokens"
|
51
|
+
certs.sa_private_key
|
52
|
+
certs.sa_public_key
|
53
|
+
|
54
|
+
front_proxy_certs = Porkadot::Assets::Certs.new(config).front_proxy
|
55
|
+
logger.info "--> Front-proxy CA key and certs"
|
56
|
+
front_proxy_certs.ca_key
|
57
|
+
front_proxy_certs.ca_cert(true)
|
58
|
+
logger.info "--> Front-proxy client key and certs"
|
59
|
+
front_proxy_certs.client_key
|
60
|
+
front_proxy_certs.client_cert(true)
|
61
|
+
''
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.subcommand_prefix
|
65
|
+
'render certs'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end; end; end; end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Cmd; module Render
|
3
|
+
class Cli < Porkadot::SubCommandBase
|
4
|
+
include Porkadot::Utils
|
5
|
+
|
6
|
+
default_task :all
|
7
|
+
desc "all", "Render all assets to deploy Kubernetes cluster"
|
8
|
+
def all
|
9
|
+
invoke "porkadot:cmd:render:certs:cli:all", [], options
|
10
|
+
invoke :kubelet, [], options
|
11
|
+
invoke :etcd, [], options
|
12
|
+
invoke :bootstrap, [], options
|
13
|
+
invoke :kubernetes, [], options
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "certs", "Render certificates to deploy Kubernetes"
|
17
|
+
subcommand "certs", Porkadot::Cmd::Render::Certs::Cli
|
18
|
+
|
19
|
+
desc "kubelet", "Render kubelet related files"
|
20
|
+
option :node, type: :string
|
21
|
+
def kubelet
|
22
|
+
logger.info "Generating kubelet related files"
|
23
|
+
kubelets = Porkadot::Assets::KubeletList.new(self.config)
|
24
|
+
if node = options[:node]
|
25
|
+
kubelets[node].render
|
26
|
+
else
|
27
|
+
kubelets.render
|
28
|
+
end
|
29
|
+
""
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "etcd", "Render etcd related files"
|
33
|
+
option :node, type: :string
|
34
|
+
def etcd
|
35
|
+
logger.info "Generating etcd related files"
|
36
|
+
etcds = Porkadot::Assets::EtcdList.new(self.config)
|
37
|
+
if node = options[:node]
|
38
|
+
etcds[node].render
|
39
|
+
else
|
40
|
+
etcds.render
|
41
|
+
end
|
42
|
+
""
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "bootstrap", "Render bootstrap related files"
|
46
|
+
def bootstrap
|
47
|
+
logger.info "Generating bootstrap related files"
|
48
|
+
bootstrap = Porkadot::Assets::Bootstrap.new(self.config)
|
49
|
+
kubelet = Porkadot::Assets::Kubelet.new(self.config.bootstrap.kubelet_config)
|
50
|
+
kubelet.render
|
51
|
+
bootstrap.render
|
52
|
+
""
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "kubernetes", "Render kubernetes manifests"
|
56
|
+
def kubernetes
|
57
|
+
logger.info "Generating kubernetes manifests"
|
58
|
+
k8s = Porkadot::Assets::Kubernetes.new(self.config)
|
59
|
+
k8s.render
|
60
|
+
""
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.subcommand_prefix
|
64
|
+
'render'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end; end; end
|
data/lib/porkadot/cmd.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'hashie'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Porkadot
|
6
|
+
class Raw < ::Hashie::Mash
|
7
|
+
disable_warnings :keys, :min
|
8
|
+
end
|
9
|
+
|
10
|
+
class Config
|
11
|
+
attr_reader :raw
|
12
|
+
attr_reader :logger
|
13
|
+
|
14
|
+
def initialize path
|
15
|
+
default_config = {}
|
16
|
+
open(File.expand_path(File.join(Porkadot::ROOT, 'porkadot', 'default.yaml'))) do |io|
|
17
|
+
default_config = YAML::load(io)
|
18
|
+
end
|
19
|
+
open(File.expand_path(path)) do |io|
|
20
|
+
@raw = ::Porkadot::Raw.new(default_config.rmerge(YAML.load(io)))
|
21
|
+
end
|
22
|
+
@logger = Logger.new(STDOUT)
|
23
|
+
end
|
24
|
+
|
25
|
+
def certs
|
26
|
+
@certs ||= Porkadot::Configs::Certs.new(self)
|
27
|
+
return @certs
|
28
|
+
end
|
29
|
+
|
30
|
+
def connection
|
31
|
+
self.raw.connection
|
32
|
+
end
|
33
|
+
|
34
|
+
def lb
|
35
|
+
@lb ||= Porkadot::Configs::Lb.new(self)
|
36
|
+
return @lb
|
37
|
+
end
|
38
|
+
|
39
|
+
def cni
|
40
|
+
@cni ||= Porkadot::Configs::Cni.new(self)
|
41
|
+
return @cni
|
42
|
+
end
|
43
|
+
|
44
|
+
def bootstrap
|
45
|
+
@bootstrap ||= Porkadot::Configs::Bootstrap.new(self)
|
46
|
+
return @bootstrap
|
47
|
+
end
|
48
|
+
|
49
|
+
def kubernetes
|
50
|
+
@kubernetes ||= Porkadot::Configs::Kubernetes.new(self)
|
51
|
+
return @kubernetes
|
52
|
+
end
|
53
|
+
alias k8s kubernetes
|
54
|
+
|
55
|
+
def etcd
|
56
|
+
@etcd ||= Porkadot::Configs::Etcd.new(self)
|
57
|
+
return @etcd
|
58
|
+
end
|
59
|
+
|
60
|
+
def nodes
|
61
|
+
@nodes ||= {}.tap do |nodes|
|
62
|
+
self.raw.nodes.each do |k, v|
|
63
|
+
nodes[k] = Porkadot::Configs::Kubelet.new(self, k, v)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return @nodes
|
67
|
+
end
|
68
|
+
|
69
|
+
def etcd_nodes
|
70
|
+
@etcd_nodes ||= {}.tap do |nodes|
|
71
|
+
self.raw.nodes.each do |k, v|
|
72
|
+
if v && v.labels && v.labels.to_hash.keys.include?(Porkadot::ETCD_MEMBER_LABEL)
|
73
|
+
nodes[k] = Porkadot::Configs::EtcdNode.new(self, k, v)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
return @etcd_nodes
|
78
|
+
end
|
79
|
+
|
80
|
+
def assets_dir
|
81
|
+
File.expand_path(raw.local.assets_dir)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
module ConfigUtils
|
87
|
+
|
88
|
+
def config
|
89
|
+
return @config
|
90
|
+
end
|
91
|
+
|
92
|
+
def logger
|
93
|
+
return @config.logger
|
94
|
+
end
|
95
|
+
|
96
|
+
def raw
|
97
|
+
return @raw
|
98
|
+
end
|
99
|
+
|
100
|
+
def asset_path file
|
101
|
+
File.join(self.target_path, file.to_s)
|
102
|
+
end
|
103
|
+
alias path asset_path
|
104
|
+
|
105
|
+
def method_missing name, *args
|
106
|
+
return nil if self.raw.nil?
|
107
|
+
self.raw[name]
|
108
|
+
end
|
109
|
+
|
110
|
+
def respond_to_missing? sym, include_private
|
111
|
+
return false if self.raw.nil?
|
112
|
+
self.raw.respond_to_missing?(sym, include_private) ? true : super
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Configs
|
3
|
+
class Bootstrap
|
4
|
+
class Kubelet < Porkadot::Configs::Kubelet
|
5
|
+
attr_reader :bootstrap_config
|
6
|
+
def initialize bootstrap_config
|
7
|
+
@bootstrap_config = bootstrap_config
|
8
|
+
# TODO: specify default node
|
9
|
+
super bootstrap_config.config, 'bootstrap', bootstrap_config.raw.node
|
10
|
+
end
|
11
|
+
|
12
|
+
def control_plane_endpoint
|
13
|
+
"127.0.0.1:#{bootstrap_config.config.k8s.apiserver.bind_port}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def target_path
|
17
|
+
File.join(bootstrap_config.target_path, 'kubelet')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
include Porkadot::ConfigUtils
|
22
|
+
attr_reader :kubelet_config
|
23
|
+
|
24
|
+
def initialize config
|
25
|
+
@config = config
|
26
|
+
@raw = config.raw.bootstrap
|
27
|
+
@kubelet_config = Kubelet.new(self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def target_path
|
31
|
+
File.join(self.config.assets_dir, 'bootstrap')
|
32
|
+
end
|
33
|
+
|
34
|
+
def bootstrap_path
|
35
|
+
File.join(self.target_path, 'bootstrap')
|
36
|
+
end
|
37
|
+
|
38
|
+
def secrets_path
|
39
|
+
File.join(self.bootstrap_path, 'secrets')
|
40
|
+
end
|
41
|
+
|
42
|
+
def kubeconfig_path
|
43
|
+
File.join(self.bootstrap_path, 'kubeconfig-bootstrap.yaml')
|
44
|
+
end
|
45
|
+
|
46
|
+
def manifests_path
|
47
|
+
File.join(self.target_path, 'manifests')
|
48
|
+
end
|
49
|
+
|
50
|
+
def apiserver_path
|
51
|
+
File.join(self.manifests_path, 'kube-apiserver.bootstrap.yaml')
|
52
|
+
end
|
53
|
+
|
54
|
+
def controller_manager_path
|
55
|
+
File.join(self.manifests_path, 'kube-controller-manager.bootstrap.yaml')
|
56
|
+
end
|
57
|
+
|
58
|
+
def scheduler_path
|
59
|
+
File.join(self.manifests_path, 'kube-scheduler.bootstrap.yaml')
|
60
|
+
end
|
61
|
+
|
62
|
+
def install_sh_path
|
63
|
+
File.join(self.target_path, 'install.sh')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end; end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Configs; class Certs
|
3
|
+
class Etcd
|
4
|
+
include Porkadot::Configs::CertsUtils
|
5
|
+
attr_reader :config
|
6
|
+
attr_reader :logger
|
7
|
+
|
8
|
+
def initialize config
|
9
|
+
@config = config
|
10
|
+
@logger = config.logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def target_dir
|
14
|
+
File.join(self.certs_root_dir, 'etcd')
|
15
|
+
end
|
16
|
+
|
17
|
+
def ca_key_path
|
18
|
+
File.join(self.target_dir, 'ca.key')
|
19
|
+
end
|
20
|
+
|
21
|
+
def ca_cert_path
|
22
|
+
File.join(self.target_dir, 'ca.crt')
|
23
|
+
end
|
24
|
+
|
25
|
+
def client_key_path
|
26
|
+
File.join(self.target_dir, 'etcd-client.key')
|
27
|
+
end
|
28
|
+
|
29
|
+
def client_cert_path
|
30
|
+
File.join(self.target_dir, 'etcd-client.crt')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end; end; end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Configs; class Certs
|
3
|
+
class FrontProxy
|
4
|
+
include Porkadot::Configs::CertsUtils
|
5
|
+
attr_reader :config
|
6
|
+
attr_reader :logger
|
7
|
+
|
8
|
+
def initialize config
|
9
|
+
@config = config
|
10
|
+
@logger = config.logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def target_dir
|
14
|
+
File.join(self.certs_root_dir, 'kubernetes')
|
15
|
+
end
|
16
|
+
|
17
|
+
def ca_key_path
|
18
|
+
File.join(self.target_dir, 'front-proxy-ca.key')
|
19
|
+
end
|
20
|
+
|
21
|
+
def ca_cert_path
|
22
|
+
File.join(self.target_dir, 'front-proxy-ca.crt')
|
23
|
+
end
|
24
|
+
|
25
|
+
def client_key_path
|
26
|
+
File.join(self.target_dir, 'front-proxy-client.key')
|
27
|
+
end
|
28
|
+
|
29
|
+
def client_cert_path
|
30
|
+
File.join(self.target_dir, 'front-proxy-client.crt')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end; end; end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Configs; class Certs
|
3
|
+
class Kubernetes
|
4
|
+
include Porkadot::Configs::CertsUtils
|
5
|
+
attr_reader :config
|
6
|
+
attr_reader :logger
|
7
|
+
|
8
|
+
def initialize config
|
9
|
+
@config = config
|
10
|
+
@logger = config.logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def additional_sans
|
14
|
+
dns_names = []
|
15
|
+
ips = []
|
16
|
+
if self.config.k8s.control_plane_endpoint
|
17
|
+
host = self.config.k8s.control_plane_endpoint.split(':')[0]
|
18
|
+
self.ipaddr?(host) ? ips << host : dns_names << host
|
19
|
+
end
|
20
|
+
self.config.nodes.each do |_, node|
|
21
|
+
k = node.name
|
22
|
+
v = node
|
23
|
+
next unless v.labels && v.labels.include?(Porkadot::K8S_MASTER_LABEL)
|
24
|
+
self.ipaddr?(k) ? ips << k : dns_names << k
|
25
|
+
if v.hostname
|
26
|
+
self.ipaddr?(v.hostname) ? ips << v.hostname : dns_names << v.hostname
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
sans = dns_names.map {|v| "DNS:#{v}"} + ips.map {|v| "IP:#{v}"}
|
31
|
+
default_sans = %W(
|
32
|
+
DNS:kubernetes
|
33
|
+
DNS:kubernetes.default
|
34
|
+
DNS:kubernetes.default.svc
|
35
|
+
DNS:kubernetes.default.svc.#{self.config.k8s.networking.dns_domain}
|
36
|
+
DNS:localhost
|
37
|
+
IP:#{self.config.k8s.networking.kubernetes_ip}
|
38
|
+
IP:127.0.0.1
|
39
|
+
)
|
40
|
+
return default_sans + sans.uniq
|
41
|
+
end
|
42
|
+
|
43
|
+
def target_dir
|
44
|
+
File.join(self.certs_root_dir, 'kubernetes')
|
45
|
+
end
|
46
|
+
|
47
|
+
def ca_key_path
|
48
|
+
File.join(self.target_dir, 'ca.key')
|
49
|
+
end
|
50
|
+
|
51
|
+
def ca_cert_path
|
52
|
+
File.join(self.target_dir, 'ca.crt')
|
53
|
+
end
|
54
|
+
|
55
|
+
def apiserver_key_path
|
56
|
+
File.join(self.target_dir, 'apiserver.key')
|
57
|
+
end
|
58
|
+
|
59
|
+
def apiserver_cert_path
|
60
|
+
File.join(self.target_dir, 'apiserver.crt')
|
61
|
+
end
|
62
|
+
|
63
|
+
def kubelet_client_key_path
|
64
|
+
File.join(self.target_dir, 'kubelet-client.key')
|
65
|
+
end
|
66
|
+
|
67
|
+
def kubelet_client_cert_path
|
68
|
+
File.join(self.target_dir, 'kubelet-client.crt')
|
69
|
+
end
|
70
|
+
|
71
|
+
def admin_key_path
|
72
|
+
File.join(self.target_dir, 'admin.key')
|
73
|
+
end
|
74
|
+
alias_method :client_key_path, :admin_key_path
|
75
|
+
|
76
|
+
def admin_cert_path
|
77
|
+
File.join(self.target_dir, 'admin.crt')
|
78
|
+
end
|
79
|
+
alias_method :client_cert_path, :admin_cert_path
|
80
|
+
|
81
|
+
def sa_private_key_path
|
82
|
+
File.join(self.target_dir, 'sa.key')
|
83
|
+
end
|
84
|
+
|
85
|
+
def sa_public_key_path
|
86
|
+
File.join(self.target_dir, 'sa.pub')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end; end; end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'ipaddr'
|
2
|
+
|
3
|
+
module Porkadot; module Configs
|
4
|
+
|
5
|
+
module CertsUtils
|
6
|
+
|
7
|
+
def certs_root_dir
|
8
|
+
File.join(self.config.assets_dir, 'certs')
|
9
|
+
end
|
10
|
+
|
11
|
+
def ipaddr?(addr)
|
12
|
+
IPAddr.new(addr)
|
13
|
+
return true
|
14
|
+
rescue IPAddr::InvalidAddressError
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
class Certs
|
21
|
+
include CertsUtils
|
22
|
+
attr_reader :config
|
23
|
+
attr_reader :logger
|
24
|
+
|
25
|
+
def initialize config
|
26
|
+
@config = config
|
27
|
+
@logger = config.logger
|
28
|
+
end
|
29
|
+
|
30
|
+
def etcd
|
31
|
+
@etcd ||= ::Porkadot::Configs::Certs::Etcd.new(config)
|
32
|
+
return @etcd
|
33
|
+
end
|
34
|
+
|
35
|
+
def kubernetes
|
36
|
+
@kubernetes ||= ::Porkadot::Configs::Certs::Kubernetes.new(config)
|
37
|
+
return @kubernetes
|
38
|
+
end
|
39
|
+
|
40
|
+
def front_proxy
|
41
|
+
@front_proxy ||= ::Porkadot::Configs::Certs::FrontProxy.new(config)
|
42
|
+
return @front_proxy
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end; end
|
47
|
+
|
48
|
+
require 'porkadot/configs/certs/etcd'
|
49
|
+
require 'porkadot/configs/certs/k8s'
|
50
|
+
require 'porkadot/configs/certs/front_proxy'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
module Porkadot; module Configs
|
3
|
+
class Cni
|
4
|
+
include Porkadot::ConfigUtils
|
5
|
+
attr_reader :type
|
6
|
+
|
7
|
+
def initialize config
|
8
|
+
@config = config
|
9
|
+
@type = config.raw.cni.type
|
10
|
+
@raw = config.raw.cni.send(config.raw.cni.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
|
+
end
|
22
|
+
end; end
|