Извлечение и присвоение значений из одного манифеста другому в пределах кластера

Я практикую GitOps и хотел бы максимально автоматизировать. ArgoCD совместно с Crossplane создает мои кластеры на основе манифестов. Когда кластер запущен и работает, Crossplane создает Secretсодержащий обычный kubeconfigфайл, который можно скачать и использовать как любой другой kubeconfig.

В ArgoCD я должен назначить IP-адрес целевого кластера в AppProject-манифест.

И это задание я хотел бы автоматизировать.

Может быть, кто-то знает инструмент для выполнения таких задач. Я предполагаю, что эти шаги распространены в мире K8, но я их не знаю. Если такого инструмента нет, я думал пойти ручным путем.

Необработанный секрет kubeconfig:

      data:
  kubeconfig: YXBpVmVyc2lvbj..........1VKbFJFTkRRVkl5WjBGM1NVSkJaMGxDUVblahblh..g==
kind: Secret
metadata:
  creationTimestamp: "2022-01-24T17:09:07Z"
  name: cluster-MY_CLUSTER-NAME-cp
  namespace: default
  resourceVersion: "7413"
  uid: 25346457-cc78-4e21-9cba-e291b2251c84
type: Opaque

Это base64 декодированный соответствующий kubeconfig

      apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLSBLAHBLAH_BLAH_B0K
    server: https://123.456.678.0:6443 # <<---- THIS IP SHOULD BE EXTRACTED
  name: MY_CLUSTER-staging-cp
contexts:
- context:
    cluster: MY_CLUSTER-staging-cp
    user: MY_CLUSTER-staging-cp
  name: MY_CLUSTER-staging-cp
current-context: MY_CLUSTER-staging-cp
kind: Config
preferences: {}
users:
- name: MY_CLUSTER-staging-cp
  user:
    client-certificate-data: LS0tL...........StkZk9IdWpqT2JmQjlHcG5maWpMOXZPODQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0
    client-key-data: LS0tLS1CRUd...........JTiQo=

Это мой целевой манифест:

      apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: staging
spec:
  destinations:
    - namespace: "staging"
      server: $STAGING_IP # <<-- THE PLACE TO PUT THE IP ADDRESS

Я могу извлечь адрес из секрета с помощью:

export STAGING_IP=$(kubectl get secret cluster-details-vonhier-staging-cp -o jsonpath="{.data.kubeconfig}" | base64 -d| yq e ".clusters[0].cluster.server" -)

И применить его через:

yq e --inplace ".spec.destinations[0].server = \"${STAGING_IP}\"" app-projects/staging.yml

Что заканчивается, как я ожидаю:

адресаты: - пространство имен: "производственный" сервер: "https://123.456.678.0:6443"

Это работает.

Но как «упаковать» это в кластер? Работает локально,..

  • Является ли вариант использования для kind: Job-манифест?
  • Или есть что-то подобное?
  • Какой-то конкретный образ для таких задач?

Спасибо, что указали мне правильное направление

1 ответ

Я смог получить желаемое секретное значение, создав новое соединение и используя его для хранения токена в переменной более высокого уровня, чем informer.AddEventHandler

          rules := clientcmd.NewDefaultClientConfigLoadingRules()
    myKubeconfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, &clientcmd.ConfigOverrides{})
    myconfig, err := myKubeconfig.ClientConfig()
    clientset := kubernetes.NewForConfigOrDie(myconfig)
    secretList, err := clientset.CoreV1().Secrets("crossplane-system").List(metav1.ListOptions{})

    var bearerToken string

    if err != nil {
        panic(err.Error())
    }
    for _, secret := range secretList.Items {
        if len(secret.Data["authToken"]) != 0 {
            var authToken string = string(secret.Data["authToken"])
            fmt.Print("authToken: ", authToken)
            bearerToken = authToken
        } else {
            fmt.Println("no authToken found")
        }

    }
Другие вопросы по тегам