mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-14 14:23:37 +00:00
support multiple ec2 ips in aws provider
This commit is contained in:
parent
04b2c29a5a
commit
43e606a5da
@ -50,6 +50,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
||||||
"k8s.io/kubernetes/pkg/volume"
|
"k8s.io/kubernetes/pkg/volume"
|
||||||
|
"path"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProviderName is the name of this cloud provider.
|
// ProviderName is the name of this cloud provider.
|
||||||
@ -976,11 +977,21 @@ func (c *Cloud) NodeAddresses(name types.NodeName) ([]v1.NodeAddress, error) {
|
|||||||
if c.selfAWSInstance.nodeName == name || len(name) == 0 {
|
if c.selfAWSInstance.nodeName == name || len(name) == 0 {
|
||||||
addresses := []v1.NodeAddress{}
|
addresses := []v1.NodeAddress{}
|
||||||
|
|
||||||
internalIP, err := c.metadata.GetMetadata("local-ipv4")
|
macs, err := c.metadata.GetMetadata("network/interfaces/macs/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying AWS metadata for %q: %q", "local-ipv4", err)
|
return nil, fmt.Errorf("error querying AWS metadata for %q: %q", "network/interfaces/macs", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, macID := range strings.Split(macs, "\n") {
|
||||||
|
macPath := path.Join("network/interfaces/macs/", macID, "local-ipv4s")
|
||||||
|
internalIPs, err := c.metadata.GetMetadata(macPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error querying AWS metadata for %q: %q", macPath, err)
|
||||||
|
}
|
||||||
|
for _, internalIP := range strings.Split(internalIPs, "\n") {
|
||||||
addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: internalIP})
|
addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: internalIP})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
externalIP, err := c.metadata.GetMetadata("public-ipv4")
|
externalIP, err := c.metadata.GetMetadata("public-ipv4")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1029,15 +1040,26 @@ func extractNodeAddresses(instance *ec2.Instance) ([]v1.NodeAddress, error) {
|
|||||||
|
|
||||||
addresses := []v1.NodeAddress{}
|
addresses := []v1.NodeAddress{}
|
||||||
|
|
||||||
privateIPAddress := aws.StringValue(instance.PrivateIpAddress)
|
// handle internal network interfaces
|
||||||
if privateIPAddress != "" {
|
for _, networkInterface := range instance.NetworkInterfaces {
|
||||||
ip := net.ParseIP(privateIPAddress)
|
// skip network interfaces that are not currently in use
|
||||||
|
if isNilOrEmpty(networkInterface.Status) || *networkInterface.Status != ec2.NetworkInterfaceStatusInUse {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, internalIP := range networkInterface.PrivateIpAddresses {
|
||||||
|
if !isNilOrEmpty(internalIP.PrivateIpAddress) {
|
||||||
|
ipAddress := *internalIP.PrivateIpAddress
|
||||||
|
ip := net.ParseIP(ipAddress)
|
||||||
if ip == nil {
|
if ip == nil {
|
||||||
return nil, fmt.Errorf("EC2 instance had invalid private address: %s (%s)", aws.StringValue(instance.InstanceId), privateIPAddress)
|
return nil, fmt.Errorf("EC2 instance had invalid private address: %s (%s)", orEmpty(instance.InstanceId), ipAddress)
|
||||||
}
|
}
|
||||||
addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: ip.String()})
|
addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: ip.String()})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Other IP addresses (multiple ips)?
|
// TODO: Other IP addresses (multiple ips)?
|
||||||
publicIPAddress := aws.StringValue(instance.PublicIpAddress)
|
publicIPAddress := aws.StringValue(instance.PublicIpAddress)
|
||||||
if publicIPAddress != "" {
|
if publicIPAddress != "" {
|
||||||
|
@ -117,6 +117,7 @@ type FakeAWSServices struct {
|
|||||||
instances []*ec2.Instance
|
instances []*ec2.Instance
|
||||||
selfInstance *ec2.Instance
|
selfInstance *ec2.Instance
|
||||||
networkInterfacesMacs []string
|
networkInterfacesMacs []string
|
||||||
|
networkInterfacesPrivateIPs [][]string
|
||||||
networkInterfacesVpcIDs []string
|
networkInterfacesVpcIDs []string
|
||||||
|
|
||||||
ec2 *FakeEC2
|
ec2 *FakeEC2
|
||||||
@ -359,6 +360,13 @@ func (self *FakeMetadata) GetMetadata(key string) (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(keySplit) == 5 && keySplit[4] == "local-ipv4s" {
|
||||||
|
for i, macElem := range self.aws.networkInterfacesMacs {
|
||||||
|
if macParam == macElem {
|
||||||
|
return strings.Join(self.aws.networkInterfacesPrivateIPs[i], "/\n"), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -553,6 +561,16 @@ func TestNodeAddresses(t *testing.T) {
|
|||||||
instance0.PrivateIpAddress = aws.String("192.168.0.1")
|
instance0.PrivateIpAddress = aws.String("192.168.0.1")
|
||||||
instance0.PublicDnsName = aws.String("instance-same.ec2.external")
|
instance0.PublicDnsName = aws.String("instance-same.ec2.external")
|
||||||
instance0.PublicIpAddress = aws.String("1.2.3.4")
|
instance0.PublicIpAddress = aws.String("1.2.3.4")
|
||||||
|
instance0.NetworkInterfaces = []*ec2.InstanceNetworkInterface{
|
||||||
|
{
|
||||||
|
Status: aws.String(ec2.NetworkInterfaceStatusInUse),
|
||||||
|
PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{
|
||||||
|
{
|
||||||
|
PrivateIpAddress: aws.String("192.168.0.1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
instance0.InstanceType = aws.String("c3.large")
|
instance0.InstanceType = aws.String("c3.large")
|
||||||
instance0.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")}
|
instance0.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")}
|
||||||
state0 := ec2.InstanceState{
|
state0 := ec2.InstanceState{
|
||||||
@ -598,6 +616,8 @@ func TestNodeAddresses(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
aws3, _ := mockInstancesResp(&instance0, instances[0:1])
|
aws3, _ := mockInstancesResp(&instance0, instances[0:1])
|
||||||
|
// change node name so it uses the instance instead of metadata
|
||||||
|
aws3.selfAWSInstance.nodeName = "foo"
|
||||||
addrs3, err3 := aws3.NodeAddresses("instance-same.ec2.internal")
|
addrs3, err3 := aws3.NodeAddresses("instance-same.ec2.internal")
|
||||||
if err3 != nil {
|
if err3 != nil {
|
||||||
t.Errorf("Should not error when instance found")
|
t.Errorf("Should not error when instance found")
|
||||||
@ -609,18 +629,34 @@ func TestNodeAddresses(t *testing.T) {
|
|||||||
testHasNodeAddress(t, addrs3, v1.NodeExternalIP, "1.2.3.4")
|
testHasNodeAddress(t, addrs3, v1.NodeExternalIP, "1.2.3.4")
|
||||||
testHasNodeAddress(t, addrs3, v1.NodeExternalDNS, "instance-same.ec2.external")
|
testHasNodeAddress(t, addrs3, v1.NodeExternalDNS, "instance-same.ec2.external")
|
||||||
testHasNodeAddress(t, addrs3, v1.NodeInternalDNS, "instance-same.ec2.internal")
|
testHasNodeAddress(t, addrs3, v1.NodeInternalDNS, "instance-same.ec2.internal")
|
||||||
|
}
|
||||||
|
|
||||||
// Fetch from metadata
|
func TestNodeAddressesWithMetadata(t *testing.T) {
|
||||||
aws4, fakeServices := mockInstancesResp(&instance0, []*ec2.Instance{&instance0})
|
var instance ec2.Instance
|
||||||
fakeServices.selfInstance.PublicIpAddress = aws.String("2.3.4.5")
|
|
||||||
fakeServices.selfInstance.PrivateIpAddress = aws.String("192.168.0.2")
|
|
||||||
|
|
||||||
addrs4, err4 := aws4.NodeAddresses(mapInstanceToNodeName(&instance0))
|
instanceName := "instance.ec2.internal"
|
||||||
if err4 != nil {
|
instance.InstanceId = aws.String("i-0")
|
||||||
t.Errorf("unexpected error: %v", err4)
|
instance.PrivateDnsName = &instanceName
|
||||||
|
instance.PublicIpAddress = aws.String("2.3.4.5")
|
||||||
|
instance.InstanceType = aws.String("c3.large")
|
||||||
|
instance.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")}
|
||||||
|
state := ec2.InstanceState{
|
||||||
|
Name: aws.String("running"),
|
||||||
}
|
}
|
||||||
testHasNodeAddress(t, addrs4, v1.NodeInternalIP, "192.168.0.2")
|
instance.State = &state
|
||||||
testHasNodeAddress(t, addrs4, v1.NodeExternalIP, "2.3.4.5")
|
|
||||||
|
instances := []*ec2.Instance{&instance}
|
||||||
|
awsCloud, awsServices := mockInstancesResp(&instance, instances)
|
||||||
|
|
||||||
|
awsServices.networkInterfacesMacs = []string{ "0a:26:89:f3:9c:f6", "0a:77:64:c4:6a:48" ,}
|
||||||
|
awsServices.networkInterfacesPrivateIPs = [][]string{ []string{"192.168.0.1"}, []string{"192.168.0.2"} ,}
|
||||||
|
addrs, err := awsCloud.NodeAddresses("")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
testHasNodeAddress(t, addrs, v1.NodeInternalIP, "192.168.0.1")
|
||||||
|
testHasNodeAddress(t, addrs, v1.NodeInternalIP, "192.168.0.2")
|
||||||
|
testHasNodeAddress(t, addrs, v1.NodeExternalIP, "2.3.4.5")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetRegion(t *testing.T) {
|
func TestGetRegion(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user