[](https://res.cloudinary.com/practicaldev/image/fetch/s--ZQMwshiy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/820/1%2A8MDBjrYv5W2ANPok4EO3Tg.png)

在上一篇文章ArgoCD:概述、SSL 配置和应用程序部署我们快速概述了如何使用 ArgoCD,现在让我们尝试部署 Helm 图表。

其中最有趣的部分是如何启用Helm Secrets。对此感到有些痛苦,但最后,它按预期工作。

内容

  • ArgCD:Helm 图表部署

  • ArgoCD:添加私有 Github 存储库

  • Github SSH 密钥

  • ArgoCD 存储库

  • 添加 ArgoCD 应用程序

  • ArgoCD 和 Helm Secrets

  • 具有共享卷的 InitContainer

  • 构建安装了 helm-secrets 插件的 ArgoCD Docker 映像

  • SOPS 和 AWS KMS — 认证

  • AWS IAM 用户

  • AWS 凭证和配置

  • 添加secrets.yaml

ArgCD:Helm 图表部署

创建测试图表:

$ helm create test-helm-chart
Creating test-helm-chart

进入全屏模式 退出全屏模式

在本地检查:

$ helm upgrade --install --namespace dev-1-test-helm-chart-ns --create-namespace test-helm-chart-release test-helm-chart/ --debug --dry-run
…
{}
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace dev-1-test-helm-chart-ns -l “app.kubernetes.io/name=test-helm-chart,app.kubernetes.io/instance=test-helm-chart-release” -o jsonpath=”{.items[0].metadata.name}”)
export CONTAINER_PORT=$(kubectl get pod --namespace dev-1-test-helm-chart-ns $POD_NAME -o jsonpath=”{.spec.containers[0].ports[0].containerPort}”)
echo “Visit [http://127.0.0.1:8080](http://127.0.0.1:8080) to use your application”
kubectl --namespace dev-1-test-helm-chart-ns port-forward $POD_NAME 8080:$CONTAINER_PORT

进入全屏模式 退出全屏模式

好的 - 它正在工作,将其推送到 Github 存储库。

ArgoCD:添加私有 Github 存储库

Github SSH 密钥

我们有一个 Github 组织。稍后将为 ArgoCD 创建一个专用的 Github 用户,但现在,我们可以向我们的帐户添加一个新的 RSA 密钥。

实际上,我们可以使用 login:token 来配置访问权限,但 key 似乎是更好的选择。

生成密钥:

$ ssh-keygen -f ~/.ssh/argocd-github-key
Generating public/private rsa key pair.
…

进入全屏模式 退出全屏模式

将其添加到 Github — Settings > SSH keys:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--URWwn0u8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/512/0%2AQIKLLnoILBCSdGNE.png)

ArgoCD 存储库

转到 Settings — Repositories:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--7Ix1HGEI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/948/0%2ArTER-ZUJBgVh-BdJ.png)

选择使用 SSH 连接存储库:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--Zn80ijrx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/738/0%2ANL2dlRLYLixpHc9m.png)

设置名称,URL,添加私钥:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--KPSZxMqQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/1024/0%2AQIle1tP8U7biweEz.png)

密钥将存储在 Kubernetes Secret 中:

$ kk -n dev-1-devops-argocd-ns get secrets
NAME TYPE DATA AGE
argocd-application-controller-token-mc457 kubernetes.io/service-account-token 3 45h
argocd-dex-server-token-74r75 kubernetes.io/service-account-token 3 45h
argocd-secret Opaque 5 45h
argocd-server-token-54mfx kubernetes.io/service-account-token 3 45h
default-token-6mmr5 kubernetes.io/service-account-token 3 45h
repo-332507798 Opaque 1 13m

进入全屏模式 退出全屏模式

repo-332507798 — 在这里。

单击_连接_。

添加 ArgoCD 应用程序

创建一个新应用程序:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--TQqaRlcr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/713/0%2APd5fHaNkHNfeJWUD.png)

设置其名称,Project 保留_default_,在_Sync Policy to Auto-create namespace 中启用即可:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--gIsxkX9L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/880/0%2Ag-bEjTywKsXr4uOw.png)

Source 离开 Git,设置存储库的 URL,在 Revision 中指定一个分支,在 Path — path 到我们图表的目录。

在当前情况下,存储库是 devops-kubernetes,chart 的目录 — tests/test-helm-chart/,ArgoCD 将扫描 repo 并建议您选择其中的可用目录:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--j_S4iqpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/758/0%2AJKQzhl1xlrPy8tX3.png)

