配置容器应用Secret

  Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,例如密码、数字证书、私钥、令牌和SSH key等,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

一、 Secret概述

  Secret对象储存数据的方式及使用方法类似于ConfigMap对象,以键值方式存储数据,在pod资源中通过环境变量或存储卷进行数据访问。不同的是,Secret对象仅会被分发至调用了此对象的Pod资源所在的工作节点,且只能由节点将其存储于内存中。另外,Secret对象的数据的存储即打印格式为Base64编码的字符串,因此用户在创建Secret对象时也要提供此种编码格式的数据。不过,在容器中以环境变量或存储卷的方式访问时,它们会被自动解码为明文格式。

1. Secret对象的用途

  Secret对象主要有两种用途,一是作为存储卷注入到Pod上由容器应用程序所使用,二是用于kubelet为Pod里的容器拉取镜像时向私有仓库提供认证信息。不过,后面使用ServiceAccount资源自建的Secret对象是一种更具安全性的方式。

2. Secret资源的类型

  Secret资源主要由四种类型组成,具体如下:

1)Opaque:自定义数据内容;base64编码格式的Secret,用来存储密码、秘钥、信息、证书等数据,类型标识符为generic。可以通过base64 --decode解码获得原始数据,因此安全性弱

2)kubernetes.io/service-account-token: Service Account的认证信息,可在创建Service Account时由kubernetes自动创建。Pod 如果使用了 ServiceAccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

3)kubernetes.io/dockerconfigjson:用来存储docker镜像仓库的认证信息,类型标识为docker registry

4)kubernetes.io/tls:用于为SSL通信模式存储证书和私钥文件,命令式创建时类型标识为tls

二、创建Secret资源

  手动创建Secret对象方式有两种:通过kubectl create命令和使用Secret配置文件

1. 命令式创建

   语法格式如下:

[root@k8s-master1 ~]# kubectl create secret --help
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]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

  若要创建generic类型的Secret对象, 语法格式如下:

[root@k8s-master1 ~]# kubectl create secret generic --help
Create a secret based on a file, directory, or specified literal value.

 A single secret may package one or more key/value pairs.

 When creating a secret based on a file, the key will default to the basename of the file, and the value will default to
the file content. If the basename is an invalid key or you wish to chose your own, you may specify an alternate key.

 When creating a secret based on a directory, each file whose basename is a valid key in the directory will be packaged
into the secret. Any directory entries except regular files are ignored (e.g. subdirectories, symlinks, devices, pipes,
etc).

Examples:
  # Create a new secret named my-secret with keys for each file in folder bar
  kubectl create secret generic my-secret --from-file=path/to/bar

  # Create a new secret named my-secret with specified keys instead of names on disk
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa
--from-file=ssh-publickey=path/to/id_rsa.pub

  # Create a new secret named my-secret with key1=supersecret and key2=topsecret
  kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret

  # Create a new secret named my-secret using a combination of a file and a literal
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret

  # Create a new secret named my-secret from an env file
  kubectl create secret generic my-secret --from-env-file=path/to/bar.env

Options:
      --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in
the template. Only applies to golang and jsonpath output formats.
      --append-hash=false: Append a hash of the secret to its name.
      --dry-run='none': Must be "none", "server", or "client". If client strategy, only print the object that would be
sent, without sending it. If server strategy, submit server-side request without persisting the resource.
      --field-manager='kubectl-create': Name of the manager used to track field ownership.
      --from-env-file='': Specify the path to a file to read lines of key=val pairs to create a secret (i.e. a Docker
.env file).
      --from-file=[]: Key files can be specified using their file path, in which case a default name will be given to
them, or optionally with a name and file path, in which case the given name will be used.  Specifying a directory will
iterate each named file in the directory that is a valid secret key.
      --from-literal=[]: Specify a key and literal value to insert in secret (i.e. mykey=somevalue)
  -o, --output='': Output format. One of:
json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
      --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the
annotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.
      --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The
template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
      --type='': The type of secret to create
      --validate=true: If true, use a schema to validate the input before sending it

Usage:
  kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1]
[--dry-run=server|client|none] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

  不少场景中,Pod中的应用需要通过用户名和密码访问其他服务,例如访问数据库系统等。创建此类的Secret对象,可以使用“kubectl create secret generic <SECRET_NAME> --from-literal=key=value”命令直接创建,不过为用户认证之需进行创建时,其使用的键名通常是username和password。例如下面的命令,以“root/ikubernetes”分别为用户名和密码创建了一个名为mysql-auth的Secret对象:

[root@k8s-master1 ~]# kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=ikubernetes
secret/mysql-auth created

  而后即可查看新建资源的属性信息,由下面命令及其输出结果可以看出,以generic标识符创建的Secret对象是为Opaque类型,其键值数据会以Base64的编码格式进行保存和打印:

[root@k8s-master1 ~]# kubectl get secrets mysql-auth
NAME         TYPE     DATA   AGE
mysql-auth   Opaque   2      3m29s
[root@k8s-master1 ~]# kubectl get secrets mysql-auth -o yaml
apiVersion: v1
data:
  password: aWt1YmVybmV0ZXM=
  username: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2022-10-13T14:01:51Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
        f:username: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2022-10-13T14:01:51Z"
  name: mysql-auth
  namespace: default
  resourceVersion: "814371"
  selfLink: /api/v1/namespaces/default/secrets/mysql-auth
  uid: 5c42fb3b-af1f-4e29-90be-6ab40c2841b7
