Secret
secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
用户可以创建自己的secret,系统也会有自己的secret。
Pod需要先引用才能使用某个secret,且Secret 要求数据必须是经过 Base64 转码的,以免出现明文密码显示的安全隐患。
[root@k8s]# vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
以上为一个简单的secret.yml文件,记录了用户名为admin,密码为MWYyZDFlMmU2N2Rm的一组凭证。查看发现成功创建。之后就是使用,下面用redis测试一下:
以上的yml创建了一个redis容器,
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql-container
image: mysql:5.7.44
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
这样就在mysql中,root用户使用了刚才的secret,直接进入pod中,输入env,查到了对应变量
再登录试试,成功进入
ConfigMap
ConfigMap与 Secret 类似,用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。ConfigMap 保存的是不需要加密的、应用所需的配置信息。ConfigMap 的用法几乎与 Secret 完全相同:可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。由于ConfigMap中存的是很多的配置文件内容,不适用于yml创建,使用指定目录的方法创建。先在本地创一个conf文件,
[root@k8s]# vim server.conf
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
再通过“kubectl create configmap test-config2 –from-file=server.conf”,创建configmap。看看这个新创建的configmap
创建成功,尝试使用一下
使用volumes挂载到pod中,
[root@master]# vim volupod.yml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-configmap
spec:
containers:
- name: nginx-configmap
image: nginx:1.25.0
volumeMounts:
- name: config-volume4
mountPath: "/tmp/config4"
volumes:
- name: config-volume4
configMap:
name: test-config2
进入新建的这个nginx的pod中,cd到tmp目录,查看
成功挂载进来了,configmap可以用来把各种配置文件放到配置文件目录中。
Downward API
downwardAPI存储卷类型,从严格意义上来说,downwardAPI不是存储卷,它自身就存在,原因在于,它引用的是Pod自身的运行环境信息,这些信息在Pod启动手就存在。
- spec.nodeName – 宿主机名字
- status.hostIP – 宿主机 IP
- metadata.name – Pod 的名字
- metadata.namespace – Pod 的 Namespace
- status.podIP – Pod 的 IP
- spec.serviceAccountName – Pod 的 Service Account 的名字
- metadata.uid – Pod 的 UID
- metadata.labels[”] – 指定 的 Label 值
- metadata.annotations[”] – 指定 的 Annotation 值
- metadata.labels – Pod 的所有 Label
- metadata.annotations – Pod 的所有 Annotation
这个不需要提前创建什么,这是k8s自己自带的一些参数,直接使用就行,创建对应pod的yml来测一下。
[root@master]# vim test-env-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
name: test-env-pod
namespace: kube-system
spec:
containers:
- name: test-env-pod
image: daocloud.io/library/nginx
env:
- name: POD_NAME #第一个环境变量的名字
valueFrom: #使用valueFrom方式设置
fieldRef: #关联一个字段metadata.name
fieldPath: metadata.name #这个字段从当前运行的pod详细信息查看
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
创建完成后,创建pod,exec进入后查看,downwardapi成功在pod中显示出来