k8s中特殊的Vloume:project Volume
他们存在的意义不是为了存放容器的数据,也不是用来容器与宿主机的数据交互。是为容器提供预先定义好的数据。
以下四种project Volume:
1.Secret:把pod访问的加密数据存放到Etcd中。后通过挂载方式访问到Secret里保存的信息。
2.ConfigMap:
3.Downward API:
4.ServiceAccountRoken:

在上诉pod中,定义的容器挂载了projected,这个volume的数据来源(sources)对应-user -pass的对象。这里用到的数据,正是以Secret对象的方式交给k8s保存。
如下:创建Secret对象

如下通过YML文件创建Secret对象:

由上可得:Secret对象只有一个。但是他的data字段却key-value的方式保留两份数据。
需要注意的是:Secret对象要求数据是必须Base64转码的。

以上只是转码并没有加密,生产环境中需要开启Secret的加密插件,增强数据的安全性。
创建pod:

当pod变成running之后,secret对象是不是已经在容器中了:

从返回的结果我们可以看出已经指向data字段的key了。数据来源于Etcd。
与Secret类似的Configmap:它保存的是不需要加密的,应该需要的配置信息。
如何把文件保存到ConfigMap中:

kubectl get -o yaml 这样的参数。会将指定的Pod API 对象以YAML的方式展现出来。
而Downward API,让pod的里面的容器能够直接获取到这个Pod API对象的信息。
例子:

由上面的pod的YML文件中可得,一个容器声明了project类型的Volume,只不过来源变成了Downward API。,需要声明了要暴露Pod的metadata.labels给容器。
通过这样的声明方式: 当前Pod的labels字段的值,就会呗Kubernetes自动挂载成为 /etc/podinfo/labels
这个容器启动之后就是不断的打印容器的Labels的字段。


Service Account
1.可否再pod中安装一个k8s的client,这样就可以从容器里直接访问并且操作k8s的API。 可。需要解决API server 授权问题。
1.1Service Account的授权信息实际上它保存再一个特殊的Secret对象中。即;ServiceAccountToken.任何k8s集群上的应用都必须使用这个的授权信息。,也就是token,才可以合法访问APIserver。
为了方便使用k8s已经提供了默认的服务账户,运行再pod之中,无需声明挂载。
如何做到的呢?
主要靠的是 projected Volume机制。
image.png
pod的健康检测与恢复机制。
在k8s中,你可以为pod里面的容器定义一个健康检查”探针“:Probe。kubelet就会根据这个Probe的放回值决定容器的状态。pod恢复机制,在任何时候容器发生了异常,都会被重建。
image.png
网友评论