volumes de armazenamento Kubernetes Series Kubernetes

O primeiro capítulo, Introdução

Os recipientes de dados padrão são caso não persistente de, depois do fim do recipiente também seguido perda de dados, de modo que encaixe proporciona um mecanismo de armazenamento de dados persistente volume. Semelhantes, Kubernetes prestar um serviço mais poderosos e ricos mecanismos de tomada Desconto para resolver o problema da persistência de dados entre dados de parte de recipiente e recipiente.
Quando diferente Docker, Kubernetes Volume de ciclo de vida Pod recipiente ligação e desligar após o reinício, quando Kubelet recipiente novamente, os dados Desconto ainda permanece e excluir Pod, Volume vai ser limpo.
Se os dados são perdidos depende do tipo de Volume, como dados emptyDir serão perdidos, enquanto os dados PV não será perdido
PersistentVolume (pv) e PersistentVolumeClaim (pvc) são dois K8S recursos API fornecida para armazenar os detalhes abstratos. Administradores focado em como fornecer recursos de armazenamento por pv sem atenção à forma como os usuários usam o mesmo usuário só precisa montar pvc no recipiente sem a necessidade de se concentrar em como o uso de tecnologia para atingir volumes de armazenamento.
relações pvc pv e relações com a vagem eo nó é semelhante ao anterior os últimos recursos consome. pv pvc pode aplicar aos recursos de tamanho e de armazenamento especificado definir o modo de acesso.

O segundo capítulo, o conhecimento pv pvc

Lifecycle

pv e pvc seguir o ciclo de vida:
1. fonte pronta. Os administradores criam pv múltipla disponível para o usuário no cluster.
 2. ligao. usuários de PVC para criar e recursos atribuir e acesso para o modo desejado. Antes de encontrar pv utilizável, pvc permanecem estado desacoplado.
 3. Use. usuários pvc pode usar o mesmo volume como no pod.
 4. Release. usuários pvc para recuperar os recursos de armazenamento apagados, pv se tornará estado "liberado". Como os dados são retidos antes, esses dados precisam ser processados de acordo com estratégias diferentes, caso contrário ele não pode ser utilizado por outros pvc esses recursos de armazenamento.
 5. recuperado. pv você pode definir três estratégia de recuperação: Reservado (Manter), reciclagem (Reciclar) e apagar (Delete).
   política de retenção para permitir o processamento manual de retenção de dados.
   política de exclusão de exclusão e recursos de armazenamento externos associados necessidade pv para plug-in apoio.
   estratégia de recuperação irá realizar operações de limpeza, ele pode ser usado após a nova pvc, necessário plug-in apoio.

propriedade pv

pv tem os seguintes atributos:
  capacidade. Atualmente suporta apenas o tamanho de armazenamento, o futuro pode apoiar o IOPS e rendimento.
  modo de acesso. ReadWriteOnce: escrever um único nó. ReadOnlyMany: multi-nó só de leitura. ReadWriteMany: vários nós a ler e escrever. Apenas um modo de montar.
  estratégia de recuperação. Atualmente NFS e reciclagem apoio HostPath. AWS, EBS, GCE, PD e apoio removido da cinza.
  Stage. Dividido Disponível (pvc não ligada), ligada (ligada), Liberado (recursos pvc ter sido excluído, mas não recuperado), Falha (falha na recuperação automática) </ pre>

propriedade pvc

modo de acesso. PV da mesma semântica. padrão específico utilizado para solicitar recursos.
Recursos. Número de pedidos de recursos de armazenamento </ pre>

tipo de pv

emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
NFS
iscsi
flocker
GlusterFS
RBD
cephfs
gitRepo
segredo
persistentVolumeClaim
downwardAPI
azureFileVolume
................
........ (以下省略)

Tipo de volume utilizado atualmente 

emptyDir

Se o Pod definir emptyDir tipo de volume, Pod foi atribuído ao tempo de Node, cria emptyDir, enquanto o Pod executado no nó, emptyDir haverá (container pendurado acima não resulta em perda de dados emptyDir), mas se o Pod é excluído do nó (Pod é excluído, ou Pod migrar), emptyDir serão excluídos e perdidos para sempre.

hostPath

hostPath capaz de montar o sistema de arquivos no Pod Node para entrar. Se você precisa usar um arquivo em Pod Node, pode ser hostPath usado </ pre>

NFS

NFS é um acrônimo para Network File System que é um sistema de arquivos de rede. Kubernetes por configuração simples pode ser montado no vagem no NFS, NFS e os dados são armazenados permanentemente, ao apoiar simultaneamente operação de gravação NFS.

