Refactor bootstrap verifier/authenticator into its own package

No code changes, but this avoids a circular package dependency that we
would otherwise introduce in the GCE logic.
This commit is contained in:
justinsb 2021-09-26 09:43:53 -04:00
parent c742621468
commit fad6db8beb
17 changed files with 37 additions and 21 deletions

View File

@ -9,13 +9,13 @@ go_library(
"//cmd/kops-controller/controllers:go_default_library", "//cmd/kops-controller/controllers:go_default_library",
"//cmd/kops-controller/pkg/config:go_default_library", "//cmd/kops-controller/pkg/config:go_default_library",
"//cmd/kops-controller/pkg/server:go_default_library", "//cmd/kops-controller/pkg/server:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/nodeidentity:go_default_library", "//pkg/nodeidentity:go_default_library",
"//pkg/nodeidentity/aws:go_default_library", "//pkg/nodeidentity/aws:go_default_library",
"//pkg/nodeidentity/azure:go_default_library", "//pkg/nodeidentity/azure:go_default_library",
"//pkg/nodeidentity/do:go_default_library", "//pkg/nodeidentity/do:go_default_library",
"//pkg/nodeidentity/gce:go_default_library", "//pkg/nodeidentity/gce:go_default_library",
"//pkg/nodeidentity/openstack:go_default_library", "//pkg/nodeidentity/openstack:go_default_library",
"//upup/pkg/fi:go_default_library",
"//upup/pkg/fi/cloudup/awsup:go_default_library", "//upup/pkg/fi/cloudup/awsup: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -30,13 +30,13 @@ import (
"k8s.io/kops/cmd/kops-controller/controllers" "k8s.io/kops/cmd/kops-controller/controllers"
"k8s.io/kops/cmd/kops-controller/pkg/config" "k8s.io/kops/cmd/kops-controller/pkg/config"
"k8s.io/kops/cmd/kops-controller/pkg/server" "k8s.io/kops/cmd/kops-controller/pkg/server"
"k8s.io/kops/pkg/bootstrap"
"k8s.io/kops/pkg/nodeidentity" "k8s.io/kops/pkg/nodeidentity"
nodeidentityaws "k8s.io/kops/pkg/nodeidentity/aws" nodeidentityaws "k8s.io/kops/pkg/nodeidentity/aws"
nodeidentityazure "k8s.io/kops/pkg/nodeidentity/azure" nodeidentityazure "k8s.io/kops/pkg/nodeidentity/azure"
nodeidentitydo "k8s.io/kops/pkg/nodeidentity/do" nodeidentitydo "k8s.io/kops/pkg/nodeidentity/do"
nodeidentitygce "k8s.io/kops/pkg/nodeidentity/gce" nodeidentitygce "k8s.io/kops/pkg/nodeidentity/gce"
nodeidentityos "k8s.io/kops/pkg/nodeidentity/openstack" nodeidentityos "k8s.io/kops/pkg/nodeidentity/openstack"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/manager"
@ -86,7 +86,7 @@ func main() {
ctrl.SetLogger(klogr.New()) ctrl.SetLogger(klogr.New())
if opt.Server != nil { if opt.Server != nil {
var verifier fi.Verifier var verifier bootstrap.Verifier
var err error var err error
if opt.Server.Provider.AWS != nil { if opt.Server.Provider.AWS != nil {
verifier, err = awsup.NewAWSVerifier(opt.Server.Provider.AWS) verifier, err = awsup.NewAWSVerifier(opt.Server.Provider.AWS)

View File

@ -13,6 +13,7 @@ go_library(
"//cmd/kops-controller/pkg/config:go_default_library", "//cmd/kops-controller/pkg/config:go_default_library",
"//pkg/apis/kops/registry:go_default_library", "//pkg/apis/kops/registry:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/pki:go_default_library", "//pkg/pki:go_default_library",
"//pkg/rbac:go_default_library", "//pkg/rbac:go_default_library",
"//upup/pkg/fi:go_default_library", "//upup/pkg/fi:go_default_library",

View File

@ -23,10 +23,10 @@ import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops/registry" "k8s.io/kops/pkg/apis/kops/registry"
"k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/apis/nodeup"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/pkg/bootstrap"
) )
func (s *Server) getNodeConfig(ctx context.Context, req *nodeup.BootstrapRequest, identity *fi.VerifyResult) (*nodeup.NodeConfig, error) { func (s *Server) getNodeConfig(ctx context.Context, req *nodeup.BootstrapRequest, identity *bootstrap.VerifyResult) (*nodeup.NodeConfig, error) {
klog.Infof("getting node config for %+v", req) klog.Infof("getting node config for %+v", req)
instanceGroupName := identity.InstanceGroupName instanceGroupName := identity.InstanceGroupName

View File

@ -33,6 +33,7 @@ import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/cmd/kops-controller/pkg/config" "k8s.io/kops/cmd/kops-controller/pkg/config"
"k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/apis/nodeup"
"k8s.io/kops/pkg/bootstrap"
"k8s.io/kops/pkg/pki" "k8s.io/kops/pkg/pki"
"k8s.io/kops/pkg/rbac" "k8s.io/kops/pkg/rbac"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
@ -44,14 +45,14 @@ type Server struct {
certNames sets.String certNames sets.String
keypairIDs map[string]string keypairIDs map[string]string
server *http.Server server *http.Server
verifier fi.Verifier verifier bootstrap.Verifier
keystore pki.Keystore keystore pki.Keystore
// configBase is the base of the configuration storage. // configBase is the base of the configuration storage.
configBase vfs.Path configBase vfs.Path
} }
func NewServer(opt *config.Options, verifier fi.Verifier) (*Server, error) { func NewServer(opt *config.Options, verifier bootstrap.Verifier) (*Server, error) {
server := &http.Server{ server := &http.Server{
Addr: opt.Server.Listen, Addr: opt.Server.Listen,
TLSConfig: &tls.Config{ TLSConfig: &tls.Config{
@ -168,7 +169,7 @@ func (s *Server) bootstrap(w http.ResponseWriter, r *http.Request) {
klog.Infof("bootstrap %s %s success", r.RemoteAddr, id.NodeName) klog.Infof("bootstrap %s %s success", r.RemoteAddr, id.NodeName)
} }
func (s *Server) issueCert(name string, pubKey string, id *fi.VerifyResult, validHours uint32, keypairIDs map[string]string) (string, error) { func (s *Server) issueCert(name string, pubKey string, id *bootstrap.VerifyResult, validHours uint32, keypairIDs map[string]string) (string, error) {
block, _ := pem.Decode([]byte(pubKey)) block, _ := pem.Decode([]byte(pubKey))
if block.Type != "RSA PUBLIC KEY" { if block.Type != "RSA PUBLIC KEY" {
return "", fmt.Errorf("unexpected key type %q", block.Type) return "", fmt.Errorf("unexpected key type %q", block.Type)

View File

@ -45,6 +45,7 @@ go_library(
"//pkg/apis/kops/model:go_default_library", "//pkg/apis/kops/model:go_default_library",
"//pkg/apis/kops/util:go_default_library", "//pkg/apis/kops/util:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/configbuilder:go_default_library", "//pkg/configbuilder:go_default_library",
"//pkg/dns:go_default_library", "//pkg/dns:go_default_library",
"//pkg/flagbuilder:go_default_library", "//pkg/flagbuilder:go_default_library",

View File

@ -23,6 +23,7 @@ import (
"strconv" "strconv"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/bootstrap"
"k8s.io/kops/pkg/wellknownports" "k8s.io/kops/pkg/wellknownports"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
@ -39,7 +40,7 @@ func (b BootstrapClientBuilder) Build(c *fi.ModelBuilderContext) error {
return nil return nil
} }
var authenticator fi.Authenticator var authenticator bootstrap.Authenticator
var err error var err error
switch kops.CloudProviderID(b.Cluster.Spec.CloudProvider) { switch kops.CloudProviderID(b.Cluster.Spec.CloudProvider) {
case kops.CloudProviderAWS: case kops.CloudProviderAWS:

8
pkg/bootstrap/BUILD.bazel generated Normal file
View File

@ -0,0 +1,8 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["authenticate.go"],
importpath = "k8s.io/kops/pkg/bootstrap",
visibility = ["//visibility:public"],
)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fi package bootstrap
// Authenticator generates authentication credentials for requests. // Authenticator generates authentication credentials for requests.
type Authenticator interface { type Authenticator interface {

View File

@ -4,7 +4,6 @@ go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"assetstore.go", "assetstore.go",
"authenticate.go",
"ca.go", "ca.go",
"changes.go", "changes.go",
"clientset_castore.go", "clientset_castore.go",

View File

@ -22,6 +22,7 @@ go_library(
"//dnsprovider/pkg/dnsprovider/providers/aws/route53:go_default_library", "//dnsprovider/pkg/dnsprovider/providers/aws/route53:go_default_library",
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
"//pkg/apis/kops/model:go_default_library", "//pkg/apis/kops/model:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/cloudinstances:go_default_library", "//pkg/cloudinstances:go_default_library",
"//pkg/featureflag:go_default_library", "//pkg/featureflag:go_default_library",
"//pkg/nodeidentity/aws:go_default_library", "//pkg/nodeidentity/aws:go_default_library",

View File

@ -28,7 +28,7 @@ import (
"github.com/aws/aws-sdk-go/aws/endpoints" "github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/sts" "github.com/aws/aws-sdk-go/service/sts"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/pkg/bootstrap"
) )
const AWSAuthenticationTokenPrefix = "x-aws-sts " const AWSAuthenticationTokenPrefix = "x-aws-sts "
@ -37,7 +37,7 @@ type awsAuthenticator struct {
sts *sts.STS sts *sts.STS
} }
var _ fi.Authenticator = &awsAuthenticator{} var _ bootstrap.Authenticator = &awsAuthenticator{}
// RegionFromMetadata returns the current region from the aws metdata // RegionFromMetadata returns the current region from the aws metdata
func RegionFromMetadata(ctx context.Context) (string, error) { func RegionFromMetadata(ctx context.Context) (string, error) {
@ -57,7 +57,7 @@ func RegionFromMetadata(ctx context.Context) (string, error) {
return region, nil return region, nil
} }
func NewAWSAuthenticator(region string) (fi.Authenticator, error) { func NewAWSAuthenticator(region string) (bootstrap.Authenticator, error) {
config := aws.NewConfig(). config := aws.NewConfig().
WithCredentialsChainVerboseErrors(true). WithCredentialsChainVerboseErrors(true).
WithRegion(region). WithRegion(region).

View File

@ -36,8 +36,8 @@ import (
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/sts" "github.com/aws/aws-sdk-go/service/sts"
"k8s.io/kops/pkg/bootstrap"
nodeidentityaws "k8s.io/kops/pkg/nodeidentity/aws" nodeidentityaws "k8s.io/kops/pkg/nodeidentity/aws"
"k8s.io/kops/upup/pkg/fi"
) )
type AWSVerifierOptions struct { type AWSVerifierOptions struct {
@ -57,9 +57,9 @@ type awsVerifier struct {
client http.Client client http.Client
} }
var _ fi.Verifier = &awsVerifier{} var _ bootstrap.Verifier = &awsVerifier{}
func NewAWSVerifier(opt *AWSVerifierOptions) (fi.Verifier, error) { func NewAWSVerifier(opt *AWSVerifierOptions) (bootstrap.Verifier, error) {
config := aws.NewConfig(). config := aws.NewConfig().
WithCredentialsChainVerboseErrors(true). WithCredentialsChainVerboseErrors(true).
WithRegion(opt.Region). WithRegion(opt.Region).
@ -120,7 +120,7 @@ type ResponseMetadata struct {
RequestId string `xml:"RequestId"` RequestId string `xml:"RequestId"`
} }
func (a awsVerifier) VerifyToken(token string, body []byte) (*fi.VerifyResult, error) { func (a awsVerifier) VerifyToken(token string, body []byte) (*bootstrap.VerifyResult, error) {
if !strings.HasPrefix(token, AWSAuthenticationTokenPrefix) { if !strings.HasPrefix(token, AWSAuthenticationTokenPrefix) {
return nil, fmt.Errorf("incorrect authorization type") return nil, fmt.Errorf("incorrect authorization type")
} }
@ -237,7 +237,7 @@ func (a awsVerifier) VerifyToken(token string, body []byte) (*fi.VerifyResult, e
return nil, err return nil, err
} }
result := &fi.VerifyResult{ result := &bootstrap.VerifyResult{
NodeName: addrs[0], NodeName: addrs[0],
CertificateNames: addrs, CertificateNames: addrs,
} }

View File

@ -15,6 +15,7 @@ go_library(
"//pkg/apis/kops/registry:go_default_library", "//pkg/apis/kops/registry:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/assets:go_default_library", "//pkg/assets:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/configserver:go_default_library", "//pkg/configserver:go_default_library",
"//pkg/kopscodecs:go_default_library", "//pkg/kopscodecs:go_default_library",
"//upup/pkg/fi:go_default_library", "//upup/pkg/fi:go_default_library",

View File

@ -39,6 +39,7 @@ import (
"k8s.io/kops/pkg/apis/kops/registry" "k8s.io/kops/pkg/apis/kops/registry"
"k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/apis/nodeup"
"k8s.io/kops/pkg/assets" "k8s.io/kops/pkg/assets"
"k8s.io/kops/pkg/bootstrap"
"k8s.io/kops/pkg/configserver" "k8s.io/kops/pkg/configserver"
"k8s.io/kops/pkg/kopscodecs" "k8s.io/kops/pkg/kopscodecs"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
@ -757,7 +758,7 @@ func seedRNG(ctx context.Context, bootConfig *nodeup.BootConfig, region string)
// getNodeConfigFromServer queries kops-controller for our node's configuration. // getNodeConfigFromServer queries kops-controller for our node's configuration.
func getNodeConfigFromServer(ctx context.Context, bootConfig *nodeup.BootConfig, region string) (*nodeup.BootstrapResponse, error) { func getNodeConfigFromServer(ctx context.Context, bootConfig *nodeup.BootConfig, region string) (*nodeup.BootstrapResponse, error) {
var authenticator fi.Authenticator var authenticator bootstrap.Authenticator
switch api.CloudProviderID(bootConfig.CloudProvider) { switch api.CloudProviderID(bootConfig.CloudProvider) {
case api.CloudProviderAWS: case api.CloudProviderAWS:

View File

@ -27,6 +27,7 @@ go_library(
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/backoff:go_default_library", "//pkg/backoff:go_default_library",
"//pkg/bootstrap:go_default_library",
"//pkg/kubeconfig:go_default_library", "//pkg/kubeconfig:go_default_library",
"//pkg/pki:go_default_library", "//pkg/pki:go_default_library",
"//upup/pkg/fi:go_default_library", "//upup/pkg/fi:go_default_library",

View File

@ -33,6 +33,7 @@ import (
"time" "time"
"k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/apis/nodeup"
"k8s.io/kops/pkg/bootstrap"
"k8s.io/kops/pkg/pki" "k8s.io/kops/pkg/pki"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup" "k8s.io/kops/upup/pkg/fi/cloudup"
@ -135,7 +136,7 @@ func (b *BootstrapClientTask) Run(c *fi.Context) error {
type KopsBootstrapClient struct { type KopsBootstrapClient struct {
// Authenticator generates authentication credentials for requests. // Authenticator generates authentication credentials for requests.
Authenticator fi.Authenticator Authenticator bootstrap.Authenticator
// CAs are the CA certificates for kops-controller. // CAs are the CA certificates for kops-controller.
CAs []byte CAs []byte