Eu tenho um controlador de replicação que cria mais de um PODs. Dentro de cada POD existe um container rodando uma aplicação.
Agora dentro do contêiner, ele pode chamar a API kubernetes conforme abaixo.
KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)
curl --silent --insecure --header "Authorization: Bearer $KUBE_TOKEN" \
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$POD_NAMESPACE/pods/$POD_NAME
POD_NAME
é o nome do POD;
POD_NAMESPACE
é o namespace do POD
As instâncias do aplicativo em contains formam um cluster. E eles elegem uma das instâncias do aplicativo como mestre, as outras são escravas que replicam os dados do mestre em tempo real. Quando a instância mestre falhar, outra instância escrava será promovida a mestre.
Quando o aplicativo no contêiner é promovido a mestre, quero que a instância do aplicativo mestre chame a API kubernetes para que todo o tráfego vá para este POD/contêiner.
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "my-cluster"
},
"spec": {
"ports": [{
"port": 33379,
"targetPort": 33379
}],
"type" : "None",
"selector": {
"name": "<POD_NAME>"
}
}
}
Especifiquei o POD_NAME
como seletor, mas o serviço não encontra nenhum dos POD.
Como posso configurar o serviço para que todo o tráfego vá para esse POD?
Você pode fazer com que seu seletor de serviço selecione um
"master"
rótulo, por exemplo"role": "master"
- então você pode adicionar o rótulo mestre a qualquer pod escolhido como mestre. Os rótulos podem ser alterados em pods em execução usando o método PATCH.O
name
rótulo é tratado da mesma forma que qualquer outro rótulo em um seletor. É uma prática comum adicionar um rótulo de nome a um pod que corresponda ao nome dos metadados e, em seguida, usá-lo em um seletor, mas sem o rótulo no pod, o seletor não o encontrará.