我正在经历Kubernetes tutorial的第二个模块,对于何时需要kubectl proxy
感到困惑。
我感到困惑的原因是,在本教程中,可以在设置代理之前使用命令kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
创建一个Deployment(即将Docker映像作为容器放置在Pod中)。部署映像似乎需要访问节点。
该教程说:“默认情况下,[kus,即容器组]在同一个kubernetes集群中的其他Pod和服务中可见,但在该网络外部不可见。”因此,它指示我们在尝试直接kubectl proxy
(例如,curl
)的广告连播之前,先用curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
设置代理。但是我们已经能够在没有代理的情况下部署这些Pod。我们可以部署它们但不能查询它们似乎很奇怪。
类似地,本教程还让我们在尝试使用带有curl http://localhost:8001/version
的Kubernetes API来获取版本之前设置了代理(我相信localhost:8001
是代理)。但是,更早之前,我们能够使用kubectl version
来查询没有代理的版本,该代理同时返回主节点上的kubectl
和 Kubernetes的版本。
有人能阐明这些明显的矛盾吗?
答案 0 :(得分:6)
在运行kubectl
命令时,CLI会确定Kubernetes API服务器的地址,即用来验证服务器证书的CA(以确保您是在与受信任的服务器而不是与某些管理员进行对话)中间)和您的客户端凭据(来自kubeconfig文件)(用于使用mTLS建立到服务器的加密身份验证连接),默认情况下该文件位于~/.kube/config
中。您可以在教程中cat
对该文件进行查看,以查看其中的内容:
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority: /root/.minikube/ca.crt
server: https://172.17.0.26:8443
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /root/.minikube/client.crt
client-key: /root/.minikube/client.key
您可以在没有代理的情况下等效于本教程中发生的事情,如下所示:
$ curl \
--cacert /root/.minikube/ca.crt \
--cert /root/.minikube/client.crt \
--key /root/.minikube/client.key \
https://172.17.0.26:8443/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-5gzp5 | v=1
您可以看到,在运行proxy命令之后,需要运行的结果curl命令更加简单和便捷:
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
您无需费心弄清楚API服务器的地址或处理所有这些证书和密钥,只需连接到本地主机,然后在本地运行的本地代理即可处理与API和代理之间的安全且经过身份验证的连接从API服务器返回给您的响应。
现在,您需要与Kubernetes API进行的大多数交互都可以直接通过kubectl
命令完成,很少需要直接curl
进行API交互。发出kubectl run
或kubectl version
命令时,您会看到此信息。实际上,您观察到您后来通过curl
找到了版本信息,但实际上并不需要这样做,因为您可以直接运行kubectl version
。
因此,您可能仅在需要直接使用kubectl proxy
Kubernetes API时才使用curl
,因为没有本机的kubectl
命令可以让您执行想要的操作 and < / em>,当您希望不使用带有所有cert标志等的更复杂的curl
命令的便利时。
好的,但是何时真正需要直接curl
API?同样,通常永远不会。但是,除了作为用于创建和删除Kubernetes资源(pod,部署,服务,pvc等)的RESTful API之外,API所做的一件事是它还充当了内部容器网络的代理。现成的,除了通过位于/api/v1/namespaces/default/pods/$POD_NAME/proxy/
的Kubernetes API提供的代理端点之外,无法将流量发送到您在本教程中运行的容器。
您在问题注释中链接的StackOverflow question具有可接受的答案,该答案解释了将流量发送到运行中的容器的其他几种方法。对于现实世界的应用程序,您可能想使用Kubernetes API服务器本身上的代理端点之外的其他东西,但是代理端点是通过网络与已部署的容器进行交互的一种快速简便的方法,因此它在设置更健壮和复杂的基础结构以处理到您的容器的入口流量之前,您可能想在开发生命周期的早期阶段做些事情。
因此将它们放在一起:何时将Web应用程序部署到Kubernetes ,并且您要向其发送请求并且不想(尚未)设置一些更复杂但更健壮的方法来获取到容器的入口流量,可以使用位于Kubernetes API服务器/api/v1/namespaces/default/pods/$POD_NAME/proxy/
上的容器网络代理API。没有kubectl
命令会为您命中该端点,因此您必须直接对其进行卷曲(或在浏览器中打开)。 当您想直接curl
直接任何一个Kuberentes服务器API终结点并且时,您不想将一堆标志传递给您的curl
命令,然后运行kubectl proxy
可使您运行针对该本地代理的更简单的curl
命令,该命令会将您的请求代理到Kubernetes API。
最后一点说明,这里有两个完全不同的代理。一种是本地代理,将您的请求代理到Kuberentes API服务器的 any 端点。 Kubernetes API服务器拥有的一个这样的(类型)端点本身就是部署容器的内部网络的代理。 (此外,容器网络内部有一些代理可以使事情在后台运行,但为了简单起见,无需在此答案中进行讨论)。不要混淆这两个代理。
答案 1 :(得分:0)
我通常使用kubectl代理查询API服务器。如下所示
kubectl proxy --port=8001 &
curl 127.0.0.1:8001/version
curl 127.0.0.1:8001/metrics
curl 127.0.0.1:8001/api/v1/namespaces
curl 127.0.0.1:8001/api/v1/namespaces/kube-system
curl 127.0.0.1:8001/api/v1/namespaces/kube-system/services
curl 127.0.0.1:8001/api/v1/namespaces/kube-system/services/kube-dns
答案 2 :(得分:0)
代理服务器运行时,可以使用 curl , wget 或浏览器浏览kubernetes API。
获取API版本:
curl http://localhost:8080/api/
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.15:8443"
}
]
}
获取豆荚列表:
curl http://localhost:8080/api/v1/namespaces/default/pods
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "33074"
},
"items": [
{
"metadata": {
"name": "kubernetes-bootcamp-2321272333-ix8pt",
"generateName": "kubernetes-bootcamp-2321272333-",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/pods/kubernetes-bootcamp-2321272333-ix8pt",
"uid": "ba21457c-6b1d-11e6-85f7-1ef9f1dab92b",
"resourceVersion": "33003",
"creationTimestamp": "2016-08-25T23:43:30Z",
"labels": {
"pod-template-hash": "2321272333",
"run": "kubernetes-bootcamp"
},
...
}
此外,您可以点击一些k8s-service来检查服务是否确实连接到所需的部署/吊舱
http://localhost:8001/api/v1/namespaces/<namespace-name>/services/<service-name>:<service-port>/proxy/
答案 3 :(得分:0)
何时需要kubectl代理?
当应用程序需要与API Server通信而不在应用程序内部实现安全逻辑和群集配置时。
它阻止以下客户端应用程序:
不要混淆kubectl proxy
与docs上列出的其他代理