type: Opaque

  不过,Kubernetes系统的Secret对象的Base64编码的数据并非加密格式,许多相关的工具程序均可轻松完成解码,如下面所示的Base64命令:

[root@k8s-master1 ~]# echo aWt1YmVybmV0ZXM= | base64 -d
ikubernetes

  对于本身业已存储于文件中的数据,也可以在创建generic格式Secret对象时使用“--from-file”选项从文件中直接进行加载。例如创建用于SSH认证的Secret对象时,如果尚且没有认证信息文件,则需要首先使用命令生成一对认证文件:

[root@k8s-master1 ~]# ssh-keygen -t rsa -P '' -f ${HOME}/.ssh/id_rsa

  而后使用“kubectl create secret generic NAME  --from-file=[key=]/PATH/TO/FILE”命令加载文件内容并生成为Secret对象:

[root@k8s-master1 ~]# kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=${HOME}/.ssh/id_rsa --from-file=ssh-publickey=${HOME}/.ssh/id_rsa.pub secret/ssh-key-secret created
You have new mail in /var/spool/mail/root
[root@k8s-master1 ~]# kubectl get secret ssh-key-secret
NAME             TYPE     DATA   AGE
ssh-key-secret   Opaque   2      17s
[root@k8s-master1 ~]# kubectl describe secret ssh-key-secret
Name:         ssh-key-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
ssh-privatekey:  1679 bytes
ssh-publickey:   398 bytes
[root@k8s-master1 ~]# kubectl get secret ssh-key-secret -o yaml
apiVersion: v1
data:
  ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBb3hOZmp2eXlXWFpIcEFEZVNYQUNxcHhoU05vWXdnSE9xZGJJY3p2M2lpSFR6OHUxCjhCQnZEbVVYWHRZUy9kVWJSdCtqSUtPdG1aN3lOMG4xQUFKaFZFbHBNTEk4YVZzYVFxcXBSaFhiNEVHTW1jMTkKYmxmVS8wRjVZVEhVZzhIejl4RTZaaGZaS1NCdjJqQnkxOE5tZWRXM2wrUmp3ZWVIL3JRNUtONU9uL3RSVGVLUgpnOC9VWWNVY1RpbjVDL29Vcldhait6bjI2SDc0LzZ4WlFaT0haMW1PSHY0ZDJzMm9ncUh2eDBGOWxGOXQvY081CmNKN3d3M21OaW4wSFh3NGdBUFQ3YTZlNy9IM2tkMWtxZUpyOElscmcvTFlJMGQrYkxPRnd0cnlLbVlhOFdiU1AKSU1jcjhML0FPWjhnRVdIbitVNXpERWNXeDQ2NjF4NE5HV1hybVFJREFRQUJBb0lCQVFDWGpncXlEWUVIQ1pqYwovMzJXaklXOTM2VytHZ3NHU3IyeE5BNklvY09WV1lqTFJvd290bTB2MkoyV29xZDF4ZGNhei81LzkvMy9saXVQClhLbFlQOTRLZ2t0RFdYSXhpOXhrOXN4b2VTb21TV1VORDEreDYrams3UW1NWGM0ZVFXT2xTeHFXQlRYcU5kNGQKemdiOUpQa1k0NWxEalp0MGV1UDF2N0tibTdkQWo4bVBDU0RHVFIxZDVscXE1Z0VjdENPaVV2RDNUMzdXcGFnUApIT1BKanFrR29SS1Y4L3VEaVpKQW1rcjVDSXhxb055bTRRSUdRRWxpd2ZzWE9FRW5tL25TbncweVA1V1VNYmFqCjVHTVFBZjQvU2tTMlVvNVozRDJBNzBqaERzTVNWYXVuZnhrS1ZNamp0ZUJwY29mUTFrWDcwRWxydXFuZ0R5SkoKVG5pZmRmbk5Bb0dCQU5CUzFlWnJuSEo2dmlPZVRVVWNPaExYT2pjTnZvUXVqdTBNUVg5TThDVVpwK1F5dWhQZAptaHFIdGlJcTFmYzBMbWxGWlhSR2RvRXNsQXZWeWdJZGh4WVNoOGlQYTR6aFc1WTZ2Qm53dEFTNDhUSWJoNng2CmpkaGJyR1JINlRYVWhhWEZkNGt5bnVyYmQwTHkyajF6Z3Bvc0RxYUJQQ1VCSnAyTHBQelNpSnR6QW9HQkFNaGwKa3kxOGhYOEVlS2pVcFNSRU1helk3cjA1SXZpK0ZIT0RRZEVRYWpHYTFXZ0JVQXFMd0FwM3ZDVktoenYzamF2SgppaG5PN1g4M2E3OHhUY2MyMGxMTWFsVTVUQ2tzRHd3dGgwUndGMXcyMThKRk51WU0rTkVxZkoyMFNLSyszM3JpCjAwaGtnRlJ5OXFkbkxmM2t1VnZiVGFmZDF2L25KUlBJQWlsYmI3SERBb0dCQUlsdWpHUlZpOEZPVGsrcktHaTIKWlcxMmhaWTZQL3h0eHFhRmxsUUlDc2srOHE2dDlHb1VvSXh1Q1c3aStZTDY3cjlPSTg4Z2lSOVFyRjVlYk1VVwplNzdJL01FSU5MaWRGMUcxYjlCaEpqR1RYTE5rekEyeVVBOXk4dmk1SkJYNkhTMHVaMXlnZzR5R3VsZjFaSnB6CnNLNUs4R05TRUw2TTBzL09oMHF2RGFZWEFvR0FPUTdTelF5N1plTDhCL1lqM3lPYmtUOWpHblYrUTV5N2JmaGQKY1ExZmJ5aEt3d1k4cUFRS2RmQ0puWVNPNU1Bamtsb2IvQ1V5OGhueGo4cVYvcmJaUThINE5MUFB2NWxQMzRQSApFL0ZtZFZjWUw3Uk5ZVXNvUFVYL25WZUxwdXI1N3A5TzBUbnNZQjhybzVaNVBlVTE4YldMY3RSek53RzFTT0NWCjNQaXY0TWtDZ1lBMU5FSDV6cG5MN0hSejNjZGxiMXIvRVViOW90NWNPZlh5S0VIcHBVL3RLV3krM1BLcFJ5Qi8KQkhYejM3blBmSWdRL3dzQTMzUllrOW1MQldMVUFuOEUvNTRLS3p0S0tvNHdTaXBOSE82emRwemloZUJvU1prcwo1dzAraGI3RXU2N1lUdGxoa3hLeERMR3pVcDd2clNleERzNlFxbXMwdG1sOTdKNEVNU1k2anc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
  ssh-publickey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFDakUxK08vTEpaZGtla0FONUpjQUtxbkdGSTJoakNBYzZwMXNoek8vZUtJZFBQeTdYd0VHOE9aUmRlMWhMOTFSdEczNk1nbzYyWm52STNTZlVBQW1GVVNXa3dzanhwV3hwQ3FxbEdGZHZnUVl5WnpYMXVWOVQvUVhsaE1kU0R3ZlAzRVRwbUY5a3BJRy9hTUhMWHcyWjUxYmVYNUdQQjU0Zit0RGtvM2s2ZisxRk40cEdEejlSaHhSeE9LZmtMK2hTdFpxUDdPZmJvZnZqL3JGbEJrNGRuV1k0ZS9oM2F6YWlDb2UvSFFYMlVYMjM5dzdsd252RERlWTJLZlFkZkRpQUE5UHRycDd2OGZlUjNXU3A0bXZ3aVd1RDh0Z2pSMzVzczRYQzJ2SXFaaHJ4WnRJOGd4eXZ3djhBNW55QVJZZWY1VG5NTVJ4YkhqcnJYSGcwWlpldVogcm9vdEBrOHMtbWFzdGVyMQo=
