mirror of https://github.com/kubernetes/kops.git
Migrate nodeup to aws-sdk-go-v2
This commit is contained in:
parent
1e14df43b6
commit
4418e65232
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||
package model
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
|
@ -24,8 +25,8 @@ import (
|
|||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
awsconfig "github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
|
||||
"github.com/blang/semver/v4"
|
||||
hcloudmetadata "github.com/hetznercloud/hcloud-go/hcloud/metadata"
|
||||
"k8s.io/klog/v2"
|
||||
|
@ -560,14 +561,17 @@ func (c *NodeupModelContext) RunningOnAzure() bool {
|
|||
}
|
||||
|
||||
// GetMetadataLocalIP returns the local IP address read from metadata
|
||||
func (c *NodeupModelContext) GetMetadataLocalIP() (string, error) {
|
||||
func (c *NodeupModelContext) GetMetadataLocalIP(ctx context.Context) (string, error) {
|
||||
var internalIP string
|
||||
|
||||
switch c.BootConfig.CloudProvider {
|
||||
case kops.CloudProviderAWS:
|
||||
sess := session.Must(session.NewSession())
|
||||
metadata := ec2metadata.New(sess)
|
||||
localIPv4, err := metadata.GetMetadata("local-ipv4")
|
||||
config, err := awsconfig.LoadDefaultConfig(ctx)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to load AWS config: %w", err)
|
||||
}
|
||||
metadata := imds.NewFromConfig(config)
|
||||
localIPv4, err := getMetadata(ctx, metadata, "local-ipv4")
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get local-ipv4 address from ec2 metadata: %w", err)
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ func (b *KubeAPIServerBuilder) Build(c *fi.NodeupModelBuilderContext) error {
|
|||
}
|
||||
|
||||
if b.CloudProvider() == kops.CloudProviderHetzner {
|
||||
localIP, err := b.GetMetadataLocalIP()
|
||||
localIP, err := b.GetMetadataLocalIP(c.Context())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -420,7 +420,7 @@ func (b *KubeAPIServerBuilder) writeServerCertificate(c *fi.NodeupModelBuilderCo
|
|||
alternateNames = append(alternateNames, "127.0.0.1")
|
||||
|
||||
if b.CloudProvider() == kops.CloudProviderHetzner {
|
||||
localIP, err := b.GetMetadataLocalIP()
|
||||
localIP, err := b.GetMetadataLocalIP(c.Context())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -18,15 +18,17 @@ package model
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
awsconfig "github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||
"k8s.io/klog/v2"
|
||||
|
@ -66,7 +68,8 @@ func (b *KubeletBuilder) Build(c *fi.NodeupModelBuilderContext) error {
|
|||
return fmt.Errorf("error building kubelet server cert: %v", err)
|
||||
}
|
||||
|
||||
kubeletConfig, err := b.buildKubeletConfigSpec()
|
||||
ctx := c.Context()
|
||||
kubeletConfig, err := b.buildKubeletConfigSpec(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error building kubelet config: %v", err)
|
||||
}
|
||||
|
@ -75,9 +78,12 @@ func (b *KubeletBuilder) Build(c *fi.NodeupModelBuilderContext) error {
|
|||
// Set the provider ID to help speed node registration on large clusters
|
||||
var providerID string
|
||||
if b.CloudProvider() == kops.CloudProviderAWS {
|
||||
sess := session.Must(session.NewSession())
|
||||
metadata := ec2metadata.New(sess)
|
||||
instanceIdentity, err := metadata.GetInstanceIdentityDocument()
|
||||
config, err := awsconfig.LoadDefaultConfig(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error loading AWS config: %v", err)
|
||||
}
|
||||
metadata := imds.NewFromConfig(config)
|
||||
instanceIdentity, err := metadata.GetInstanceIdentityDocument(ctx, &imds.GetInstanceIdentityDocumentInput{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -93,7 +99,7 @@ func (b *KubeletBuilder) Build(c *fi.NodeupModelBuilderContext) error {
|
|||
}
|
||||
|
||||
{
|
||||
t, err := b.buildSystemdEnvironmentFile(kubeletConfig)
|
||||
t, err := b.buildSystemdEnvironmentFile(c.Context(), kubeletConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -310,7 +316,7 @@ func (b *KubeletBuilder) buildManifestDirectory(kubeletConfig *kops.KubeletConfi
|
|||
}
|
||||
|
||||
// buildSystemdEnvironmentFile renders the environment file for the kubelet
|
||||
func (b *KubeletBuilder) buildSystemdEnvironmentFile(kubeletConfig *kops.KubeletConfigSpec) (*nodetasks.File, error) {
|
||||
func (b *KubeletBuilder) buildSystemdEnvironmentFile(ctx context.Context, kubeletConfig *kops.KubeletConfigSpec) (*nodetasks.File, error) {
|
||||
// TODO: Dump the separate file for flags - just complexity!
|
||||
flags, err := flagbuilder.BuildFlags(kubeletConfig)
|
||||
if err != nil {
|
||||
|
@ -323,7 +329,7 @@ func (b *KubeletBuilder) buildSystemdEnvironmentFile(kubeletConfig *kops.Kubelet
|
|||
flags += " --cloud-config=" + InTreeCloudConfigFilePath
|
||||
|
||||
if b.UsesSecondaryIP() {
|
||||
localIP, err := b.GetMetadataLocalIP()
|
||||
localIP, err := b.GetMetadataLocalIP(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -627,7 +633,7 @@ func (b *KubeletBuilder) addContainerizedMounter(c *fi.NodeupModelBuilderContext
|
|||
// once that is part of core k8s.
|
||||
|
||||
// buildKubeletConfigSpec returns the kubeletconfig for the specified instanceGroup
|
||||
func (b *KubeletBuilder) buildKubeletConfigSpec() (*kops.KubeletConfigSpec, error) {
|
||||
func (b *KubeletBuilder) buildKubeletConfigSpec(ctx context.Context) (*kops.KubeletConfigSpec, error) {
|
||||
// Merge KubeletConfig for NodeLabels
|
||||
c := b.NodeupConfig.KubeletConfig
|
||||
|
||||
|
@ -635,13 +641,23 @@ func (b *KubeletBuilder) buildKubeletConfigSpec() (*kops.KubeletConfigSpec, erro
|
|||
|
||||
// Respect any MaxPods value the user sets explicitly.
|
||||
if (b.NodeupConfig.Networking.AmazonVPC != nil || (b.NodeupConfig.Networking.Cilium != nil && b.NodeupConfig.Networking.Cilium.IPAM == kops.CiliumIpamEni)) && c.MaxPods == nil {
|
||||
sess := session.Must(session.NewSession())
|
||||
metadata := ec2metadata.New(sess)
|
||||
|
||||
// Get the actual instance type by querying the EC2 instance metadata service.
|
||||
instanceTypeName, err := metadata.GetMetadata("instance-type")
|
||||
config, err := awsconfig.LoadDefaultConfig(ctx)
|
||||
if err != nil {
|
||||
// Otherwise, fall back to the Instance Group spec.
|
||||
return nil, fmt.Errorf("error loading AWS config: %v", err)
|
||||
}
|
||||
metadata := imds.NewFromConfig(config)
|
||||
|
||||
var instanceTypeName string
|
||||
// Get the actual instance type by querying the EC2 instance metadata service.
|
||||
resp, err := metadata.GetMetadata(ctx, &imds.GetMetadataInput{Path: "instance-type"})
|
||||
if err == nil {
|
||||
defer resp.Content.Close()
|
||||
itName, err := io.ReadAll(resp.Content)
|
||||
if err == nil {
|
||||
instanceTypeName = string(itName)
|
||||
}
|
||||
}
|
||||
if instanceTypeName == "" {
|
||||
instanceTypeName = *b.NodeupConfig.DefaultMachineType
|
||||
}
|
||||
|
||||
|
@ -727,7 +743,7 @@ func (b *KubeletBuilder) buildKubeletServingCertificate(c *fi.NodeupModelBuilder
|
|||
name := "kubelet-server"
|
||||
dir := b.PathSrvKubernetes()
|
||||
|
||||
names, err := b.kubeletNames()
|
||||
names, err := b.kubeletNames(c.Context())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -771,7 +787,7 @@ func (b *KubeletBuilder) buildKubeletServingCertificate(c *fi.NodeupModelBuilder
|
|||
return nil
|
||||
}
|
||||
|
||||
func (b *KubeletBuilder) kubeletNames() ([]string, error) {
|
||||
func (b *KubeletBuilder) kubeletNames(ctx context.Context) ([]string, error) {
|
||||
if b.CloudProvider() != kops.CloudProviderAWS {
|
||||
name, err := os.Hostname()
|
||||
if err != nil {
|
||||
|
@ -784,22 +800,25 @@ func (b *KubeletBuilder) kubeletNames() ([]string, error) {
|
|||
}
|
||||
|
||||
addrs := []string{b.InstanceID}
|
||||
sess := session.Must(session.NewSession())
|
||||
metadata := ec2metadata.New(sess)
|
||||
config, err := awsconfig.LoadDefaultConfig(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error loading AWS config: %v", err)
|
||||
}
|
||||
metadata := imds.NewFromConfig(config)
|
||||
|
||||
if localHostname, err := metadata.GetMetadata("local-hostname"); err == nil {
|
||||
if localHostname, err := getMetadata(ctx, metadata, "local-hostname"); err == nil {
|
||||
klog.V(2).Infof("Local Hostname: %s", localHostname)
|
||||
addrs = append(addrs, localHostname)
|
||||
}
|
||||
if localIPv4, err := metadata.GetMetadata("local-ipv4"); err == nil {
|
||||
if localIPv4, err := getMetadata(ctx, metadata, "local-ipv4"); err == nil {
|
||||
klog.V(2).Infof("Local IPv4: %s", localIPv4)
|
||||
addrs = append(addrs, localIPv4)
|
||||
}
|
||||
if publicIPv4, err := metadata.GetMetadata("public-ipv4"); err == nil {
|
||||
if publicIPv4, err := getMetadata(ctx, metadata, "public-ipv4"); err == nil {
|
||||
klog.V(2).Infof("Public IPv4: %s", publicIPv4)
|
||||
addrs = append(addrs, publicIPv4)
|
||||
}
|
||||
if publicIPv6, err := metadata.GetMetadata("ipv6"); err == nil {
|
||||
if publicIPv6, err := getMetadata(ctx, metadata, "ipv6"); err == nil {
|
||||
klog.V(2).Infof("Public IPv6: %s", publicIPv6)
|
||||
addrs = append(addrs, publicIPv6)
|
||||
}
|
||||
|
@ -824,3 +843,16 @@ func (b *KubeletBuilder) buildCgroupService(name string) *nodetasks.Service {
|
|||
|
||||
return service
|
||||
}
|
||||
|
||||
func getMetadata(ctx context.Context, client *imds.Client, path string) (string, error) {
|
||||
resp, err := client.GetMetadata(ctx, &imds.GetMetadataInput{Path: path})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Content.Close()
|
||||
data, err := io.ReadAll(resp.Content)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(data), nil
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ func TestTaintsApplied(t *testing.T) {
|
|||
t.Error(err)
|
||||
}
|
||||
|
||||
c, err := b.buildKubeletConfigSpec()
|
||||
c, err := b.buildKubeletConfigSpec(context.TODO())
|
||||
|
||||
if g.expectError {
|
||||
if err == nil {
|
||||
|
@ -189,7 +189,7 @@ func runKubeletBuilder(t *testing.T, context *fi.NodeupModelBuilderContext, node
|
|||
|
||||
builder := KubeletBuilder{NodeupModelContext: nodeupModelContext}
|
||||
|
||||
kubeletConfig, err := builder.buildKubeletConfigSpec()
|
||||
kubeletConfig, err := builder.buildKubeletConfigSpec(context.Context())
|
||||
if err != nil {
|
||||
t.Fatalf("error from KubeletBuilder buildKubeletConfig: %v", err)
|
||||
return
|
||||
|
@ -204,7 +204,7 @@ func runKubeletBuilder(t *testing.T, context *fi.NodeupModelBuilderContext, node
|
|||
context.AddTask(fileTask)
|
||||
}
|
||||
{
|
||||
fileTask, err := builder.buildSystemdEnvironmentFile(kubeletConfig)
|
||||
fileTask, err := builder.buildSystemdEnvironmentFile(context.Context(), kubeletConfig)
|
||||
if err != nil {
|
||||
t.Fatalf("error from KubeletBuilder buildSystemdEnvironmentFile: %v", err)
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue