【kubernetes/k8s源码分析】 k8s secret storage 源码分析_kubelet卷挂载secret源码-程序员宅基地

技术标签: # kubernetes CSI 存储  

      Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。

     用户可以创建自己的secret,系统也会有自己的secret。

     Pod需要先引用才能使用某个secret,Pod有2种方式来使用secret:作为volume的一个域被一个或多个容器挂载;在拉取镜像的时候被kubelet引用。

 

Service Account

      Service Account 场景:pod里的进程需要调用 Kubernetes API 以及非 Kubernetes API 的其它服务。Service Account 是给 pod 里面的进程使用的,它为pod提供必要的身份认证

      如果kubernetes 启动参数设置 --admission_control=ServiceAccount,会在每个namespace下创建一个默认的 default 的service account

# kubectl get serviceaccount default -oyaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2019-05-29T06:59:44Z"
  name: default
  namespace: default
  resourceVersion: "225"
  selfLink: /api/v1/namespaces/default/serviceaccounts/default
  uid: 56de4d32-81df-11e9-884b-0800271c9f15
secrets:
- name: default-token-shmrt

   在看看这个secrets是啥内容

apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVZFBJbVBPUVhGL2g0MzNGRHAvTWI4MnN2NWVZd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU1TURReU5URXdNelF3TUZvWERUSTBNRFF5TXpFd016UXdNRm93WlRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByZFdKbGNtNWxkR1Z6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcnJUQW5tR2pGRWoxUmVLVG0vOXgKZlhQSXJ1NXZtVG5GYTYrUmR6bGhRTldSdW11Tmc4eCtPNnZ3U0tHSzdORUMzdEN4UkxsOHZKQmpJR0o5TlJ4egpLcWVtamZaR2E2NERGT3g0N1RlaTRkUHRlVDBqNjFsWjFxeFcwcmhxSHFzRWJySVZYWE14bExhVnYyYVorVUZwCitkOFg0Q1dKVVQ2OW1zcDZDdzhIZHYvMnNLRGsraVlPY2dzei9EbzlPaTBKbThrb3B3ak5sd1lqZ012ZVdkcnMKTS8vS2Q3MVQwY040bzhhYnZwZng2V2pCTWNuUzVxb01XTy94bzFPUXZyZmpFUmkxL2dPSmdZRHpRamFESXRNeQp4cWZEZ2lZZmJmTktTSVNpc3FPRG9BaVZ5VkY1SS8xajVrWFBSTldiUURxUHl0N0VZWnk5aXN4Mm0zRTFKRkE0CmpRSURBUUFCbzJZd1pEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWQKQmdOVkhRNEVGZ1FVbHlrT0ZrMThPZ3dBa2JLNnZaVWNDai9hSEZJd0h3WURWUjBqQkJnd0ZvQVVseWtPRmsxOApPZ3dBa2JLNnZaVWNDai9hSEZJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHR0UrODEwY2hUNUVpUnI3K1VsCmRmeHB6byswNFJxbCt3RUhFaThuY1pYTFoxS25xeDUya1M4UnpsdHR4bzRDRGpyRE1nakkzSmpJZXIwcFFwcmYKdklCcnBkdFJCQm0wNTI0SEorUThldG1md0FiR0xOVjhyYmowdDhVc1hPZ000RjkzelhsV0NNWDdLT3Bzc2xsVgpxTEk1Qi80aUh1LzFmOU9RU0ViejhSWmtkeTY3RlZPSjJYMlNTMXJldjZzbTlERVE0RnZ5WWlJejFJWXhjY2tuClRGbGNwMVVFTzZOOGRsWnpuTTNnL2N2OVNSZVJiMXUyYktnL0hKZm1nTTZTVU9CYU9XYmR6SkM2Z2s4UkhCbW8KdWtpWFNkOHNWeGJTb1lYL011S2grS3Z0K3NENWNaUitKQXVnd2lJcFQvKzRlaUNyc0F6akNicHlsY29WR2NQeAp1N009Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  namespace: ZGVmYXVsdA==
  token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklpSjkuZXlKcGMzTWlPaUpyZFdKbGNtNWxkR1Z6TDNObGNuWnBZMlZoWTJOdmRXNTBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5dVlXMWxjM0JoWTJVaU9pSmtaV1poZFd4MElpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltUmxabUYxYkhRdGRHOXJaVzR0YzJodGNuUWlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2laR1ZtWVhWc2RDSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqVTJaR1UwWkRNeUxUZ3haR1l0TVRGbE9TMDRPRFJpTFRBNE1EQXlOekZqT1dZeE5TSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBrWldaaGRXeDBPbVJsWm1GMWJIUWlmUS5TSnY1b2tpYXVHMHg2UGJYT0hWZHdYbkZxYlNKNUNSdk9zOVRWbVpGY3dNUUdMTnpROUlLOXJ6MmRSQjhxUmhTdUcwS2ZDemxCeW0tYTRuaFp2MHNvMURndkV2MVY3LVRhRklzLW9HbXp2bVpoUzh0YVZvdVI2MDYyLWlKcmVmVHg5VkgzX1pLbkdNY241VXp4UEFSNkV1Xy1hZXFBd244UzJSN2xDZEtiNEZmNkt2Zl9Bdk5uWnhLdmt1QVJNYmg3Z2tsNm55LUItNnJiQ0w0V0F6R3JMVFUyYmNtSVhTZEwyWkFmbUhpcGxnMWhBUWtmcnZVVDFRZjJQQnZSczAtQ0xUYU1OeTFRMF9CMHc5SlN1ZWJBYjYycE41WXE4UmhFcjR1dEZuNW83Y3lnRWFoQlloZGFMdEdram1wdFNlZVRucE80UFJPLU1FdXVCZHdtdTRNZVE=
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: default
    kubernetes.io/service-account.uid: 56de4d32-81df-11e9-884b-0800271c9f15
  creationTimestamp: "2019-05-29T06:59:44Z"
  name: default-token-shmrt
  namespace: default
  resourceVersion: "219"
  selfLink: /api/v1/namespaces/default/secrets/default-token-shmrt
  uid: 56f435ab-81df-11e9-884b-0800271c9f15
type: kubernetes.io/service-account-token

 

使用Secret 

      secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用。比如可以用secret导入与外部系统交互需要的证书文件等。

    volumeMounts:
    - mountPath: /var/lib/mysql
      name: mysql-persistent-storage
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-shmrt

      readOnly: true

  volumes:
  - hostPath:
      path: /tmp/mysql
      type: ""
    name: mysql-persistent-storage
  - name: default-token-shmrt
    secret:
      defaultMode: 420
      secretName: default-token-shmrt 

      将ca.crt 、namespace和token三个文件写入value在容器的/var/run/secrets/kubernetes.io/serviceaccount目录下,这样容器通过https 访问apiserver

    Pod中以文件的形式使用secret 

  1. 创建一个Secret,多个Pod可以引用同一个Secret
  2. 修改Pod的定义,在spec.volumes[]加一个volume
  3. 在每个需要使用Secret的容器中添加一项spec.containers[].volumeMounts
  4. Secret中data字段的每一个key都是指定路径下面的一个文件名

 

类型

Opaque任意字符串,默认类型

kubernetes.io/service-account-token:作用于ServiceAccount

 

每一个用户对API资源进行操作都需要通经过以下三个步骤:

第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限

token(共享秘钥)

SSL(双向SSL认证)

通过任何一个认证即表示认证通过,进入下一步

第二步:授权检查,确认是否对资源具有相关的权限

ABAC(基于属性的访问控制)

RBAC(基于角色的访问控制)

NODE(基于节点的访问控制)

WEB HOOK(自定义HTTP回调方法的访问控制)

第三步:准入控制(对操作资源相关联的其他资源是否有权限操作)

 

 

  • Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了ServiceAccout)
  • 验证Pod引用的service account存在,否则拒绝创建
  • 如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中
  • container启动后都会挂载该service account的namespace token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount

 

    下面是第一部secret分析 

 

1. NewMounter 函数

    插件名为:kubernetes.io/secret,实例化secretVolumeMounter,名,pod 信息等

func (plugin *secretPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) {
	return &secretVolumeMounter{
		secretVolume: &secretVolume{
			spec.Name(),
			pod.UID,
			plugin,
			plugin.host.GetMounter(plugin.GetPluginName()),
			volume.NewCachedMetrics(volume.NewMetricsDu(getPath(pod.UID, spec.Name(), plugin.host))),
		},
		source:    *spec.Volume.Secret,
		pod:       *pod,
		opts:      &opts,
		getSecret: plugin.getSecret,
	}, nil
}


2. SetUpAt 函数

     /var/lib/kubelet/pods/7f3ca9fc-8435-11e9-a5a0-0800271c9f15/volumes/kubernetes.io~secret/default-token-w25t2

func getPath(uid types.UID, volName string, host volume.VolumeHost) string {
   return host.GetPodVolumeDir(uid, strings.EscapeQualifiedNameForDisk(secretPluginName), volName)
}

     每一个 namespace 都有一default serviceaccount,存储在 kubernetes API 中的 Secrets 资源

 

