K8S中的ServiceAccount和useraccount并配置私有仓库用户名密码Harbor拉取私有镜像

简介: K8S中的ServiceAccount和useraccount并配置私有仓库用户名密码Harbor拉取私有镜像

kubernetes集群中账户分为两类,Kubernetes管理的serviceaccount(服务账户)和useraccount(用户账户)。

k8s创建两套独立的账号系统,原因如下:

(1)面向的对象不同。useraccount给用户用,我们使用kubectl时用的就是userAccount。

Service Account是给Pod里的进程使用的。Pod容器的进程需要访问API Server时用的就是ServiceAccount账户

(2)useraccount是全局性的,在集群所有namespaces中,名称具有唯一性。用户名称可以在kubeconfig中查看。

Service Account则属于某个具体的Namespace

(3)useraccount是与后端的用户数据库同步的,创建一个新用户通常要走一套复杂的业务流程才能实现,Service Account的创建则需要极轻量级的实现方式,集群管理员可以很容易地为某些特定任务创建一个Service Account

(4)对于一个复杂的系统来说,多个组件通常拥有各种账号的配置信息,Service Account是Namespace隔离的,可以针对组件进行一对一的定义,同时具备很好的“便携性”

我这里是kubernetes-admin(主节点)

[root@master ~]# cat ~/.kube/config 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EZ3lOVEV3TURNd01Gb1hEVE16TURneU1qRXdNRE13TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTU94ClFQMVo0dHk3SGZiNVFHRDkrbDZXZUU4RXBSREVqL2MzNWdKWGtlbjlXRCtNbXVuMVhoUStEYXUzMjMvVVNJOVIKQlEvYU5FT3FYdlFDS1JYTUFBYWRSVFMwd0kwNDJVV1RPR0pFV0dOY1hWdjdFa21KaTAxRmd5dy9nYlI5eCttOApQMTNJdStkYjdtZmxjZ2lXb0c4eG9GblVmQTMyeWdWTzBBTy9WaEtPd3h4QTNybndWWVlTdkdWckR4YTZ3WUtQCjYyNTE4VTRiSStmYU9SMUNpbDcyekZpR3FEZ0F3eW1tNlR4LzNKVm05aG40cjFROVBkeDl3c3lOclZLMmw4RTcKL0xDODNMWk5nRGhvNEVvcE5uUi9NK2ZmbHJmRDNsbzZzOWNKZXNPamQ1U1lEWWtTb3g5K0lVU0o2SitIdkdXeQpiaGxlL1licCswK3hOM1JkVnNFQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFJeW9IdU9rN3hXL0xkSnhoYVJjc3lDRW1DVXkKOUZGbys1K1JEQkpLanlzK0dnc3FmSHh0dUJkYlJhSlA5SGFGVFBpT24wenNBbXJMK291VjNJODNBcVdYYnVqbwo1b2JFUEwvNTl3K04vT1FIS2RmcmJ0UHJLWDB6SDU2R3htc3cramUvNEdXWEZpcDJKbWRYV0tGelNZenN3UmFQCnRRNE1LeUVHQjdSdlB1bnJkeStscjdIbXRTRGFRTE51czBzTlptSGhvZGNtbXUzQjZKZ2k1Wmd0RDBXVjNhYUQKc1UxaGFveC82V000aGJhYlU0Q0hJNGpkOVR5ZXVlRkRrcTFaK1E5TGppdTFnK3NGc3hTT0h4OXMxdDlLSGRmWAp4b0dFditIV09tNGdkNEN1UVljWC9RQkg1L2czM2NBckNQNXlVZjJHNlpBV1YycjRqeGF1ejNUTGFPMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://192.168.174.139:6443
  name: kubernetes
contexts:

Service Account

Controller Manager创建了ServiceAccount Controller和Token Controller这两个安全相关的控制器。其中ServiceAccount Controller一直监听Service Account和Namespace的事件,

每个Namespace下都有一个名为default的默认的 Service Account对象

如果在一个Namespace中没有default Service Account,那么Service Account会给Namespace创建一个默认(default)的Service Account。

每创建一个ServiceAccount ,就会对应创建一个secret。

这个secret,会和Service Account里面有一个名为Tokens的字段关联,当Pod启动时候,这个Secret会自动Mount到Pod的指定目录下,用来完成Pod中的进程访问API server时的身份认证过程。

[root@node1 nginx]# kubectl get sa,secret
NAME                     SECRETS   AGE
serviceaccount/default   1         11d
serviceaccount/mydemo    1         24m
serviceaccount/mytest    1         25m
 
NAME                         TYPE                                  DATA   AGE
secret/default-token-jdgfp   kubernetes.io/service-account-token   3      11d
secret/mydemo-token-88szx    kubernetes.io/service-account-token   3      24m
secret/mytest-token-ddb56    kubernetes.io/service-account-token   3      25m
 
 
[root@node1 nginx]# kubectl get serviceaccount,secret
NAME                     SECRETS   AGE
serviceaccount/default   1         11d
serviceaccount/mydemo    1         25m
serviceaccount/mytest    1         26m
 
