在 ServiceAccount 中设置 imagePullSecrets,为Pod 注入 imagePullSecrets 信息

导语

我们知道k8s中目前有三种secret资源类型

Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
kubernetes.io/service-account-token:用于 ServiceAccount, ServiceAccount 创建时 Kubernetes 会默认创建一个对应的 Secret 对象,Pod 如果使用了 ServiceAccount,对应的 Secret 会自动挂载到 Pod 目录 /run/secrets/kubernetes.io/serviceaccount 中。

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).

这里我们来看下docker-registry类型在运维中的使用

创建一个用户 docker registry 认证的 Secret: kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

查看secret列表

[root@master1 docker_file]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-vd9c2   kubernetes.io/service-account-token   3      334d
my-secret             kubernetes.io/dockerconfigjson        1      31m
myregistry            kubernetes.io/dockerconfigjson        1      289d
secret-demo           Opaque                                2      26h

这里我们用-o yaml 参数来仔细看secret资源的信息,可以看到dockerconfigjson部分是一串字符;
用base64 -d解密后可以看到数据为我们之前填写的信息(绿色部分)

[root@master1 docker_file]# kubectl get secrets  my-secret -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJET0NLRVJfUkVHSVNUUllfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2023-09-09T09:01:34Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:.dockerconfigjson: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2023-09-09T09:01:34Z"
  name: my-secret
  namespace: default
  resourceVersion: "51463008"
  selfLink: /api/v1/namespaces/default/secrets/my-secret
  uid: 0f5225bb-9304-469d-8dbb-66dc57db9afc
type: kubernetes.io/dockerconfigjson
[root@master1 docker_file]# echo "eyJhdXRocyI6eyJET0NLRVJfUkVHSVNUUllfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0="|base64 -d
{"auths":{"DOCKER_REGISTRY_SERVER":{"username":"DOCKER_USER","password":"DOCKER_PASSWORD","email":"DOCKER_EMAIL","auth":"RE9DS0VSX1VTRVI6RE9DS0VSX1BBU1NXT1JE"}}}[root@master1 docker_file]# 

注意:
imagePullSecrets

ImagePullSecrets 与 Secrets 不同,因为 Secrets 可以挂载到 Pod 中,但是 ImagePullSecrets 只能由 Kubelet 访问。

如果我们需要拉取私有仓库中的 Docker 镜像的话就需要使用到上面的 myregistry 这个 Secret:

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: foo
    image: 192.168.1.100:5000/test:v1
  imagePullSecrets:
  - name: myregistry

我们需要拉取私有仓库镜像 192.168.1.100:5000/test:v1,我们就需要针对该私有仓库来创建一个如上的 Secret,然后在 Pod 中指定 imagePullSecrets。

重点:除了设置 Pod.spec.imagePullSecrets 这种方式来获取私有镜像之外,我们还可以通过在 ServiceAccount 中设置 imagePullSecrets,然后就会自动为使用该 SA 的 Pod 注入 imagePullSecrets 信息:

如下所示,每一个命名空间下默认会有一个默认的serviceaccount资源,且所有pod都默认会应用此sa

[root@master1 docker_file]#kubectl get sa
NAME      SECRETS   AGE
default   1         334d
[root@master1 docker_file]# kubectl get sa -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: "2022-10-09T09:50:00Z"
    name: default
    namespace: default
    resourceVersion: "379"
    selfLink: /api/v1/namespaces/default/serviceaccounts/default
    uid: 2549b411-adff-41fa-b724-627320bcf002
  secrets:
  - name: default-token-vd9c2
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

这里复制默认serviceaccount信息,编辑为default-sa.yaml文件,添加myregistry信息;

[root@master1 docker_file]# vi default-sa.yaml
[root@master1 docker_file]# cat default-sa.yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: "2022-10-09T09:50:00Z"
    name: default
    namespace: default
    resourceVersion: "379"
    selfLink: /api/v1/namespaces/default/serviceaccounts/default
    uid: 2549b411-adff-41fa-b724-627320bcf002
  secrets:
  - name: default-token-vd9c2
  imagePullSecrets://新增部分
  - name: myregistry//新增部分
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

重新创建此sa资源

[root@master1 docker_file]# kubectl apply -f default-sa.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
serviceaccount/default configured
[root@master1 docker_file]# kubectl get pod myapp -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
    ...
     dnsPolicy: ClusterFirst
  enableServiceLinks: true
  imagePullSecrets:
  - name: myregistry
  nodeName: node2
  ...

可以看到新建pod中带有myregistry的secret信息,这样访问私有仓库时就不需要针对每个pod再做额外设置了。

Logo

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

更多推荐