KubeSphere usa GlusterFS como armazenamento persistente


提示: k8s中可以使用静态、动态的方式供给glusterfs存储资源,但是两者的配置不相同,如果是静态,那么直接挂盘,创建lvm,创建文件系统,挂载,安装glusterfs集群,创建卷,k8s使用gluster即可。但是动态方式的话,需要结合heketi服务+glusterfs,由heketi服务管理、创建glusterfs集群,k8s中配置存储类指定heketi即可。heketi服务要求glusterfs服务器的磁盘必须是裸盘,不能是格式化的文件系统或lvm,这有点坑。所以这一点需要注意了。

I. Introdução

Ambiente: centos7.9, Kubernetes v1.22.12
Site oficial do glusterfs: https://docs.gluster.org/en/latest
glusterfs foi descontinuado na v1.25. Para obter detalhes, você pode visualizar a matriz de suporte de armazenamento k8s

1. Preparação do anfitrião

  Prepare três máquinas virtuais ou físicas para instalar o sistema de arquivos glusterfs como servidor de armazenamento e monte um disco separado para armazenar dados, porque o GlusterFS não recomenda o compartilhamento do diretório raiz.
Aqui estou usando 3 hosts.

192.168.54.52
192.168.54.53
192.168.54.54

Configure o nome do host, desligue o firewall e desligue o selinux.
Ignore. É muito simples. Faça você mesmo.

2. Prepare o disco

提示:三个存储节点都要挂载一块未经格式化的的硬盘出来。
  Se a máquina virtual virtualiza diretamente um disco rígido, o servidor em nuvem que uso virtualiza diretamente um disco rígido. Tenha cuidado para não fazer nenhuma operação no disco rígido primeiro . Após virtualizá-lo, execute o comando para verificar.

sudo lsblk

  Você pode ver a letra da unidade vdb
Insira a descrição da imagem aqui

2. Instale o servidor glusterfs

1. Configure a fonte glusterfs yum

#配置glusterfs的yum源
cat > /etc/yum.repos.d/glusterfs.repo <<EOF
[glusterfs]
name=glusterfs
baseurl=https://buildlogs.centos.org/centos/7/storage/x86_64/gluster-9/	
enabled=1
gpgcheck=0
EOF

2. Instale o serviço Gluster

#安装glusterfs-server
yum install glusterfs-server

3. Inicie o serviço e inicie-o na inicialização

systemctl start glusterd.service
systemctl enable  glusterd.service
systemctl status  glusterd.service

4. O porto de Glusterfs

#gluster守护进程端口24007,每创建一个逻辑卷,就会启动一个进程和端口,
进程端口默认是49152,以此类推,第二个卷端口就是49153。
[root@gluster1 /]# netstat  -lntup | grep gluster
tcp        0      0 0.0.0.0:49152           0.0.0.0:*               LISTEN      12946/glusterfsd    
tcp        0      0 0.0.0.0:49153           0.0.0.0:*               LISTEN      15586/glusterfsd    
tcp        0      0 0.0.0.0:24007           0.0.0.0:*               LISTEN      3503/glusterd  

3. Instale o serviço Heketi (o serviço Heketi é necessário para implementar o fornecimento dinâmico k8s de armazenamento glusterfs)

  heketi fornece API RESTFUL para cluster glusterfs e gerencia e controla cluster glusterfs por meio de um estilo repousante.

  Está escrito no documento oficial do k8s que o glusterfs deve ser usado como back-end para fornecer armazenamento dinamicamente. A interface heketi deve ser configurada na classe de armazenamento. O Glusterfs não está configurado diretamente, então precisamos instalar o serviço Heketi.

  Existem três métodos de instalação para serviços Heketi: instalação de cluster OpenShift, instalação autônoma independente e instalação Kubernetes. Usamos instalação autônoma independente.

1. Instalação Heketi

  1. Instale o servidor heketi e as ferramentas do cliente on-line usando o yum. O Heketi também está na fonte do glusterfs. Se não houver uma fonte do glusterfs, consulte a fonte do yum para configurar o glusterfs acima.
yum install  heketi heketi-client
  1. #Instalação offline
    Consulte o site oficial para adicionar uma descrição do link , baixe o pacote binário heketi e configure o serviço para ser iniciado pelo gerenciamento do systemd.

