我想做什么:
出于我自己的教育目的,我试图启动kube API服务器并将kubelet注册为节点。我正在一个运行Linux和docker runtime的无聊的盒子中进行此练习。
我到目前为止所做的是:
$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
$./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
答案 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容器。