如何通过yaml将秘密数据设置为kubernetes秘密?

How to set secret data to kubernetes secrets by yaml?

我正在使用 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格式有误。那怎么写呢?

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

我们目前不支持公开为环境变量的秘密。

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 注释秘密 mysecret kubectl.kubernetes.io/last-applied-configuration-
(最后的 - 是说要擦除它)
kubectl get secret mysecret -n=api -o yaml
(确认)

或者你会做
Bash#回声制作 | base64
cHJvZHVjdGlvbgo=

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

假设我们现在按照以下步骤在部署中添加 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="<your_api-key"

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

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