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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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是可以拉取到镜像的。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
143 1
|
5天前
|
Kubernetes 数据库 Docker
Kubernetes Node删除镜像
【7月更文挑战第1天】
|
2月前
|
Kubernetes 安全 API
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
|
21天前
|
SQL Kubernetes 数据处理
实时计算 Flink版产品使用问题之在 flink-conf.yaml 中定义的配置在某些情况下未被正确应用到 K8s 上运行的任务管理器(JobManager)和任务管理节点(TaskManager),是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
存储 Kubernetes Docker
k8s-配置与存储-配置管理
k8s-配置与存储-配置管理
|
2月前
|
运维 Kubernetes Linux
Kubernetes详解(九)——资源配置清单创建Pod实战
Kubernetes详解(九)——资源配置清单创建Pod实战
84 2
|
2月前
|
JSON Kubernetes API
Kubernetes详解(八)——Kubernetes资源配置清单
Kubernetes详解(八)——Kubernetes资源配置清单
48 2
|
2月前
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
264 0
|
2月前
|
存储 Kubernetes 数据安全/隐私保护