notas de estudo k8s (4): explicação detalhada do namespace

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.

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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 .

Acho que você gosta

Origin blog.csdn.net/qq_57629230/article/details/131384133
Recomendado
Clasificación