kind: Secret
metadata:
  creationTimestamp: "2022-10-13T15:07:16Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:ssh-privatekey: {}
        f:ssh-publickey: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2022-10-13T15:07:16Z"
  name: ssh-key-secret
  namespace: default
  resourceVersion: "825667"
  selfLink: /api/v1/namespaces/default/secrets/ssh-key-secret
  uid: 0c29717a-bf12-4535-a039-0e557239508d
type: Opaque

  以上创建的Secret类型均为“Opaque”。

  另外,若要基于私钥和数字证书文件创建用于SSL/TLS通信的Secret对象,则需要使用“kubectl create secret tls NAME --cert=path/to/cert/file --key=path/to/key/file”命令来进行,语法格式如下:

[root@k8s-master1 ~]# kubectl create secret tls --help
Create a TLS secret from the given public/private key pair.

 The public/private key pair must exist before hand. The public key certificate must be .PEM encoded and match the given
private key.

Examples:
  # Create a new TLS secret named tls-secret with the given key pair:
  kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key

Options:
      --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in
the template. Only applies to golang and jsonpath output formats.
      --append-hash=false: Append a hash of the secret to its name.
      --cert='': Path to PEM encoded public key certificate.
      --dry-run='none': Must be "none", "server", or "client". If client strategy, only print the object that would be
sent, without sending it. If server strategy, submit server-side request without persisting the resource.
      --field-manager='kubectl-create': Name of the manager used to track field ownership.
      --key='': Path to private key associated with given certificate.
  -o, --output='': Output format. One of:
json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
      --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the
annotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.
      --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The
template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
      --validate=true: If true, use a schema to validate the input before sending it

Usage:
  kubectl create secret tls NAME --cert=path/to/cert/file --key=path/to/key/file [--dry-run=server|client|none]