secret, err := b.getSecret(b.pod.Namespace, b.source.SecretName)
if err != nil {
	if !(errors.IsNotFound(err) && optional) {
		klog.Errorf("Couldn't get secret %v/%v: %v", b.pod.Namespace, b.source.SecretName, err)
		return err
	}
	secret = &v1.Secret{
		ObjectMeta: metav1.ObjectMeta{
			Namespace: b.pod.Namespace,
			Name:      b.source.SecretName,
		},
	}
}

    MakePayload 主要是读取secret 中的data数据,包括ca.crt namespace token,value为需要写入这三个文件的内容

// MakePayload function is exported so that it can be called from the projection volume driver
func MakePayload(mappings []v1.KeyToPath, secret *v1.Secret, defaultMode *int32, optional bool) (map[string]volumeutil.FileProjection, error) {
	if defaultMode == nil {
		return nil, fmt.Errorf("No defaultMode used, not even the default value for it")
	}

	payload := make(map[string]volumeutil.FileProjection, len(secret.Data))
	var fileProjection volumeutil.FileProjection

	if len(mappings) == 0 {
		for name, data := range secret.Data {
			fileProjection.Data = []byte(data)
			fileProjection.Mode = *defaultMode
			payload[name] = fileProjection
		}
	} else {
		for _, ktp := range mappings {
			content, ok := secret.Data[ktp.Key]
			if !ok {
				if optional {
					continue
				}
				errMsg := "references non-existent secret key"
				klog.Errorf(errMsg)
				return nil, fmt.Errorf(errMsg)
			}

			fileProjection.Data = []byte(content)
			if ktp.Mode != nil {
				fileProjection.Mode = *ktp.Mode
			} else {
				fileProjection.Mode = *defaultMode
			}
			payload[ktp.Path] = fileProjection
		}
	}
	return payload, nil
}

    使用wrapped emptydir插件

setupSuccess := false
if err := wrapped.SetUpAt(dir, fsGroup); err != nil {
	return err
}

     也就是写入文件包括ca.crt namespace token,设置文件owner,完活

writerContext := fmt.Sprintf("pod %v/%v volume %v", b.pod.Namespace, b.pod.Name, b.volName)
writer, err := volumeutil.NewAtomicWriter(dir, writerContext)
if err != nil {
	klog.Errorf("Error creating atomic writer: %v", err)
	return err
}

err = writer.Write(payload)
if err != nil {
	klog.Errorf("Error writing payload to dir: %v", err)
	return err
}

err = volume.SetVolumeOwnership(b, fsGroup)
if err != nil {
	klog.Errorf("Error applying volume ownership settings for group: %v", fsGroup)
	return err
}
setupSuccess = true

 

总结:

     secret 这个主要是 pod内进程访问的凭证,将 ca.crt namespace token 三个文件挂载到pod内

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhonglinzhang/article/details/90677709

智能推荐

bootstrap tab切换后,刷新 页面 回到被选中的tab页签_bootstrap刷新页面-程序员宅基地

文章浏览阅读686次。描述:当使用bootstrap 的tab 进行页面切换后,一刷新页面,又回到了第一个初始页,从而又得重新切换,实现目标:例如当前切换到第三个页面后,刷新页面自动定位到第三个tab页面中。_bootstrap刷新页面

uniapp视频播放器(h5+app)

这是关于一篇在uniapp使用video视频播放器,支持自定义播放器样式,支持手势操作,选集、倍数和清晰度切换,支持SRT字幕格式。

uCosii从任务的建立到运行_ucosii用户任务中都有参数初始化,先执行哪个-程序员宅基地

文章浏览阅读823次。μC/OS-Ⅱ从任务的建立到运行提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、任务建立到运行整体流程二、分步功能实现1.μC/OS-Ⅱ初始化2.读入数据总结前言最近在学习ucosii实时操作系统,记录下学习过程,以待日后查阅.tips:本文所用ucosii版本为V2.86,硬件平台为STM32.一、任务建立到运行整体流程μC/OS-Ⅱ任务从建立到运行的整体流程如下所述:1. μC/OS-Ⅱ初始化: OSInit();2. 创建任务: Create_T_ucosii用户任务中都有参数初始化,先执行哪个

【燃料电池】燃料电池并网以最大额定功率运行研究(Simulink实现)_如何实现燃料电池大规模并网-程序员宅基地

文章浏览阅读260次。控制和电流谐振控制方法,增强了系统的稳定性,提高了供电质量。部分文献针对风力发电、太阳电池并网系统的小干扰稳定性进行研究,对燃料电池发电系统稳定性分析具有一定指导意义。文献[6,7]则分别建立太阳电池和风力发电系统的小信号模型,利用特征值分析法对系统的小干扰稳定性进行分析。文献[8]在光伏发电系统控制器参数进行全局优化以提高系统稳定性,但只考虑特征值作为单一优化目标,没有考虑阻尼比对系统稳定的影响,影响了控制参数的优化效果。在该模型中,燃料电池连接到电网,并由基于功率的控制器控制。行百里者,半于九十。_如何实现燃料电池大规模并网

