企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理

  • 前言
  • k8s存储
    • 一、configMap配置管理
      • configMap简介
      • 创建configmap
      • 使用configmap
    • 二、Secret配置管理
    • 三、Volumes配置管理
      • 持久卷PV --静态


前言

k8s存储

一、configMap配置管理

configMap简介

Configmap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法。
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

典型的使用场景:
填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件

创建configmap

使用字面值指定创建

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
kubectl get cm
kubectl describe cm my-config

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第1张图片

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第2张图片

使用文件创建

kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
kubectl get cm
kubectl describe cm my-config-2

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第3张图片

使用目录创建

创建测试目录

mkdir configmap
cd configmap/
mkdir test
cp /etc/passwd test/
cp /etc/fstab test/
ls test/

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第4张图片

kubectl create configmap my-config-3 --from-file=test
kubectl get cm
kubectl describe cm my-config-3

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第5张图片

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第6张图片

编写yaml文件创建

vim cm1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.0.250"
  db_port: "3306"

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第7张图片

cat cm1.yaml
kubectl apply -f cm1.yaml
kubectl get cm

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第8张图片

使用configmap

1.通过环境变量的方式直接传递给pod
2.通过在pod的命令行下运行的方式
3.作为volume的方式挂载到pod内

通过环境变量的方式直接传递给pod

cd configmap/
vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: key1
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

拉起资源清单,创建节点

kubectl apply -f pod.yaml

kubectl get pod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第9张图片

容器执行已完成,需要在pod日志中查看结果

kubectl logs pod1

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第10张图片

通过在pod的命令行下运行的方式

vim pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

拉起资源清单,创建pod2节点

kubectl apply -f pod2.yaml
kubectl get pod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第11张图片

查看节点输出结果

kubectl logs pod2

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第12张图片

vim pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busybox
      command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

kubectl apply -f pod3.yaml
kubectl get pod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第13张图片

kubectl logs pod3

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第14张图片

信息来源cm1-config

kubectl describe cm cm1-config

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第15张图片
企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第16张图片

更新
更新nginx的配置文件,修改端口为8080

vim nginx.conf
cat nginx.conf

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第17张图片

server {
    listen       8080;
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

通过文件创建cm

 kubectl create configmap nginxconf --from-file=nginx.conf
kubectl get cm

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第18张图片

kubectl describe cm nginxconf

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第19张图片

编写清单挂载覆盖nginx配置文件
vim nginx.yaml
cat nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
          - name: config-volume
            mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginxconf

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第20张图片

kubectl apply -f nginx.yaml

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第21张图片

查看分配端口并访问

kubectl get pod -o wide
curl 10.244.141.214:8080

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第22张图片

修改端口为8000

kubectl edit cm nginxconf
apiVersion: v1
data:
  nginx.conf: |
    server {
        listen       8000;
        server_name  _;

        location / {
            root /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第23张图片

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第24张图片

访问,发现未更改

curl 10.244.141.214
curl 10.244.141.214:8000

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第25张图片

刷新副本

 kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200219"}}}}}'

在这里插入图片描述

通过副本age查看是否刷新

kubectl get deployments.apps

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第26张图片

查看重新分配的IP,访问8000,更新已生效。

kubectl get pod -o wide

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第27张图片

curl 10.244.141.215:8000

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第28张图片

二、Secret配置管理

敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

Pod 可以用两种方式使用 secret:
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
当 kubelet 为 pod 拉取镜像时使用。

Secret的类型:
Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。
Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。

查看secrets命令

kubectl get secrets

从文件创建secret

创建认证文本文件

echo -n 'admin' > ./username.txt
echo -n 'westos' > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
kubectl get secrets

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第29张图片

查看认证信息

kubectl describe secrets db-user-pass

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第30张图片

默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以通过以下方式查看

查看yaml格式的secret ,可以看到base64格式的认证信息

kubectl get secrets db-user-pass -o yaml

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第31张图片

查看base64方式加密的明文

echo d2VzdG9z | base64 -d

在这里插入图片描述

编写一个secret对象

vim secret.yaml
cat secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第32张图片

kubectl apply -f secret.yaml

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第33张图片

将Secret挂载到Volume中

vim secret.yaml
cat secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第34张图片

拉起容器,查看pod节点

kubectl apply -f secret.yaml
kubectl get pod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第35张图片

进入mysecret pod节点查看

kubectl exec -it  mysecret -- bash

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第36张图片

可以看到,文件挂载在根目录下的/secret/中

向指定路径映射 secret 密钥

vim secret.yaml
tail -n 20 secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第37张图片

kubectl apply -f secret.yaml

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第38张图片

进入节点终端查看

kubectl exec -it  mysecret -- bash

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第39张图片

可以看到,文件挂载在指定路径my-group/my-username下

将Secret设置为环境变量

vim secret.yaml
tail -20 secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-env
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第40张图片

kubectl apply -f secret.yaml
kubectl get pod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第41张图片

kubectl exec -it  secret-env -- bash
env

env 查看环境变量中是否有认证文件信息
企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第42张图片

注意:环境变量读取Secret很方便,但无法支撑Secret动态更新,即修改yaml文件后,容器内无法及时更改。

kubernetes.io/dockerconfigjson用于存储docker registry的认证信息。

创建secret的格式为docker-registry

kubectl create secret docker-registry myregistrykey --docker-server=hyl.westos.org --docker-username=admin --docker-password=westos --docker-email=yakexi007@westos.org
kubectl get secrets

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第43张图片

编写资源清单,拉取私密仓库中的镜像

vim registry.yaml
cat registry.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: game2048
      image: hyl.westos.org/westos/game2048
  imagePullSecrets:
    - name: myregistrykey

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第44张图片

拉起清单

kubectl apply -f registry.yaml
kubectl get pod

查看pod节点详细信息,可以看到已成功拉取

kubectl describe pod mypod

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第45张图片

三、Volumes配置管理

Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。

emptyDir卷:当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。

emptyDir卷创建

mkdir volumes
cd volumes/
ls
vim vol1.yaml
cat vol1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: vol1
spec:
  containers:
  - image: busyboxplus
    name: vm1
    command: ["sleep", "300"]
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  - name: vm2
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      medium: Memory
      sizeLimit: 100Mi

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第46张图片

kubectl apply -f vol1.yaml
kubectl get pod -o wide
# 访问节点,报错403
curl 10.244.141.222

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第47张图片

进入容器,创建默认发布文件

kubectl exec -it  vol1 -- sh

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第48张图片

再次访问,成功

curl 10.244.141.222

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第49张图片

创建大于设定100M大小的文件,节点会坏掉

kubectl exec -it  vol1 -- sh

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第50张图片

kubectl get pod
kubectl get pod vol1

在这里插入图片描述

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。注意:此处主机为分配的node节点主机,而不是k8smaster主机。

vim host.yaml
cat host.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: DirectoryOrCreate

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第51张图片

kubectl apply -f host.yaml
kubectl get pod -o wide

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第52张图片

node节点文件目录查看
企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第53张图片

进入容器,测试挂载是否成功

kubectl exec -it  test-pd -- sh

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第54张图片

在容器挂载目录中创建一个文件,受控node主机的相应目录也会自动生成相应文件。
企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第55张图片

共享文件系统nfs使用,首先在所有结点上安装nfs,在仓库结点上配置nfs

server1仓库节点:

yum install -y nfs-utils
vim /etc/exports
systemctl start nfs
showmount -e

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第56张图片

server2中:

vim nfs.yaml
cat nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    nfs:
      server: 172.25.9.1
      path: /mnt/nfs

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第57张图片

验证nfs配置是否有误

showmount -e 172.25.9.1

在这里插入图片描述

kubectl apply -f nfs.yaml
kubectl get pod -o wide

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第58张图片

server1:
等待nfs.yaml 拉起后,测试是否同步

cd /mnt/nfs
echo www.westos.org > index.html

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第59张图片

进入容器,测试挂载是否成功

kubectl exec -it  test-pd -- sh

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第60张图片

持久卷PV --静态

PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。

PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。

有两种PV提供的方式:静态和动态。
静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。

动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass。

PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。

创建NFS 静态PV卷

vim pv.yaml
cat pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /mnt/nfs
    server: 172.25.9.1

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第61张图片

拉起容器

kubectl apply -f pv.yaml

查看PV

kubectl get pv

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第62张图片
此时状态为Available模式

创建PVC

vim pvc.yaml
cat pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteOnce #ReadWriteMany 多点读写
  resources:
    requests:
      storage: 1Gi

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第63张图片

拉起pvc容器,查看pvc和pv相关信息

kubectl apply -f  pvc.yaml
kubectl get pvc
kubectl get pv

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第64张图片

Pod挂载PV

vim pod.yaml
cat pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: pv1
  volumes:
  - name: pv1
    persistentVolumeClaim:
      claimName: pvc1

kubectl apply -f pod.yaml
kubectl get pod

进入容器终端测试挂载是否成功

kubectl exec -it  test-pd -- bash

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第65张图片

测试访问

kubectl get pod -o wide
curl 10.244.141.225

企业运维实战--k8s学习笔记7.k8s存储之configMap配置管理、Secret配置管理和Volumes配置管理_第66张图片

删除顺序:pod,pvc,pv

你可能感兴趣的:(运维,kubernetes,k8s配置管理,k8s,数据卷)