我有以下问题:
我使用以下命令登录到 Kubernetes pod:
./cluster/kubectl.sh exec my-nginx-0onux -c my-nginx -it bash
“ip addr show”命令显示为其分配的 pod 的 IP。由于 pod 是一个逻辑概念,我假设我登录的是 docker 容器而不是 pod,在这种情况下,pod IP 与 docker 容器 IP 相同。这样的理解正确吗?
从 Kubernetes 节点,我执行
sudo docker ps
,然后执行以下操作:-
sudo docker exec 71721cb14283 -it '/bin/bash'
这行不通。有人知道我做错了什么吗?
我想使用curl 从 pod 中访问我创建的 nginx 服务。如何在此 pod 或容器中安装 curl 以从内部访问服务。我想这样做是为了了解网络连接。
以下是如何在 kubernetes 网络中使用curl 命令行来测试和探索内部 REST 端点。
要获得网络内运行的 busybox 的提示,请执行以下命令。 (提示是每个开发人员使用一个独特的容器。)
kubectl run curl-<YOUR NAME> --image=radial/busyboxplus:curl -i --tty --rm
您可以省略 --rm 并保持实例运行以供以后重新使用。要稍后重用它,请输入:
kubectl attach <POD ID> -c curl-<YOUR NAME> -i -t
使用命令
kubectl get pods
您可以看到所有正在运行的POD。 <POD ID>
与 curl-yourname-944940652-fvj28
类似。
编辑:请注意,您需要从终端登录谷歌云(一次),然后才能执行此操作!这是一个示例,请确保输入您的区域、集群和项目:
gcloud container clusters get-credentials example-cluster --zone europe-west1-c --project example-148812
Kubernetes的想法是,pods分配在host上,但没有什么是确定或永久的,所以你不应该尝试从容器中查找容器或pod的IP,而应该使用Kubernetes 调用 Service。
KubernetesService 是通过 kube-proxy
到具有一组定义的选择器的 pod 的路径,它将通过给定选择器将请求负载均衡到所有 pod。简而言之:
例如,
创建一个带有名为“name”的label的Pod。就说吧name=mypod
例如,使用您称为
name=mypod
的 选择器 myService
创建一个Service
,例如为其分配端口
9000
。然后您可以使用以下命令从 pod 卷曲到此服务提供的 pod
curl http://myService:9000
LoadBalancer 类型的 Service,并在 AWS 或 GKE 上运行,则该服务也可以从集群外部使用。对于仅限内部的服务,只需设置标志clusterIP: None
,外部就不会进行负载平衡。请参阅此处的参考:
https://kubernetes.io/docs/concepts/services-networking/service/ https://kubernetes.io/docs/tutorials/services/
IP-per-pod 模型。同一 Pod 中的所有容器共享相同的 IP 地址,就好像它们在同一主机上运行一样。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
。对于你的情况,
sudo docker exec -it 71721cb14283 '/bin/bash'
应该有效。如果没有,您应该提供命令的输出。
apt-get update && apt-get install curl
kubectl exec -n NAMESPACE -c CONTAINER PODNAME curl "URL"