ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

k8s-Volumes

2022-07-19 16:31:13  阅读:220  来源: 互联网

标签:name Volumes mysql pod k8s spec metadata


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,对外暴露端口为30000

 

3.1.1 查看运行状态

 

 

 

3.1.2 Navicat连接mysql

 

 

 

如上图所示连接成功。

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

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
          emptyDir: {}
---
kind: Service
apiVersion: v1
metadata:
  name: k8s-mysql-service
spec:
  type: NodePort
  ports:
  - port: 5000
    targetPort: 3306
    nodePort: 30000
  selector:
    name: k8s-mysql

 

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

 

 

 

重启mysql对应的pod

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

 

 

 

观察数据库:

 

 

 

新建的数据库已经不在。

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

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: 
            path: /var/lib/mysql
            type: File
---
kind: Service
apiVersion: v1
metadata:
  name: k8s-mysql-service
spec:
  type: NodePort
  ports:
  - port: 5000
    targetPort: 3306
    nodePort: 30000
  selector:
    name: k8s-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

标签:name,Volumes,mysql,pod,k8s,spec,metadata
来源: https://www.cnblogs.com/yakniu/p/16494561.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有