0

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

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

这个任务我想自动化。

也许有人知道执行此类任务的工具。我假设这些步骤在 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是一个用例吗?
  • 或者有没有类似的东西?
  • 此类任务的任何特定图像?

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

4

1 回答 1

0

通过创建一个新连接并使用它将令牌存储在比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")
        }

    }
于 2022-01-30T10:59:03.573 回答