top of page

akv2k8s

  • Foto do escritor: fernando freitas do vale
    fernando freitas do vale
  • 26 de ago. de 2023
  • 5 min de leitura

Atualizado: 29 de ago. de 2023


ree

Keyvault integrado no Azure Kubernets


  • Pré-requisitos

  • Criando KeyVault

  • Criando AKS e Configurando Hello-World

  • Permissão do AKS no KeyVault

  • Criando certificado auto assinado no KeyVault

  • Instalando akv2k8s

  • Criando a secret no k8s usando keyvault

Você precisa sincronizar os certificados do KeyVault com seu AKS? Aqui você encontra um tutorial de inicio a fim de como fazer essa configuração.


  • Pré-requisitos

Para os pré-requisitos temos os seguintes componentes:


1. AZ CLI

Se faz necessário ter instalado na sua máquina o AZ CLI pois será com ele que vamos criar o key vault, o aks e demais atividades dentro do Azure.


Para instalação basta seguir a documentação oficial:


A instalação é bem intuitiva, next next next finish


2. Kubectl


O kubectl é apenas um executável que se realiza download e em seguida salva em uma pasta onde será configurado as variáveis de ambiente:


Para isso crie uma pasta onde desejar com o nome que desejar, eu criei o C:\bin


Em seguida vá em:



ree

Vá em configurações avançadas



ree

Em seguida em:



ree

ree

ree

Agora abra o CMD execute o seguinte comando:


cd c:\bin
curl.exe -LO "https://dl.k8s.io/release/v1.28.1/bin/windows/amd64/kubectl.exe" 

ree

Mesmo que esteja usando o powershell entre no cmd digitando CMD, como pode perceber não tem o PS no inicio da linha de comando. O curl vai funcionar melhor no CMD do que no Powershell.


Em seguida digite


kubectl version

ree

Referencia:


3 - HELM


O Helm é bem simples, basta fazer o download e salvar o executável no diretório que salvamos o kubectl:



ree

4 - GIT


Para correto funcionamento de algumas funcionalidades utilizamos o GIT.


Basta instalar next finish por esse link:



5 - Krew


O krew é um gerenciador de plugins para o kubectl, atenção que ele precisa do GIT já estar instalado


Vamos baixar o executável em:



Em seguida salvar no mesmo diretório c:\bin e executar o comando:


krew install krew

ree

Add %USERPROFILE%\.krew\bin nas variáveis de ambiente em path:


ree

Agora executamos kubectl krew:


ree

Agora vamos instalar um plugin que vamos utilizar em nosso lab:


kubectl krew install view-cert

ree

Pronto finalizamos os pré requisitos agora vamos começar o LAB.


  • Criando Azure KeyVault

O KeyVault pode ser criado tanto pelo portal quanto pelo AZ CLI. Pelo portal é super intuitivo então aqui vamos abordar a criação pelo AZ CLI. Fique a vontade de criar o KeyVault da maneira que achar melhor.


1 - Login AZ CLI


Primeiramente vamos realizar o login utilizando o AZ CLI.


az login

Realize login com a conta administradora do Azure

ree

ree

Em seguida confirme a subscription que você está e se é ela que vc deseja realizar as atividades:


az account list -o table

ree

2 - Criando Resource Group


Em seguida vamos criar o Resource Group:


az group create -l EastUs2 -n akv2k8s
ree

3 - Criando Key Vault


Agora vamos criar o Key Vault


az keyvault create --location EastUs2 --name kv-akv2k8s --resource-group akv2k8s

ree

Acesse o portal para confirmar a criação:


ree


ree

Em seguida confirme que está configurado como "Access Policy"


ree


  • Criando AKS e Configurando Hello-World


1 - Criando AKS


Primeiramente vamos criar o AKS:


az aks create -g akv2k8s -n aks-akv2k8s-cluster --generate-ssh-keys

ree

Vamos confirmar sua criação:



ree

Em seguida vamos realizar login no cluster:


az aks get-credentials --resource-group akv2k8s --name aks-akv2k8s-cluster --admin

ree

Para testar se estamos no cluster basta usar o comando:


kubectl get ns -A

ree

2 - Deploy Hello World


Vamos criar o namespace da aplicação que será publicada para teste:


kubectl create ns box

ree

Altere o contexto para o namespace que acabamos de criar:


kubectl config set-context --current --namespace=box

ree

Vamos realizar o Apply do seguinte yaml:


apiVersion: v1
kind: Service
metadata:
  name: box-svc
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: box-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: box-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: box-app
  template:
    metadata:
      labels:
        app: box-app
    spec:
      containers:
      - name: box-app
        image: boxboat/hello-boxboat
        ports:
        - containerPort: 80

Salve ele como box.yaml no c:\temp por exemplo.


kubectl apply -f c:\temp\box.yaml


ree

Vamos conferir os pods e o service:


Os Pods


kubectl get pods

ree

O Service:


kubectl get svc

ree

3 - Ingress Controller e Ingress Rule


Ingress Controller


Para podermos ter acesso ao deploy vamos precisar expor ele, e para isso usamos o NGINX como Ingress Controller.



helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx 
helm repo add nginx-stable https://helm.nginx.com/stable 
helm repo update

ree

kubectl create ns ingress-basic

ree


helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-basic --set  controller.replicaCount=2--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux --set controller.service.externalTrafficPolicy=Local

