Diretório de artigos
-
- I. Introdução
- 2. Instale o servidor glusterfs
- 3. Instale o serviço Heketi (o serviço Heketi é necessário para implementar o fornecimento dinâmico k8s de armazenamento glusterfs)
-
- 1. Instalação Heketi
- 2. Crie um usuário heketi e configure o login sem senha
- 3. Modifique o arquivo de configuração heketi
- 4. Inicie o serviço heketi
- 5. Configure as variáveis de ambiente da ferramenta cliente hekeit-cli
- 6. Defina o arquivo de topologia do hekeit
- 7. Teste a criação de volume de armazenamento
- 4. Kubesphere usa glusterfs como armazenamento back-end (fornecimento dinâmico de armazenamento glusterfs)
- 5. Explore onde os dados de log estão armazenados
- 6. Resumo
提示: 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
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
- 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
- #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
Em seguida, você pode definir a declaração de armazenamento (PVC) por meio da interface kubesphere
Crie uma carga de trabalho selecionando a declaração de armazenamento criada anteriormente.
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
[root@gluster1 /]# lsblk
Existem muito mais partições
. /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.
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
- k8s glusterfs obsoleto na versão v1.25. O glusterfs ainda é popular?
- 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?
- 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