[options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

  例如,假设需要为Nginx测试创建SSL虚拟主机,用户首先使用了类似如下的命令生成了私钥和自签证书:

[root@k8s-master1 ~]# openssl genrsa -out nginx.key 2048
Generating RSA private key, 2048 bit long modulus
...................+++
...........+++
e is 65537 (0x10001)
[root@k8s-master1 ~]# openssl req -new -x509 -key nginx.key -out nginx.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=www.ilinux.io
[root@k8s-master1 ~]# ll nginx*
-rw-r--r-- 1 root root 1285 Oct 15 16:57 nginx.crt
-rw-r--r-- 1 root root 1679 Oct 15 16:42 nginx.key

  而后即可使用如下命令将这两个文件创建为Secret对象。需要注意的是,无论用户提供的证书和私钥文件使用的是什么名称,它们一律会被转换为分别以tls.key(私钥)和tls.crt为其键名:

[root@k8s-master1 ~]# mkdir secret
You have new mail in /var/spool/mail/root
[root@k8s-master1 ~]# cd secret/
[root@k8s-master1 secret]# cp /root/nginx.crt .
[root@k8s-master1 secret]# cp /root/nginx.key .
[root@k8s-master1 secret]# ll
total 8
-rw-r--r-- 1 root root 1285 Oct 15 17:01 nginx.crt
-rw-r--r-- 1 root root 1679 Oct 15 17:01 nginx.key
[root@k8s-master1 secret]# kubectl create secret tls nginx-ssl --cert=./nginx.crt --key=./nginx.key
secret/nginx-ssl created

  创建的Secret类型应该为“kubernetes.io/tls”,例如下面命令结果中的显示:

[root@k8s-master1 secret]# kubectl get secrets nginx-ssl
NAME        TYPE                DATA   AGE
nginx-ssl   kubernetes.io/tls   2      17s
[root@k8s-master1 secret]# kubectl get secrets nginx-ssl -o yaml
apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURoekNDQW0rZ0F3SUJBZ0lKQUpvVndVai9lYW1uTUEwR0NTcUdTSWIzRFFFQkN3VUFNRm94Q3pBSkJnTlYKQkFZVEFrTk9NUkF3RGdZRFZRUUlEQWRDWldscWFXNW5NUkF3RGdZRFZRUUhEQWRDWldscWFXNW5NUTh3RFFZRApWUVFLREFaRVpYWlBjSE14RmpBVUJnTlZCQU1NRFhkM2R5NXBiR2x1ZFhndWFXOHdIaGNOTWpJeE1ERTFNRGcxCk56TTFXaGNOTWpJeE1URTBNRGcxTnpNMVdqQmFNUXN3Q1FZRFZRUUdFd0pEVGpFUU1BNEdBMVVFQ0F3SFFtVnAKYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdVp6RVBNQTBHQTFVRUNnd0dSR1YyVDNCek1SWXdGQVlEVlFRRApEQTEzZDNjdWFXeHBiblY0TG1sdk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCnRjQ3ZLLy9qbUo5Um1FSDBOcXhlSjBCZDZvMWhaNUpQV0xwV3dXdVp1MU4yN1dIWE9Vd3JLblpWeU9RY0lFQUsKUGdhZmlrR05jVVVMa1pkZE9ONG9uRVhGYVJybWV3M0ZFYi9YRVEralVXN29ScG5SM0pTVFo0ZEFvaXMwbnovcwphNXpOSCtsRCtuYXd1anNHTmdvZVhoUWJUTXRqSlBBZ1dWRkVHeG0wbGhrTHF5Rk5LWitSd0FlUW53L2hUQUxrCkE1aHhOTDlPSWRBUGNjTlJzUVRRYlV6ZDVhZ3o2RjJhb0hhVXRTMGxkdGxOd2tOcE9QR056cGdVbGRvaDBITDUKVmtMUXcrcGpDeGRZWGZRd2VJVy96WEFlSjlRMW5TN1BsaFIrTVpJdHFGRWJmdkkwT084RFNtYjhaS0tLL20rRQowbTNCTG44NUdPNHdJVjIvMWlHc3h3SURBUUFCbzFBd1RqQWRCZ05WSFE0RUZnUVVoRkVLZENzUzVGME5WN0EvClozRG9BSUxtbCtVd0h3WURWUjBqQkJnd0ZvQVVoRkVLZENzUzVGME5WN0EvWjNEb0FJTG1sK1V3REFZRFZSMFQKQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBSEhVUkVEdGxOWnRucVF4L1Q4RkFYZEd3V0dTbApCc0xwOEV2R0l3MjMrbGQvTWNPaFA4dmpmM3ZTcDMzV1lRSDNqaFJFbzJZNmZhVDUxRkJNMklXZGhzZ0ZNclZVCkVwaU9XQlcvdTNvOElpcUo4MWJLMVhvVnd4RXNHWFlRdzFubDFhcU8yOTNTTUJobXQweXpnREtXT0ZCcnJWcWoKMTlwZG5Ibml1S1ZBU1pnZDlBdm91WDN5SnY5ZGtPYnluMVBrMFpHQUxwcHdoY21zNEpocG1aYWo1VVhxV25QaApyN01KRVlYcGtjeFpGSWY5dUV0QlNPTmdFeWZYREhjMEQySWJEU3RabG05WVVHZkVrQUY0Z0dYYWQrbDZkK3JYCjFYUm9Jc0NFb3pLdjcrdDFzay9Na2ExSDVQemh5bmVMS3hDRXBvTmVGbXZkejlOcm9pOW1LV1BCUmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdGNDdksvL2ptSjlSbUVIME5xeGVKMEJkNm8xaFo1SlBXTHBXd1d1WnUxTjI3V0hYCk9Vd3JLblpWeU9RY0lFQUtQZ2FmaWtHTmNVVUxrWmRkT040b25FWEZhUnJtZXczRkViL1hFUStqVVc3b1JwblIKM0pTVFo0ZEFvaXMwbnovc2E1ek5IK2xEK25hd3Vqc0dOZ29lWGhRYlRNdGpKUEFnV1ZGRUd4bTBsaGtMcXlGTgpLWitSd0FlUW53L2hUQUxrQTVoeE5MOU9JZEFQY2NOUnNRVFFiVXpkNWFnejZGMmFvSGFVdFMwbGR0bE53a05wCk9QR056cGdVbGRvaDBITDVWa0xRdytwakN4ZFlYZlF3ZUlXL3pYQWVKOVExblM3UGxoUitNWkl0cUZFYmZ2STAKT084RFNtYjhaS0tLL20rRTBtM0JMbjg1R080d0lWMi8xaUdzeHdJREFRQUJBb0lCQVFDaFhjT280dlhsS1g0KwpHa0NDMGlKOTR1My9NeXNKMDZMUytnM1FpSUhqQ1VXTG1OU0hNSk1hamhtMzFKOE1Hdzk4NWxCN1padjR0djZBCmNzejNrbmFuMkdKZTROMUUzNExhTVdMMjZOVnRsWFJ3U2wxQzVEN0RLaGcrWXZIRGVmT2p6NEZuRmFtZkZBWHcKTWp0ZmV6aGUrcWNLVllGZTZEc3dVYkNRQnhDSU9aRlZDcjFuYURLbWtHbTJYNGZOd3BTK0l4ZENhbG1sNjlvLwpqbzdWd2p4ZzhIKzJJcTUvR3l6T0I4MVR6QnpqMlJxVnF2N2NWSUFZS2YyS3Vwdm9yQ2IxcUtrbGVXZ0krMWNpClhwS0lzc1lwTDZpK3ROWnJMdHdTRnhLTnZaakhiT05hWWc3SngyMmREZ2UveTk3Sjh5SXpQYS9jWWttL24vSFcKU2xjNHpZZmhBb0dCQU5pRW9Fbmo1NEhySEFEZXpNZ3ZkbEp3MFVvS1p0enpCT1NzNEVkRGRldjF3bkhlZlVUSwpwZFhBV2NyODEvV1A2L21KNE1sZmZMUWM1L29KYjJqUFk0MUtKL0RKTjEra2I4Nlh0dHZ3V0NEMmlLYnFqeUo2CjdSdXhXeGJrUmlHQktJMFUxMjZYRDVLeE95bGIvWUZqcGV3K1IxaFh0eVlweEMyNU5LNFZOODl2QW9HQkFOYmwKS05kV0lhNHVpWHVKRVNid1BobzdzUHN5ZUJFWHJneVpRWTJTaFFUYUxZR3djcjR2Q1ZTdG5uZVNKNTczeE9LYgp0SitXb3dsUU40azdpbzVVa3lRemh4OEdzdjB5RzN5bjRnOG04cis1RHJoVjMrdktzRUxoQmdJTFJsV2JCNnR0CjM1Q1FaWFQxNzRsTi9FRVlJRUtrZHUxOU9JNUIvQzlHR09nMDY4d3BBb0dBSnNheDBpbmZ0ek85QXlianMrSlUKSlhXUTlkcWhDMmIyZEdIRmxOMnZDOEFxdjZ2aDhXVDlpQ2QzclZQVTlXUitGV1dzL1VOOW1PQW9aMjR6SnFrbApvaE1xemdPclNCU3g5V1RVV2RWVVl5cmoxRWpqczRBaVlMaEZvUGJtM0c4K0xPNFRtdm13ejB1d1Zicmt6cnhpCjVjbE5pN1BCMkRMWXNIdWZ4S0dHS2o4Q2dZQWNEVC8rbEJ6RGF3bkJXWXdtcEJmSFB1R0VlUHNaYUJqdFJoZzcKamRQVlpWR3BhMG9mTDI2dFloaWNqVFNrMkwwWHc3R1pYNFdhMHFEZFJpdDVGdXM2UDR1MDdoL3hVMWdwTnBVWQoyMEcyNjBaVG84b2VNcEE5dXJnWkRqVzVPUXFRUTBCNjA0NmE3UHUrMWJKSElRb2RDUEVKWVY0L203ZDZ5RkM2CkJ5Wjh1UUtCZ1FEVk9pQ21qeStZdit2YXlVZ2NVNkRRTW42dXNCN3J6ZGtZQTVodEo1M0RlQVNPU3pIRE1MUVgKSlo2RDVnWDVhaVNHVHBPU2dkWlhBcnNYMkVyQ2xURVp4eWZhY3M2cE5oU2gxUm55RkZ2QWdRbGlXMnlCQytUTgppMCs1bGg2anRUbm5CR2lZYk5hZm9nWW1OVTVmcDMxUGZEeFY5OFpPL28wWWt1UUJkT2ZjOFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
kind: Secret
metadata:
  creationTimestamp: "2022-10-15T09:03:05Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:tls.crt: {}
        f:tls.key: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2022-10-15T09:03:05Z"
  name: nginx-ssl
  namespace: default
  resourceVersion: "834160"
  selfLink: /api/v1/namespaces/default/secrets/nginx-ssl
  uid: d6c1af85-7b43-4345-b082-9e4090860935
type: kubernetes.io/tls
You have new mail in /var/spool/mail/root
[root@k8s-master1 secret]# kubectl describe secrets nginx-ssl
Name:         nginx-ssl
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  1285 bytes
tls.key:  1679 bytes

  由上述操作过程可见,命令式创建的Secret对象与ConfigMap对象的方式几乎没有明显区别。

2. 清单式创建

  Secret资源时标准的Kubernetes API对象,除了标准的apiVersion、kind和metadata字段,它可用的其他字段具体如下:

[root@k8s-master1 secret]# kubectl explain secret
KIND:     Secret
VERSION:  v1

DESCRIPTION:
     Secret holds secret data of a certain type. The total bytes of the values
     in the Data field must be less than MaxSecretSize bytes.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   data <map[string]string>  #"key:value"格式的数据,通常是敏感信息,数据格式需是以Base64格式编码的字符串,因此需要用户事先完成编码
     Data contains the secret data. Each key must consist of alphanumeric
     characters, '-', '_' or '.'. The serialized form of the secret data is a
     base64 encoded string, representing the arbitrary (possibly non-string)
     data value here. Described in https://tools.ietf.org/html/rfc4648#section-4

   immutable    <boolean>
     Immutable, if set to true, ensures that data stored in the Secret cannot be
     updated (only object metadata can be modified). If not set to true, the
     field can be modified at any time. Defaulted to nil. This is a beta field
     enabled by ImmutableEphemeralVolumes feature gate.

   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata     <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   stringData   <map[string]string> #以明文格式(非Base64编码)定义的"key:value"数据;无须用户事先对数据进行Base64编码,而是在创建为Secret对象时自动进行编码并保存于data字段中;stringData字段中的明文不会被API Server输出,不过若使用"kubectl apply"命令进行的创建,那么注解信息中还是可能会直接输出这些信息的。
     stringData allows specifying non-binary secret data in string form. It is
     provided as a write-only convenience method. All keys and values are merged
     into the data field on write, overwriting any existing values. It is never
     output when reading from the API.

   type <string> # 仅是为了便于编程方式处理Secret数据而提供的类型标识
     Used to facilitate programmatic handling of secret data.

1)数据类型为Base64编码

  手动加密数据,以Base64位编码:

