Eu costumava ser capaz de enrolar
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/
como meu URL base, mas no kubernetes 0.18.0 ele me dá "não autorizado". O estranho é que se eu usar o endereço IP externo da máquina API ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/
), ele funciona perfeitamente.
kubernetes
tslater
fonte
fonte
$KUBERNETES_SERVICE_HOST
e$KUBERNETES_PORT_443_TCP_PORT
?Respostas:
Na documentação oficial encontrei o seguinte:
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
Aparentemente, estava faltando um token de segurança que não precisava em uma versão anterior do Kubernetes. A partir disso, desenvolvi o que considero uma solução mais simples do que executar um proxy ou instalar o golang no meu contêiner. Veja este exemplo que obtém as informações, da api, para o contêiner atual:
Eu também uso include um binário simples, jq ( http://stedolan.github.io/jq/download/ ), para analisar o json para uso em scripts bash.
fonte
v1beta3
parav1
--cacert
sinalizador para curl para que curl valide o certificado apresentado pelo apiserver.KUBERNETES_SERVICE_HOST=kubernetes.default
,$KUBERNETES_443_TCP_PORT=443
, NAMESPACE == $ (</ var / run / segredos / kubernetes.io / ServiceAccount / namespace). The URL was
kubernetes.default: 443 / api / v1 / namespaces / $ NAMESPACE / vagens / ... `. Observe que a versão da API é definida como v1 em vez de v1beta3 e o namespace padrão foi substituído por $ NAMESPACE.Cada pod tem uma conta de serviço automaticamente aplicada que permite acessar o apiserver. A conta de serviço fornece credenciais de cliente, na forma de um token de portador, e o certificado da autoridade de certificação que foi usado para assinar o certificado apresentado pelo apiserver. Com essas duas informações, você pode criar uma conexão segura e autenticada com o apisever sem usar
curl -k
(também conhecido comocurl --insecure
):fonte
--root-ca-file=
argumento quando iniciado. (isso é tratado automaticamente na maioria dos instaladores do Kubernetes). Veja a discussão aqui para mais detalhes: github.com/kubernetes/kubernetes/issues/10265https://kubernetes.default/
como hostkubernetes.default.svc
documentado em kubernetes.io/docs/tasks/access-application-cluster/…Usando o cliente Python kubernetes ..
fonte
versão wget:
fonte
O adendo mais importante aos detalhes já mencionados acima é que o pod do qual você está tentando acessar o servidor API deve ter os recursos RBAC para fazer isso.
Cada entidade no sistema k8s é identificada por uma conta de serviço (como uma conta de usuário usada para usuários). Com base nos recursos do RBAC, o token da conta de serviço (/var/run/secrets/kubernetes.io/serviceaccount/token) é preenchido. As ligações kube-api (por exemplo, pykube) podem usar esse token como uma entrada ao criar conexão com os servidores kube-api. Se o pod tiver os recursos de RBAC corretos, ele será capaz de estabelecer a conexão com o servidor kube-api.
fonte
Encontrei esse problema ao tentar acessar a API de dentro de um pod usando o código Go. Abaixo está o que eu implementei para fazer isso funcionar, caso alguém se depare com essa pergunta e queira usar o Go também.
O exemplo usa um recurso de pod, para o qual você deve usar a
client-go
biblioteca se estiver trabalhando com objetos kubernetes nativos. O código é mais útil para quem trabalha com CustomResourceDefintions.fonte
De dentro do pod, o servidor kubernetes api pode ser acessado diretamente em " https: //kubernetes.default ". Por padrão, ele usa a "conta de serviço padrão" para acessar o servidor API.
Portanto, também precisamos passar um "ca cert" e um "token de conta de serviço padrão" para autenticar com o servidor API.
arquivo de certificado é armazenado no seguinte local dentro do pod: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
e o token de conta de serviço padrão em: /var/run/secrets/kubernetes.io/serviceaccount/token
Você pode usar o cliente nodejs kubbernetes godaddy .
fonte
Tive um problema de autenticação semelhante no GKE, em que scripts python de repente lançaram exceções. A solução que funcionou para mim foi dar permissão aos pods por meio de função
para mais informações insira a descrição do link aqui
fonte
Para quem está usando o Google Container Engine (com tecnologia Kubernetes):
Uma chamada simples
https://kubernetes
de dentro do cluster usando este cliente kubernetes para Java funciona.fonte
Com o RBAC habilitado, a conta de serviço padrão não tem nenhuma permissão.
Melhor criar uma conta de serviço separada para suas necessidades e usá-la para criar seu pod.
Está bem explicado aqui https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/
fonte
Minha versão do k8s é 1.2.0 e em outras versões deve funcionar também ^ ^
fonte
This is from the
Kubernetes em açãobook.
Você precisa cuidar da autenticação . O próprio servidor API diz que você não está autorizado a acessá-lo, porque não sabe quem você é .
Para autenticar, você precisa de um token de autenticação. Felizmente, o token é fornecido por meio do segredo de token padrão mencionado anteriormente e é armazenado no arquivo de token no volume do segredo.
Você vai usar o token para acessar o servidor API . Primeiro, carregue o token em uma variável de ambiente:
O token agora está armazenado na variável de ambiente TOKEN . Você pode usá-lo ao enviar solicitações ao servidor de API:
fonte