zoukankan      html  css  js  c++  java
  • k8s-Volumes(6)

    1、什么是Volumns?

    k8s中的volumns跟docker中的volumns有点类似,都是用于挂载应用的数据。但是docker中的volumns通常只挂载在主机的目录,其生命周期无法管理。而K8S中的Volumns则独立于任何容器,其与pod有着相同的生命周期。同时pod中的容器可以共享该Volumns。因此,当容器在pod中重启的时候,数据依然会被保留。如pod被删除了,数据也会被删除。

    2、Volumns的类型

    2.1 emptyDir

    emptyDir类型在pod被分配到Node的时候被创建,并存储在Node主机上的一个目录。如它的名字一样,初始化为一个空目录,pod中的容器都可以读取该目录。emptyDir类型与pod有着相同的生命周期,pod销毁,emptyDir也会被销毁。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mysql-pd
    spec:
      containers:
      - image: easyboys/k8sdemo:mysql5.6
        name: k8s-mysql
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-persistent-storage
      volumes:
      - name: mysql-persistent-storage
        emptyDir: {}
    
    
    

    2.2 hostPath

    hostPath类型就是挂载在主机的一个文件或者目录上,即时pod被删除,volumns的数据也不会被删除。如需要读取本机某些应用程序的数据,如docker的内部文件,此时就需要hostPath。

    • apiVersion: v1
      kind: Pod
      metadata:
        name: mysql-pd
      spec:
        containers:
        - image: easyboys/k8sdemo:mysql5.6
          name: k8s-mysql
          volumeMounts:
          - mountPath: /var/lib/mysql
            name: mysql-persistent-storage
        volumes:
        - name: mysql-persistent-storage
          hostPath:
            path:/mysql
      

    3、Mysql k8s部署Volumns

    ​ 下面通过Mysql 挂载volumns在演示上面两种类型。

    3.1 创建一个mysql-deploy.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-mysql-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: k8s-mysql
      template:
        metadata:
          labels:
            name: k8s-mysql
        spec:
          containers:
          - name: mysql
            image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: password
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 3306
              name: mysql
          # volumeMounts:
          # - name: mysql-persistent-storage
          #    mountPath: /var/lib/mysql
          # volumes:
          # - name: mysql-persistent-storage
          #  hostPath:
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: k8s-mysql-service
    spec:
      type: NodePort
      ports:
      - port: 5000
        targetPort: 3306
        nodePort: 32000
      selector:
        name: k8s-mysql
    
    

    ​ 上面的yaml为mysql配置了root用户的密码为password,对外暴露端口为32000

    3.1.1 查看运行状态

    Image_20201030104353

    3.1.2 Navicat连接mysql

    Image_20201030104623

    Image_20201030104709

    如上图所示连接成功。

    3.2 修改mysql-deploy.yaml中Container的Volumns类型为emptyDir

    containers:
        - name: mysql
        image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
        env:
        - name: MYSQL_ROOT_PASSWORD
        value: password
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-persistent-storage
    volumes:
        - name: mysql-persistent-storage
          hostPath:
            path:/mysql
    

    在删除该pod的时候,先创建一个数据库,用于验证pod被删除后重新构建的时候该数据库是否存在。

    Image_20201030105411

    重启mysql对应的pod

    kubectl replace --force -f mysql-deploy.yaml
    

    观察数据库:

    Image_20201030121357

    新建的数据库已经不在。

    3.3 修改mysql-deploy.yaml中Container的Volumns类型为hostPath

    containers:
        - name: mysql
        image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
        env:
        - name: MYSQL_ROOT_PASSWORD
        value: password
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-persistent-storage
    volumes:
        - name: mysql-persistent-storage
          hostPath: /var/lib/mysql
    

    重复上面步骤,先创建一个数据库,再重启mysql的pod,发现新建数据库依然存在。

    4、ConfigMap

    configmap可以将配置文件与容器分离,偏于容器的迁移。修改configmap能够动态更新容器中对应的配置文件。

    4.1 ConfigMap的创建方式

    ConfigMap的创建方式有很多种,下面只介绍常用的几种:

    通过yaml创建configmap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
      namespace: netcore
    data:
      name: lzl
    

    通过已有文件创建:

    创建一个config.txt,内容为name=lzl,再执行以下命令

    kubectl create configmap myconfig -n netcore --from-file=config.txt
    

    查看confimap内容:

    kubectl get configmap myconfig -n netcore -o yaml
    

    Image_20201030145724

    4.2 使用ConfigMap数据定义容器环境变量

    1、创建configmap

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
      namespace: netcore
    data:
      name: lzl
    

    2、创建pod,制定容器的env参数:

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
      namespace: netcore
    spec:
      containers:
        - name: test-container
          image: registry.cn-shenzhen.aliyuncs.com/dormi330/busybox
          command: [ "/bin/sh", "-c", "env" ]
          env:
            - name: user_name     #环境变量名称
              valueFrom:
                configMapKeyRef:
                  name: my-config #configmap的名称
                  key: username   #configmap中key的名称
      restartPolicy: Never
    
    

    3、pod启动成功查看logs日志

    Image_20201030155600

    上述所述,环境变量已生效。

    4.3使用ConfigMap中数据填充数据卷

    还是用上面所示的configmap(my-config),创建以下pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: configcolume-pod
      namespace: netcore
    spec:
      containers:
        - name: test-container
          image: easyboys/k8sdemo:v1 #用的是我自己的netcoreapi镜像
          volumeMounts:
          - name: config-colume    #挂载的volumes名称
            mountPath: /etc/config
          ports:
          - containerPort: 5000
      volumes:
        - name: config-colume   #volumes名称,与上面保持一致
          configMap:
            name: my-config   #已有的configmap名称
      restartPolicy: Never
    
    

    进入容器中 /etc/config目录下

     kubectl exec -it --namespace netcore configcolume-pod /bin/sh
    

    Image_20201030204842

    /etc/config 下多了一个username文件,内容为lzl,表明挂载成功。

    5、AspNetCore 利用ConfigMap挂载Appsettings.json

    推荐圣杰博客 https://www.cnblogs.com/sheng-jie/p/Using-ConfigMap-with-NETCore.html

  • 相关阅读:
    ZOJ2833*(并查集)
    大学(转载)
    Poj1503
    ibatis中select password('string')引起的bug
    servlet直接调用spring的serivce方法
    如何Eclipse自动提示
    servlet直接调用spring的serivce方法
    ibatis中select password('string')引起的bug
    如何Eclipse自动提示
    如何Eclipse自动提示
  • 原文地址:https://www.cnblogs.com/roluodev/p/13904219.html
Copyright © 2011-2022 走看看