Skip to main content

10、存储和配置

Y-aong...About 6 mink8s部署devops

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
      

三、configMapopen in new window

定义

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 的一个注解来触发立即刷新。

configmap使用参考open in new window

四、Secret

定义

Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Podopen in new window 规约中或者镜像中。 使用 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
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8