2. Crie um usuário heketi e configure o login sem senha

  Crie um usuário de login sem senha, porque o site oficial exige que o host heketi seja capaz de fazer login no host glusterfs sem uma senha. Aqui não criarei um usuário heketi, mas usarei diretamente o usuário root. Se for um usuário não root, ele precisa de permissões sudo.

#建议使用root用户做免密登录
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

3. Modifique o arquivo de configuração heketi

vim /etc/heketi/heketi.json
{
    
    
  "_port_comment": "Heketi Server Port Number",
  "port": "7080",      #Heketi服务端口,默认是8080,可以自定义

  "_use_auth": "Enable JWT authorization. Please enable for deployment",
  "use_auth": true,   true,	#是否使用JWT authorization,设置为true

  "_jwt": "Private keys for access",
  "jwt": {
    
    
    "_admin": "Admin has access to all APIs",
    "admin": {
    
    
      "key": "abc.123456"     #配置admin的密码
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
    
    
      "key": "abc.123456"     #配置普通账号的密码
    }
  },

  "_glusterfs_comment": "GlusterFS Configuration",
  "glusterfs": {
    
    
    "_executor_comment": [
      "Execute plugin. Possible choices: mock, ssh",
      "mock: This setting is used for testing and development.",
      "      It will not send commands to any node.",
      "ssh:  This setting will notify Heketi to ssh to the nodes.",
      "      It will need the values in sshexec to be configured.",
      "kubernetes: Communicate with GlusterFS containers over",
      "            Kubernetes exec api."
    ],
    "executor": "ssh",    #命令执行器配置为ssh

    "_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
    
                  #命令执行器为ssh方式,改下面这段
      "keyfile": "/root/.ssh/id_rsa",      #ssh的密钥
      "user": "root",           #ssh的用户,我使用的是root用户            
      "port": "22",             #ssh的端口     
      "fstab": "/etc/fstab"     #存储挂载点的fstab文件,保持默认即可
    },

    "_kubeexec_comment": "Kubernetes configuration",
    "kubeexec": {
    
             #命令执行器没有用到kubernetes,不用改
      "host" :"https://kubernetes.host:8443",
      "cert" : "/path/to/crt.file",
      "insecure": false,
      "user": "kubernetes username",
      "password": "password for kubernetes user",
      "namespace": "OpenShift project or Kubernetes namespace",
      "fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"
    },

    "_db_comment": "Database file name",
    "db": "/var/lib/heketi/heketi.db",  #heketi数据库文件,保持默认

    "_loglevel_comment": [
      "Set log level. Choices are:",
      "  none, critical, error, warning, info, debug",
      "Default is warning"
    ],
    "loglevel" : "warning"             #定义日志几级别
  }
}

4. Inicie o serviço heketi

  Modifique o usuário que executa o serviço heketi. O padrão é usuário heketi. O usuário heketi é criado por padrão quando o yum é instalado. No entanto, usamos ssh como usuário root, portanto, precisamos modificar o usuário que executa o serviço heketi.

vim /usr/lib/systemd/system/heketi.service
User=root	#改为root

comece

systemctl daemon-reload 
systemctl start  heketi
systemctl enable heketi
systemctl status heketi

Após o teste, se você visualizar o seguinte print, significa que o serviço Heketi inicia normalmente.

curl http://192.168.54.52:7080/hello
Hello from Heketi

5. Configure as variáveis ​​de ambiente da ferramenta cliente hekeit-cli

echo 'export HEKETI_CLI_SERVER=http://192.168.54.52:7080' >> ~/.bash_profile	#永久设置环境变量
echo 'export HEKETI_CLI_USER=admin'  >> ~/.bash_profile							#永久设置环境变量
echo 'export HEKETI_CLI_KEY=abc.123456'  >> ~/.bash_profile						#永久设置环境变量
source  ~/.bash_profile															#立即生效

6. Defina o arquivo de topologia do hekeit

  O site oficial diz que Heketi deve receber informações sobre a topologia do sistema. Isso permite que a Heketi decida quais nós, discos e clusters usar. https://github.com/heketi/heketi/blob/master/docs/admin/topology.md

  Você pode usar o cliente de linha de comando para criar um cluster, adicionar nós ao cluster e, em seguida, adicionar discos a cada nó. Se estiver usando a linha de comando, esse processo pode ser bastante tedioso. Portanto, o cliente de linha de comando suporta o carregamento dessas informações no Heketi usando um arquivo de topologia que descreve o cluster, os nós do cluster e as informações do disco em cada nó.

  Escreva um arquivo de topologia. Este arquivo de topologia é um arquivo no formato JSON que descreve os clusters, nós e discos a serem adicionados ao Heketi. Exemplo de site oficial

