Projeto projet11-kubernetes-services · todos os comandos para implantar, expor e testar os Services.
A partir da pasta do projeto (projet11-kubernetes-services):
kubectl config use-context docker-desktop
docker build -t demo-k8s:1.0 ./app # (se ainda não construída no projeto 10)
kubectl apply -f k8s/ # deployment + 3 services
kubectl get pods # 3 Pods Runningkubectl get svc # TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S)
kubectl get svc -o wide
kubectl describe svc demo-clusterip # detalhes + EndpointsLeitura de kubectl get svc:
| Coluna | Significado |
|---|---|
TYPE | ClusterIP / NodePort / LoadBalancer |
CLUSTER-IP | IP interno (sempre presente) |
EXTERNAL-IP | IP externo (LoadBalancer) ou <none> |
PORT(S) | port do Service (e :nodePort para NodePort) |
Um ClusterIP não é acessível a partir do anfitrião: chama-se a partir de um Pod, pelo nome.
# Pod cliente descartável (--rm : apaga à saída)
kubectl run client --rm -it --image=curlimages/curl -- shDepois, no shell do Pod:
curl http://demo-clusterip # chamada PELO NOME (resolvido pelo CoreDNS)
curl http://demo-clusterip # relança : o nome do Pod muda
exitTestar a resolução DNS:
kubectl run dnstest --rm -it --image=busybox:1.36 -- sh
# no Pod :
nslookup demo-clusterip
wget -qO- http://demo-clusteripkubectl get svc demo-nodeport
# Abrir no navegador :
start http://localhost:30082
# ou testar em linha de comandos :
curl http://localhost:30082kubectl get svc demo-lb # EXTERNAL-IP deve passar a "localhost"
start http://localhost:8090
curl http://localhost:8090Se o
EXTERNAL-IPficar<pending>, espera alguns segundos (o Docker Desktop provisiona o LB). Em cluster kind, o tipo LoadBalancer fica<pending>sem MetalLB: usakubectl port-forward(ver anexo).
kubectl get endpoints demo-clusterip # IP dos Pods atrás do Service
kubectl get pods -o wide --show-labels # labels dos Pods
kubectl get pods --selector app=demo-back # os mesmos Pods que o seletor do ServiceVer a repartição (10 pedidos via port-forward):
kubectl port-forward svc/demo-clusterip 8091:80
# noutro TERMINAL :
1..10 | ForEach-Object { (Invoke-WebRequest -Headers @{Accept="application/json"} http://localhost:8091).Content }kubectl delete -f k8s/
# ou por objeto :
kubectl delete svc demo-clusterip demo-nodeport demo-lb
kubectl delete deployment demo-back| Sintoma | Causa provável | Solução |
|---|---|---|
curl http://demo-clusterip falha | Não a partir de um Pod, ou serviço ausente | Chamar a partir de um Pod; verificar kubectl get svc |
| Endpoints vazios | O seletor não corresponde a nenhum label de Pod | Alinhar selector (Service) e labels (Pods) |
EXTERNAL-IP em <pending> | Sem load balancer (kind, cloud não configurada) | Docker Desktop: esperar; senão kubectl port-forward |
localhost:30082 inacessível | NodePort não criado / porto ocupado | kubectl get svc demo-nodeport; alterar nodePort |
ImagePullBackOff | Imagem demo-k8s:1.0 ausente do cluster | Construí-la; em kind: kind load docker-image demo-k8s:1.0 |
# Solução universal de acesso temporário a qualquer Service :
kubectl port-forward svc/demo-clusterip 8091:80 # -> http://localhost:8091Curso criado pelo Dr. Haythem REHOUMA — Desenvolvimento e implantação de soluções de dados