gcePersistentDisk

disco gcePersistentDisk pode ser montado permanentemente na GCE ao recipiente, você precisa executar VM Kubernetes na GCE

awsElasticBlockStore

disco awsElasticBlockStore EBS pode ser montado sobre as AWS recipiente, Kubernetes precisa ser executado no AWS EC2.

gitRepo

volume de gitRepo de baixo git para o caminho especificado no contentor

volume projetado

Projetada pluralidade de volume Volume de fonte mapeado para o mesmo diretório, apoio secreto, downwardAPI e configMap </ pre>

O terceiro capítulo, um exemplo simples

1, emptyDir (armazenamento de nível de nó, o ciclo de vida e do mesmo pod)

# cat emptydir.yaml  #pod中有两个container挂载同一个emptyDir,nginx提供web服务,busybox则循环向挂载目录下的index.html文件写入数据
apiVersion: v1
kind: Pod
metadata:
  name: emptydir
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: myapp
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  - name: busybox
    image: busybox:latest
    volumeMounts:     #见pod的volume挂载到container中
    - name: html      #名称需要和 volumes中的name一致
      mountPath: /data   #挂载volume在container中的路径
    command:
    - "/bin/sh"
    - "-c"
    - "while true; do echo $(date) >> /data/index.html; sleep 2; done"
  volumes:    #创建pod可以使用的volume,可以有多个
  - name: html  
    emptyDir: {}  #volume类型,默认不限制使用空间

Ver pod funcionamento e acesso

# kubectl apply -f emptydir.yaml
pod/emptydir created

# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE               
emptydir   2/2     Running   0          76s   10.244.3.34   huoban-k8s-node01

# while true; do curl 10.244.3.34; sleep 1; done
Fri Sep 20 03:34:38 UTC 2019
Fri Sep 20 03:34:40 UTC 2019
Fri Sep 20 03:34:42 UTC 2019
......

2, hostPath (armazenamento de nível de nó, o ciclo de vida e o mesmo nó)

#cat host-path.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default 
spec:
  containers: - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts: - name: html
      mountPath: /usr/share/nginx/html
  volumes: - name: html
    hostPath:
      path: "/data/pod/volumel"  #依据type的值来确定挂载路径是否需要创建 type: DirectoryOrCreate  #挂载目录不存在则创建

# kubectl apply -f host-path.yaml
pod/pod-hostpath created

# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE               
pod-hostpath   1/1     Running   0          58s   10.244.5.11   huoban-k8s-node03

criar manualmente o diretório e adicionar o teste arquivo html

# ssh node3 "ls -l /data/pod/volumel"
.
# ssh node03 "touch /data/pod/volumel/index.html"
# ssh node03 "ls -al /data/pod/volumel"
total 8
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root    0 Sep 20 15:00 index.html

# echo "node03" > /data/pod/volumel/index.html  #在node03服务器上执行
# cat /data/pod/volumel/index.html
node03

# curl 10.244.5.11
node03

#删除服务,数据还在
# kubectl delete -f host-path.yaml
pod "pod-hostpath" deleted
# ssh node03 "ls -al /data/pod/volumel"
total 12
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root    7 Sep 20 15:04 index.html

3, NFS (armazenamento permanente, ciclo de vida e mesmo servidor NFS, não excluídos)

1、在master上操作
# cat pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    nfs:
      path: "/data/volumes/v1"  #该目录在NFS server上必须存在并可以被集群中node节点可以挂载,node节点需要安装nfs-utils,可以执行NFS 挂载操作      
      server: 172.16.17.10 #该server需要安装NFS 服务,并共享path中的目录或文件

2、在其中一台node节点上做测试
# mount -t nfs 172.16.17.10:/data/volumes/v1 /mnt  在任意一节点上进行挂载测试,确定可以挂载是否可以成功,需要安装nfs-utils工具包
# df -h |grep mnt  #查看挂载状态
172.16.17.10:/data/volumes/v1 77G 3.5G 74G 5% /mnt
# umount /mnt  #确认没有问题后卸载

3、测试运行
# kubectl apply -f pod-nfs-vol.yaml #创建pod
pod "pod-nfs" created
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.1.154 huoban-k8s-node01 

4、在节点上测试创建文件
#在NFS server上添加一个测试HTML文件
# cd /data/volumes/v1/   #挂载目录
# echo "<h1>NFS Server volume v1</h1>" > index.html

