zoukankan      html  css  js  c++  java
  • kubernetes 存储卷

    emptyDir: 默认的本地存储会随着pod删除而删除、只适合临时目录或缓存使用,没有任何持久性。

    mydir实例

    mkdir /volumes

    cd /volumes

    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-pod
      namespace: default
      labels:
        app: myapp
    spec:
      containers:
      - name: myvolume-pod
        image: nginx
        ports:
        - name: http
          containerPort: 80
        volumeMounts: #容器挂载
        - name: mydir  
          mountPath: /data/web/html/  #挂载路径
      volumes:
      - name: mydir
        emptyDir: {} #大小不限制

    kubectl   apply -f pod-volume-pod.yaml

    hostPath(不能跨节点)

    #一、现在node节点上创建目录/data/pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: hostpath-pod
      namespace: default
    spec:
      containers:
      - name: myhostpath
        image: ikubernetes/myapp:v1
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
      volumes:
      - name: html
        hostPath:
          path: /data/pod
          type: DirectoryOrCreate
    
    
    ##kubectl  apply  -f pod-hostpath.yaml #启动
    
    #在node节点的/data/pod目录下创建index.html 即可用curl访问pod的ip

    NFS()

    #1、安装nfs
    yum install -y nfs-utils #
    mkdir /nfsdir
    [root@k8s-m volumes]# cat /etc/exports
    /nfsdir  10.0.0.0/24(rw,sync)
    chown  -R nfsnobody.nfsnobody  /nfsdir
    
    
    
    #[root@k8s-m volumes]# cat pod-nfs.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pod
      namespace: default
    spec:
      containers:
      - name: myhostpath
        image: ikubernetes/myapp:v1
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
      volumes:
      - name: html
        nfs:
          path: /nfsdir
          server: k8s-m
    
    kubectl apply -f  pod-nfs.y
    
    [root@k8s-m nfsdir]# echo  nfs >index.html
    [root@k8s-m volumes]# kubectl  get pod  nfs-pod -o wide
    NAME      READY     STATUS    RESTARTS   AGE       IP            NODE      NOMINATED NODE
    nfs-pod   1/1       Running   0          2m        10.244.1.55   node1     <none>
    [root@k8s-m volumes]# curl  10.244.1.55
    nfs

    PV

    #创建目录
     mkdir  /nfsdir/{v1,v2,v3,v4,v5} -p
    
    [root@k8s-m gfs]# cat  /etc/exports
    /nfsdir  10.0.0.0/24(rw,sync)
    /nfsdir/v1  10.0.0.0/24(rw,sync)
    /nfsdir/v2  10.0.0.0/24(rw,sync)
    /nfsdir/v3  10.0.0.0/24(rw,sync)
    /nfsdir/v4  10.0.0.0/24(rw,sync)


    ##下面是pv的yaml文件
    apiVersion: v1
    kind: PersistentVolume
    metadata:
       name: pv01
       #不要加名称空间
    spec:
      nfs:
        path: /data/v1
        server: k8s-m
      accessModes: ["ReadWriteMany","ReadWriteOnce"] 
      capacity:
        storage: 2Gi
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
       name: pv02
       #不要加名称空间
    spec:
      nfs:
        path: /data/v2
        server: k8s-m
      accessModes: ["ReadWriteMany","ReadWriteOnce"]
      capacity:
        storage: 5Gi
    
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
       name: pv03
       #不要加名称空间
    spec:
      nfs:
        path: /data/v3
        server: k8s-m
      accessModes: ["ReadWriteMany","ReadWriteOnce"]
      capacity:
        storage: 10Gi
    
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
       name: pv04
       #不要加名称空间
    spec:
      nfs:
        path: /data/v4
        server: k8s-m
      accessModes: ["ReadWriteMany","ReadWriteOnce"]
      capacity:
        storage: 20Gi
    [root@k8s-m ~]# kubectl  apply -f mypv.yaml 
    persistentvolume/pv01 configured
    persistentvolume/pv02 created
    persistentvolume/pv03 created
    persistentvolume/pv04 created
    [root@k8s-m ~]# kubectl  get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    pv01      2Gi        RWO,RWX        Retain           Available                                      2m
    pv02      5Gi        RWO,RWX        Retain           Available                                      1m
    pv03      10Gi       RWO,RWX        Retain           Available                                      1m
    pv04      20Gi       RWO,RWX        Retain           Available                                      1m

    例子:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mypvc
      namespace: default
    spec:
      accessModes: ["ReadWriteMany"]
      resources: 
        requests:
          storage: 6Gi  #要求pv至少大小
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: pvc-pod
      namespace: default
    spec:    
      containers:
      - name: pvc-pod
        image: ikubernetes/myapp:v2
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
      volumes:
      - name: html
        persistentVolumeClaim:
          claimName: mypvc  #使用的pvc名字

    [root@k8s-m volumes]# kubectl apply -f pod-pvc.yaml
    persistentvolumeclaim/mypvc unchanged
    pod/pvc-pod created

    [root@k8s-m volumes]# kubectl get pvc
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    mypvc Bound pv03 10Gi RWO,RWX 1m

    [root@k8s-m volumes]# kubectl get pv
    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    pv01 2Gi RWO,RWX Retain Available 9h
    pv02 5Gi RWO,RWX Retain Available 9h
    pv03 10Gi RWO,RWX Retain Bound default/mypvc 9h
    pv04 20Gi RWO,RWX Retain Available 9h

     

    配置容器应用的方式:

    1、之定义命令行 参数

    args:[]

    2、把配置文件直接写入镜像中

    3、环境变量

    (1)cloud Native的应用程序一般可直接通过环境变量加载配置

    (2)通过entrypoint脚本来预处理变量为配置文件中的配置信息

    4、存储卷

     #configmap(配置中心)

    configmap通过key,valomu数据存储

     命令创建 

    [root@k8s-m ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=test.configmap.com
    
    [root@k8s-m ~]# kubectl  get cm nginx-config  -o wide
    NAME           DATA      AGE
    nginx-config   2         54m
    
    ###文件创建
    [root@k8s-m nfsdir]# cat config_map.conf 
    server {
         server_name  test.textcon.conm;
         listen  80;
         root /mnt/html;
    
    }
    kubectl  create configmap text-nginx --from-file=./config_map.conf
    
    [root@k8s-m nfsdir]# kubectl  get cm
    NAME           DATA      AGE
    nginx-config   2         56m
    text-nginx     1         50m
    
    ###使用configmap注入pod
    [root@k8s-m ~]# cat config-pod-nginx.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: cm-pod-nginx
      namespace: default
      labels: 
        app: my-pod
      annotations:
        zhushi: "lalala   dsadsadasdasasd"
         
    spec:
      containers:
      - name: my-configmap-nginx
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
        env:
        - name: NGINX_SERVER_PORT #定义的变量名
          valueFrom: #从哪获取值
            configMapKeyRef: #引用configmap
              name:  nginx-config #引用这个configmap(之前创建的)
              key: nginx_port  #引用这个的值
        - name: NGINX_SERVER_NAME #定义第二个变量(多个)
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: server_name
        
    [root@k8s-m ~]# kubectl apply -f  config-pod-nginx.yaml 
    pod/cm-pod-nginx created
    [root@k8s-m ~]# kubectl  get  pod cm-pod-nginx  -o wide 
    NAME           READY     STATUS    RESTARTS   AGE       IP            NODE      NOMINATED NODE
    cm-pod-nginx   1/1       Running   0          37s       10.244.1.70   node1     <none>
    ##进入容器中查看
    [root@k8s-m ~]# kubectl  exec -it cm-pod-nginx -- /bin/sh
    ##查看变量
    / # printenv |grep -i nginx_server
    NGINX_SERVER_PORT=80
    NGINX_SERVER_NAME=test.configmap.com

    ###在线编辑变量congidfmap配置

    [root@k8s-m ~]# kubectl edit cm nginx-conf

    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
    nginx_port: "9999"   ##改成了9999
    server_name: test.configmap.com
    kind: ConfigMap
    metadata:
    creationTimestamp: 2018-09-06T12:31:26Z
    name: nginx-config
    namespace: default
    resourceVersion: "168906"
    selfLink: /api/v1/namespaces/default/configmaps/nginx-config
    uid: c58c7185-b1d0-11e8-96d6-000c2924d722

    ##查看

    [root@k8s-m ~]# kubectl describe cm nginx-config
    Name: nginx-config
    Namespace: default
    Labels: <none>
    Annotations: <none>

    Data
    ====
    nginx_port:
    ----
    9999
    server_name:
    ----
    test.configmap.com
    Events: <none>


    ##查看容器变量

    [root@k8s-m ~]# kubectl exec -it cm-pod-nginx -- /bin/sh
    / # printenv |grep -i nginx_server
    NGINX_SERVER_PORT=80
    NGINX_SERVER_NAME=test.configmap.com

    ##结果没变(证明使用环境变量注入配置的方案,只有容器创建时更新)

    ###configmap挂载卷

    [root@k8s-m ~]# cat config-pod-2.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: cm-pod-2
    namespace: default
    labels:
    app: my-pod

    spec:
    containers:
    - name: my-configmap-nginx-2
    image: ikubernetes/myapp:v1
    ports:
    - name: http
    containerPort: 80
    volumeMounts:
    - name: vlou-conf
    mountPath: /etc/nginx/config.d/
    readOnly: true #不允许容器改变挂载中的内容
    volumes: #挂载存储卷
    - name: vlou-conf
    configMap:
    name: nginx-config

    [root@k8s-m ~]# kubectl apply -f config-pod-2.yaml
    pod/cm-pod-2 created

    [root@k8s-m ~]# kubectl get pod cm-pod-2
    NAME READY STATUS RESTARTS AGE
    cm-pod-2 1/1 Running 0 1m

    ##测试

    #进入容器查看

    [root@k8s-m ~]# kubectl  exec -it cm-pod-2 -- /bin/sh

    / # ls /etc/nginx/config.d/
    nginx_port server_name

    / # cat /etc/nginx/config.d/nginx_port
    9999/ #    ###这是之前定义的配置

    ##动态修改后再查看

    [root@k8s-m ~]# kubectl edit cm nginx-config

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
    nginx_port: "8888"   ###改成8888端口
    server_name: test.configmap.com
    kind: ConfigMap
    metadata:
    creationTimestamp: 2018-09-06T12:31:26Z
    name: nginx-config
    namespace: default
    resourceVersion: "174082"
    selfLink: /api/v1/namespaces/default/configmaps/nginx-config
    uid: c58c7185-b1d0-11e8-96d6-000c2924d722

    ###查看容器中的变量值(需要等一会)

    / # cat /etc/nginx/config.d/nginx_port
    8888/ #

     ###测试将nginx配置传入容器中

    [root@k8s-m ~]# cat config-pod-3.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: cm-pod-3
    namespace: default
    labels:
    app: my-pod

    spec:
    containers:
    - name: my-ng-conf
    image: ikubernetes/myapp:v1
    ports:
    - name: http
    containerPort: 80
    volumeMounts:
    - name: vlou-conf
    mountPath: /etc/nginx/conf.d/
    readOnly: true #不允许容器改变挂载中的内容
    volumes: #挂载存储卷
    - name: vlou-conf
    configMap:
    name: text-nginx

    [root@k8s-m ~]# kubectl get pod
    NAME READY STATUS RESTARTS AGE
    cm-pod-3 1/1 Running 0 3s

    [root@k8s-m ~]# kubectl exec -it cm-pod-3 -- /bin/sh
    / # ls /etc/nginx/conf.d/
    ..2018_09_07_12_45_59.366917455/ ..data/ config_map.conf
    / # ls /etc/nginx/conf.d/config_map.conf
    /etc/nginx/conf.d/config_map.conf
    / # cat /etc/nginx/conf.d/config_map.conf
    server {
    server_name test.textcon.conm;
    listen 80;
    root /mnt/html;

    }

    ###成功

    ###secret (值通过bash64编码加密)使用bash64命令可以轻松获取数据

    ##创建一个secret
    ##命令行
    [root@k8s-m ~]# kubectl  create  secret generic  mysql-root-password  --from-literal=password=123456
    secret/mysql-root-password created
    [root@k8s-m ~]# kubectl  get secret 
    NAME                  TYPE                                  DATA      AGE
    mysql-root-password   Opaque                                1         38s
    [root@k8s-m ~]# kubectl  describe secret mysql-root-password
    Name:         mysql-root-password
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  6 bytes   ##只显示密码长度

    [root@k8s-m ~]# kubectl get secret mysql-root-password -o yaml
    apiVersion: v1
    data:
    password: MTIzNDU2    ##值使用的是bash64进行的编码

    kind: Secret
    metadata:
    creationTimestamp: 2018-09-08T00:22:12Z
    name: mysql-root-password
    namespace: default
    resourceVersion: "198879"
    selfLink: /api/v1/namespaces/default/secrets/mysql-root-password
    uid: 3b839912-b2fd-11e8-9a6e-000c2924d722
    type: Opaque

    ###使用base64解码

    [root@k8s-m ~]# echo MTIzNDU2|base64 -d
    123456[root@k8s-m ~]#




    ##secret使用(环境变量注入)

    [root@k8s-m ~]# cat config-secret.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: cm-pod-secret
    namespace: default
    labels:
    app: my-pod

    spec:
    containers:
    - name: my-secret-nginx
    image: ikubernetes/myapp:v1
    ports:
    - name: http
    containerPort: 80
    env:
    - name: MYSQL_ROOT_PASSWORD #定义的变量名
    valueFrom: #从哪获取值
    secretKeyRef: #引用configmap
    name: mysql-root-password #引用这个secret(之前创建的)
    key: password #引用这个的值

    #查看

    [root@k8s-m ~]# kubectl exec -it cm-pod-secret -- printenv|grep -i mysql
    MYSQL_ROOT_PASSWORD=123456   #已解码

  • 相关阅读:
    Linux命令之more
    Linux命令之sort
    STM32启动模式
    poll调用深入解析
    STM32 控制步进电机 28BYJ-48
    NEC协议
    家用宽带的上传和下载速度
    Ubuntu14.04更新源
    波特率和比特率【串口为例】
    CentOS: make menuconfig error: curses.h: No such file or directory
  • 原文地址:https://www.cnblogs.com/zhangb8042/p/9589968.html
Copyright © 2011-2022 走看看