将kubelet注册到kube-apiserver

时间:2019-11-01 09:03:16

标签: kubernetes

我想做什么:

出于我自己的教育目的,我试图启动kube API服务器并将kubelet注册为节点。我正在一个运行Linux和docker runtime的无聊的盒子中进行此练习。

我到目前为止所做的是:

  1. 我已经使用主机网络运行了dockerized etcd:
$docker run --volume=$PWD/etcd-data:/default.etcd --detach --net=host quay.io/coreos/etcd

$docker ps
CONTAINER ID        IMAGE                 COMMAND                 CREATED             STATUS              PORTS               NAMES
3f4a42fce24a        quay.io/coreos/etcd   "/usr/local/bin/etcd"   2 hours ago         Up 2 hours                              awesome_bartik
  1. 我已经启动了将其连接到etcd的API服务器
$./kube-apiserver --etcd-servers=http://127.0.0.1:2379 --service-cluster-ip-range=10.0.0.0/16 

服务器v.1.16已启动并正在运行,如下所示:

$curl http://localhost:8080/version
{
  "major": "1",
  "minor": "16",
  "gitVersion": "v1.16.0",
  "gitCommit": "2bd9643cee5b3b3a5ecbd3af49d09018f0773c77",
  "gitTreeState": "clean",
  "buildDate": "2019-09-18T14:27:17Z",
  "goVersion": "go1.12.9",
  "compiler": "gc",
  "platform": "linux/amd64"
}

尚未注册任何节点。

我尚无法实现的目标:

现在,我想启动kubelet并将其注册为Node。在早期版本中,可以使用--api-servers标志来实现,但是该标志已经被删除,并且该配置应该位于单独的kubelet配置文件中。

我的问题是如何在kubelet配置文件中配置对API服务器的访问? here也提供了类似的讨论,但并没有太大帮助。 here提供了kubelet配置选项。

到目前为止,配置文件看起来像这样……似乎staticPodURL绝对不是正确的配置:-)

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
staticPodURL: http://localhost:8080
failSwapOn: false
authentication:
  anonymous:
    enabled: true
  webhook:
    enabled: false
authorization:
  mode: AlwaysAllow

1 个答案:

答案 0 :(得分:1)

经过大量的挖掘,我设法使kubelet注册到kube-api服务器中,这为进一步构建每个组件的小型k8s集群组件打开了道路。

我在kubelet配置中寻找的标志如下:

  

-kubeconfig字符串

     

kubeconfig文件的路径,指定如何连接到API服务器。提供--kubeconfig启用API服务器   模式,省略--kubeconfig启用独立模式。

现在我有两个配置文件:

$ cat 02.kubelet-api-server-config.yaml 
apiVersion: v1
kind: Config
clusters:
  - cluster:
      server: http://localhost:8080
    name: kubernetes
contexts:
  - context:
      cluster: kubernetes
    name: system:node:java2dayskube@kubernetes
current-context: system:node:java2dayskube@kubernetes
preferences: {}


$ cat 02.kubelet-base-config.yaml 
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
staticPodURL: http://localhost:8080
failSwapOn: false
authentication:
  anonymous:
    enabled: true
  webhook:
    enabled: false
authorization:
  mode: AlwaysAllow

如上所述,API服务器已启动并正在运行,因此我现在可以启动kubelet:

sudo ./kubelet --config=02.kubelet-base-config.yaml --kubeconfig=02.kubelet-api-server-config.yaml

很明显,kubelet已将其自身注册为API服务器中的节点(为简洁起见,跳过了详细信息):

$ curl http://localhost:8080/api/v1/nodes
{
  "kind": "NodeList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/nodes",
    "resourceVersion": "62"
  },
  "items": [
    {
      "metadata": {
        "name": "vagrant",
        ...
        "creationTimestamp": "2019-11-03T09:12:18Z",
        "labels": {
          "beta.kubernetes.io/arch": "amd64",
          "beta.kubernetes.io/os": "linux",
          "kubernetes.io/arch": "amd64",
          "kubernetes.io/hostname": "vagrant",
          "kubernetes.io/os": "linux"
        },
        "annotations": {
          "volumes.kubernetes.io/controller-managed-attach-detach": "true"
        }
      },
      "spec": {
        "taints": [
          {
            "key": "node.kubernetes.io/not-ready",
            "effect": "NoSchedule"
          }
        ]
      }
      ...
} 

我已经通过向api服务器发出POST请求来设法创建了一个Pod。已通知kubelet并跨越了相应的docker容器。