[root@k8s-master1 secret]# echo -n 'admin' | base64
YWRtaW4=
[root@k8s-master1 secret]# echo -n 'Admin12345' | base64
QWRtaW4xMjM0NQ==
[root@k8s-master1 secret]#

  解码:

[root@k8s-master1 secret]# echo QWRtaW4xMjM0NQ== |base64 -d
Admin12345

  创建Secret资源清单示例secret-demo-1.yaml

[root@k8s-master1 secret]# vim secret-demo-1.yaml
[root@k8s-master1 secret]# cat secret-demo-1.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-demo-1
type: Opaque
data:
  username: YWRtaW4=
  password: QWRtaW4xMjM0NQ==
[root@k8s-master1 secret]# kubectl apply -f secret-demo-1.yaml
secret/secret-demo-1 created
[root@k8s-master1 secret]# kubectl get secrets secret-demo-1
NAME            TYPE     DATA   AGE
secret-demo-1   Opaque   2      23s
[root@k8s-master1 secret]# kubectl get secrets secret-demo-1 -o yaml
apiVersion: v1
data:
  password: QWRtaW4xMjM0NQ==
  username: YWRtaW4=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"password":"QWRtaW4xMjM0NQ==","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"secret-demo-1","namespace":"default"},"type":"Opaque"}
  creationTimestamp: "2022-10-15T09:28:29Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
        f:username: {}
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:type: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2022-10-15T09:28:29Z"
  name: secret-demo-1
  namespace: default
  resourceVersion: "838558"
  selfLink: /api/v1/namespaces/default/secrets/secret-demo-1
  uid: ed53f504-467b-40f4-bad8-10548d2cab5f
