mirror of https://github.com/k3s-io/k3s
Merge pull request #49237 from brendandburns/imds2
Automatic merge from submit-queue (batch tested with PRs 49237, 49656, 49980, 49841, 49899) Improve our Instance Metadata coverage in Azure.pull/6/head
commit
82b95c0a4e
|
@ -54,7 +54,7 @@ type Subnet struct {
|
|||
Prefix string `json:"prefix"`
|
||||
}
|
||||
|
||||
// InstanceMetadata represents access to the Azure instance metadata server.
|
||||
// InstanceMetadata knows how to query the Azure instance metadata server.
|
||||
type InstanceMetadata struct {
|
||||
baseURL string
|
||||
}
|
||||
|
@ -71,8 +71,8 @@ func (i *InstanceMetadata) makeMetadataURL(path string) string {
|
|||
return i.baseURL + path
|
||||
}
|
||||
|
||||
// QueryMetadataJSON queries the metadata server and populates the passed in object
|
||||
func (i *InstanceMetadata) QueryMetadataJSON(path string, obj interface{}) error {
|
||||
// Object queries the metadata server and populates the passed in object
|
||||
func (i *InstanceMetadata) Object(path string, obj interface{}) error {
|
||||
data, err := i.queryMetadataBytes(path, "json")
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -80,8 +80,8 @@ func (i *InstanceMetadata) QueryMetadataJSON(path string, obj interface{}) error
|
|||
return json.Unmarshal(data, obj)
|
||||
}
|
||||
|
||||
// QueryMetadataText queries the metadata server and returns the corresponding text
|
||||
func (i *InstanceMetadata) QueryMetadataText(path string) (string, error) {
|
||||
// Text queries the metadata server and returns the corresponding text
|
||||
func (i *InstanceMetadata) Text(path string) (string, error) {
|
||||
data, err := i.queryMetadataBytes(path, "text")
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
|
|
@ -30,14 +30,23 @@ import (
|
|||
// NodeAddresses returns the addresses of the specified instance.
|
||||
func (az *Cloud) NodeAddresses(name types.NodeName) ([]v1.NodeAddress, error) {
|
||||
if az.UseInstanceMetadata {
|
||||
text, err := az.metadata.QueryMetadataText("instance/network/interface/0/ipv4/ipAddress/0/privateIpAddress")
|
||||
ipAddress := IPAddress{}
|
||||
err := az.metadata.Object("instance/network/interface/0/ipv4/ipAddress/0", &ipAddress)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return []v1.NodeAddress{
|
||||
{Type: v1.NodeInternalIP, Address: text},
|
||||
addresses := []v1.NodeAddress{
|
||||
{Type: v1.NodeInternalIP, Address: ipAddress.PrivateIP},
|
||||
{Type: v1.NodeHostName, Address: string(name)},
|
||||
}, nil
|
||||
}
|
||||
if len(ipAddress.PublicIP) > 0 {
|
||||
addr := v1.NodeAddress{
|
||||
Type: v1.NodeExternalIP,
|
||||
Address: ipAddress.PublicIP,
|
||||
}
|
||||
addresses = append(addresses, addr)
|
||||
}
|
||||
return addresses, nil
|
||||
}
|
||||
ip, err := az.getIPForMachine(name)
|
||||
if err != nil {
|
||||
|
@ -77,9 +86,27 @@ func (az *Cloud) ExternalID(name types.NodeName) (string, error) {
|
|||
return az.InstanceID(name)
|
||||
}
|
||||
|
||||
func (az *Cloud) isCurrentInstance(name types.NodeName) (bool, error) {
|
||||
nodeName := mapNodeNameToVMName(name)
|
||||
metadataName, err := az.metadata.Text("instance/compute/name")
|
||||
return (metadataName == nodeName), err
|
||||
}
|
||||
|
||||
// InstanceID returns the cloud provider ID of the specified instance.
|
||||
// Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound)
|
||||
func (az *Cloud) InstanceID(name types.NodeName) (string, error) {
|
||||
if az.UseInstanceMetadata {
|
||||
isLocalInstance, err := az.isCurrentInstance(name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if isLocalInstance {
|
||||
externalInstanceID, err := az.metadata.Text("instance/compute/vmId")
|
||||
if err == nil {
|
||||
return externalInstanceID, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
var machine compute.VirtualMachine
|
||||
var exists bool
|
||||
var err error
|
||||
|
@ -119,6 +146,18 @@ func (az *Cloud) InstanceTypeByProviderID(providerID string) (string, error) {
|
|||
// (Implementer Note): This is used by kubelet. Kubelet will label the node. Real log from kubelet:
|
||||
// Adding node label from cloud provider: beta.kubernetes.io/instance-type=[value]
|
||||
func (az *Cloud) InstanceType(name types.NodeName) (string, error) {
|
||||
if az.UseInstanceMetadata {
|
||||
isLocalInstance, err := az.isCurrentInstance(name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if isLocalInstance {
|
||||
machineType, err := az.metadata.Text("instance/compute/vmSize")
|
||||
if err == nil {
|
||||
return machineType, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
machine, exists, err := az.getVirtualMachine(name)
|
||||
if err != nil {
|
||||
glog.Errorf("error: az.InstanceType(%s), az.getVirtualMachine(%s) err=%v", name, name, err)
|
||||
|
|
|
@ -879,7 +879,7 @@ func TestMetadataParsing(t *testing.T) {
|
|||
}
|
||||
|
||||
networkJSON := NetworkMetadata{}
|
||||
if err := metadata.QueryMetadataJSON("/some/path", &networkJSON); err != nil {
|
||||
if err := metadata.Object("/some/path", &networkJSON); err != nil {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue