【问题标题】:How to access Kubernetes API when using minkube?使用 minikube 时如何访问 Kubernetes API?
【发布时间】:2017-04-04 21:30:01
【问题描述】:

通过 kubernetes api 使用 minikube 设置 kubernetes 集群的正确方法是什么? 目前找不到可以访问kubernetes集群的端口。

【问题讨论】:

    标签: kubernetes minikube


    【解决方案1】:

    运行minikube start会自动配置kubectl

    您可以运行minikube ip 来获取您的 minikube 所在的 IP。 API 服务器默认运行在 8443 上。


    更新:要直接访问 API 服务器,您需要使用已生成的自定义 SSL 证书。通过 minikube。客户端证书和密钥通常存储在:~/.minikube/apiserver.crt~/.minikube/apiserver.key。当您发出请求时,您必须将它们加载到您的 HTTPS 客户端中。

    如果您使用的是curl,请使用--cert--key 选项来使用证书和密钥文件。查看docs了解更多详情。

    【讨论】:

    • 是的,但是如果你查询api-server,那么它将通过“未经授权的请求”错误!那么如何克服这个错误呢?
    • kubectl 抛出这个错误,还是你尝试直接访问 API 服务器(curl 类型)?
    • 不,我没有使用 kubectl,而是直接使用 CURL ping API 端点
    • 同样的问题,如果我在没有 minikube 的情况下运行 kubernetes,它会询问我基本凭据,但对于 minikube,它从未询问过凭据,它直接显示未经授权的消息
    【解决方案2】:

    在运行 minikube 时访问 Kubernetes API 的最简单方法是使用

    kubectl proxy --port=8080
    

    然后您可以通过

    访问 API
    curl http://localhost:8080/api/
    

    这还允许您在浏览器中浏览 API。启动 minikube 使用

    minikube start --extra-config=apiserver.Features.EnableSwaggerUI=true
    

    然后启动kubectl proxy,并在浏览器中导航至http://localhost:8080/swagger-ui/

    可以直接使用 curl 访问 Kubernetes API

    curl --cacert ~/.minikube/ca.crt --cert ~/.minikube/client.crt --key ~/.minikube/client.key https://`minikube ip`:8443/api/
    

    但通常这样做没有任何好处。普通浏览器对 minikube 生成的证书不满意,所以如果你想用你的浏览器访问 API,你需要使用kubectl proxy

    【讨论】:

    • 对于带有 k8s v1.10.0 的 minikube v0.28.0,以下工作可启用 swagger ui:minikube start --extra-config=apiserver.enable-swagger-ui=true
    • 将这些公开访问/公开是否安全?
    • 如果我在 GCP VM 上运行 minikube,我无法从外部访问 8080。考虑到现在端口 8080 服务于 HTTPS 连接,我该怎么做?
    • @RumeshMadhusanka 您需要创建防火墙规则来为您的虚拟机打开端口 8080。一种方法是导航到 console.cloud.google.com/networking/firewalls/list 并通过 Web 控制台创建规则。
    【解决方案3】:

    我查看了很多答案,但其中很多都是错误的。

    在此之前,我们需要 IP 和令牌。

    如何获取IP:minikube ip 如何生成Token

    $export secret=kubectl get serviceaccount default -o json | jq -r '.secrets[].name'
    
    $kubectl get secret $secret -o yaml | grep "token:" | awk {'print $2'} |  base64 -D > token
    

    注意:base64 对 mac 使用 -D,但对 Linux 使用 -d。

    那么,正确的命令是:

    #curl -v -k -H --cacert ~/.minikube/ca.crt -H "Authorization: Bearer $(cat ~/YOUR_TOKEN)"  "https://{YOUR_IP}:8443/api/v1/pods"
    

    【讨论】:

    • 谢谢。这是最完整的答案,因为它谈到了访问 API 所需的不记名令牌。
    • 为了避免在获取秘密名称时依赖jq,您可以运行$export secret=$(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}')。也不需要grepawk,只需运行kubectl get secret $secret -o jsonpath='{.data.token}' | base64 --decode
    【解决方案4】:

    这些说明对我有用https://github.com/jenkinsci/kubernetes-plugin#configuration-on-minikube

    需要生成和上传 pfx 文件,以及其中提到的其他步骤。

    【讨论】:

      【解决方案5】:

      上面的大多数答案在他们自己的意义上都是正确的。

      我会给出我的答案:

      1) 通过 Kubernetes API 使用 minikube 设置 Kubernetes 集群的正确方法是什么?

      Ans:我认为这很简单。按照minikube installation的官方k8s文档中提到的安装步骤进行操作

      2) 暂时找不到可以访问kubernetes集群的端口。

      Ans:这也有一个直截了当的答案。你必须检查你的 Kube 配置文件。您可以在您的主目录~/.kube/config 中找到它。查看此文件,它将包含详细信息。

      apiVersion: v1
      clusters:
      - cluster:
          certificate-authority: /Users/username/.minikube/ca.crt
          server: https://192.168.64.2:8443
        name: minikube
      contexts:
      - context:
          cluster: minikube
          namespace: default
          user: minikube
        name: minikube
      current-context: minikube
      kind: Config
      preferences: {}
      users:
      - name: minikube
        user:
          client-certificate: /Users/username/.minikube/client.crt
          client-key: /Users/username/.minikube/client.key
      

      这里提到的server 细节是您要命中的api-server 端点。

      您可以使用kubectl 命令和kubectl config view 一样查看此信息

      使用下面的 curl 使用 curl 来点击 api-server

      curl https://192.168.64.2:8443/api/v1/pod --key /Users/sanjay/.minikube/client.key --cert /Users/sanjay/.minikube/client.crt --cacert /Users/sanjay/.minikube/ca.crt
      

      注意:replace the ip port and the path as per your config file in above command.

      【讨论】:

        【解决方案6】:

        用户 Sven Marnach 让我找到了正确的方向,但是为了获得正确的服务器 ip、crt 和密钥位置,我运行了 kubectl config view

        $ kubectl config view
        apiVersion: v1
        clusters:
        - cluster:
            certificate-authority: /Users/user/.minikube/ca.crt
            server: https://127.0.0.1:32792
          name: minikube
        contexts:
        - context:
            cluster: minikube
            user: minikube
          name: minikube
        current-context: minikube
        kind: Config
        preferences: {}
        users:
        - name: minikube
          user:
            client-certificate: /Users/user/.minikube/profiles/minikube/client.crt
            client-key: /Users/user/.minikube/profiles/minikube/client.key
        
        $ curl --cacert ~/.minikube/ca.crt --cert ~/.minikube/profiles/minikube/client.crt --key ~/.minikube/profiles/minikube/client.key https://127.0.0.1:32792/api/
        {
          "kind": "APIVersions",
          "versions": [
            "v1"
          ],
          "serverAddressByClientCIDRs": [
            {
              "clientCIDR": "0.0.0.0/0",
              "serverAddress": "172.17.0.2:8443"
            }
          ]
        }
        
         $ curl -s --cacert ~/.minikube/ca.crt --cert ~/.minikube/profiles/minikube/client.crt --key ~/.minikube/profiles/minikube/client.key https://127.0.0.1:32792/api/v1/pods | jq .items[].metadata | jq '"\(.name), \(.namespace), \(.selfLink)"'
        "shell-demo, default, /api/v1/namespaces/default/pods/shell-demo"
        "coredns-f9fd979d6-6b2nx, kube-system, /api/v1/namespaces/kube-system/pods/coredns-f9fd979d6-6b2nx"
        "etcd-minikube, kube-system, /api/v1/namespaces/kube-system/pods/etcd-minikube"
        "kube-apiserver-minikube, kube-system, /api/v1/namespaces/kube-system/pods/kube-apiserver-minikube"
        "kube-controller-manager-minikube, kube-system, /api/v1/namespaces/kube-system/pods/kube-controller-manager-minikube"
        "kube-proxy-bbck9, kube-system, /api/v1/namespaces/kube-system/pods/kube-proxy-bbck9"
        "kube-scheduler-minikube, kube-system, /api/v1/namespaces/kube-system/pods/kube-scheduler-minikube"
        "storage-provisioner, kube-system, /api/v1/namespaces/kube-system/pods/storage-provisioner"
        

        读者也可能对link感兴趣。

        【讨论】:

          【解决方案7】:

          对于 windows 用户,这里是更简单的kubectl proxy 命令的替代方法:

          1. 使用 "minikube mount [path-to-folder]:/host 挂载本地主机的 .minikube 文件夹。这样,您将能够从节点内访问证书。如果您不知道该文件夹的确切路径,您可以获取它通过查看 kubectl config view 响应。

          2. 在不同的命令提示符下,记下您的 kube api 服务器的 IP。这可以通过您的主机 (windows) minikube ip 运行来完成。请注意,这是您的 minikube 容器中的虚拟 IP。

          3. 在 minikube 容器中启动 bash。 docker exec -it {your-container-id} bash

          4. 访问您在第 1 点安装的文件夹)。现在,只需通过 2 中的虚拟 ip curl 到 Kubectl api 服务器。):

            curl https://{your-ip-from-2}:8443/api --key ./ca.key --cert ./ca.crt 在这里,我们正在传递要使用的证书。请注意我没有使用代理客户端。

          就是这样。出于学习目的,我认为这是一种比直接代理更有趣的方法。

          【讨论】:

            猜你喜欢
            • 2019-12-16
            • 2017-07-13
            • 1970-01-01
            • 2018-04-20
            • 2019-05-17
            • 2020-06-17
            • 2018-06-26
            • 2022-01-05
            • 2018-05-28
            相关资源
            最近更新 更多