{
    
    
    "clusters": [
        {
    
    
            "nodes": [
                {
    
    
                    "node": {
    
    
                        "hostnames": {
    
    
                            "manage": [
                                "192.168.54.52"
                            ],
                            "storage": [
                                "192.168.54.52"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        {
    
    
                            "name": "/dev/vdb",
                            "destroydata": true
                        }
                    ]
                },
                {
    
    
                    "node": {
    
    
                        "hostnames": {
    
    
                            "manage": [
                                "192.168.54.53"
                            ],
                            "storage": [
                                "192.168.54.53"
                            ]
                        },
                        "zone": 2
                    },
                    "devices": [
                        {
    
    
                            "name": "/dev/vdb",
                            "destroydata": true
                        }
                    ]
                },
                {
    
    
                    "node": {
    
    
                        "hostnames": {
    
    
                            "manage": [
                                "192.168.54.54"
                            ],
                            "storage": [
                                "192.168.54.54"
                            ]
                        },
                        "zone": 2
                    },
                    "devices": [
                        {
    
    
                            "name": "/dev/vdb",
                            "destroydata": true
                        }
                    ]
                }
            ]
        }
    ]
}

Carregue nós glusterfs para Heketi por meio de arquivos de topologia

[root@gluster1]# heketi-cli topology load --json=/etc/heketi/topology.json --server=http://192.168.54.52:7080--user=admin --secret=abc.123456
	Found node 192.168.54.52 on cluster f5dca07fd4e2edbe2e0b0ce5161a1cf7
		Adding device /dev/vdb ... OK
	Found node 192.168.54.53 on cluster f5dca07fd4e2edbe2e0b0ce5161a1cf7
		Adding device /dev/vdb ... OK
	Found node 192.168.54.54 on cluster f5dca07fd4e2edbe2e0b0ce5161a1cf7
		Found device /dev/vdb

  Verifique as informações. Como as variáveis ​​de ambiente da ferramenta cliente heketi-cli foram adicionadas ao arquivo /root/.bash_profile anteriormente, não há necessidade de escrever parâmetros como –server aqui.

heketi-cli topology info

7. Teste a criação de volume de armazenamento

heketi-cli volume create --size=2 --replica=3

saída

Name: vol_aa8a1280b5133a36b32cf552ec9dd3f3
Size: 2
Volume Id: aa8a1280b5133a36b32cf552ec9dd3f3
Cluster Id: b89a07c2c6e8c533322591bf2a4aa613
Mount: 192.168.54.52:vol_aa8a1280b5133a36b32cf552ec9dd3f3
Mount Options: backup-volfile-servers=192.168.54.52,192.168.54.53
Block: false
Free Size: 0
Reserved Size: 0
Block Hosting Restriction: (none)
Block Volumes: []
Durability Type: replicate
Distribute Count: 1
Replica Count: 3

4. Kubesphere usa glusterfs como armazenamento back-end (fornecimento dinâmico de armazenamento glusterfs)

Para a instalação do Kubesphere, instale você mesmo o tutorial do site oficial do Kubesphere . Isso pode ser um problema com meu método. Vou atualizá-lo após o teste subsequente ser bem-sucedido. Este artigo primeiro registra as etapas experimentais para evitar que mais programadores caiam na armadilha.
提示:经过反复测试,使用kubesphere界面进行gluster存储配置,存储卷声明(PVC)始终处于pending的状态,无法成功挂载,这里使用K8s命令直接进行存储类的创建,然后使用kubesphere界面进行存储卷声明配置,可以成功挂载并持久化gluster集群中。

Proceda da seguinte forma

  • 1. Crie um srecrt, e o usuário salva a senha do usuário do serviço heketi, apenas a senha (você pode usar kubesphere ou arquivo yaml);
  • 2. Crie uma classe de armazenamento (usando arquivo yaml);
  • 3. Um preparador (Provisionador), o k8s possui um driver Provisioner do tipo glusterfs integrado, portanto não há necessidade de criá-lo separadamente (não há necessidade de criá-lo);
  • 4. Crie pvc (usando kubesphere);
  • 5. Crie uma implantação e o pod use pvc para persistência de dados (usando kubesphere);

1. Crie um segredo e armazene apenas a senha

Recomende um site de conversão de senha base64 Verificação on-line Base64

vim heketi-secret.yaml			#创建secret,主要用于保存heketi服务的admin用户密码
apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: kube-system
data:
  # base64 encoded password. E.g.: echo -n "abc.123456" | base64
  key: YWJjLjEyMzQ1Ng==		#这个是heketi服务的admin用户密码abc.123456,仅密码而已
type: kubernetes.io/glusterfs
#创建成功
kubectl apply -f heketi-secret.yaml	

2. Crie uma classe de armazenamento

Consulte o documento de referência do site oficial

vim glusterfs-storageclass.yaml	
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: glusterfs-storageclass						#存储名称
provisioner: kubernetes.io/glusterfs				#指定存储类的provisioner,这个provisioner是k8s内置的驱动程序
reclaimPolicy: Retain								#pvc删除,pv采用何种方式处理,这里是保留
volumeBindingMode: Immediate						#卷的绑定模式,表示创建pvc立即绑定pv
allowVolumeExpansion: true							#是否运行卷的扩容,配置为true才能实现扩容pvc
parameters:											#glusterfs的配置参数
  resturl: "http://192.168.54.52:7080"			    #heketi服务的地址和端口
  clusterid: "0cb591249e2542d0a73c6a9c8351baa2"		#集群id,在heketi服务其上执行heketi-cli cluster list能看到
  restauthenabled: "true"							#Gluster REST服务身份验证布尔值,用于启用对 REST 服务器的身份验证
  restuser: "admin"									#heketi的用户admin
  secretNamespace: "kube-system"						#secret所属的密码空间
  secretName: "heketi-secret"						#secret,使用secret存储了heketi的用户admin的登陆密码
  volumetype: "replicate:3"                         #挂载类型,三个副本,生产常用
#创建成功
kubectl apply -f glusterfs-storageclass.yaml

Para visualizar o tipo de armazenamento, você pode usar o seguinte comando para visualizá-lo: se a criação for bem-sucedida, o tipo de armazenamento correspondente também poderá ser visto na interface do kubesphere.

[root@master /]# kubectl  get sc
NAME                          PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
glusterfs (default)           kubernetes.io/glusterfs   Delete          Immediate              true                   5h27m
glusterfs-storageclass        kubernetes.io/glusterfs   Retain          Immediate              true                   4h21m
glusterfs-test-storageclass   kubernetes.io/glusterfs   Retain          Immediate              true                   3h44m
local (default)               openebs.io/local          Delete          WaitForFirstConsumer   false                  20d

Insira a descrição da imagem aqui
Em seguida, você pode definir a declaração de armazenamento (PVC) por meio da interface kubesphere
Insira a descrição da imagem aqui

Crie uma carga de trabalho selecionando a declaração de armazenamento criada anteriormente.

Insira a descrição da imagem aqui

5. Explore onde os dados de log estão armazenados

Executando lsblk em qualquer nó, encontramos o seguinte:

[root@gluster1 /]# cat /etc/fstab

Já montado automaticamente
Insira a descrição da imagem aqui

[root@gluster1 /]# lsblk

Existem muito mais partições
Insira a descrição da imagem aqui
. /dev/vdb era originalmente um disco vazio não formatado, mas agora um ponto de montagem aparece. Depois de inserir o ponto de montagem para visualizá-lo, descobri que o arquivo foi persistido no sistema de arquivos glusterfs e em vários outros nós também têm Também há dados.
Insira a descrição da imagem aqui
Reimplante a carga e use a mesma declaração de armazenamento (PVC). Os dados ainda existem. Esta solução foi basicamente verificada. Perfeito!

6. Resumo

  1. k8s glusterfs obsoleto na versão v1.25. O glusterfs ainda é popular?
  2. Quando o k8s fornece armazenamento glusterfs dinamicamente, o Heketi exige que o disco rígido seja um disco vazio. Como é um disco vazio, não precisamos participar da criação de um sistema de arquivos. Os arquivos são montados aleatoriamente? Qual é a lógica do glusterfs por trás do posicionamento dos dados?
  3. Heketi exige que o disco rígido seja um disco vazio. O disco rígido formatado é realmente inutilizável? Isso não seria um desperdício de recursos de hardware?

Artigo de referência, agradecimentos especiais a
https://zhuanlan.zhihu.com/p/495108133
https://www.likecs.com/show-306086916.html
https://blog.csdn.net/MssGuo/article/details/ 128409865

Acho que você gosta

Origin blog.csdn.net/bacawa/article/details/130319878
Recomendado
Clasificación