5、访问一下并测试数据是否丢失
# curl 10.244.1.154
<h1>NFS Server volume v1</h1>
# kubectl delete pod pod-nfs   #删除刚刚创建的pod
pod "pod-nfs" deleted
# kubectl apply -f pod-nfs-vol.yaml  #再重新创建
pod "pod-nfs" created

# kubectl get pod -o wide #查看新创建后pod所在的node节点级IP地址
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.2.192 huoban-k8s-node02

# curl 10.244.2.192  #再次访问一下,文件依然存在,文件不会随着pod的终结而销毁
<h1>NFS Server volume v1</h1>

4, criar PV e PVC (criado com NFS)

NFS server上创建多个挂载目录,并共享

# cat /etc/exports
/data/volumes/v1  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v2  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v3  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v4  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v5  172.16.0.0/16(rw,no_root_squash)

# ll /data/volumes/
总用量 0
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v1
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v2
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v3
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v4
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v5

# exportfs 
/data/volumes/v1 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v5 172.16.0.0/16
# showmount -e
Export list for huoban-k8s-nfs:
/data/volumes/v5 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v1 172.16.0.0/16

将NFS server共享的目录创建为PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol-001   #不允许定义名称空间,应为pv是属于集群级别的
spec:
  capacity: #pv的大小
    storage: 5Gi
  accessModes:    #访问的模型,具体访问模型官方文档链接: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
    - ReadWriteOnce  #支持的访问模型与具体的共享存储设备类型有关,具体见上方链接
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v1
    server: 172.16.17.10
---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-02
spec:
  capacity: 
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v2
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-03
spec:
  capacity: 
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v3
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-04
spec:
  capacity: 
    storage: 15Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v4
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-05
spec:
  capacity: 
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v5
    server: 172.16.17.10

# kubectl apply -f nfs-vol.yaml 
persistentvolume "nfs-vol-01" created
persistentvolume "nfs-vol-02" created
persistentvolume "nfs-vol-03" created
persistentvolume "nfs-vol-04" created
persistentvolume "nfs-vol-05" created

# kubectl get pv
NAME               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                       STORAGECLASS   REASON    AGE
nfs-vol-01         5Gi        RWO,RWX        Recycle          Available                                                          7s
nfs-vol-02         5Gi        RWO            Recycle          Available                                                          7s
nfs-vol-03         10Gi       RWO,RWX        Recycle          Available                                                          7s
nfs-vol-04         15Gi       RWO            Recycle          Available                                                          7s
nfs-vol-05         20Gi       RWO,RWX        Recycle          Available                                                          7s

#创建一个PVC
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteOnce"] #pvc的访问模式一定是pv访问模式的子集
  resources:
    requests:
      storage: 5Gi

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: my-pvc

# kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim "my-pvc" created
pod "pod-pvc" created

# kubectl get pvc
NAME      STATUS    VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc    Bound     nfs-vol-02   5Gi        RWO                           1m

# kubectl get pv  #查看pv状态的变化,nfs-vol-02被 default名称空间下my-pvc申请并绑定
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON    A
nfs-vol-01   5Gi        RWO,RWX        Recycle          Available                                             9
nfs-vol-02   5Gi        RWO            Recycle          Bound       default/my-pvc                            9
nfs-vol-03   10Gi       RWO,RWX        Recycle          Available                                             9
nfs-vol-04   15Gi       RWO            Recycle          Available                                             9
nfs-vol-05   20Gi       RWO,RWX        Recycle          Available                                       

# 查看下pod的创建信息
# kubectl describe pod pod-pvc 
......
Volumes:
  html:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  my-pvc
    ReadOnly:   false
  default-token-tcwjz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-tcwjz
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                 Age              From                 Message
  ----     ------                 ----             ----                 -------
  Warning  FailedScheduling       8m (x2 over 8m)  default-scheduler    pod has unbound PersistentVolumeClaims (repeated 2 times)
  Normal   Scheduled              8m               default-scheduler    Successfully assigned pod-pvc to huoban-k8s-node01
  Normal   SuccessfulMountVolume  8m               kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "default-token-tcwjz"
  Normal   SuccessfulMountVolume  8m               kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "nfs-vol-02"
  Normal   Pulled                 8m               kubelet, huoban-k8s-node01  Container image "ikubernetes/myapp:v1" already present on machine
  Normal   Created                7m               kubelet, huoban-k8s-node01  Created container
  Normal   Started                7m               kubelet, huoban-k8s-node01  Started container

#注意:处于绑定状态下的pv无法直接被删除,如果需要删除被绑定的pv,需要先删除申请绑定的PVC

Acho que você gosta

Origin blog.51cto.com/79076431/2478686
Recomendado
Clasificación