Criação de um StatefulSet
Cenário
StatefulSets são um tipo de cargas de trabalho cujos dados ou status são armazenados enquanto estão em execução. Por exemplo, MySQL é um StatefulSet porque ele precisa armazenar novos dados.
Um contêiner pode ser migrado entre hosts diferentes, mas os dados não são armazenados nos hosts. Para armazenar dados de StatefulSet de forma persistente, anexar volumes de armazenamento HA fornecidos pelo CCE para o recipiente.
Restrições
- Quando você exclui ou escala um StatefulSet o sistema não exclui os volumes de armazenamento associados ao StatefulSet para garantir a segurança dos dados.
- Ao excluir um StatefulSet, reduza o número de réplicas para 0 antes de excluir o StatefulSet para que os pods no StatefulSet possam ser interrompidos em ordem.
- Quando você cria um StatefulSet, um Serviço headless é necessário para o acesso ao pod. Para mais detalhes, consulte Serviços headless.
- Quando um nó está indisponível, os pods se tornam Unready. Nesse caso, exclua manualmente os pods do StatefulSet para que os pods possam ser migrados para um nó normal.
Pré-requisitos
- Antes de criar uma carga de trabalho, você deve ter um cluster disponível. Para obter detalhes sobre como criar um cluster, consulte Compra de um cluster do CCE.
- Para habilitar o acesso público a uma carga de trabalho, verifique se um EIP ou balanceador de carga foi vinculado a pelo menos um nó no cluster.
Se um pod tiver vários contêineres, certifique-se de que as portas usadas pelos contêineres não entrem em conflito entre si. Caso contrário, a criação do StatefulSet falhará.
Usar o console do CCE
- Efetue logon no console do CCE.
- Clique no nome do cluster para acessar o console do cluster, escolha Workloads no painel de navegação e clique em Create Workload no canto superior direito.
- Defina informações básicas sobre a carga de trabalho.
Basic Info
- Workload Type: selecione StatefulSet. Para obter detalhes sobre os tipos de carga de trabalho, consulte Visão geral.
- Workload Name: insira o nome da carga de trabalho. Digite de 1 a 63 caracteres começando com uma letra minúscula e terminando com uma letra minúscula ou dígito. Somente letras minúsculas, dígitos e hifens (-) são permitidos.
- Namespace: selecione o namespace da carga de trabalho. O valor padrão é default. Você também pode clicar em Create Namespace para criar um. Para mais detalhes, consulte Criação de um namespace.
- Pods: digite o número de pods da carga de trabalho.
- Container Runtime: um cluster do CCE usa runC por padrão, enquanto um cluster do CCE Turbo suporta runC e Kata. Para obter detalhes sobre as diferenças, consulte Tempo de execução do Kata e tempo de execução comum.
- Time Zone Synchronization: especifique se deseja ativar a sincronização de fuso horário. Depois que a sincronização de fuso horário estiver ativada, o contêiner e o nó usarão o mesmo fuso horário. A função de sincronização de fuso horário depende do disco local montado no contêiner. Não modifique nem exclua o fuso horário. Para mais detalhes, consulte Configuração da sincronização de fuso horário.
Container Settings- Informações sobre o contêiner
Vários contêineres podem ser configurados em um pod. Você pode clicar em Add Container à direita para configurar vários contêineres para o pod.
- Basic Info: configure informações básicas sobre o contêiner.
Parâmetro
Descrição
Container Name
Nomeie o contêiner.
Pull Policy
Política de atualização ou extração de imagem. Se você selecionar Always, a imagem será extraída do repositório de imagens a cada vez. Se você não selecionar Always, a imagem existente do nó é usada preferencialmente. Se a imagem não existir, a imagem será extraída do repositório de imagens.
Image Name
Clique em Select Image e selecione a imagem usada pelo contêiner.
Para usar uma imagem de terceiros, consulte Uso de imagens de terceiros.
Image Tag
Selecione a tag de imagem a ser implementada.
CPU Quota
- Request: número mínimo de núcleos de CPU exigidos por um contêiner. O valor padrão é 0,25 núcleos.
- Limit: número máximo de núcleos de CPU disponíveis para um contêiner. Não deixe Limit não especificado. Caso contrário, ocorrerá um uso intensivo de recursos de contêiner e sua carga de trabalho poderá exibir um comportamento inesperado.
Se Request e Limit não forem especificados, a cota não é limitada. Para obter mais informações e sugestões sobre Request e Limit, consulte Configuração de especificações do contêiner.
Memory Quota
- Request: quantidade mínima de memória requerida por um contêiner. O valor padrão é 512 MiB.
- Limit: quantidade máxima de memória disponível para um contêiner. Quando o uso de memória exceder o limite de memória especificado, o contêiner será encerrado.
Se Request e Limit não forem especificados, a cota não é limitada. Para obter mais informações e sugestões sobre Request e Limit, consulte Configuração de especificações do contêiner.
(Optional) GPU Quota
Configurável somente quando o cluster contém nós de GPU e o complemento Suíte IA do CCE (GPU NVIDIA) está instalado.
- All: nenhuma GPU será usada.
- Dedicated: os recursos da GPU são dedicados ao contêiner.
- Shared: porcentagem de recursos de GPU usados pelo contêiner. Por exemplo, se esse parâmetro for definido como 10%, o contêiner usará 10% dos recursos da GPU.
Para obter detalhes sobre como usar GPUs no cluster, consulte Agendamento de GPU padrão no Kubernetes.
(Optional) NPU Quota
Número de chips de Ascend 310 necessários para o contêiner. O valor deve ser um número inteiro e o complemento Suíte de IA do CCE (Ascend NPU) deve ser instalado.
Para obter detalhes sobre como usar NPUs no cluster, consulte Agendamento de NPU.
(Optional) Privileged Container
Programas em um contêiner privilegiado têm certos privilégios.
Se Privileged Container estiver habilitado, os privilégios serão atribuídos ao contêiner. Por exemplo, contêineres privilegiados podem manipular dispositivos de rede na máquina host e modificar parâmetros do kernel.
(Optional) Init Container
Se usar o contêiner como um contêiner init. Um contêiner init não suporta verificação de integridade.
Um contêiner init é um contêiner especial que é executado antes que outros contêineres de aplicações em um pod sejam iniciados. Cada pod pode conter vários contêineres. Além disso, um pod pode conter um ou mais contêineres init. Os contêineres de aplicações em um pod são iniciados e executados somente após a conclusão da execução de todos os contêineres init. Para obter detalhes, consulte Contêineres init.
- (Opcional) Lifecycle: configure as operações a serem executadas em uma fase específica do ciclo de vida do contêiner, como Startup Command, Post-Start e Pre-Stop. Para mais detalhes, consulte Definição dos parâmetros do ciclo de vida do contêiner.
- (Opcional) Health Check: configure a sonda de vivacidade, a sonda pronta e a sonda de inicialização conforme necessário. Para mais detalhes, consulte Configuração da verificação de integridade para um contêiner.
- (Opcional) Environment Variables: configure variáveis para o ambiente em execução do contêiner usando pares chave-valor. Essas variáveis transferem informações externas para contêineres executados em pods e podem ser modificadas de forma flexível após a implementação da aplicação. Para mais detalhes, consulte Configuração de uma variável de ambiente.
- (Opcional) Armazenamento de dados: monte armazenamento local ou armazenamento em nuvem no contêiner. Os cenários de aplicações e os modos de montagem variam de acordo com o tipo de armazenamento. Para mais detalhes, consulte Armazenamento.
- StatefulSets oferecem suporte à conexão dinâmica de discos EVS. Para obter mais detalhes, consulte Montagem dinâmica de um disco EVS para um StatefulSete Montagem dinâmica de um PV local para um StatefulSet.
A montagem dinâmica é obtida usando o campo volumeClaimTemplates e depende da capacidade de criação dinâmica da StorageClass. Um StatefulSet associa cada pod a uma PVC usando o campo volumeClaimTemplates, e a PVC é vinculada ao PV correspondente. Portanto, depois que o pod é reprogramado, os dados originais ainda podem ser montados com base no nome da PVC.
- Depois que uma carga de trabalho é criada, o armazenamento montado dinamicamente não pode ser atualizado.
- StatefulSets oferecem suporte à conexão dinâmica de discos EVS. Para obter mais detalhes, consulte Montagem dinâmica de um disco EVS para um StatefulSete Montagem dinâmica de um PV local para um StatefulSet.
- (Opcional) Security Context: atribua permissões de contêiner para proteger o sistema e outros contêineres de serem afetados. Insira o ID do usuário para atribuir permissões de contêiner e impedir que sistemas e outros contêineres sejam afetados.
- (Opcional) Logging: relate os logs de saída de contêiner padrão para o AOM por padrão, sem a necessidade de configurações manuais. Você pode configurar manualmente o caminho da coleção de logs. Para mais detalhes, consulte Uso do ICAgent para coletar logs de contêiner.
Para desativar a saída padrão da carga de trabalho atual, adicione a anotação kubernetes.AOM.log.stdout: [] em Rótulos e anotações. Para obter detalhes sobre como usar essa anotação, consulte Tabela 1.
- Basic Info: configure informações básicas sobre o contêiner.
- Image Access Credential: selecione a credencial usada para acessar o repositório de imagens. O valor padrão é default-secret. Você pode usar default-secret para acessar imagens no SWR. Para obter detalhes sobre default-secret, consulte default-secret.
- (Opcional) GPU: All é selecionado por padrão. A instância da carga de trabalho será agendada para o nó do tipo de GPU especificado.
Parâmetros de Serviço headless
Um Serviço headless é usado para resolver o problema de acesso mútuo entre pods em um StatefulSet. O Serviço headless fornece um nome de domínio de acesso fixo para cada pod. Para mais detalhes, consulte Serviços headless.
(Opcional) Service Settingso
Um Serviço fornece acesso externo para pods. Com um endereço IP estático, um Serviço encaminha o tráfego de acesso aos pods e equilibra automaticamente a carga desses pods.
Você também pode criar um Serviço depois de criar uma carga de trabalho. Para obter detalhes sobre Serviços de diferentes tipos, consulte Visão geral.
(Opcional) Advanced Settings- Upgrade: especifique o modo de atualizar e os parâmetros de upgrade da carga de trabalho. Rolling upgrade e Replace upgrade são suportados. Para mais detalhes, consulte Configuração da política de atualização da carga de trabalho.
- Políticas de gerenciamento de pods
Para alguns sistemas distribuídos, a sequência de StatefulSet é desnecessária e/ou não deve ocorrer. Esses sistemas exigem apenas exclusividade e identificadores.
- OrderedReady: o StatefulSet implantará, excluirá ou dimensionará os pods em ordem e um por um. (O StatefulSet só continua depois que o pod anterior estiver pronto ou excluído.) Esta é a política padrão.
- Parallel: o StatefulSet criará pods em paralelo para corresponder à escala desejada sem esperar e excluirá todos os pods de uma só vez.
- Scheduling: configure políticas de afinidade e antiafinidade para agendamento flexível de carga de trabalho. Afinidade de nó, afinidade de pod e antiafinidade de pod são suportadas. Para mais detalhes, consulte Política de agendamento (afinidade/antiafinidade).
- Toleration: o uso de ambas manchas e tolerâncias permite (não forçosamente) que o pod seja agendado para um nó com as manchas correspondentes e controla as políticas de despejo de pod depois que o nó onde o pod está localizado é manchado. Para mais detalhes, consulte Manchas e tolerâncias.
- Labels and Annotations: adicione rótulos ou anotações para pods usando pares chave-valor. Depois de inserir a chave e o valor, clique em Confirm. Para obter detalhes sobre como usar e configurar rótulos e anotações, consulte Rótulos e anotações.
- DNS: configure uma política DNS separada para a carga de trabalho. Para mais detalhes, consulte Configuração de DNS.
- APM Settings: use o Application Performance Management (APM) para fornecer uma análise de problemas e localização mais precisas para programas Java. Para mais detalhes, consulte Configuração de configurações de APM para análise de gargalo de desempenho.
- Clique em Create Workload no canto inferior direito.
Usar kubectl
Neste exemplo, uma carga de trabalho de nginx é usada e o volume do EVS é montado dinamicamente nela usando o campo volumeClaimTemplates.
- Use o kubectl para se conectar ao cluster. Para mais detalhes, consulte Conexão a um cluster usando o kubectl.
- Crie e edite o arquivo nginx-statefulset.yaml.
nginx-statefulset.yaml é um nome de arquivo de exemplo, e você pode alterá-lo conforme necessário.
vi nginx-statefulset.yaml
A seguir é apresentado um exemplo do conteúdo do arquivo. Para obter mais informações sobre o StatefulSet consulte a documentação do Kubernetes.
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi volumeMounts: - name: test readOnly: false mountPath: /usr/share/nginx/html subPath: '' imagePullSecrets: - name: default-secret dnsPolicy: ClusterFirst volumes: [] serviceName: nginx-svc replicas: 2 volumeClaimTemplates: # Dynamically mounts the EVS volume to the workload. - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test namespace: default annotations: everest.io/disk-volume-type: SAS # SAS EVS volume type. labels: failure-domain.beta.kubernetes.io/region: ap-southeast-1 # region where the EVS volume is created. failure-domain.beta.kubernetes.io/zone: ap-southeast-1a # AZ where the EVS volume is created. It must be the same as the AZ of the node. spec: accessModes: - ReadWriteOnce # The value must be ReadWriteOnce for the EVS volume. resources: requests: storage: 10Gi storageClassName: csi-disk # Storage class name. The value is csi-disk for the EVS volume. updateStrategy: type: RollingUpdate
vi nginx-headless.yaml
apiVersion: v1 kind: Service metadata: name: nginx-svc namespace: default labels: app: nginx spec: selector: app: nginx version: v1 clusterIP: None ports: - name: nginx targetPort: 80 nodePort: 0 port: 80 protocol: TCP type: ClusterIP
- Crie uma carga de trabalho e o serviço headless correspondente.
kubectl create -f nginx-statefulset.yaml
Se as informações a seguir forem exibidas, o StatefulSet foi criado com sucesso.
statefulset.apps/nginx created
kubectl create -f nginx-headless.yaml
Se as seguintes informações forem exibidas, o serviço headless foi criado com êxito.
service/nginx-svc created
- Se a carga de trabalho for acessada por meio de um Serviço ClusterIP ou NodePort, defina o tipo de acesso à carga de trabalho correspondente. Para mais detalhes, consulte Rede.