Как получить метданные AWS при создании узла с помощью client-go

Я работаю над написанием настраиваемого контроллера для нашего кластера kubernetes, который будет прослушивать события узла и выполнять некоторые операции на узле. Я использую библиотеку kubernetes client-go и могу захватывать события kubernetes всякий раз, когда узел присоединяется или удаляется. из кластера. Но можно ли получить подробную информацию об экземпляре AWS для созданного узла Kubernetes, например идентификатор экземпляра, теги и т. Д.? Заранее спасибо.

PS: Я установил кластер kubernetes с помощью kops


person Mathan Kumar    schedule 24.07.2018    source источник


Ответы (2)


На узле Kubernetes в AWS некоторые вещи будут заполнены как часть меток узла и различные другие части метаданных узла:

kubectl get nodes -o json | jq '.items[].metadata.labels'

{
  "beta.kubernetes.io/arch": "amd64",
  "beta.kubernetes.io/instance-type": "c5.large",
  "beta.kubernetes.io/os": "linux",
  "failure-domain.beta.kubernetes.io/region": "us-east-1",
  "failure-domain.beta.kubernetes.io/zone": "us-east-1b",
  "kubernetes.io/hostname": "<hostname>",
  "kubernetes.io/role": "master",
  "manufacturer": "amazon_ec2",
  "node-role.kubernetes.io/master": "",
  "operatingsystem": "centos",
  "tier": "production",
  "virtual": "kvm"
}

Информация об узле находится в client-go в узел узла, используя метод Get. Вот пример:

  client := kubernetes.NewForConfigOrDie(config)

  list, err := client.CoreV1().Nodes().List(metav1.ListOptions{})
  if err != nil {
    fmt.Fprintf(os.Stderr, "error listing nodes: %v", err)
    os.Exit(1)
  }

  for _, node := range list.Items {
    fmt.Printf("Node: %s\n", node.Name)
    node, err := client.CoreV1().Nodes().Get(node.Name, metav1.GetOptions{})
    if err != nil {
      fmt.Fprintf(os.Stderr, "error getting node: %v", err)
      os.Exit(1)
    }
    fmt.Println(node)
  }

Однако на самом деле, вероятно, вы не хотите этого делать. Если вы запускаете это в кластере kops в AWS, узел, на котором выполняется ваша рабочая нагрузка, уже имеет доступ к API AWS, а также к роль IAM, необходимая для запроса данных узла.

Помня об этом, рассмотрите возможность использования вместо него AWS Go SDK. Вы можете легко запросить EC2, вот адаптированный пример:

package main

import (
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
    // Load session from shared config
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    // Create new EC2 client
    ec2Svc := ec2.New(sess)

    // Call to get detailed information on each instance
    result, err := ec2Svc.DescribeInstances(nil)
    if err != nil {
        fmt.Println("Error", err)
    } else {
        fmt.Println("Success", result)
    }
}
person jaxxstorm    schedule 24.07.2018
comment
Спасибо за ответ :) В какой-то мере мне это помогло. Используя метаданные kubernetes, мне не удалось получить метаданные ec2 .. И просто используя aws-sdk-go, я не смогу сопоставить соответствующий узел. Фильтрация экземпляров с использованием частного DNS (от имени хоста узла) дала идентификатор экземпляра, через который я могу выполнять другие операции - person Mathan Kumar; 25.07.2018

При получении события для создания узла у его атрибута object Имя object.Name есть частный DNS созданного экземпляра aws. Используя частный DNS экземпляра, мы могли бы запросить идентификатор экземпляра с помощью aws-sdk-go

hostName := object.Name
sess := session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
}))

// Create new EC2 client
ec2Svc := ec2.New(sess)
var instanceId string
params := &ec2.DescribeInstancesInput{
Filters: []*ec2.Filter{
                {
                        Name:   aws.String("private-dns-name"),
                        Values: []*string{aws.String(hostName)},
                },
        },
}
// Call to get detailed information on each instance
result, err := ec2Svc.DescribeInstances(params)
if err != nil {
        fmt.Println("there was an error listing instances in", err.Error())
        log.Fatal(err.Error())
}
for idx, res := range result.Reservations {
        fmt.Println("  > Reservation Id", *res.ReservationId, " Num Instances: ", len(res.Instances))
        for _, inst := range result.Reservations[idx].Instances {
                // result[idx].SetDisableApiTermination(true);
                instanceId = *inst.InstanceId
                fmt.Println("    - Instance ID: ", *inst.InstanceId)
                break // Only one instance will match the private dns
        }
}

С идентификатором экземпляра мы могли выполнять любые операции с экземпляром ec2, используя API aws-sdk-go.

person Mathan Kumar    schedule 26.07.2018