Destination 选择的本地 Kubernetes 集群中,将命名空间设置为将要部署图表的位置:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--2kRStBM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/692/0%2AYBhXtBT-CyL9tlak.png)

Destination 而不是 Directory 中设置了 Helm,虽然 Argo 发现这是存储库中的 helm-chart 目录并且已经设置了 Helm 本身并且已经扫描了values.yaml中的值。

可以将所有内容保留默认值,稍后我们将在此处添加我们的secrets.yaml:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--4ZvIgBpX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2ALiaNFrPe6ndTEEnJ.png)

完毕:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--akyvBkjV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/712/0%2AMTAR7wD_a9ArcxTy.png)

如果您现在单击该应用程序,您将看到 ArgoCD 已经扫描了模板并创建了一个清单以显示将从该 Helm 图表中部署哪些资源:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--GWrxCiJ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1 .medium.com/max/1024/0%2ALTk4bh0cyUTXLtew.png)

单击 Sync,您可以在此处看到可用的选项,例如 PruneDry Run:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--tiotDuBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AMT_Dg909A-MywU-w.png)

点击 Synchronize — 开始部署:

[](https://res.cloudinary.com/practicaldev/image/fetch/s---Dnmw7Kd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1 .medium.com/max/1024/0%2AlMLXqpNznsinm1xU.png)

完成 — 一切都已启动并正在运行:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--0gd4PI1v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2A1QF2qNLrZKYqfxqc.png)

现在检查应用程序列表:

