Diretório de artigos
- Espaços para nome
-
- Importância dos namespaces
- Cenários de uso de namespace
- espaço para nome inicial
- Operações de comando comuns
- Caso do site oficial: Crie um namespace, configure cotas de memória e CPU e crie um pod para usar o namespace
-
- 1. Crie um espaço para nome
- 2. Crie um objeto de cota de recurso e atribua um valor a esse objeto de recurso.
- 3. Vincule o namespace e os objetos de cota de recursos
- 4. Visualize as informações do objeto de cota de recursos correspondentes ao namespace e gere-as no formato de arquivo yaml
- 5.Criar pod
- 6. Após criar o pod, visualize o objeto de cota de recursos novamente
- 7. Tente criar um segundo pod
Espaços para nome
Namespace no Kubernetes é um mecanismo para organizar e isolar recursos dentro de um cluster . Um Namespace pode ser considerado como um cluster virtual , que divide o cluster físico em múltiplas partes lógicas, cada parte possui seu próprio conjunto de recursos (como Pod, Serviço, ConfigMap, etc.).
Namespace é adequado para isolar recursos criados por diferentes usuários
Usado para classificar, filtrar e gerenciar qualquer grupo de objetos no cluster . Cada carga de trabalho adicionada a um cluster Kubernetes deve ser colocada em um namespace.
Diferentes empresas (web, banco de dados, centro de mensagens) podem ser implantadas em diferentes namespaces para obter isolamento de negócios, e cotas de recursos podem ser impostas a elas para limitar o uso de recursos como CPU e memória.
Importância dos namespaces
Namespaces fornecem escopo para nomes de objetos no cluster. Embora os nomes devam ser exclusivos dentro de um namespace, o mesmo nome pode ser usado em diferentes namespaces . Isso pode ser uma grande ajuda para alguns cenários. Por exemplo, se você usar namespaces para dividir os ambientes do ciclo de vida do aplicativo (como desenvolvimento, preparação, produção), poderá manter cópias dos mesmos objetos com os mesmos nomes em cada ambiente.
Os namespaces também permitem que os usuários apliquem facilmente políticas a partes específicas do cluster . Você pode controlar o uso de recursos definindo um objeto ResourceQuota, que define limites para o uso de recursos por namespace. Da mesma forma, ao usar uma CNI (Container Network Interface) que suporta política de rede no cluster, como Calico ou Canal (chita para política, flanela para rede). Você aplica NetworkPolicy a um namespace, onde as regras definem como os pods se comunicam entre si. Namespaces diferentes podem ter políticas diferentes.
Um dos maiores benefícios do uso de namespaces é a capacidade de aproveitar as vantagens do Kubernetes RBAC (controle de acesso baseado em função) . O RBAC permite desenvolver funções sob um único nome, agrupando assim uma lista de permissões ou capacidades. Os objetos ClusterRole são usados para definir padrões de uso em escala de cluster, enquanto os tipos de objetos de função se aplicam a namespaces específicos, proporcionando maior controle e granularidade. Após a criação de uma função, um RoleBinding pode conceder recursos definidos a usuários ou grupos de usuários específicos dentro do contexto de um único namespace. Dessa forma, os namespaces permitem que os operadores de cluster mapeiem políticas idênticas para coleções organizadas de recursos.
Cenários de uso de namespace
- Mapeando namespaces para equipes ou projetos
Ao fornecer namespaces dedicados às equipes, você pode usar políticas RBAC para delegar determinadas funções para autogerenciamento e automação. Definir cotas de recursos para equipes e projetos também é muito útil. Dessa forma, você pode acessar os recursos de forma adequada com base nas necessidades e prioridades de negócios da sua organização - Use namespaces para particionar ambientes de ciclo de vida.
Namespaces são ideais para particionar ambientes de desenvolvimento, preparação e produção em um cluster. Normalmente, somos aconselhados a implantar cargas de trabalho de produção em um cluster completamente separado para garantir o máximo isolamento. - Use namespaces para isolar diferentes consumidores.
Segmente cargas de trabalho com base em consumidores. Por exemplo, se o seu cluster fornece infraestrutura para vários clientes, a segmentação por namespace permitirá que você gerencie cada cliente enquanto rastreia para onde vão as contas.
espaço para nome inicial
O Kubernetes cria quatro namespaces iniciais quando é iniciado:
-
default
O Kubernetes inclui esse namespace para que você possa começar a usar um novo cluster sem criar um novo namespace.
-
kube-node-lease
Este namespace contém objetos Lease que são usados para associação com cada nó. As concessões de nós permitem que o kubelet envie pulsações para que o plano de controle possa detectar falhas de nós.
-
kube-public
Todos os clientes (incluindo clientes não autenticados) podem ler este namespace. Este namespace é reservado principalmente para uso do cluster, de modo que determinados recursos precisam estar visíveis e legíveis em todo o cluster. Os atributos públicos deste namespace são uma convenção, não um requisito.
-
kube-system
Este namespace é usado para objetos criados pelo sistema Kubernetes.
Operações de comando comuns
1. Veja todos os namespaces
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 7d6h
kube-node-lease Active 7d6h
kube-public Active 7d6h
kube-system Active 7d6h
quota-mem-cpu-example Active 47h
Você pode ver os quatro namespaces iniciais que vêm com a inicialização do k8s.
2. Veja detalhes do namespace
[root@k8s-master ~]# kubectl describe namespace kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
Este comando pode ver os objetos de cota de recursos para o namespace
3. Crie um espaço para nome
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
Ver namespace
[root@k8s-master ~]# kubectl get namespace
4. Visualize os pods em um determinado namespace
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-6949477b58-m954m 1/1 Running 15 7d3h
calico-node-c55c9 1/1 Running 11 7d3h
calico-node-cxnbg 1/1 Running 9 7d3h
calico-node-pm4jp 1/1 Running 10 7d3h
coredns-7f89b7bc75-hl2tf 1/1 Running 9 7d6h
coredns-7f89b7bc75-wkf68 1/1 Running 10 7d6h
etcd-k8s-master 1/1 Running 11 7d6h
kube-apiserver-k8s-master 1/1 Running 14 7d6h
kube-controller-manager-k8s-master 1/1 Running 14 7d6h
kube-proxy-55krt 1/1 Running 11 7d6h
kube-proxy-5zjxj 1/1 Running 9 7d3h
kube-proxy-dnvgg 1/1 Running 10 7d3h
kube-scheduler-k8s-master 1/1 Running 11 7d6h
metrics-server-769f6c8464-wqwdd 1/1 Running 2 26h
Nota: Se você não especificar o namespace -n, os pods no namespace padrão serão visualizados por padrão. Se você não especificar um namespace ao criar um pod, o pod será criado apenas no namespace padrão.
5. Excluir namespace
[root@k8s-master ~]# kubectl delete namespace mem-example
Caso do site oficial: Crie um namespace, configure cotas de memória e CPU e crie um pod para usar o namespace
Consulte a documentação do site oficial: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
1. Crie um espaço para nome
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
Ver namespace
[root@k8s-master ~]# kubectl get namespace
2. Crie um objeto de cota de recurso e atribua um valor a esse objeto de recurso.
[root@k8s-master ~]# vim quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
- apiversion, declara a versão do apiserver como v1
- tipo, objeto, cria objeto de cota de recurso
- metadados, dados de versão, nome especificado
- difícil, limitações de hardware
- requests.cpu: "1", solicite uma CPU
- limites.cpu: "2", no máximo 2 CPUs podem ser usadas
3. Vincule o namespace e os objetos de cota de recursos
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
4. Visualize as informações do objeto de cota de recursos correspondentes ao namespace e gere-as no formato de arquivo yaml
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota define os seguintes requisitos no namespace quota-mem-cpu-example:
- Todos os contêineres de cada pod no namespace devem ter solicitações e limites de memória, bem como solicitações e limites de CPU.
- O total de solicitações de memória de todos os pods no namespace não pode exceder 1 GiB.
- O limite total de memória de todos os pods no namespace não pode exceder 2 GiB.
- O total de solicitações de CPU de todos os pods no namespace não pode exceder 1 CPU.
- O limite total de CPU de todos os pods no namespace não pode exceder 2 CPUs.
5.Criar pod
Editar arquivo yaml
[root@k8s-master ~]# vim quota-mem-cpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
Criar pod
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
Ver pods criados no namespace especificado
[root@k8s-master ~]# kubectl get pod --namespace=quota-mem-cpu-example
NAME READY STATUS RESTARTS AGE
quota-mem-cpu-demo 1/1 Running 0 70s
6. Após criar o pod, visualize o objeto de cota de recursos novamente
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
Depois de criar o pod, descobri que a CPU e a memória correspondentes foram usadas.
7. Tente criar um segundo pod
Editar arquivo yaml
[root@k8s-master ~]# vim quota-mem-cpu-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
Criar pod
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
Error from server (Forbidden): error when creating "quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi
No manifesto, você pode ver que a solicitação de memória do pod é de 700 MiB. Observe que a soma das novas solicitações de memória mais as solicitações de memória já usadas excede a cota de solicitação de memória : 600 MiB + 700 MiB > 1 GiB
O segundo pod não pode ser criado com sucesso. A saída mostra que a criação de um segundo pod fará com que o total de solicitações de memória exceda a cota de solicitação de memória .