mirror of https://github.com/k3s-io/k3s
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.8 KiB
79 lines
2.8 KiB
package cloudprovider |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"strings" |
|
|
|
"github.com/k3s-io/k3s/pkg/version" |
|
"github.com/pkg/errors" |
|
"github.com/sirupsen/logrus" |
|
corev1 "k8s.io/api/core/v1" |
|
cloudprovider "k8s.io/cloud-provider" |
|
) |
|
|
|
var ( |
|
InternalIPKey = version.Program + ".io/internal-ip" |
|
ExternalIPKey = version.Program + ".io/external-ip" |
|
HostnameKey = version.Program + ".io/hostname" |
|
) |
|
|
|
var _ cloudprovider.InstancesV2 = &k3s{} |
|
|
|
// InstanceExists returns true if the instance for the given node exists according to the cloud provider. |
|
// K3s nodes always exist. |
|
func (k *k3s) InstanceExists(ctx context.Context, node *corev1.Node) (bool, error) { |
|
return true, nil |
|
} |
|
|
|
// InstanceShutdown returns true if the instance is shutdown according to the cloud provider. |
|
// K3s nodes are never shutdown. |
|
func (k *k3s) InstanceShutdown(ctx context.Context, node *corev1.Node) (bool, error) { |
|
return false, nil |
|
} |
|
|
|
// InstanceMetadata returns the instance's metadata. |
|
func (k *k3s) InstanceMetadata(ctx context.Context, node *corev1.Node) (*cloudprovider.InstanceMetadata, error) { |
|
if (node.Annotations[InternalIPKey] == "") && (node.Labels[InternalIPKey] == "") { |
|
return nil, errors.New("address annotations not yet set") |
|
} |
|
|
|
addresses := []corev1.NodeAddress{} |
|
|
|
// check internal address |
|
if address := node.Annotations[InternalIPKey]; address != "" { |
|
for _, v := range strings.Split(address, ",") { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeInternalIP, Address: v}) |
|
} |
|
} else if address = node.Labels[InternalIPKey]; address != "" { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeInternalIP, Address: address}) |
|
} else { |
|
logrus.Infof("Couldn't find node internal ip annotation or label on node %s", node.Name) |
|
} |
|
|
|
// check external address |
|
if address := node.Annotations[ExternalIPKey]; address != "" { |
|
for _, v := range strings.Split(address, ",") { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeExternalIP, Address: v}) |
|
} |
|
} else if address = node.Labels[ExternalIPKey]; address != "" { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeExternalIP, Address: address}) |
|
} |
|
|
|
// check hostname |
|
if address := node.Annotations[HostnameKey]; address != "" { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeHostName, Address: address}) |
|
} else if address = node.Labels[HostnameKey]; address != "" { |
|
addresses = append(addresses, corev1.NodeAddress{Type: corev1.NodeHostName, Address: address}) |
|
} else { |
|
logrus.Infof("Couldn't find node hostname annotation or label on node %s", node.Name) |
|
} |
|
|
|
return &cloudprovider.InstanceMetadata{ |
|
ProviderID: fmt.Sprintf("%s://%s", version.Program, node.Name), |
|
InstanceType: version.Program, |
|
NodeAddresses: addresses, |
|
Zone: "", |
|
Region: "", |
|
}, nil |
|
}
|
|
|