NAME                         TYPE                                  DATA   AGE
secret/default-token-jdgfp   kubernetes.io/service-account-token   3      11d
secret/mydemo-token-88szx    kubernetes.io/service-account-token   3      25m
secret/mytest-token-ddb56    kubernetes.io/service-account-token   3      26m

创建serviceaccount k8s会自动关联secret

[root@node1 nginx]# kubectl get serviceaccount,secret
NAME                     SECRETS   AGE
serviceaccount/default   1         11d
serviceaccount/mydemo    1         25m
serviceaccount/mytest    1         26m
 
NAME                         TYPE                                  DATA   AGE
secret/default-token-jdgfp   kubernetes.io/service-account-token   3      11d
secret/mydemo-token-88szx    kubernetes.io/service-account-token   3      25m
secret/mytest-token-ddb56    kubernetes.io/service-account-token   3      26m
[root@node1 nginx]# kubectl create sa demo
serviceaccount/demo created
[root@node1 nginx]# kubectl describe sa/demo
Name:                demo
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   demo-token-97f7p
Tokens:              demo-token-97f7p
Events:              <none>

使用serviceAccount

apiVersion: v1
kind: Pod
metadata:
  name: test-sa
spec:
  containers:
  - name: test-sa
    image: nginx:1.22.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
  serviceAccountName: mytest

查看使用详情

[root@node1 nginx]# kubectl get pod -A
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
default       test-sa                          1/1     Running   0          12m
[root@node1 nginx]# kubectl describe pod test-sa -n default
pullable://nginx@sha256:f0d28f2047853cbc10732d6eaa1b57f1f4db9b017679b9fd7966b6a2f9ccc2d1
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 06 Sep 2023 17:33:11 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from mytest-token-ddb56 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  mytest-token-ddb56:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  mytest-token-ddb56
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
 

有以下几条原则:

(1)如果spec.serviceAccount域没有被设置,则Kubernetes默认为其指定名称为default的Service Account。

(2)如果指定了spec.serviceAccountName并且不是default,但是此Service Account不存在,则该Pod操作失败。

(3)如果在Pod中没有指定ImagePullSecrets,那么这个spec.serviceAccount域指定的Service Account的ImagePullSecrets会自动加入到该Pod中。

(4)会给Pod添加一个特殊的Volume,在该Volume中包含ServiceAccount Secret中的Token,并将Volume挂载到Pod中所有容器的指定目录下(/var/run/secrets/kubernetes.io/serviceaccount)。

接下来就是使用私有镜像了。

此时使用私有仓库就需要配置否则 imagePullSecrets。否则会拉取失败。

此时我们需要创建一个secret,存储harbor的用户名密码。

之后有两种选择

  1. 在Deployment的yaml使用imagePullSecrets
  2. 创建一个绑定该secret的serviceAccount,在deployment的yaml中使用这个serviceAccount。或者把这个secret直接patch给default sa。

 

1.创建secret

kubectl create secret docker-registry harborpaas -n dev --docker-server=harbor.com --docker-username=paas --docker-password=XXXXX --docker-email=xxx@xxx.com

2.创建sa

apiVersion: v1
kind: ServiceAccount
metadata:
  name: harbor-sa
  namespace: dev
secrets:
imagePullSecrets:
- name: harborpaas

3.deployment使用sa

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-sa
  namespace: dev
spec:
  serviceAccountName: harbor-sa

根据这一条,如果在Pod中没有指定ImagePullSecrets,那么这个spec.serviceAccount域指定的Service Account的ImagePullSecrets会自动加入到该Pod中。

所以pod是可以拉取到镜像的。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
217 23
|
8月前
|
Prometheus Kubernetes 监控
Kubernetes监控:Prometheus与AlertManager结合,配置邮件告警。
完成这些步骤之后,您就拥有了一个可以用邮件通知你的Kubernetes监控解决方案了。当然,所有的这些配置都需要相互照应,还要对你的Kubernetes集群状况有深入的了解。希望这份指南能帮助你创建出适合自己场景的监控系统,让你在首次发现问题时就能做出响应。
391 22
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
12月前
|
运维 Kubernetes 数据安全/隐私保护
K8S 拉取私有仓库镜像
在Kubernetes中从私有仓库拉取镜像时,需先创建包含认证信息的Secret,然后在Pod或Deployment中引用此Secret。本文通过具体步骤演示了如何创建Secret、更新Kubernetes资源配置文件以引用Secret,并验证了镜像拉取及应用运行的成功。
748 6
|
Kubernetes 应用服务中间件 Linux
k8s--如何将chart包托管至harbor
k8s--如何将chart包托管至harbor
463 1
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
1432 0
|
12月前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
10天前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
75 1
|
17天前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
173 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
231 9

热门文章

最新文章

推荐镜像

更多
下一篇
开通oss服务