什么时候需要kubectl代理?

时间:2019-03-14 00:32:21

标签: kubernetes

我正在经历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的版本。

有人能阐明这些明显的矛盾吗?

4 个答案:

答案 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 runkubectl 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通信而不在应用程序内部实现安全逻辑和群集配置时。


它阻止以下客户端应用程序:

  • 实施身份验证逻辑
  • 可以访问安全凭据(证书)
  • 要传递给应用程序的集群信息,代理将处理连接,并且该应用程序在本地主机上运行
  • 限制对某些API路径的访问
  • 在客户端和服务器之间强制建立安全的SSL连接
  • 随时撤消访问而无需撤消证书

不要混淆kubectl proxydocs上列出的其他代理