$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
guestbook [https://kubernetes.default.svc](https://kubernetes.default.svc) default default Synced Healthy <none> <none> [https://github.com/argoproj/argocd-example-apps.git](https://github.com/argoproj/argocd-example-apps.git) guestbook HEAD
test-helm-chart [https://kubernetes.default.svc](https://kubernetes.default.svc) dev-1-devops-test-helm-chart-ns default Synced Healthy <none> <none> git@github.com:***/devops-kubernetes.git tests/test-helm-chart DVPS-458-ArgoCD

进入全屏模式 退出全屏模式

命名空间中的一个 pod:

$ kubectl -n dev-1-devops-test-helm-chart-ns get pod
NAME READY STATUS RESTARTS AGE
test-helm-chart-67dccc9fb4–2m5rf 1/1 Running 0 2m27s

进入全屏模式 退出全屏模式

而现在我们可以去Helm Secrets配置。

ArgoCD 和 Helm Secrets

所以,在我们不想使用我们的秘密之前,一切都变得如此简单,因为 ArgoCD 中的 Helm 没有安装必要的插件。

可用选项是按照文档here>>>使用 ArgoCD 构建自定义 Docker 映像,或者通过共享卷使用 Kubernetes InitContainer 安装插件,如here>>>所述。

具有共享卷的 InitContainer

我尝试的第一个解决方案是带有共享卷的 InitContainer,总的来说,它工作正常 — 插件已安装。

_ argocd-repo-server __ 的部署是下一个:

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: repo-server
    app.kubernetes.io/name: argocd-repo-server
    app.kubernetes.io/part-of: argocd
  name: argocd-repo-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-repo-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-repo-server
    spec:
      automountServiceAccountToken: false
      initContainers:
      - name: argo-tools
        image: alpine/helm
        command: [sh, -c]
        args:
        - apk add git &&
          apk add curl &&
          apk add bash &&
          helm plugin install [https://github.com/futuresimple/helm-secrets](https://github.com/futuresimple/helm-secrets)
        volumeMounts:
        - mountPath: /root/.local/share/helm/plugins/
          name: argo-tools
      containers:
      - command:
        - uid_entrypoint.sh
        - argocd-repo-server
        - --redis
        - argocd-redis:6379
        image: argoproj/argocd:v1.7.9
        imagePullPolicy: Always
        name: argocd-repo-server
        ports:
        - containerPort: 8081
        - containerPort: 8084
        readinessProbe:
          initialDelaySeconds: 5
          periodSeconds: 10
          tcpSocket:
            port: 8081
        volumeMounts:
        - mountPath: /app/config/ssh
          name: ssh-known-hosts
        - mountPath: /app/config/tls
          name: tls-certs
        - mountPath: /app/config/gpg/source
          name: gpg-keys
        - mountPath: /app/config/gpg/keys
          name: gpg-keyring
        - mountPath: /home/argocd/.local/share/helm/plugins/
          name: argo-tools
      volumes:
      - configMap:
          name: argocd-ssh-known-hosts-cm
        name: ssh-known-hosts
      - configMap:
          name: argocd-tls-certs-cm
        name: tls-certs
      - configMap:
          name: argocd-gpg-keys-cm
        name: gpg-keys
      - emptyDir: {}
        name: gpg-keyring
      - emptyDir: {}
        name: argo-tools

进入全屏模式 退出全屏模式

这里是一个以_argo-tools_名称创建的emptyDir卷,然后一个名为_argo-tools_的initContainer以这个卷启动并附加到/root/.local/share/helm/plugins/目录,然后安装gitcurlbash,最后执行helm plugin install https://github.com/futuresimple/helm-secrets

同一个卷_argo-tools_挂载到_argocd-repo-server pod,因为/home/argocd/.local/share/helm/plugins/目录和_argocd-repo-server容器中的helm可以看到插件并能够使用它。

但问题来了:我们如何执行helm secrets install命令?默认情况下,ArgoCD 调用/usr/local/bin/helm二进制文件,并且无法为其指定其他参数。

因此,不得不使用第二个选项 — 使用 helm-secrets 构建自定义映像,并安装sops,并编写一个包装脚本来执行 helm 二进制文件。

构建安装了 helm-secrets 插件的 ArgoCD Docker 映像

该解决方案在此处搜索 — 如何使用 ArgoCD 和 Sops 处理 Kubernetes 机密。

首先 — 需要编写我们的包装脚本。

必须使用templateinstallupgradelintdiff参数调用脚本而不是/usr/local/bin/helm二进制文件,并将带有所有参数的命令传递给helm secrets

执行helm secrets @arguments后 - 打印输出并删除“removed 'secrets.yaml.dec'”字符串:

#! /bin/sh

# helm secrets only supports a few helm commands
if [$1 = "template"] || [$1 = "install"] || [$1 = "upgrade"] || [$1 = "lint"] || [$1 = "diff"]
then 
    # Helm secrets add some useless outputs to every commands including template, namely
    # 'remove: <secret-path>.dec' for every decoded secrets.
    # As argocd use helm template output to compute the resources to apply, these outputs
    # will cause a parsing error from argocd, so we need to remove them.
    # We cannot use exec here as we need to pipe the output so we call helm in a subprocess and
    # handle the return code ourselves.
    out=$(helm.bin secrets $@) 
    code=$? 
    if [$code -eq 0]; then
        # printf insted of echo here because we really don't want any backslash character processing
        printf '%s\n' "$out" | sed -E "/^removed '.+\.dec'$/d"      
        exit 0
    else
        exit $code
    fi
else
    # helm.bin is the original helm binary
    exec helm.bin $@
fi

进入全屏模式 退出全屏模式

接下来是使用 helm-secrets 和sops构建自己的 Docker 映像,并用我们的 wrapper 替换/usr/local/bin/helm

找到最新的 SOPS 版本 —https://github.com/mozilla/sops/releases/和最新版本的 Helm-secrets — https://github.com/zendesk/helm-secrets/releases ](https://github.com/zendesk/helm-secrets/releases)。

编写一个 Dockerfile:

FROM argoproj/argocd:v1.7.9

ARG SOPS_VERSION="v3.6.1"
ARG HELM_SECRETS_VERSION="2.0.2" 

USER root  
COPY helm-wrapper.sh /usr/local/bin/
RUN apt-get update --allow-insecure-repositories --allow-unauthenticated && \
    apt-get install -y \
    curl \
    gpg && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    curl -o /usr/local/bin/sops -L [https://github.com/mozilla/sops/releases/download/${SOPS\_VERSION}/sops-${SOPS\_VERSION}.linux](https://github.com/mozilla/sops/releases/download/%24%7BSOPS_VERSION%7D/sops-%24%7BSOPS_VERSION%7D.linux) && \
    chmod +x /usr/local/bin/sops && \
    cd /usr/local/bin && \
    mv helm helm.bin && \
    mv helm2 helm2.bin && \
    mv helm-wrapper.sh helm && \
    ln helm helm2 && \
    chmod +x helm helm2

# helm secrets plugin should be installed as user argocd or it won't be found
USER argocd
RUN /usr/local/bin/helm.bin plugin install [https://github.com/zendesk/helm-secrets](https://github.com/zendesk/helm-secrets) --version ${HELM_SECRETS_VERSION}
ENV HELM_PLUGINS="/home/argocd/.local/share/helm/plugins/"

进入全屏模式 退出全屏模式

构建镜像—— 下面的存储库是公开的,所以你可以从这里使用镜像。

使用用于构建它的 ArgoCD 加上您自己的内部版本号标记图像,这里将是 1:

$ docker build -t setevoy/argocd-helm-secrets:v1.7.9–1 .
$ docker push setevoy/argocd-helm-secrets:v1.7.9–1

进入全屏模式 退出全屏模式

现在,需要更新用于在中部署 ArgoCD 的install.yaml上一篇文章。

SOPS 和 AWS KMS — 认证

在我们的例子中,我们使用来自 AWS Key Management Service 的密钥,因此来自setevoy/argocd-helm-secrets:v1.7.9-1映像的容器中的 SOPS 必须有权访问 AWS 账户和此密钥。

SOPS需要~/.aws/credentials~/.aws/config文件,我们将从 Kubernetes Secrets 挂载到 pod。

实际上,这可以通过ServiceAccount和 IAM 角色来完成 — 但是现在,让我们来处理文件。

AWS IAM 用户

创建专用 AWS 用户来访问密钥 — 转到 AWS IAM,将其设置为_Programmatic access_:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--id2_lgqZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/870/0%2Apeq2b5wezxqcJeB7.png)

接下来,创建一个只读 IAM 策略,该策略只能访问 SOPS 使用的这个密钥:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--1r3NfcJi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/845/0%2AmnvsmPPAG11KKvdK.png)

[](https://res.cloudinary.com/practicaldev/image/fetch/s--zj6ljmXT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/874/0%2ATCSZY3WFwD46vcHn.png)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "kms:ListKeys",
                "kms:ListAliases",
                "kms:DescribeKey",
                "kms:ListKeyPolicies",
                "kms:GetKeyPolicy",
                "kms:GetKeyRotationStatus",
                "iam:ListUsers",
                "iam:ListRoles"
            ],
            "Resource": "arn:aws:kms:us-east-2:534 ***385:key/f73daf0d-*** -440ca3b6547b",
            "Effect": "Allow"
        }
    ]
}

