【问题标题】:How to set secret data to kubernetes secrets by yaml?如何通过yaml将秘密数据设置为kubernetes秘密?
【发布时间】:2016-02-17 09:15:20
【问题描述】:

我正在使用 kubernetes 将 rails 应用程序部署到 google 容器引擎。

关注 Kubernetes 机密文档:http://kubernetes.io/v1.1/docs/user-guide/secrets.html

我创建了一个网络控制器文件:

# web-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    name: web
  name: web-controller
spec:
  replicas: 2
  selector:
    name: web
  template:
    metadata:
      labels:
        name: web
    spec:
      containers:
      - name: web
        image: gcr.io/my-project-id/myapp:v1
        ports:
        - containerPort: 3000
          name: http-server
        env:
          secret:
          - secretName: mysecret

并创建了一个秘密文件:

# secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  RAILS_ENV: production

当我跑步时:

kubectl create -f web-controller.yml

显示:

error: could not read an encoded object from web-controller.yml: unable to load "web-controller.yml": json: cannot unmarshal object into Go value of type []v1.EnvVar
error: no objects passed to create

web-controller.yml 文件中的 yaml 格式可能有误。那怎么写呢?

【问题讨论】:

    标签: ruby-on-rails yaml kubernetes google-kubernetes-engine


    【解决方案1】:

    假设我们现在在部署中添加 imagepull 机密,请按照以下步骤操作,

    kubectl create secret docker-registry secret-name --docker-server=<registry-server-url> --docker-username=<Username> --docker-password=<password> --docker-email=<your-email>

    现在在部署 yaml 文件中引用这个,

    apiVersion: v1
    kind: Deployment
    metadata:
      name: test-deployment
    spec:
      containers:
      - name: test-app
        image: <Image-name-private>
      imagePullSecrets:
      - name: secret-name
    

    假设您有一些用于访问应用程序的 api 密钥。

    kubectl create secret generic secret-name --from-literal api-key="&lt;your_api-key"

    现在像这样在部署中引用它。

            env:
              - name: API_KEY
                valueFrom:
                  secretKeyRef:
                    name: secret-name
                    key: api-key
    

    【讨论】:

      【解决方案2】:

      secret.yml

      apiVersion: v1
      kind: Secret
      metadata:
        name: mysecret
      type: Opaque
      stringData:
        RAILS_ENV: production
      

      stringData 是您所追求的简单模式版本,不过是一回事。 您将在注释中看到用于创建秘密的明文原始 yaml(如果您使用上述方法,这意味着您将在注释中拥有人类可读的秘密,如果您使用以下方法,您将拥有 base64 'd secret in your annotation),除非您像这样使用擦除注释命令:

      kubectl apply -f secret.yml
      kubectl annotate secret mysecret kubectl.kubernetes.io/last-applied-configuration-
      (最后的 - 是删除它的意思)
      kubectl get secret mysecret -n=api -o yaml
      (确认)

      您也可以选择
      Bash# echo 制作 | base64
      cHJvZHVjdGlvbgo=

      apiVersion: v1
      kind: Secret
      metadata:
        name: mysecret
      type: Opaque
      data:
        RAILS_ENV: cHJvZHVjdGlvbgo=
      

      【讨论】:

        【解决方案3】:

        我们目前不支持公开为 env vars 的机密。

        【讨论】:

        • 当时确实如此,但现在已经不是这样了
        【解决方案4】:

        您需要对值进行base64 编码,并且您的密钥必须是有效的DNS 标签,即将RAILS_ENV 替换为例如rails-env。另请参阅我整理的这个端到端示例here,了解更多详细信息和具体步骤。

        【讨论】:

        • 非常感谢。我读过你的帖子。这很好。我的问题是我想创建一个秘密文件来保存我的环境数据。如data: RAILS_ENV: cHJvZHVjdGlvbg==。但是当我运行kubectl create -f secret.yml 时,它说:* data[RAILS_ENV]: invalid value 'RAILS_ENV': must have at most 253 characters and match regex \.?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*。命名是不对的。我不能在秘密文件中设置环境数据吗?
        • @scho 我怀疑您是否仔细阅读了博客文章;)它说:“密钥必须是 DNS 名称”,这意味着在您的情况下:将密钥更改为 rails-env 并且它将起作用。顺便说一句,如果您将答案标记为正确并对其进行投票,我将不胜感激,以便跟随您的其他人立即知道他们可以依赖它。
        • 谢谢。对不起,我不在乎;-(
        • 别担心,碰巧是最好的。正如我所说,请接受这个作为正确答案......
        • 我想写下更多信息。即使我这样做了,并再次创建 web-controller,结果也是一样的。问题是 web-controller.yml 文件中的格式不正确。也许现在 kubernetes secrets 不支持该功能更好地设置环境变量。
        猜你喜欢
        • 2016-08-21
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2019-11-28
        相关资源
        最近更新 更多