type: Opaque
[root@k8s-master1 secret]# kubectl describe secrets secret-demo-1
Name:         secret-demo-1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  10 bytes
username:  5 bytes

2)数据类型为明文格式的键值数据

[root@k8s-master1 secret]# vim secret-demo-2.yaml
[root@k8s-master1 secret]# cat secret-demo-2.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-demo-2
type: Opaque
stringData:
  username: redis
  password: redisp@ss
[root@k8s-master1 secret]# kubectl apply -f secret-demo-2.yaml
secret/secret-demo-2 created
[root@k8s-master1 secret]# kubectl get secrets secret-demo-2
NAME            TYPE     DATA   AGE
secret-demo-2   Opaque   2      13s
[root@k8s-master1 secret]# kubectl get secrets secret-demo-2 -o yaml
apiVersion: v1
data:
  password: cmVkaXNwQHNz
  username: cmVkaXM=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"secret-demo-2","namespace":"default"},"stringData":{"password":"redisp@ss","username":"redis"},"type":"Opaque"}
  creationTimestamp: "2022-10-15T09:32:59Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
        f:username: {}
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:type: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2022-10-15T09:32:59Z"
  name: secret-demo-2
  namespace: default
  resourceVersion: "839335"
  selfLink: /api/v1/namespaces/default/secrets/secret-demo-2
  uid: c21c3a61-8541-4b0b-86f8-1a7dad95053b
type: Opaque
[root@k8s-master1 secret]# kubectl describe secrets secret-demo-2
Name:         secret-demo-2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  9 bytes
username:  5 bytes

  相比较来说,基于清单文件将保存于文件中的敏感信息创建Secret对象时,用户首先需要将敏感信息读出,转为Base64编码格式,而后再将其创建为清单文件,过程繁琐,反不如命令式创建来的便捷。不过,如果存在多次创建或重构之需,那么将其保存为配置清单也是情势所需。

三、Secret的使用

  类似Pod使用COnfigMap对象的方式,Secret对象可以注入为环境变量,也可以存储为卷形式挂载使用。

1. 以环境变量注入Secret对象

  通过在env字段中为valueFrom内嵌secretKeyRef对象中的数据,语法格式如下:

