kubernetes中的Volumes

为什么引入Volume

1.当container crash的时候,kubelet将会重启它,里面之前运行的数据将会丢失, 容器将以一个clean state的状态来启动.
2.运行在pod中的containers通常会共享数据. volumes的概念就是为了解决这些问题.

现状

kubernetes中的volume有完整的lifetime.在pod中可以脱离container而存在.container重启的时候, volume中的pod会被保存. pod消失的时候, volume也会消失. kubernetes支持多种volumes的类型.pod可以使用同时使用多个volume.类型如下

emptyDir 
hostPath 
gcePersistentDisk 
awsElasticBlockStore 
nfs 
iscsi 
flocker 
glusterfs 
rbd 
cephfs 
gitRepo 
secret 
persistentVolumeClaim 
downwardAPI 
projected 
azureFileVolume 
azureDisk 
vsphereVolume 
Quobyte 
PortworxVolume 
ScaleIO 

常用的存储类型

emptyDir

emptyDir卷当pod分配给Node的时候会被创建, 伴随这pod在该Node上运行整个过程. 开始的时候为空的. pod中的containers可以读写emptyDir volume中的同一个文件, 这个volume可以被挂载到容器相同或者不同的目录. 但是如果pod在该node上被removed, 那么emptyDir中的数据将会被永远的删除. 注意:如果容器crashing pod没有从node上remove. emptyDir中的volume数据是safe的.
emptyDir的使用用途

暂存空间,如基于磁盘的合并排序
检查一个长时间的计算以恢复崩溃
持有内容管理器容器在Web服务器容器提供数据时提取的文件

默认情况下,根据您的环境,emptyDir卷存储在任何介质中,可能是磁盘或SSD或网络存储。 但是,您可以将emptyDir.medium字段设置为“Memory”,以告诉Kubernetes为您安装tmpfs(RAM支持的文件系统)。 虽然tmpfs非常快,但请注意,与磁盘不同,tmpfs在机器重新启动时被清除,您写入的任何文件都会计入您的容器的内存限制
Pod的例子

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

Hostpath

hostPath卷将文件或目录从主机节点的文件系统挂载到您的pod中。 这不是大多数Pods需要的,但它为某些应用提供了强大的逃生舱。
比如, 一些使用hostPath的例子

运行需要访问Docker内部的容器; 使用/ var / lib / docker的hostPath
在容器中运行cAdvisor; 使用/ dev / cgroups的hostPath

使用的时候需要注意的
1. 具有相同配置的pod(例如从podTemplate创建的)可能因节点上的不同文件在不同节点上的行为不同
2. 当Kubernetes按计划添加资源感知调度时,它将无法解决hostPath使用的资源
3. 在底层主机上创建的目录只能由root写入。 您需要以特权容器的身份运行您的进程,或修改主机上的文件权限,以便能够写入hostPath卷

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data

gcePersistentDisk

awsElasticBlockStore

Nfs

nfs卷允许现有的NFS(网络文件系统)共享挂载到您的pod中。 不同于在删除Pod时被清除的emptyDir,nfs卷的内容将被保留,并且卷仅被卸载。 这意味着NFS卷可以预先填充数据,并且该数据可以在pod之间“切换”。 NFS可以同时由多个写入器安装。
nfs例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/nfs

iSCSI

iscsi卷允许将现有iSCSI(基于IP的SCSI)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,将保留iscsi卷的内容,并且该卷仅被卸载。 这意味着可以使用数据预先填充一个iscsi卷,并且该数据可以在pod之间“切换”。

iSCSI的一个特点是它可以同时由多个消费者以只读方式安装。 这意味着您可以使用数据集预先填充卷,然后根据需要从多个pod中并行提供。 不幸的是,iSCSI卷只能由读写模式的单个消费者进行装载 – 不允许同时写入
iSCSI例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/iscsi

flocker

Flocker是一个开源的集群容器数据卷管理器。 它提供由各种存储后端支持的数据卷的管理和编排。

Flocker卷允许将Flocker数据集挂载到pod中。 如果Flocker中尚未存在数据集,则需要首先使用Flocker CLI或使用Flocker API创建数据集。 如果数据集已经存在,它将被Flocker重新连接到调度盒的节点。 这意味着数据可以根据需要在pod之间“切换”。
flocker例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/flocker

glusterfs