进入全屏模式 退出全屏模式

保存并附加到用户:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--C2mwFaM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/892/0%2AV2C7P0-RCOI1Tcl0.png)

保存用户,转到 AWS KMS,添加一个关键用户:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--ScY_rbRF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/941/0%2AGvnRLV1Ee77vzrsF.png)

配置本地 AWS 配置文件:

$ aws configure --profile argocd-kms
AWS Access Key ID [None]: AKI***Q4F
AWS Secret Access Key [None]: S7c***6ya
Default region name [None]: us-east-2
Default output format [None]:

进入全屏模式 退出全屏模式

检查访问:

$ aws --profile argocd-kms kms describe-key --key-id f73daf0d-***-440ca3b6547b
{
“KeyMetadata”: {
“AWSAccountId”: “534***385”,
“KeyId”: “f73daf0d-***-440ca3b6547b”,
“Arn”: “arn:aws:kms:us-east-2:534 ***385:key/f73daf0d-*** -440ca3b6547b”,
…

进入全屏模式 退出全屏模式

此配置文件将用于加密我们的机密,并且此配置文件需要添加到 argocd-repo-server pod。

AWS 凭证和配置

使用~/.aws/credentials~/.aws/config内容创建一个新的 Kubernetes Secret,然后它们将映射到 argocd-repo-server pod:

--------     
apiVersion: v1
kind: Secret
metadata:
  name: argocd-aws-credentials
  namespace: dev-1-devops-argocd-ns
type: Opaque
stringData: 
  credentials: |
    [argocd-kms]
    aws_access_key_id = AKI***Q4F
    aws_secret_access_key = S7c***6ya
  config: | 
    [profile argocd-kms]
    region = us-east-2

进入全屏模式 退出全屏模式

将文件添加到.gitignore:

$ cat .gitignore
argocd-aws-credentials.yaml

进入全屏模式 退出全屏模式

稍后,什么时候会为 ArgoCD 推出自动化,这个文件可以从 Jenkins Secrets 中创建。

创建秘密:

$ kubectl apply -f argocd-aws-credentials.yaml
secret/argocd-aws-credentials created

进入全屏模式 退出全屏模式

更新部署 argocd-repo-server - 更改要使用的镜像,从我们的 Secret 添加一个新卷,并将其作为/home/argocd/.aws安装到使用 Argo 的 pod:

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: repo-server
    app.kubernetes.io/name: argocd-repo-server
    app.kubernetes.io/part-of: argocd
  name: argocd-repo-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-repo-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-repo-server
    spec:
      automountServiceAccountToken: false
      containers:
      - command:
        - uid_entrypoint.sh
        - argocd-repo-server
        - --redis
        - argocd-redis:6379
# image: argoproj/argocd:v1.7.9
        image: setevoy/argocd-helm-secrets:v1.7.9-1
        imagePullPolicy: Always
        name: argocd-repo-server
        ports:
        - containerPort: 8081
        - containerPort: 8084
        readinessProbe:
          initialDelaySeconds: 5
          periodSeconds: 10
          tcpSocket:
            port: 8081
        volumeMounts:
        - mountPath: /app/config/ssh
          name: ssh-known-hosts
        - mountPath: /app/config/tls
          name: tls-certs
        - mountPath: /app/config/gpg/source
          name: gpg-keys
        - mountPath: /app/config/gpg/keys
          name: gpg-keyring
        - mountPath: /home/argocd/.aws
          name: argocd-aws-credentials
      volumes:
      - configMap:
          name: argocd-ssh-known-hosts-cm
        name: ssh-known-hosts
      - configMap:
          name: argocd-tls-certs-cm
        name: tls-certs
      - configMap:
          name: argocd-gpg-keys-cm
        name: gpg-keys
      - emptyDir: {}
        name: gpg-keyring
      - name: argocd-aws-credentials
        secret:
          secretName: argocd-aws-credentials

进入全屏模式 退出全屏模式

更新 ArgoCD 实例:

$ kubectl -n dev-1-devops-argocd-ns apply -f install.yaml

进入全屏模式 退出全屏模式

检查豆荚:

$ kubectl -n dev-1-devops-argocd-ns get pod
NAME READY STATUS RESTARTS AGE
…
argocd-repo-server-64f4bbf4b7-jcs6x 1/1 Terminating 0 19h
argocd-repo-server-7c64775679–9jjq2 1/1 Running 0 12s

进入全屏模式 退出全屏模式

检查文件:

$ kubectl -n dev-1-devops-argocd-ns exec -ti argocd-repo-server-7c64775679–9jjq2 -- cat /home/argocd/.aws/credentials
[argocd-kms]
aws_access_key_id = AKI***Q4F
aws_secret_access_key = S7c***6ya

进入全屏模式 退出全屏模式

让我们尝试使用 helm-secrets。

添加secrets.yaml

在带有图表的存储库中创建一个新的secrets.yaml文件:

somePassword: secretValue

进入全屏模式 退出全屏模式

使用 KMS 密钥和 AWS 配置文件创建一个 .sops.yaml 文件:

--------
creation_rules:
  - kms: 'arn:aws:kms:us-east-2:534 ****385:key/f73daf0d-*** -440ca3b6547b'
    aws_profile: argocd-kms

进入全屏模式 退出全屏模式

加密文件:

$ helm secrets enc secrets.yaml
Encrypting secrets.yaml
Encrypted secrets.yaml

进入全屏模式 退出全屏模式

在测试图表中添加我们的秘密用法,例如 — 让我们创建一个名为TEST_SECRET_PASSWORD的环境变量 - 更新templates/deployment.yaml:

...
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
          - name: TEST_SECRET_PASSWORD
            value: {{ .Values.somePassword }}
...

进入全屏模式 退出全屏模式

将更改推送到存储库:

$ git add secrets.yaml templates/deployment.yaml
$ git commit -m “test secret added” && git push

进入全屏模式 退出全屏模式

转到应用程序的设置 — App 详细信息 > 参数,单击 Edit 并将values.yamlsecrets.yaml指定为 Values Files:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--6hBl0wTZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AxfeOdy1EGrulhUTb.png)

ArgoCD 现在看到应用程序没有与存储库中的数据同步:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--TUI2v3-n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/1024/0%2A99QiRPODRiVF7lx1.png)

同步它:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--aJ0PezqP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1015/0%2AdIPwMHAFGX9YeIcD.png)

检查新的 pod:

[](https://res.cloudinary.com/practicaldev/image/fetch/s--MKwcEINo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/970/0%2AO7xiAe21OVL0UyTs.png)

和数据直接在 pod 中:

$ kubectl -n dev-1-devops-test-helm-chart-ns exec -ti test-helm-chart-5c777f9c9d-wkx6s -- printenv | grep SECRET
TEST_SECRET_PASSWORD=secretValue

进入全屏模式 退出全屏模式

全部完成 — 秘密就在这里。

最初发表于RTFM:Linux、DevOps 和系统管理.


Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