[root@k8s-master1 secret]# kubectl explain pod.spec.containers.env.valueFrom.secretKeyRef
KIND:     Pod
VERSION:  v1

RESOURCE: secretKeyRef <Object>

DESCRIPTION:
     Selects a key of a secret in the pod's namespace

     SecretKeySelector selects a key of a Secret.

FIELDS:
   key  <string> -required-  #用于指定要引用secret对象中的某键的键名
     The key of the secret to select from. Must be a valid secret key.

   name <string>  #secret对象的名称
     Name of the referent. More info:
     https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names

   optional     <boolean>  #用于为当前pod资源指明此引用是否为可选
     Specify whether the Secret or its key must be defined

  此类调用环境变量的使用方式与直接定义的环境变量并无区别。下面是保存于配置文件secret-env.yaml的资源定义示例,使用之前创建的mysql-auth的secret对象的数据,并将其直接传递给了自定义运行的容器应用:

  secret对象mysql-auth详细信息结果如下:

[root@k8s-master1 secret]# kubectl describe secret mysql-auth
Name:         mysql-auth
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  11 bytes
username:  4 bytes

 创建pod资源,使用mysql-auth对象,将secret对象的值直接传递给容器,创建pod对象完成后,通过“kubectl exec”命令即可查看环境变量:

[root@k8s-master1 secret]# vim secret-env.yaml
[root@k8s-master1 secret]# cat secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env
  labels:
     app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    env:
     - name: MYSQL_USER_PASSWORD
       valueFrom:
          secretKeyRef:
            name: mysql-auth
            key: password
     - name: MYSQL_USER_NAME
       valueFrom:
          secretKeyRef:
            name: mysql-auth
            key: username
            optional: true
[root@k8s-master1 secret]# kubectl apply -f secret-env.yaml
pod/secret-env created
[root@k8s-master1 secret]# kubectl get pods secret-env -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
secret-env   1/1     Running   0          13s   10.244.36.104   k8s-node1   <none>           <none>
[root@k8s-master1 secret]# kubectl exec secret-env -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=secret-env
MYSQL_USER_PASSWORD=ikubernetes
MYSQL_USER_NAME=root
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
MYAPP_SVC_PORT=tcp://10.98.57.156:80
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
MYAPP_SVC_SERVICE_HOST=10.98.57.156
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
MYAPP_SVC_PORT_80_TCP_PORT=80
NGINX_VERSION=1.12.2
HOME=/root

  通过envFrom字段直接将secret资源一次性导入或者导入多个secret资源对象,语法格式如下:

[root@k8s-master1 secret]# kubectl explain pod.spec.containers.envFrom.secretRef
KIND:     Pod
VERSION:  v1

RESOURCE: secretRef <Object>

DESCRIPTION:
     The Secret to select from

     SecretEnvSource selects a Secret to populate the environment variables
     with.

     The contents of the target Secret's Data field will represent the key-value
     pairs as environment variables.

FIELDS:
   name <string>
     Name of the referent. More info:
     https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names

   optional     <boolean>
     Specify whether the Secret must be defined

  例如,将上述示例中的pod资源转为如下形式的定义secret-envfrom.yaml配置文件后,其引用的Secret进行配置的效果并无不同:

[root@k8s-master1 secret]# vim secret-envfrom.yaml
[root@k8s-master1 secret]# cat secret-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-envfrom
  labels:
     app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    envFrom:
    - secretRef:
        name: mysql-auth
[root@k8s-master1 secret]# kubectl apply -f secret-envfrom.yaml
pod/secret-envfrom created
[root@k8s-master1 secret]# kubectl get pods secret-envfrom
NAME             READY   STATUS    RESTARTS   AGE
secret-envfrom   1/1     Running   0          13s
[root@k8s-master1 secret]# kubectl exec secret-envfrom -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=secret-envfrom
password=ikubernetes
username=root
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
MYAPP_SVC_PORT=tcp://10.98.57.156:80
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
MYAPP_SVC_SERVICE_HOST=10.98.57.156
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
MYAPP_SVC_PORT_80_TCP_PORT=80
NGINX_VERSION=1.12.2
HOME=/root

2. Secret存储卷

  在Pod中使用Secret存储卷的方式,除了其类型及引用表示要替换为Secret及secretName之外,几乎完全类似于ConfigMap存储卷,包括支持使用挂载整个存储卷、只挂载存储卷中的指定键值以及独立挂载存储卷中的键等使用方式。

  下面是定义在配置文件secret-volume.yaml中的secret资源使用示例,它将nginx-ssl关联为pod资源的名为nginxcert的Secret存储卷,而后由容器web-server挂载至/etc/nginx/ssl/目录下:

[root@k8s-master1 secret]# vim secret-volume.yaml
You have new mail in /var/spool/mail/root
[root@k8s-master1 secret]# cat secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume
spec:
  containers:
  - name: web-server
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: nginxcert
      mountPath: /etc/nginx/ssl/
      readOnly: true
  volumes:
  - name: nginxcert
    secret:
      secretName: nginx-ssl
[root@k8s-master1 secret]# kubectl apply -f secret-volume.yaml
pod/secret-volume created
[root@k8s-master1 secret]# kubectl get pods secret-volume
NAME            READY   STATUS    RESTARTS   AGE
secret-volume   1/1     Running   0          10s

  创建完成后,查看容器挂载点目录中的文件,以确认其挂载是否成功完成。下面命令的结果显示,私钥文件tls.key和证书文件tls.crt已经成功保存于挂载点路径之下:

