从集群中的一个清单中提取值并将其分配给另一个清单



我正在练习GitOps,希望尽可能多地实现自动化。ArgoCD和Crossplane一起创建了基于清单的集群。当集群启动并运行时,Crossplane会创建一个包含常规kubeconfig文件的Secret,该文件可以像其他kubeconfig一样下载和使用。

在ArgoCD中,我必须在AppProject-清单中分配目标集群IP地址。

我想自动化这项任务

也许有人知道做这类任务的工具。我认为这些步骤在K8s世界中很常见,但我不知道。如果没有这样的工具,我想走手动方式。

原始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清单的用例吗
  • 或者有类似的东西吗
  • 这些任务有什么具体的图像吗

谢谢你给我指明了正确的方向

我能够通过创建一个新连接来获得我想要的秘密值,并使用它将令牌存储在比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")
}
}

最新更新