glusterfs卷允许将Glusterfs(开源网络文件系统)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,保留了一个glusterfs卷的内容,并且该卷只是被卸载。 这意味着可以使用数据预先填充一个glusterfs卷,并且该数据可以在pod之间“切换”。 GlusterFS可以同时由多个写入器安装。

Rbd

cephfs

gitRepo

secret

秘密卷用于将敏感信息(如密码)传递给pod。 您可以将秘密存储在Kubernetes API中,并将其作为文件安装在pod上,而不直接与Kubernetes连接。 秘密卷由tmpfs(RAM支持的文件系统)支持,因此它们永远不会写入非易失性存储。

PersistentVolumeClaim

persistentVolumeClaim卷用于将PersistentVolume安装到pod中。 PersistentVolumes是用户在不知道特定云环境的细节的情况下“声称”持久存储(如GCE PersistentDisk或iSCSI卷)的一种方式

downwardAPI

一个向下的API卷被用于使向下的API数据可用于应用程序。 它安装一个目录,并将所请求的数据写入纯文本文件。

https://kubernetes.io/docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information/

projected

A projected volume可以映射很多volume源到相同的目录下, 当前, 下面类型的volume sources支持的有

secret
downwardAPI
configMap

例子

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

SubPath

有时,在一个pod中共享一个卷用于多个用途是有用的。 volumeMounts.subPath属性可用于指定引用卷而不是根的子路径。
例子-下面是一个LAMP stack的例子,Html内容映射到html文件目录下, databases存储在mysql文件目录下:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data
A:在 Kubernetes 中部署 Prometheus,可以按照以下步骤进行操作: 1. 创建一个 Kubernetes Namespace,可以使用以下命令: ``` kubectl create ns monitoring ``` 2. 创建一个 Prometheus 配置文件 prometheus.yml,可以使用以下命令: ``` vi prometheus.yml ``` 将以下内容复制到文件中: ``` global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - api_server: null role: endpoints namespaces: names: ['default'] relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - api_server: null role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor ``` 这个配置文件将监控使用 `https` 端口的 Kubernetes API Server、Kubernetes Node 的 CPU、内存和磁盘利用率等信息,以及已经部署的 Prometheus 本身。 3. 创建一个 ConfigMap,将以上配置文件导入 Kubernetes 集群,可以使用以下命令: ``` kubectl create configmap prometheus-cm --from-file=prometheus.yml -n monitoring ``` 4. 创建一个 Prometheus Deployment 并暴露一个 Service,可以使用以下 YAML 文件: ``` apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: monitoring spec: replicas: 1 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:v2.22.2 args: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus/data - --storage.tsdb.retention.time=7d volumeMounts: - name: prometheus-data mountPath: /prometheus - name: prometheus-config mountPath: /etc/prometheus volumes: - name: prometheus-data emptyDir: {} - name: prometheus-config configMap: name: prometheus-cm items: - key: prometheus.yml path: prometheus.yml --- apiVersion: v1 kind: Service metadata: name: prometheus namespace: monitoring spec: selector: app: prometheus ports: - name: prometheus-web port: 9090 protocol: TCP targetPort: 9090 ``` 以上 YAML 文件中,我们创建了一个名称为 prometheus 的 Deployment,副本数为 1,使用了 prom/prometheus:v2.22.2 镜像。然后创建了一个名称为 prometheus 的 Service,并将 targetPort 设置为 9090。 5. 使用以下命令,将以上 YAML 文件部署到 K8s 集群中: ``` kubectl apply -f prometheus.yaml ``` 等待几分钟后,可以执行以下命令验证 Prometheus 是否正常运行: ``` kubectl get pods -n monitoring ``` 以上命令输出的结果应该类似于以下内容: ``` NAME READY STATUS RESTARTS AGE prometheus-7b447fcfbc-wq2xn 1/1 Running 0 8h ``` 此外,还可以使用以下命令获取 Prometheus 的 Service 的 ClusterIP: ``` kubectl get svc prometheus -n monitoring ``` 以上命令输出的结果应该类似于以下内容: ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.100.82.214 <none> 9090/TCP 8h ``` 通过以上输出的 ClusterIP 和 9090/TCP,就可以在 K8s 集群内部访问 Prometheus 了,比如可以使用以下命令: ``` curl http://10.100.82.214:9090/ ``` 以上命令输出的内容应该是 HTML 格式的 Prometheus 首页。 至此,在 Kubernets 中部署 Prometheus 完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值