mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Move the kubelet certificate management code into a single package
Code is very similar and belongs together.
This commit is contained in:
parent
145976f72a
commit
b8e662fcea
@ -107,7 +107,6 @@ go_library(
|
|||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
"//vendor/golang.org/x/exp/inotify:go_default_library",
|
"//vendor/golang.org/x/exp/inotify:go_default_library",
|
||||||
"//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
|
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
@ -19,8 +19,6 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
|
||||||
"crypto/x509/pkix"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -37,7 +35,6 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
certificates "k8s.io/api/certificates/v1beta1"
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
clientv1 "k8s.io/api/core/v1"
|
clientv1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
@ -457,7 +454,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.KubeletDeps) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
clientCertificateManager, err = initializeClientCertificateManager(s.CertDirectory, nodeName, clientConfig.CertData, clientConfig.KeyData, clientConfig.CertFile, clientConfig.KeyFile)
|
clientCertificateManager, err = certificate.NewKubeletClientCertificateManager(s.CertDirectory, nodeName, clientConfig.CertData, clientConfig.KeyData, clientConfig.CertFile, clientConfig.KeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -660,52 +657,6 @@ func updateTransport(clientConfig *restclient.Config, clientCertificateManager c
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// initializeClientCertificateManager sets up a certificate manager without a
|
|
||||||
// client that can be used to sign new certificates (or rotate). It answers with
|
|
||||||
// whatever certificate it is initialized with. If a CSR client is set later, it
|
|
||||||
// may begin rotating/renewing the client cert
|
|
||||||
func initializeClientCertificateManager(certDirectory string, nodeName types.NodeName, certData []byte, keyData []byte, certFile string, keyFile string) (certificate.Manager, error) {
|
|
||||||
certificateStore, err := certificate.NewFileStore(
|
|
||||||
"kubelet-client",
|
|
||||||
certDirectory,
|
|
||||||
certDirectory,
|
|
||||||
certFile,
|
|
||||||
keyFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to initialize certificate store: %v", err)
|
|
||||||
}
|
|
||||||
clientCertificateManager, err := certificate.NewManager(&certificate.Config{
|
|
||||||
Template: &x509.CertificateRequest{
|
|
||||||
Subject: pkix.Name{
|
|
||||||
Organization: []string{"system:nodes"},
|
|
||||||
CommonName: fmt.Sprintf("system:node:%s", nodeName),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Usages: []certificates.KeyUsage{
|
|
||||||
// https://tools.ietf.org/html/rfc5280#section-4.2.1.3
|
|
||||||
//
|
|
||||||
// DigitalSignature allows the certificate to be used to verify
|
|
||||||
// digital signatures including signatures used during TLS
|
|
||||||
// negotiation.
|
|
||||||
certificates.UsageDigitalSignature,
|
|
||||||
// KeyEncipherment allows the cert/key pair to be used to encrypt
|
|
||||||
// keys, including the symetric keys negotiated during TLS setup
|
|
||||||
// and used for data transfer..
|
|
||||||
certificates.UsageKeyEncipherment,
|
|
||||||
// ClientAuth allows the cert to be used by a TLS client to
|
|
||||||
// authenticate itself to the TLS server.
|
|
||||||
certificates.UsageClientAuth,
|
|
||||||
},
|
|
||||||
CertificateStore: certificateStore,
|
|
||||||
BootstrapCertificatePEM: certData,
|
|
||||||
BootstrapKeyPEM: keyData,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to initialize certificate manager: %v", err)
|
|
||||||
}
|
|
||||||
return clientCertificateManager, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getNodeName returns the node name according to the cloud provider
|
// getNodeName returns the node name according to the cloud provider
|
||||||
// if cloud provider is specified. Otherwise, returns the hostname of the node.
|
// if cloud provider is specified. Otherwise, returns the hostname of the node.
|
||||||
func getNodeName(cloud cloudprovider.Interface, hostname string) (types.NodeName, error) {
|
func getNodeName(cloud cloudprovider.Interface, hostname string) (types.NodeName, error) {
|
||||||
|
@ -46,7 +46,6 @@ go_library(
|
|||||||
"//pkg/apis/componentconfig/v1alpha1:go_default_library",
|
"//pkg/apis/componentconfig/v1alpha1:go_default_library",
|
||||||
"//pkg/capabilities:go_default_library",
|
"//pkg/capabilities:go_default_library",
|
||||||
"//pkg/client/clientset_generated/clientset:go_default_library",
|
"//pkg/client/clientset_generated/clientset:go_default_library",
|
||||||
"//pkg/client/clientset_generated/clientset/typed/certificates/v1beta1:go_default_library",
|
|
||||||
"//pkg/client/listers/core/v1:go_default_library",
|
"//pkg/client/listers/core/v1:go_default_library",
|
||||||
"//pkg/cloudprovider:go_default_library",
|
"//pkg/cloudprovider:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
@ -118,7 +117,6 @@ go_library(
|
|||||||
"//vendor/github.com/google/cadvisor/events:go_default_library",
|
"//vendor/github.com/google/cadvisor/events:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/info/v1:go_default_library",
|
"//vendor/github.com/google/cadvisor/info/v1:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/info/v2:go_default_library",
|
"//vendor/github.com/google/cadvisor/info/v2:go_default_library",
|
||||||
"//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
|
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
|
@ -13,15 +13,19 @@ go_library(
|
|||||||
srcs = [
|
srcs = [
|
||||||
"certificate_manager.go",
|
"certificate_manager.go",
|
||||||
"certificate_store.go",
|
"certificate_store.go",
|
||||||
|
"kubelet.go",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/apis/componentconfig:go_default_library",
|
||||||
|
"//pkg/client/clientset_generated/clientset:go_default_library",
|
||||||
"//pkg/client/clientset_generated/clientset/typed/certificates/v1beta1:go_default_library",
|
"//pkg/client/clientset_generated/clientset/typed/certificates/v1beta1:go_default_library",
|
||||||
"//pkg/util:go_default_library",
|
"//pkg/util:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
"//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/util/cert:go_default_library",
|
"//vendor/k8s.io/client-go/util/cert:go_default_library",
|
||||||
|
124
pkg/kubelet/certificate/kubelet.go
Normal file
124
pkg/kubelet/certificate/kubelet.go
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package certificate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/x509"
|
||||||
|
"crypto/x509/pkix"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
certificates "k8s.io/api/certificates/v1beta1"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
||||||
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
|
clientcertificates "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/certificates/v1beta1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewKubeletServerCertificateManager creates a certificate manager for the kubelet when retrieving a server certificate
|
||||||
|
// or returns an error.
|
||||||
|
func NewKubeletServerCertificateManager(kubeClient clientset.Interface, kubeCfg *componentconfig.KubeletConfiguration, nodeName types.NodeName, ips []net.IP, hostnames []string) (Manager, error) {
|
||||||
|
var certSigningRequestClient clientcertificates.CertificateSigningRequestInterface
|
||||||
|
if kubeClient != nil && kubeClient.Certificates() != nil {
|
||||||
|
certSigningRequestClient = kubeClient.Certificates().CertificateSigningRequests()
|
||||||
|
}
|
||||||
|
certificateStore, err := NewFileStore(
|
||||||
|
"kubelet-server",
|
||||||
|
kubeCfg.CertDirectory,
|
||||||
|
kubeCfg.CertDirectory,
|
||||||
|
kubeCfg.TLSCertFile,
|
||||||
|
kubeCfg.TLSPrivateKeyFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to initialize server certificate store: %v", err)
|
||||||
|
}
|
||||||
|
m, err := NewManager(&Config{
|
||||||
|
CertificateSigningRequestClient: certSigningRequestClient,
|
||||||
|
Template: &x509.CertificateRequest{
|
||||||
|
Subject: pkix.Name{
|
||||||
|
CommonName: fmt.Sprintf("system:node:%s", nodeName),
|
||||||
|
Organization: []string{"system:nodes"},
|
||||||
|
},
|
||||||
|
DNSNames: hostnames,
|
||||||
|
IPAddresses: ips,
|
||||||
|
},
|
||||||
|
Usages: []certificates.KeyUsage{
|
||||||
|
// https://tools.ietf.org/html/rfc5280#section-4.2.1.3
|
||||||
|
//
|
||||||
|
// Digital signature allows the certificate to be used to verify
|
||||||
|
// digital signatures used during TLS negotiation.
|
||||||
|
certificates.UsageDigitalSignature,
|
||||||
|
// KeyEncipherment allows the cert/key pair to be used to encrypt
|
||||||
|
// keys, including the symetric keys negotiated during TLS setup
|
||||||
|
// and used for data transfer.
|
||||||
|
certificates.UsageKeyEncipherment,
|
||||||
|
// ServerAuth allows the cert to be used by a TLS server to
|
||||||
|
// authenticate itself to a TLS client.
|
||||||
|
certificates.UsageServerAuth,
|
||||||
|
},
|
||||||
|
CertificateStore: certificateStore,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to initialize server certificate manager: %v", err)
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewKubeletClientCertificateManager sets up a certificate manager without a
|
||||||
|
// client that can be used to sign new certificates (or rotate). It answers with
|
||||||
|
// whatever certificate it is initialized with. If a CSR client is set later, it
|
||||||
|
// may begin rotating/renewing the client cert
|
||||||
|
func NewKubeletClientCertificateManager(certDirectory string, nodeName types.NodeName, certData []byte, keyData []byte, certFile string, keyFile string) (Manager, error) {
|
||||||
|
certificateStore, err := NewFileStore(
|
||||||
|
"kubelet-client",
|
||||||
|
certDirectory,
|
||||||
|
certDirectory,
|
||||||
|
certFile,
|
||||||
|
keyFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to initialize client certificate store: %v", err)
|
||||||
|
}
|
||||||
|
m, err := NewManager(&Config{
|
||||||
|
Template: &x509.CertificateRequest{
|
||||||
|
Subject: pkix.Name{
|
||||||
|
CommonName: fmt.Sprintf("system:node:%s", nodeName),
|
||||||
|
Organization: []string{"system:nodes"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Usages: []certificates.KeyUsage{
|
||||||
|
// https://tools.ietf.org/html/rfc5280#section-4.2.1.3
|
||||||
|
//
|
||||||
|
// DigitalSignature allows the certificate to be used to verify
|
||||||
|
// digital signatures including signatures used during TLS
|
||||||
|
// negotiation.
|
||||||
|
certificates.UsageDigitalSignature,
|
||||||
|
// KeyEncipherment allows the cert/key pair to be used to encrypt
|
||||||
|
// keys, including the symetric keys negotiated during TLS setup
|
||||||
|
// and used for data transfer..
|
||||||
|
certificates.UsageKeyEncipherment,
|
||||||
|
// ClientAuth allows the cert to be used by a TLS client to
|
||||||
|
// authenticate itself to the TLS server.
|
||||||
|
certificates.UsageClientAuth,
|
||||||
|
},
|
||||||
|
CertificateStore: certificateStore,
|
||||||
|
BootstrapCertificatePEM: certData,
|
||||||
|
BootstrapKeyPEM: keyData,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to initialize client certificate manager: %v", err)
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
@ -18,8 +18,6 @@ package kubelet
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
|
||||||
"crypto/x509/pkix"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -38,7 +36,6 @@ import (
|
|||||||
|
|
||||||
cadvisorapi "github.com/google/cadvisor/info/v1"
|
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||||
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
|
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
|
||||||
certificates "k8s.io/api/certificates/v1beta1"
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
clientv1 "k8s.io/api/core/v1"
|
clientv1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -60,7 +57,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
||||||
componentconfigv1alpha1 "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1"
|
componentconfigv1alpha1 "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
clientcertificates "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/certificates/v1beta1"
|
|
||||||
corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1"
|
corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider"
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
@ -710,7 +706,7 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Kub
|
|||||||
}
|
}
|
||||||
ips = append(ips, cloudIPs...)
|
ips = append(ips, cloudIPs...)
|
||||||
names := append([]string{klet.GetHostname(), hostnameOverride}, cloudNames...)
|
names := append([]string{klet.GetHostname(), hostnameOverride}, cloudNames...)
|
||||||
klet.serverCertificateManager, err = initializeServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names)
|
klet.serverCertificateManager, err = certificate.NewKubeletServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to initialize certificate manager: %v", err)
|
return nil, fmt.Errorf("failed to initialize certificate manager: %v", err)
|
||||||
}
|
}
|
||||||
@ -1111,48 +1107,6 @@ type Kubelet struct {
|
|||||||
dockerLegacyService dockershim.DockerLegacyService
|
dockerLegacyService dockershim.DockerLegacyService
|
||||||
}
|
}
|
||||||
|
|
||||||
func initializeServerCertificateManager(kubeClient clientset.Interface, kubeCfg *componentconfig.KubeletConfiguration, nodeName types.NodeName, ips []net.IP, hostnames []string) (certificate.Manager, error) {
|
|
||||||
var certSigningRequestClient clientcertificates.CertificateSigningRequestInterface
|
|
||||||
if kubeClient != nil && kubeClient.Certificates() != nil {
|
|
||||||
certSigningRequestClient = kubeClient.Certificates().CertificateSigningRequests()
|
|
||||||
}
|
|
||||||
certificateStore, err := certificate.NewFileStore(
|
|
||||||
"kubelet-server",
|
|
||||||
kubeCfg.CertDirectory,
|
|
||||||
kubeCfg.CertDirectory,
|
|
||||||
kubeCfg.TLSCertFile,
|
|
||||||
kubeCfg.TLSPrivateKeyFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to initialize certificate store: %v", err)
|
|
||||||
}
|
|
||||||
return certificate.NewManager(&certificate.Config{
|
|
||||||
CertificateSigningRequestClient: certSigningRequestClient,
|
|
||||||
Template: &x509.CertificateRequest{
|
|
||||||
Subject: pkix.Name{
|
|
||||||
CommonName: fmt.Sprintf("system:node:%s", nodeName),
|
|
||||||
Organization: []string{"system:nodes"},
|
|
||||||
},
|
|
||||||
DNSNames: hostnames,
|
|
||||||
IPAddresses: ips,
|
|
||||||
},
|
|
||||||
Usages: []certificates.KeyUsage{
|
|
||||||
// https://tools.ietf.org/html/rfc5280#section-4.2.1.3
|
|
||||||
//
|
|
||||||
// Digital signature allows the certificate to be used to verify
|
|
||||||
// digital signatures used during TLS negotiation.
|
|
||||||
certificates.UsageDigitalSignature,
|
|
||||||
// KeyEncipherment allows the cert/key pair to be used to encrypt
|
|
||||||
// keys, including the symetric keys negotiated during TLS setup
|
|
||||||
// and used for data transfer.
|
|
||||||
certificates.UsageKeyEncipherment,
|
|
||||||
// ServerAuth allows the cert to be used by a TLS server to
|
|
||||||
// authenticate itself to a TLS client.
|
|
||||||
certificates.UsageServerAuth,
|
|
||||||
},
|
|
||||||
CertificateStore: certificateStore,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func allLocalIPsWithoutLoopback() ([]net.IP, error) {
|
func allLocalIPsWithoutLoopback() ([]net.IP, error) {
|
||||||
interfaces, err := net.Interfaces()
|
interfaces, err := net.Interfaces()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user