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


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:




Vá em configurações avançadas




Em seguida em:





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" 


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


Referencia:


3 - HELM


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




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


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



Agora executamos kubectl krew:



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


kubectl krew install view-cert


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



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


az account list -o table


2 - Criando Resource Group


Em seguida vamos criar o Resource Group:


az group create -l EastUs2 -n akv2k8s

3 - Criando Key Vault


Agora vamos criar o Key Vault


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


Acesse o portal para confirmar a criação:





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




  • 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


Vamos confirmar sua criação:




Em seguida vamos realizar login no cluster:


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


Para testar se estamos no cluster basta usar o comando:


kubectl get ns -A


2 - Deploy Hello World


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


kubectl create ns box


Altere o contexto para o namespace que acabamos de criar:


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


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



Vamos conferir os pods e o service:


Os Pods


kubectl get pods


O Service:


kubectl get svc


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


kubectl create ns ingress-basic



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


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


kubectl get pods -n ingress-basic

kubectl get svc-n ingress-basic


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


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



no caso ficou o seguinte DNS:




Acessando no browser:



Como podemos percerber o certificado é o autoassinado pelo nginx:




  • 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


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

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


Confirmando as permissões:




  • 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.









  • Instalando akv2k8s


Para instalação do AKV2K8S é bem simples:


kubectl create ns akv2k8s


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



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


Kubectl get pods -n akv2k8s


  • 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



kubectl get akvs


Verificar os logs:


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



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



kubectl view-cert


Tudo certo, agora vamos vincular no ingress:


Adicionar em spec:

tls:

- hosts:

- 'aks.fernandovale.cloud'

secretName: cert-aks




# 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


Certificado:



Comments


bottom of page