ree

Para confirmar basta olhar os pods e svc em ingress-basic


kubectl get pods -n ingress-basic

ree
kubectl get svc-n ingress-basic

ree

Ingress Rule


Depois do ingress instalado vamos criar a regra para que ele chegue no nosso app.


Crie o seguinte arquivo yaml:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: box-ingress
  namespace: box
spec:
  ingressClassName: nginx
  rules:
  - host: "aks.fernandovale.cloud"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: box-svc
            port:
              number: 80

Nomeie como ingress-box.yaml ou qualquer nome que desejar com a extensão .yaml.


A linha host corresponde ao host que será criado o DNS público para que possa ser acessado, no meu caso foi fernandovale.cloud. nomeie de acordo com seu domínio.


kubectl apply -f c:\temp\ingress-box.yaml

ree

Em seguida crie o DNS apontando para o IP do ingress:


ree

no caso ficou o seguinte DNS:



ree

Acessando no browser:


ree

Como podemos percerber o certificado é o autoassinado pelo nginx:



ree

  • Permissão AKS no KeyVault

Depois de nosso ambiente estar pronto para receber as alterações necessárias, vamos iniciar pelas permissões de Get no KeyVault


ClientID do AKS


Primeira coisa que iremos precisar é do ClientID do AKS para conceder permissão no KeyVault.


az aks show -g akv2k8s -n aks-akv2k8s-cluster --query "identityProfile.kubeletidentity.clientId" -o json

af669510-1afa-4975-adb8-2626396a3082

ree

Em seguida vamos dar a permissão de get em secret e em certificate:


az keyvault set-policy -n kv-akv2k8s --spn af669510-1afa-4975-adb8-2626396a3082 --certificate-permissions get
az keyvault set-policy -n kv-akv2k8s --spn af669510-1afa-4975-adb8-2626396a3082 --secret-permissions get
ree

Essas permissões também podem ser concedidas via portal com o nome do cluster.


Confirmando as permissões:


ree


  • Criando certificado auto assinado no KeyVault

Para fins de teste vamos gerar um certificado autoassinado na Azure para vincular a aplicação, caso você tenha um certificado público válido basta importar em vez de gerar um novo.



ree


ree


ree


  • Instalando akv2k8s


Para instalação do AKV2K8S é bem simples:


kubectl create ns akv2k8s

ree

helm repo add spv-charts https://charts.spvapi.no
helm repo update

ree


helm upgrade --install akv2k8s spv-charts/akv2k8s -–namespace akv2k8s
ree


Kubectl get pods -n akv2k8s

ree

  • Criando a secret no k8s usando keyvault

Agora vamos criar a secret do keyvault, primeiramente vamos criar o yaml:


apiVersion: spv.no/v1

kind: AzureKeyVaultSecret

metadata:

name: cert-keyvault

namespace: box

spec:

vault:

name: kv-akv2k8s

object:

name: akv2k8s-certificate

type: certificate

output:

secret:

name: cert-aks

type: kubernetes.io/tls

dataKey: akv2k8s-certificate


name: cert-keyvault *(se trata do nome do akvs que será criado no k8s)

namespace: box *(tem que ser o mesmo onde roda a aplicação)

name: kv-akv2k8s *(nome do keyvault)

name: akv2k8s-certificate *(nome do certificado no key vault)

name: cert-aks *(nome da secret que será vinculado no ingress)

dataKey: akv2k8s-certificate *(nome do certificado no key vault)



kubectl apply -f c:\temp\certificate.yaml

ree


kubectl get akvs

ree

Verificar os logs:


kubectl get pods -n akv2k8s
kubectl logs pods akv2k8s-controller-5f8c6c5955-xm2qp -n akv2k8s

ree


kubectl get secret
kubectl describe secret
kubectl get secret -o yaml

ree


kubectl view-cert

ree

Tudo certo, agora vamos vincular no ingress:


Adicionar em spec:

tls:

- hosts:

- 'aks.fernandovale.cloud'

secretName: cert-aks



ree

# Please edit the object below. Lines beginning with a '#' will be ignored,

# and an empty file will abort the edit. If an error occurs while saving this file will be

# reopened with the relevant failures.

#

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

annotations:

kubectl.kubernetes.io/last-applied-configuration: |

{"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{},"name":"box-ingress","namespace":"box"},"spec":{"ingressClassName":"nginx","rules":[{"host":"aks.fernandovale.cloud","http":{"paths":[{"backend":{"service":{"name":"box-svc","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}]}}

creationTimestamp: "2023-08-26T23:29:45Z"

generation: 2

name: box-ingress

namespace: box

resourceVersion: "12977"

uid: 9c14aa44-c140-4767-9cc5-bebced765828

spec:

tls:

- hosts:

- 'aks.fernandovale.cloud'

secretName: cert-aks

ingressClassName: nginx

rules:

- host: aks.fernandovale.cloud

http:

paths:

- backend:

service:

name: box-svc

port:

number: 80

path: /

pathType: Prefix

status:

loadBalancer:

ingress:

- ip: 20.94.100.95


Verificando os logs:



kubectl get pods -n ingress-basic
kubectl logs ingress-nginx-controller-78cbdf994-cf555 -n ingress-basic

ree

Certificado:


ree

 
 
 

Comentários


bottom of page