Skip to content
Snippets Groups Projects
master.go 2.91 KiB
Newer Older
package pki

import (
	"net"

	"forge.tedomum.net/acides/hepto/hepto/pkg/pekahi"
)

// Master certs
type MasterCerts struct {
	// Certificate for exposing the apiserver
kaiyou's avatar
kaiyou committed
	TLS *pekahi.Certificate
	// Certificate for signing tokens
	Tokens *pekahi.Certificate
	// Certificate for authenticating against kubelets
	Kubelet *pekahi.Certificate
	// Service certificate for the controller manager
kaiyou's avatar
kaiyou committed
	ControllersTLS *pekahi.Certificate
	// API client certificate for the controller manager
kaiyou's avatar
kaiyou committed
	ControllersAPI *pekahi.Certificate
	// API client certificate for the scheduler
kaiyou's avatar
kaiyou committed
	SchedulerAPI *pekahi.Certificate
	// Root access to the API server
	RootClient *pekahi.Certificate
}

func NewMasterCerts(path string, ip net.IP) (*MasterCerts, error) {
kaiyou's avatar
kaiyou committed
	bundle, err := pekahi.NewFileBundle(path)
	if err != nil {
		return nil, err
	}
kaiyou's avatar
kaiyou committed
	// TLS certificate
	tlsCert, err := bundle.GetCertOrCSR("tls",
		pekahi.NewServerTemplate([]string{"apiserver"}, []net.IP{ip}),
	)
	if err != nil {
		return nil, err
	}
	// Tokens key
kaiyou's avatar
kaiyou committed
	tokenKey, err := bundle.GetCertWithKey("tokens")
	if err != nil {
		return nil, err
	}
	// Kubelet certificate
kaiyou's avatar
kaiyou committed
	kubeletCert, err := bundle.GetCertOrCSR("kubelet",
		pekahi.NewClientTemplate("apiserver", ""),
	)
	if err != nil {
		return nil, err
	}
	// Controller manager certificate
kaiyou's avatar
kaiyou committed
	controllersTLSCert, err := bundle.GetCertOrCSR("controllers-tls",
		pekahi.NewServerTemplate([]string{"controllers"}, []net.IP{ip}),
	)
	if err != nil {
		return nil, err
	}
	// Controller manager API client certificate
kaiyou's avatar
kaiyou committed
	controllersAPICert, err := bundle.GetCertOrCSR("controllers-api",
		pekahi.NewClientTemplate("system:kube-controller-manager", ""),
	)
	if err != nil {
		return nil, err
	}
	// Scheduler API client certificate
kaiyou's avatar
kaiyou committed
	schedulerAPICert, err := bundle.GetCertOrCSR("scheduler-api",
		pekahi.NewClientTemplate("system:kube-scheduler", ""),
	)
	if err != nil {
		return nil, err
	}
	// Root client certificate
	rootClientCert, err := bundle.GetCertOrCSR("root",
		pekahi.NewClientTemplate("root", "system:masters"),
	)
	return &MasterCerts{
kaiyou's avatar
kaiyou committed
		TLS:            tlsCert,
		Tokens:         tokenKey,
		Kubelet:        kubeletCert,
		ControllersTLS: controllersTLSCert,
		ControllersAPI: controllersAPICert,
		SchedulerAPI:   schedulerAPICert,
		RootClient:     rootClientCert,
kaiyou's avatar
kaiyou committed
func (ca *ClusterCA) SignMasterCerts(m *MasterCerts) {
	signCert(ca.TLS, m.TLS, pekahi.NewServerTemplate(m.TLS.CSR.DNSNames, m.TLS.CSR.IPAddresses))
	signCert(ca.Kubelet, m.Kubelet, pekahi.NewClientTemplate(m.Kubelet.CSR.Subject.CommonName, ""))
	signCert(ca.TLS, m.ControllersTLS, pekahi.NewServerTemplate(m.ControllersTLS.CSR.DNSNames, m.ControllersTLS.CSR.IPAddresses))
	signCert(ca.API, m.ControllersAPI, pekahi.NewClientTemplate(m.ControllersAPI.CSR.Subject.CommonName, ""))
	signCert(ca.API, m.SchedulerAPI, pekahi.NewClientTemplate(m.SchedulerAPI.CSR.Subject.CommonName, ""))
	signCert(ca.API, m.RootClient, pekahi.NewClientTemplate(m.RootClient.CSR.Subject.CommonName, "system:masters"))