AGI要闻:斯坦福李飞飞首次创业,瞄准“空间智能”;OpenAI下周发布搜索产品挑战谷歌;新的开源 AI 眼镜来了|钛媒体AGI | 最新快讯

她的专业领域是计算机视觉和认知神经科学。对于这家新的初创公司介绍,一位消息人士提到,上个月,李飞飞在温哥华 TED 大会上演讲中表示,最前沿的 AI 研究涉及一种算法,这种算法可以合理地推断出图像和文字在三维环境中的样子,并根据这些预测采取行动,这种算法使用的概念叫做“空间智能”。让机器狗在瑜伽球上保持平衡是很有挑战的任务,在没有大语言模型之前需要人去调整参数,但现在像 GPT-4 这样的大语言模型,因为本身就具备了丰富的物理知识,所以大语言模型可以代替人类去调整参数,并根据反馈的结果进行推理和参数调整。

Pytorch加载本地自己整理好的cifar10或cifar100数据集,并进行训练_cifar100 pytorch-程序员宅基地

文章浏览阅读6.7k次,点赞11次,收藏49次。Pytorch加载本地自己整理好的cifar10数据集,并进行训练这里写自定义目录标题1.下载数据集2.解压3.复制移动4.修改tv.datasets.CIFAR10源码使用pytorch在线下载cifar10数据集时,经常报错,而且很慢,倘若下载cifar100,那等待时间可想而知了。为了不浪费时间等待,可以将数据集先下载到本地,在自行加载,下面介绍一种修改源码简单的方法。1.下载数据集(随意下载,官网地址:http://www.cs.toronto.edu/~kriz/cifar-10-pytho_cifar100 pytorch

随便推点

逆向_base64_rc4_----笔记_mdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmd-程序员宅基地

文章浏览阅读1k次。新人…学校比赛,没什么经验,上去见见世面某公司的月赛题 资源就不放了,只是当笔记Ida打开 有点小陷阱 巧妙的堆栈运用导致载入ida分析不了 得不到函数的边界比较幸运win32的程序od打开走一遍流程感受下00AD12E7 . 52 push edx00AD12E8 . 68 C821AD00 push 5ba358a4.00AD21C8 ..._mdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdaw

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划-程序员宅基地

文章浏览阅读781次。在内、外部开发者的合力之下,过去一年 Tapdata 新增数据源近20个,实现了60+数据源的接入能力。一个人可以走得很快,一群人可以走得更远,2023年期待与您共创更受欢迎的开源项目。_tapdata

python列表添加元素的三种方法定义集合数据对象_python 学习第三天 可迭代对象(列表,字典,元组和集合)...-程序员宅基地

文章浏览阅读642次。列表,字典,元组和集合列表 list列表是由一系列特定元素组成的,元素和元素之间没有任何关联关系,但他们之间有先后顺序关系列表是一种容器列表是序列的一种列表是可以被改变的序列Python中的序列类型简介(sequence)字符串(str) 列表(list) 元组(tuple) 字节串(bytes) 字节数组(bytearray)创建空列表的字面值L = [ ] # L绑定空列表创建非空列表: L ..._python 集合 对象元素

第十五周 项目 1 - 验证算法_insertht(hashtable ha[], int& n, int m, int p, key-程序员宅基地

文章浏览阅读316次。/* *Copyright (c) 2016,烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作者:杨天瑞 *完成日期:2016年12月16日 *版本号:v1.7.5 * * 问题描述:验证算法。 * 程_insertht(hashtable ha[], int& n, int m, int p, keytype k)

react-native之项目结构分析_react native课程的项目分析-程序员宅基地

文章浏览阅读6k次,点赞5次,收藏10次。前言庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然响然,奏刀騞然,莫不中音。合于桑林之舞,乃中经首之会。熟悉项目的结构,是开发的基本也是技术提升的一个重要途径,现总结下自己对react-native项目结构的分析与理解。正文项目结构init 的一个项目结构如图:tests:测试文件夹,执行命令 “npm test”会调用此文件夹,在文件夹中需要引入待测试文件。android:An_react native课程的项目分析

uniapp开发公众号,微信开发者工具进行本地调试_uniapp使用微信开发者工具 利用公众号调试的方法-程序员宅基地

文章浏览阅读584次。uniapp开发公众号,微信开发者工具进行本地调试_uniapp使用微信开发者工具 利用公众号调试的方法