Ao usar clusters do Container Service for Kubernetes (ACK), talvez seja necessário iniciar muitos pods rapidamente. O dimensionamento horizontal de nós do Elastic Compute Service (ECS) para esses pods é demorado, e manter instâncias ECS ociosas reservadas desperdiça recursos. Uma solução mais eficiente é agendar pods para execução em instâncias de contêiner elásticas por meio de nós virtuais do ACK. Assim, você não precisa adquirir ou gerenciar instâncias ECS. Este tópico descreve como agendar pods para instâncias de contêiner elásticas em clusters registrados do ACK One.
Como funciona
O Elastic Container Instance é um serviço de computação serverless da Alibaba Cloud para containerização. Ele oferece um ambiente de execução isolado, de implantação rápida e livre de operações e manutenção para seus contêineres. As instâncias de contêiner elásticas permitem que você se concentre nas aplicações containerizadas sem precisar adquirir ou gerenciar instâncias ECS. Crie instâncias de contêiner elásticas conforme a necessidade e pague pelo uso de recursos por segundo.
Geralmente, seu cluster possui pelo menos um grupo de nós de data center. Após a criação dos pods, o cluster os agenda para execução nos nós. Esse modo de agendamento é adequado para aplicações com volume de tráfego estável. Se sua carga de trabalho apresentar picos repentinos ou imprevisíveis, use nós virtuais para agendar pods diretamente em instâncias de contêiner elásticas. Essa solução elimina o tempo de criação de nós e evita custos com recursos ociosos.
Pré-requisitos
Um cluster registrado foi criado e um cluster autogerenciado com versão do Kubernetes 1.14 ou posterior está conectado ao cluster registrado.
A região onde o cluster está implantado deve ser compatível com o Elastic Container Instance. Para visualizar as regiões e zonas suportadas, faça login no console do Elastic Container Instance. Para mais informações sobre regiões e zonas suportadas, consulte Regiões e zonas.
Etapa 1: Conceder permissões do RAM ao ack-virtual-node
Usar onectl
Instale e configure o onectl em sua máquina local. Para mais informações, consulte Gerenciar clusters registrados usando onectl.
-
Execute o comando a seguir para conceder permissões do Resource Access Management (RAM) ao ack-virtual-node:
onectl ram-user grant --addon ack-virtual-nodeSaída esperada:
Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.
Usar o console
Antes de instalar o componente em um cluster registrado, especifique um par de AccessKey no cluster Kubernetes autogerenciado. Esse par é necessário para acessar serviços da Alibaba Cloud a partir do cluster autogerenciado. Antes de definir o par de AccessKey, crie um usuário do RAM e conceda a ele as permissões necessárias para acessar recursos da Alibaba Cloud.
-
Opcional: Crie uma política personalizada.
-
Anexe uma política ao usuário do RAM.
Conceda permissões aos usuários do RAM adicionando políticas de sistema, como
AliyunECIFullAccess,AliyunVPCReadOnlyAccesseAliyunAccFullAccess, ou políticas de permissão personalizadas. -
Crie um par de AccessKey para o usuário do RAM.
AvisoRecomendamos que você configure políticas baseadas em par de AccessKey para controle de acesso à rede, limitando as fontes de invocação do AccessKey a ambientes de rede confiáveis para aumentar a segurança.
-
Utilize o par de AccessKey para criar um Secret chamado alibaba-addon-secret no cluster registrado.
O sistema usa automaticamente o par de AccessKey para acessar recursos na nuvem durante a instalação do ack-virtual-node.
kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'NotaSubstitua
<your access key id>e<your access key secret>pelo par de AccessKey obtido na etapa anterior.
Etapa 2: Instalar o ack-virtual-node
Usar onectl
Execute o comando a seguir para instalar o ack-virtual-node:
onectl addon install ack-virtual-node
Saída esperada:
Addon ack-virtual-node, version **** installed.
Usar o console
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Components and Add-ons.
-
Na página Add-ons, localize o ack-virtual-node e clique em Install.
Na caixa de diálogo Note, clique em OK. O vSwitch e o grupo de segurança padrão do cluster serão utilizados pelas instâncias de contêiner elásticas implantadas pelo ack-virtual-node. Para mais informações, consulte Próximos passos.
Etapa 3: Agendar pods para instâncias de contêiner elásticas
Após a implantação do ack-virtual-node no cluster, agende pods para instâncias de contêiner elásticas configuradas como nós virtuais. Utilize um dos métodos abaixo para agendar pods em um cluster registrado. Certifique-se de que os nós virtuais estejam no estado Ready antes de prosseguir.
-
Execute o comando a seguir para consultar o status do nó virtual:
kubectl get no |grep virtual-kubeletSaída esperada:
virtual-kubelet-cn-hangzhou-b Ready agent 18d v1.20.11-aliyun.1A saída indica que o nó virtual está no estado Ready.
-
Escolha um dos três métodos a seguir para agendar pods em instâncias de contêiner elásticas.
Method 1: Add labels to pods (versão do cluster superior a 1,16)
Adicione o rótulo
alibabacloud.com/eci=trueao pod que deseja criar. Um pod baseado em Elastic Container Instance será criado e agendado para o nó virtual. Exemplo:Execute o comando a seguir para adicionar um rótulo ao pod:
Execute o comando a seguir para consultar o pod:
Saída esperada:
kubectl run nginx --image nginx -l alibabacloud.com/eci=truekubectl get pod -o wide|grep virtual-kubeletnginx-7fc9f746b6-r4xgx 0/1 ContainerCreating 0 20s 192.168.XX.XX virtual-kubelet <none> <none>Method 2: Add labels to namespaces
Adicione o rótulo
alibabacloud.com/eci=trueao namespace ao qual o pod pertence. Um pod baseado em Elastic Container Instance será criado e agendado para o nó virtual. Exemplo:Execute o comando a seguir para criar um namespace:
Execute o comando a seguir para adicionar um rótulo ao namespace do pod:
Execute o comando a seguir para agendar o pod no nó virtual:
Execute o comando a seguir para consultar o pod:
Saída esperada:
kubectl create ns vkkubectl label namespace vk alibabacloud.com/eci=truekubectl -n vk run nginx --image nginxkubectl -n vk get pod -o wide|grep virtual-kubeletnginx-6f489b847d-vgj4d 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>Método 3: Especificar nomes de nós
Agende apenas pods específicos para nós virtuais. Adicione o campo
nodeName: virtual-kubelet-cn-shanghai-kao pod. Um pod baseado em Elastic Container Instance será criado e agendado para um nó virtual. Exemplo:-
Crie um arquivo chamado nginx-deployment.yaml e copie o conteúdo a seguir para o arquivo:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeName: virtual-kubelet-cn-shanghai-k # nodeName of the specified virtual kubelet containers: - name: nginx image: nginx:1.7.9 # replace it with your exactly <image_name:tags> ports: - containerPort: 80 resources: limits: cpu: "500m" -
Execute o comando a seguir para implantar a aplicação:
kubectl apply -f nginx-deployment.yaml -
Execute o comando a seguir para consultar o pod:
kubectl get pod -o wide|grep virtual-kubelet -
Saída esperada:
nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none> nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>
Próximos passos
Modificar as configurações do vSwitch conectado a uma instância de contêiner elástica
Modifique a variável de ambiente ECI_VSWITCH para alterar o vSwitch dos pods agendados para o nó virtual. Recomendamos configurar múltiplos vSwitches em zonas diferentes para garantir alta disponibilidade. Quando as instâncias de contêiner elásticas na zona atual estiverem esgotadas, o controlador de nó virtual criará pods em outra zona.
Execute o comando a seguir para modificar as configurações do vSwitch conectado a uma instância de contêiner elástica:
kubectl edit configmap eci-profile -n kube-system
Exemplo de configuração:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enablePrivateZone: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf**** # the vSwitch to which an elastic container instance pod is connected. Separate multiple vSwitch IDs with commas (,).
vpcId: vpc-2zeghwzptn5zii0w7****
Para mais informações sobre como configurar um eci-profile, consulte Configurar eci-profile.
Delete a virtual node
-
Desinstale o ack-virtual-node do cluster registrado.
Usar onectl
Execute o comando a seguir para desinstalar o ack-virtual-node:
onectl addon uninstall ack-virtual-nodeSaída esperada:
Addon ack-virtual-node uninstalled.Usar o console
Acesse a página Add-ons no console do ACK e desinstale o ack-virtual-node.
-
Execute o comando
kubectl delete node <node name>para excluir os nós virtuais desnecessários.NotaApós desinstalar o ack-virtual-node, as instâncias de contêiner elásticas existentes no cluster não são excluídas.