Skip to content
On this page

Secret

类型

执行 kubectl create secret -h,可以看到:

Create a secret using specified subcommand.

Available Commands:
  docker-registry Create a secret for use with a Docker registry
  generic         Create a secret from a local file, directory or literal value
  tls             Create a TLS secret

Usage:
  kubectl create secret [flags] [options]

可以通过如下 flag 去创建 Secret:

  • generic:创建出来的 Secret 类型为 Opaque
  • docker-registry:创建出来的 Secret 类型为 kubernetes.io/dockerconfigjson
  • tls:创建出来的 Secret 类型为 kubernetes.io/tls

除了以上三种类型外,还有 kubernetes.io/service-account-token 类型的 Secret,可以参考 ServiceAccount

创建 Generic Secret

From literal

bash
$ kubectl create secret generic userauth \
    --from-literal=username=admin \
    --from-literal=password=admin

From file

bash
$ echo -n admin | tee username
$ echo -n admin | tee password

$ kubectl create secret generic userauth \
    --from-file=username \
    --from-file=password

From directory

bash
$ echo -n admin | tee auth/username
$ echo -n admin | tee auth/password

$ kubectl create secret generic userauth --from-file=auth/

From env file

bash
$ echo "username=admin\npassword=admin" | tee auth.env

$ kubectl create secret generic userauth --from-env-file=auth.env

From YAML

yaml
apiVersion: v1
kind: Secret
metadata:
  name: userauth
type: Opaque
data:
  username: YWRtaW4=
  password: YWRtaW4=
bash
$ kubectl apply -f userauth.yaml

创建 Docker Registry Secret

bash
$ kubectl create secret docker-registry private-registry \
    --docker-username=admin \
    --docker-password=admin \
    --docker-email=admin@example.com \
    --docker-server=https://127.0.0.1:5000

然后通过 kubectl get secret private-registry -oyaml 查看:

yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHRwczovLzEyNy4wLjAuMTo1MDAwIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImF1dGgiOiJZV1J0YVc0NllXUnRhVzQ9In19fQ==
kind: Secret
metadata:
  creationTimestamp: 2019-08-11T10:03:47Z
  name: private-registry
  namespace: default
  resourceVersion: "571738"
  selfLink: /api/v1/namespaces/default/secrets/private-registry
  uid: 4fb6a863-bc1f-11e9-98fc-025000000001
type: kubernetes.io/dockerconfigjson

其中 .dockerconfigjson 存放的内容如下:

bash
$ echo eyJhdXRocyI6eyJodHRwczovLzEyNy4wLjAuMTo1MDAwIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImF1dGgiOiJZV1J0YVc0NllXUnRhVzQ9In19fQ== | base64 -D | jq
json
{
  "auths": {
    "https://127.0.0.1:5000": {
      "username": "admin",
      "password": "admin",
      "email": "admin@example.com",
      "auth": "YWRtaW46YWRtaW4="
    }
  }
}

也可以通过 .yaml 文件将内容 base64 编码去创建 Secret

创建 TLS Secret

首先生成自签名证书:

bash
# genrate private key
$ openssl genrsa -out server.key 2048

# generate certificate signing request
$ openssl req -new -sha256 -key server.key -out server.csr

# generate self-signed certificate
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

然后执行:

bash
$ kubectl create secret tls tls-secret --cert=server.cert --key=server.key

通过 kubectl get secret tls-secret -oyaml 查看内容:

apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0...
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVk...
kind: Secret
metadata:
  creationTimestamp: 2019-08-11T10:17:07Z
  name: tls-secret
  namespace: default
  resourceVersion: "572616"
  selfLink: /api/v1/namespaces/default/secrets/tls-secret
  uid: 2c35e338-bc21-11e9-98fc-025000000001
type: kubernetes.io/tls

也可以通过 .yaml 文件将 crt 和 key 做 base64 编码去创建 Secret

使用 Secret

Secret 的使用和 ConfigMap 类似,即可以作为环境变量,也可以作为 Volume。

作为环境变量

可以使用 env 从 Secret 中取出特定的值作为环境变量:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: busybox
    image: busybox:1.31.0
    command:
    - /bin/sh
    - -c
    - echo $USERNAME:$PASSWORD
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: userauth
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: userauth
          key: password
  restartPolicy: Never

也可以使用 envFrom 使用整个 Secret 作为环境变量:

yaml
apiVersion: v1
kind: Secret
metadata:
  name: userauth
type: Opaque
data:
  USERNAME: YWRtaW4=
  PASSWORD: YWRtaW4=

---

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: busybox
    image: busybox:1.31.0
    command:
    - /bin/sh
    - -c
    - echo $USERNAME:$PASSWORD
    envFrom:
    - secretRef:
        name: userauth
  restartPolicy: Never

作为 Volume

yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: busybox
    image: busybox:1.31.0
    command:
    - /bin/sh
    - -c
    - echo $(cat /app/auth/username):$(cat /app/auth/password)
    volumeMounts:
    - name: userauth
      mountPath: /app/auth
  volumes:
  - name: userauth
    secret:
      secretName: userauth
  restartPolicy: Never

使用 Docker Registry Secret

yaml
apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: private-image
  imagePullSecrets:
  - name: private-registry

参考