10、存储和配置
10、存储和配置
一、k8s的存储
1、必要条件安装nfs-utils
所有节点
# 所有机器安装nfs-utils
apt install -y nfs-utils
主节点
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
从节点
showmount -e 主节点ip
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 172.31.0.4:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
2、原生方式挂载
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 主节点ip
path: /nfs/data/nginx-pv
二、pv和pvc
1、定义
pv:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
pvc:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
2、步骤
- 创建pv池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 主机ip
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-30M
spec:
capacity:
storage: 30M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 主机ip
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-80Mi
spec:
capacity:
storage: 80Mi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 主机ip
pvc创建和绑定
创建pvc
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nginx-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Mi storageClassName: nfs创建pod绑定pvc
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy-pvc name: nginx-deploy-pvc spec: replicas: 2 selector: matchLabels: app: nginx-deploy-pvc template: metadata: labels: app: nginx-deploy-pvc spec: containers: - image: nginx name: nginx volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html persistentVolumeClaim: claimName: nginx-pvc
三、configMap
定义
configMap卷提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被 Pod 中运行的容器化应用使用。
引用 configMap 对象时,你可以在卷中通过它的名称来引用。 你可以自定义 ConfigMap 中特定条目所要使用的路径。 下面的配置显示了如何将名为 log-config 的 ConfigMap 挂载到名为 configmap-pod 的 Pod 中:
创建configMap的方式
使用yaml文件
使用命令行方式 from-literal
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm使用文件的方式 from-file
kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径> kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties使用挂载的方式
配置configMap的四种方式
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷中添加一个文件,让应用来读取
- 编写代码在pod中运行,让k8s读取configMap
使用configMap步骤
- 创建一个configMap对象或者使用现有的configMap对象,多个pod可以使用同一个configMap
- 修改pod在spec.volumns下添加一个卷,将spec.volumns.configMap.name设置为所要使用configMap对象的引用
- 为每个需要该configMap的容器添加一个spec.containers,volumeMounts.设置
.spec.containers[].volumeMounts[].readOnly=true并将.spec.containers[].volumeMounts[].mountPath设置为一个未使用的目录名, ConfigMap 的内容将出现在该目录中。 - 更改你的镜像或者命令行,使得程序能够从该目录中查找文件,configMap中每一个data键会变成mountPath下面的一个文件名
示例
创建configMap对象
apiVersion: v1 kind: ConfigMap # 类型为configmap metadata: name: configmap-base # 实际的配置信息是放在data中的 data: appVersion: 1.0.0 jdkVersion: "1.8" #不能是number,如果符合number类型就加个引号 env: prod logDir: /var/data logLevel: info 1err_config: err #定义一个不合规范的key,看能否使用,貌似现在可以以数字开头了# 创建configmap kubectl create -f configmap-base.yaml # 查看configmap kubectl get configMap configmap-base创建pod对象使用configmap
apiVersion: v1 kind: Pod metadata: name: configmap-valuefrom spec: containers: - name: configmap-base-busybox image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","env"] # 环境变量中使用configmap env: - name: APP_VERSION valueFrom: configMapKeyRef: name: configmap-base key: appVersion - name: LOG_LEVEL valueFrom: configMapKeyRef: name: configmap-base key: logLevel - name: LOG_LEVEL valueFrom: configMapKeyRef: name: configmap-base key: logLevel restartPolicy: Never# 创建pod对象 kubectl create -f kube-configMap-valueFrom.yaml查看环境变量
[root@master config]# kubectl logs configmap-valuefrom MY_NGINX_SERVICE_PORT=8848 MY_NGINX_PORT=tcp://10.96.190.196:8848 KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.96.0.1:443 LOG_LEVEL=info HOSTNAME=configmap-valuefrom MY_NGINX_PORT_8848_TCP_ADDR=10.96.190.196 SHLVL=1 PHP_APACHE_PORT_80_TCP=tcp://10.96.64.244:80 HOME=/root MY_NGINX_PORT_8848_TCP_PORT=8848 MY_NGINX_PORT_8848_TCP_PROTO=tcp MY_NGINX_PORT_8848_TCP=tcp://10.96.190.196:8848 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 PHP_APACHE_SERVICE_HOST=10.96.64.244 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp PHP_APACHE_SERVICE_PORT=80 PHP_APACHE_PORT=tcp://10.96.64.244:80 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 MY_NGINX_SERVICE_HOST=10.96.190.196 KUBERNETES_SERVICE_HOST=10.96.0.1 PHP_APACHE_PORT_80_TCP_ADDR=10.96.64.244 PWD=/ PHP_APACHE_PORT_80_TCP_PORT=80 PHP_APACHE_PORT_80_TCP_PROTO=tcp APP_VERSION=1.0.0使用envFrom一次性将所有的配置问价内容写到环境变量
apiVersion: v1 kind: Pod metadata: name: configmap-envfrom spec: containers: - name: configmap-base-busybox image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","env"] envFrom: - configMapRef: name: configmap-base restartPolicy: Never
挂载的 ConfigMap 会被自动更新
当已挂载的 ConfigMap 被更新时,所投射的内容最终也会被更新。 这适用于 Pod 启动后可选引用的 ConfigMap 重新出现的情况。
Kubelet 在每次定期同步时都会检查所挂载的 ConfigMap 是否是最新的。 然而,它使用其基于 TTL 机制的本地缓存来获取 ConfigMap 的当前值。 因此,从 ConfigMap 更新到新键映射到 Pod 的总延迟可能与 kubelet 同步周期(默认为1分钟)+ kubelet 中 ConfigMap 缓存的 TTL(默认为1分钟)一样长。 你可以通过更新 Pod 的一个注解来触发立即刷新。
四、Secret
定义
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。
使用方式
- 挂载文件——作为挂载到一个或者多个容器卷中的文件
- 容器变量——作为容器的变量
- 拉取镜像——由kubelet在pod拉去镜像时使用
secret基本操作
命令操作secret
创建secret
kubectl create secret generic db-user-pass \ --from-literal=username=admin \ --from-literal=password='S!B\*d$zDsb='验证secret
kubectl get secrets # 查看 Secret 的细节: kubectl describe secret db-user-pass编辑secret
kubectl edit secrets <secret-name>删除secret
kubectl delete secret db-user-pass
使用配置文件操作secret
创建yaml文件
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm使用secret
kubectl apply -f ./secret.yaml
pod中使用secret
##命令格式
kubectl create secret docker-registry my_secret \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>
apiVersion: v1
kind: Pod
metadata:
name: private-nginx
spec:
containers:
- name: private-nginx
image: leifengyang/guignginx:v1.0
imagePullSecrets:
- name: my_secret