[root@k8s-master1 secret]# kubectl exec secret-volume -- ls /etc/nginx/ssl/
tls.crt
tls.key

  此时,通过ConfigMap对象为容器应用Nginx提供HTTPS虚拟主机配置,它只要使用由Secret对象生成的私钥文件和证书文件,即可定义出容器化运行的Nginx服务。

 四、imagePullSecret资源对象

  imagePullSecret资源可用于辅助kubelet从需要认证的私有镜像仓库获取镜像,它通过将secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程。

  使用imagePullSecret的方式有两种:一是创建docker-registry类型的Secret对象,并在定义pod资源时明确通过“imagePullSecrets”字段给出;另一个是创建docker-registry类型的Secret对象,将其添加到某特定的ServiceAccount对象中,那些使用该ServiceAccount资源创建的pod对象,以及默认使用该ServiceAccount的pod对象都将会直接使用imagePullSecrets中的认证信息。

  创建docker-registry类型的Secret对象时,要使用“kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email”的命令格式,其中的用户名、密码及邮件信息是在使用docker login命令登录时使用的认证信息。语法格式详情如下:

[root@k8s-master1 ~]# kubectl create secret docker-registry --help
Create a new secret for use with Docker registries.

  Dockercfg secrets are used to authenticate against Docker registries.

  When using the Docker command line to push images, you can authenticate to a given registry by running:
      '$ docker login DOCKER_REGISTRY_SERVER --username=DOCKER_USER --password=DOCKER_PASSWORD --email=DOCKER_EMAIL'.

 That produces a ~/.dockercfg file that is used by subsequent 'docker push' and 'docker pull' commands to authenticate
to the registry. The email address is optional.

  When creating applications, you may have a Docker registry that requires authentication.  In order for the
  nodes to pull images on your behalf, they have to have the credentials.  You can provide this information
  by creating a dockercfg secret and attaching it to your service account.

Examples:
  # If you don't already have a .dockercfg file, you can create a dockercfg secret directly by using:
  kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER
--docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

Options:
      --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in
the template. Only applies to golang and jsonpath output formats.
      --append-hash=false: Append a hash of the secret to its name.
      --docker-email='': Email for Docker registry
      --docker-password='': Password for Docker registry authentication
      --docker-server='https://index.docker.io/v1/': Server location for Docker registry
      --docker-username='': Username for Docker registry authentication
      --dry-run='none': Must be "none", "server", or "client". If client strategy, only print the object that would be
sent, without sending it. If server strategy, submit server-side request without persisting the resource.
      --field-manager='kubectl-create': Name of the manager used to track field ownership.
      --from-file=[]: Key files can be specified using their file path, in which case a default name will be given to
them, or optionally with a name and file path, in which case the given name will be used.  Specifying a directory will
iterate each named file in the directory that is a valid secret key.
  -o, --output='': Output format. One of:
json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
      --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the
annotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.
      --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The
template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
      --validate=true: If true, use a schema to validate the input before sending it

Usage:
  kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email
[--docker-server=string] [--from-literal=key1=value1] [--dry-run=server|client|none] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

  例如,下面的命令创建了名为local-registry的imagePullSecret对象:

[root@k8s-master1 ~]# kubectl create secret docker-registry local-registry --docker-username=Ops --docker-password=Opspass --docker-email=ops@ilinux.io
secret/local-registry created

  此类Secret对象打印的类型信息为“kubernetes.io/dockerconfigjson”,如下面的命令结果所示:

[root@k8s-master1 ~]# kubectl get secrets local-registry
NAME             TYPE                             DATA   AGE
local-registry   kubernetes.io/dockerconfigjson   1      21s
[root@k8s-master1 ~]# kubectl describe secret local-registry
Name:         local-registry
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson:  131 bytes
You have new mail in /var/spool/mail/root
[root@k8s-master1 ~]# kubectl get  secret local-registry -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsidXNlcm5hbWUiOiJPcHMiLCJwYXNzd29yZCI6Ik9wc3Bhc3MiLCJlbWFpbCI6Im9wc0BpbGludXguaW8iLCJhdXRoIjoiVDNCek9rOXdjM0JoYzNNPSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2022-10-15T12:09:27Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:.dockerconfigjson: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2022-10-15T12:09:27Z"
  name: local-registry
  namespace: default
  resourceVersion: "865782"
  selfLink: /api/v1/namespaces/default/secrets/local-registry
  uid: 1af41af5-28ee-4f4d-a53d-28dd4413f85f
type: kubernetes.io/dockerconfigjson

  而后,使用相应的私有registry中镜像的pod资源的定义,即可通过imagePullSecrets字段使用此Secret对象,使用示例如下面的配置清单所示:

[root@k8s-master1 secret]# vim secret-imagePull.yaml
[root@k8s-master1 secret]# cat secret-imagePull.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env
  labels:
     app: myapp
spec:
  imagePullSecrets:
  - name: local-registry
  containers:
  - name: myapp
    image: registry.ilinux.io/dev/myimage

  上述的配置清单仅是一个示例,拉取私有仓库镜像registry.ilinux.io/dev/myimage。运行时,需要将其Secret中的内容及清单资源的镜像等信息的定义修改为实际可用的信息。

posted @ 2022-10-16 23:01  出水芙蓉·薇薇  阅读(790)  评论(0编辑  收藏  举报