Извлечение и присвоение значений из одного манифеста другому в пределах кластера
Я практикую 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")
}
}