akv2k8s
- 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