Fala pessoal, tudo bem ? Continuando nessa jornada de aprendizado do Kubernetes, vou explicar hoje como criar múltiplos clusteres lógicos dentro de um único cluster físico. Para isso, vamos utilizar o Namespaces.

Mas Antes…

Tenho algumas novidades para contar.

Recentemente, postei aqui no site que minha palestra na Trilha .NET sobre Implementando Métricas e Healthcheck em aplicações .NET foi aprovada para o The Developer’s Conference de Belo Horizonte. Portanto, no dia 15 de junho, temos um encontro marcado em solo mineiro.

Além disso, no dia 2 de maio, estarei no canal Coders in Rio para um talk coders com o tema AKS-Conhecendo o Kubernetes no Azure. Vou falar um pouco sobre o que aprendi criando a série Jornada Kubernetes, além de apresentar o serviço de Kubernetes no Azure. Não deixe de assistir e compartilhar pelo meetup do Coders in Rio.

Voltando ao assunto do post, pra que criar múltiplos cluster dentro de um físico?

No post sobre deployment, expliquei como criar o deploy de uma aplicação .NET Core. Porém, como faço para criar diferentes ambientes de homologação e produção sem que um afete o outro ?

Para isso, existe os namespaces. Com eles, torna-se possível criar ambientes isolados, separando deployments, pods e serviços em um escopo independente. Inclusive, é possível restringir os recursos como CPU e memória que um namespace possui (veremos como fazer isso em artigos futuros). Assim, podemos criar um ambiente de homologação consumindo menos recursos que o ambiente de produção.

O Kubernetes, por padrão, já possui 3 namespaces:

  • default – É o namespace padrão para objetos sem namespace específico
  • kube-system – É o namespace para objetos criados pelo Kubernetes
  • kube-public – Esse namespace é criado automaticamente e é acessivel por qualquer usuário.

Utilizando namespaces

Vamos criar um ambiente de produção e outro de homologação. Para isso, podemos criar um namespace de 2 formas. |Através do seguinte comando:

kubectl create namespace homologacao
kubectl create namespace producao

Ou através de arquivos de manifesto:

apiVersion: v1
kind: Namespace
metadata:
  name: producao
  labels: 
    name: producao

---

apiVersion: v1
kind: Namespace
metadata:
  name: homologacao
  labels: 
    name: homologacao
kubectl apply -f criando-namespace.yaml

Agora, podemos executar o comando para listar os namespaces:

kubectl get namespace

Os namespaces de produção e homologação foram criados com sucesso. Agora, é hora de criarmos o nosso deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: website
spec:
  selector:
    matchLabels:
      app: website
  template:
    metadata:
      labels:
        app: website
    spec:
      containers:
      - name: website-container
        image: fabricioveronez/site-k8s:homolog
        ports:
        - containerPort: 80

---

kind: Service
apiVersion: v1
metadata:
  name: website-service
spec:
  selector:
    app: website
  ports:
  - protocol: TCP
    port: 80
  type: NodePort
kubectl --namespace=homologacao apply -f deployment-homolog.yaml

Se executarmos o comando kubectl get deployment, não veremos nenhum deployment em execução. Isso, porque acabamos de incluir o deployment no namespace de homologação.

Para verificarmos o deployment, devemos incluir o namespace no comando:

kubectl --namespace=homologacao get deployment

Agora, vamos fazer o mesmo processo com o deploy em produção:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: website
spec:
  selector:
    matchLabels:
      app: website
  template:
    metadata:
      labels:
        app: website
    spec:
      containers:
      - name: website-container
        image: fabricioveronez/site-k8s:prod
        ports:
        - containerPort: 80

---

kind: Service
apiVersion: v1
metadata:
  name: website-service
spec:
  selector:
    app: website
  ports:
  - protocol: TCP
    port: 80
  type: NodePort
kubectl --namespace=producao apply -f deployment-prod.yaml

Se analisarem os manifestos, verão que a única alteração é a imagem que utilizo: fabricioveronez/site-k8s:prod em produção e fabricioveronez/site-k8s:homolog para homologação.

Verificando as aplicações

Agora, vamos verificar em quais portas estão mapeados os services de cada ambiente. Utilizamos, para isso, o comando get services com o parametro –all-namespaces .

kubectl get services --all-namespaces 

Verificamos, então, que o ambiente de homologação está direcionado para a porta 31808 e produção na porta 32549.

Com isso, concluímos a separação do ambiente de homologação e produção no mesmo cluster. Espero que aproveitem esse recurso e, no caso de dúvidas ou sugestões, comentem no site ou falem diretamente comigo pelo meu telegram.