k8s实战篇-(在 ServiceAccount 中设置 imagePullSecrets,为Pod 注入 imagePullSecrets 信息)
在 ServiceAccount 中设置 imagePullSecrets,为Pod 注入 imagePullSecrets 信息。
在 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再做额外设置了。
更多推荐
所有评论(0)