ATMOS
Provedor de Recursos
Credenciais necessárias para descoberta Kubernetes com o OneSDK
10 min
a integração do onesdk com o kubernetes oferece uma maneira poderosa e flexível de consultar e analisar dados do seu cluster usando sql ao configurar um arquivo kubeconfig personalizado com as credenciais de um serviceaccount e as informações do cluster, o onesdk pode se conectar diretamente à api do kubernetes, permitindo que você execute consultas complexas sobre pods, nós, namespaces, deployments e outros recursos, transformando a gestão e a auditoria do seu ambiente kubernetes em uma experiência baseada em dados e familiar para quem já trabalha com bancos de dados o que você precisa preparar no kubernetes você precisará criar três coisas um clusterrole com permissões de leitura um serviceaccount e um clusterrolebinding ligando os dois em seguida, precisa obter o token desse serviceaccount e a url do servidor de api do cluster 1\) defina as permissões mínimas (rbac) crie um clusterrole que dê apenas get e list nos recursos que o discovery lê abaixo fornecemos um yaml “amplo” por padrão (get/list em “tudo”), mas é recomendável restringir aos grupos/recursos necessários para o seu ambiente \# k8s onesdk discovery rbac yaml apiversion rbac authorization k8s io/v1 kind clusterrole metadata name onesdk discovery readonly rules \# core api group ("") \ apigroups \[""] resources \ nodes \ pods \ namespaces \ services \ endpoints \ replicationcontrollers \ persistentvolumes \ persistentvolumeclaims \ configmaps \ secrets verbs \["get", "list", "watch"] \# apps \ apigroups \["apps"] resources \ deployments \ daemonsets \ statefulsets \ replicasets verbs \["get", "list", "watch"] \# batch \ apigroups \["batch"] resources \ jobs \ cronjobs verbs \["get", "list", "watch"] \# networking \ apigroups \["networking k8s io"] resources \ ingresses \ networkpolicies verbs \["get", "list", "watch"] \# storage \ apigroups \["storage k8s io"] resources \ storageclasses \ csinodes \ volumeattachments verbs \["get", "list", "watch"] \# node metrics/metrics server (se aplicável) \ apigroups \["metrics k8s io"] resources \ nodes \ pods verbs \["get", "list", "watch"] \ apiversion v1 kind serviceaccount metadata name onesdk discovery namespace default \ apiversion rbac authorization k8s io/v1 kind clusterrolebinding metadata name onesdk discovery readonly binding roleref apigroup rbac authorization k8s io kind clusterrole name onesdk discovery readonly subjects \ kind serviceaccount name onesdk discovery namespace default ajuste a lista de recursos a partir do que você realmente quer expor se sua organização exigir, remova secrets do escopo, ou substitua por regras mais restritas se você usa um namespace padrão diferente para o serviceaccount, mude o campo namespace em serviceaccount e subjects para aplicar, rode kubectl apply f k8s onesdk discovery rbac yaml 2\) obtenha o token do serviceaccount em clusters modernos (kubernetes 1 24+), os tokens não são mais secretos persistentes por padrão você pode criar um secret de token legível para uso “fora do cluster” para criar um secret do tipo service account token apiversion v1 kind secret metadata name onesdk discovery token namespace default annotations kubernetes io/service account name onesdk discovery type kubernetes io/service account token aplicar e depois descrever para obter o token kubectl apply f onesdk discovery token yaml kubectl n default describe secret onesdk discovery token no output, copie o valor do campo token se precisar do ca do cluster para validação tls, copie também o ca crt dica para eks/gke/aks em eks e gke, o create token funciona; em aks, dependendo da versão, você pode preferir o secret sempre verifique as políticas do seu provedor e versão do cluster 3\) descubra a url do servidor da api execute kubectl cluster info e copie a url “kubernetes control plane is running at ”, por exemplo kubectl cluster info \# kubernetes control plane is running at https //abcdefg eks amazonaws com essa url é a que você configurará no onesdk como endpoint do provedor de api se estiver atrás de um proxy corporativo ou se exigir whitelist de ips/origens, assegure que o onesdk tenha conectividade https direta até essa url 4\) monte a estrutura do kubeconfig apiversion v1 kind config clusters \ cluster certificate authority data \<base64 ca cert> server https //abcdefg eks amazonaws com name onesdk discovery cluster contexts \ context cluster onesdk discovery cluster user onesdk discovery user name onesdk discovery context current context onesdk discovery context users \ name onesdk discovery user user token \<seu token jwt> como obter cada componente 1\) server url (já tem) kubectl cluster info \# use a url do "kubernetes control plane is running at " 2\) certificate authority (ca) \# se usando secret do token kubectl n default get secret onesdk discovery token o jsonpath='{ data ca\\ crt}' \# ou diretamente do kubeconfig atual kubectl config view raw o jsonpath='{ clusters\[0] cluster certificate authority data}' 3\) token (já tem do passo anterior) \# token temporário kubectl n default create token onesdk discovery \# ou do secret kubectl n default get secret onesdk discovery token o jsonpath='{ data token}' | base64 d script para gerar o kubeconfig automaticamente \#!/bin/bash \# configurações namespace="default" service account="onesdk discovery" cluster name="onesdk discovery cluster" context name="onesdk discovery context" user name="onesdk discovery user" kubeconfig file=" /onesdk kubeconfig yaml" \# obter informações do cluster server url=$(kubectl cluster info | grep "kubernetes control plane" | awk '{print $6}') ca data=$(kubectl config view raw o jsonpath='{ clusters\[0] cluster certificate authority data}') \# obter token (tenta método moderno primeiro) token=$(kubectl n $namespace create token $service account 2>/dev/null) if \[ z "$token" ]; then echo "método create token falhou, tentando via secret " \# criar secret se não existir kubectl apply f <\<eof apiversion v1 kind secret metadata name ${service account} token namespace ${namespace} annotations kubernetes io/service account name ${service account} type kubernetes io/service account token eof \# aguardar o token ser criado sleep 5 token=$(kubectl n $namespace get secret ${service account} token o jsonpath='{ data token}' | base64 d) fi \# gerar kubeconfig cat > $kubeconfig file <\<eof apiversion v1 kind config clusters \ cluster certificate authority data ${ca data} server ${server url} name ${cluster name} contexts \ context cluster ${cluster name} user ${user name} name ${context name} current context ${context name} users \ name ${user name} user token ${token} eof echo "kubeconfig criado em $kubeconfig file" echo "para testar kubectl kubeconfig=$kubeconfig file get nodes"