使用 minikube 时如何访问 Kubernetes API?

How to access Kubernetes API when using minkube?

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

运行 minikube start 会自动配置 kubectl.

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


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

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


Update2:客户端证书和密钥通常存储在:~/.minikube/profiles/minikube目录,当您使用版本>=0.19时(more informations).由于自签名证书,您可能需要为 curl 客户端设置 --insecure 选项。

使用 运行 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.

我看了很多答案,但很多都是错的。

在我们这样做之前,我们需要 IP 和令牌。

如何获取IP: minikube ip 如何生成令牌

$export secret=kubectl get serviceaccount default -o json | jq -r '.secrets[].name'

$kubectl get secret $secret -o yaml | grep "token:" | awk {'print '} |  base64 -D > token

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

那么,正确的命令是:

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

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

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

以上大部分答案在他们自己的意义上都是正确的。

我会给出我的答案版本:

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

回答:我认为这很简单。按照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 来点击 api-server 使用 curl

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.

用户 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感兴趣。

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

  1. 使用“minikube mount [path-to-folder]:/host 安装本地主机的 .minikube 文件夹。这样,您就可以从 node.If 中访问证书不知道此文件夹的确切路径,您可以通过查看 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 在这里,我们正在传递要使用的证书。请注意我是如何不使用代理客户端的。

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