【问题标题】:Extract and assign values from one manifest to another within the cluster从一个清单中提取值并将其分配给集群内的另一个清单
【发布时间】:2022-01-30 18:59:03
【问题描述】:

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

在 ArgoCD 中,我必须在 AppProject-manifest 中分配目标集群 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-manifest 的用例吗?
  • 或者有类似的东西吗?
  • 此类任务的任何特定图像?

感谢您为我指明正确的方向

【问题讨论】:

    标签: kubernetes extract argocd kubernetes-jobs crossplane


    【解决方案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")
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-06
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多