kubelet 参数

大番茄 2020年12月17日 505次浏览
--address                 # 监听地址, 默认所有地址。
--port                    # kubelet提供的服务端口, https端口。默认10250.
--read-only-port          # kubelet提供的非认证只读服务端口,http端口。 默认10255.

--bootstrap-kubeconfig    # 指定bootstrap认证文件, 通过bootstrap获取自动颁发的证书。如果--kubeconfig已经指定了证书,这个就不需要了。
--max-pods                # 最多运行的pod数量,默认110.
--cert-dir                # 自动获取的证书会放到这个目录
--cgroup-driver           # 指定cgroup驱动,需要跟docker的一致,(systemd,  cgroupfs)。
--hostname-override       # 节点名称,默认主机名。节点名称代表了在集群里的唯一节点。kubelet注册这个名称到apiserver,也会去查找这个名称的信息。kube-proxy也有这个配置,需要都一样,这样才能从集群里检测到这个节点。
--cluster-dns             # 集群dns的ip。如果pod的`dnsPolicy=ClusterFirst`,默认也是这样。 容器里的DNS指向的就是这个DNS。
--cluster-domain          # 集群dns中的域名后缀,需要与安装的集群dns中设置的一致。
--node-labels             # 节点添加label,只有新添加的节点才有效。
--kubeconfig              # 指定连接apiserver的信息。 如果指定的文件不存在,并且bootstrap-kubeconfig有设置, 会自动根据获取到的证书生成这个文件。
--root-dir                # 设置kubelet的根目录, emptyDir临时卷是在这个目录下。
--pod-infra-container-image    # 指定pause镜像的地址,不指定就是默认的海外地址。
--rotate-certificates      # 自动轮换和续订客户端证书。
--rotate-server-certificates  # 自动轮换和续订kubelet服务证书。就是`--port`指定的https端口使用的证书。
# 上面这两个rotate参数可以一起用。 
--tls-cert-file           # 手动指定kubelet服务证书。 指定以后应该就不能使用`--rotate-server-certificates`参数了,没有测试过。
--tls-private-key-file    #
--node-ip                 # 指定使用的ip, 这个ip就是kubelet在apiserver那里的ip。 用于有多个网卡的情况下,自动判断的ip不对。
--pod-manifest-path       # 静态pod 文件位置。以点(.)开头的配置文件名会被忽略。  配置文件扩展名没有要求。 这个参数没有默认目录,不指定就没有。

# 网络相关
--network-plugin          # 调用的网络插件名称。如:--network-plugin=cni
--cni-bin-dir             # cni网络插件目录,默认/opt/cni/bin
--cni-conf-dir            # cni网络插件的配置目录,默认/etc/cni/net.d

# kubelet服务端口的身份认证
--client-ca-file          # 开启证书认证。
--anonymous-auth          # 匿名访问,默认true。
--authentication-token-webhook  #  webhook认证,去向apiserver请求用户是否存在。
--authentication-token-webhook-cache-ttl #  认证成功的缓存, 默认2m0s。

# kubelet服务端口的鉴权
--authorization-mode      # 默认`AlwaysAllow`, 可选 `Webhook`, `Webhook` 是向apiserver请求认证。
--authorization-webhook-cache-authorized-ttl  # webhook认证成功的缓存时间,默认 5m0s。
--authorization-webhook-cache-unauthorized-ttl # 认证失败的缓存时间, 默认 30s。



kubelet认证相关的:
https://www.yxingxing.net/archives/kubelet-20201216-authentication


--node-labels

给节点添加label,只有新节点才有效。 节点已经添加,就没有效果了。

增加label, arch=x86_64, disk=ssd

--node-labels=arch=x86_64,disk=ssd

--cluster-domain

会在容器的/etc/resolv.conf添加search配置。
如:

root@mynginx-75b67b9f8-gb6sk:/# cat /etc/resolv.conf
nameserver 10.0.0.2
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

如果请求的名称不是以根.结尾, 会分别加上search后面的指定的后缀组成完整的FQDN(完全合格域名)来向DNS服务器查询。
所以这个参数一定要与DNS服务器里的配置一样。

--anonymous-auth

匿名访问,默认启用。
可以匿名访问https端口。
kubectl log, exec之类的命令都需要apiserver去访问kubelt,如果关闭匿名访问,需要单独配置kubelet认证。
https://www.yxingxing.net/archives/kubelet-20201216-authentication


kubelet有两套证书

一个是作为客户端连接apiserver,向apiserver表明身份的证书。
一个是kubelet自己提供服务的https端口的。


--bootstrap-kubeconfig

kubelet刚加入集群的时候可以通过bootstrap-token自动获取证书。
如果已经通过--kubeconfig手动指定了证书,这个就没有效果了。

详细配置流程:
这个页面不要选择语言为中文, 发现页面不一样(20201219),看起来是非常老的信息,而且也是英文的。
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/

https://www.yxingxing.net/archives/kubernetes-20191123-kubelet#%E4%BA%94%E9%85%8D%E7%BD%AE%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E8%AF%81%E4%B9%A6

--rotate-certificates

如果--kubeconfig已经手动指定了证书,这个应该就不起作用了。没有测试过。

当证书快过期时向apiserver请求新的证书。只要权限够,证书是自动签署的,不用手动操作。 是用于向apiserver表明身份的证书。
这个快过期具体是多少没有看到具体的计算方式。
测试1小时过期,在45分钟左右时会请求新的证书。
需要有续订证书的权限才行。具体配置跟--bootstrap-kubeconfig在一个页面。

--rotate-server-certificates

如果已经通过--tls-cert-file,--tls-private-key-file 手动指定了证书,这个参数应该就没有效果了,没有测试过。

这个参数一般不用,用来续订kubelet自己使用的证书, 就是自己对外提供的https --port参数端口的证书。而且这个续订不是自动的,需要手动批准证书的签署。
而且就算不手动指定证书也不添加这个参数, kubelet是会生成自签证书的。下面有个例子。


--bootstrap-kubeconfig--rotate-certificates--rotate-server-certificates 这三个参数官方文档里在一个页面介绍的。
但是要区分三者的不同。

--bootstrap-kubeconfig 用于初始化节点时向apiserver表名身份,然后获取kubelet连接apiserver的证书, 以后kubelet就使用证书来表名身份了。如果kubelet的证书是手动指定的,那个参数就不需要了。

--rotate-certificates 用于轮换证书的,这个证书就是kubelet连接apiserver的证书。 这时使用的是已经拥有的证书来向apiserver发起的请求。

--rotate-server-certificates 用于轮换服务证书的,这个是kubelet自己提供服务的https端口的证书。 而发起请求使用的还是连接apiserver的证书。


服务证书的例子

https://v1-19.docs.kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#client-and-serving-certificates

kubelet的 --port 指定的端口是https端口, 这个端口的证书是由--tls-cert-file--tls-private-key-file参数提供的,如果没有提供会生成自签名证书放到--cert-dir指定的目录里:

-rw-r--r-- 1 root root 2250 Dec 16 11:06 kubelet.crt
-rw------- 1 root root 1675 Dec 16 11:06 kubelet.key

如果kubelet有--rotate-server-certificates参数,并且RotateKubeletServerCertificate功能标记也启用了,默认是启用的。

会向apiserver发起csr请求。 当然前提是kubelet向apiserver认证的证书已经有了。
其它的都跟自动续订证书的配置一样。

完成以后kubectl命令就可以看到一些东西了。
需要签署的是kubernetes.io/kubelet-serving证书。

[root@k8smaster1 k8s]# kubectl get csr
NAME        AGE   SIGNERNAME                                    REQUESTOR              CONDITION
csr-46fzp   26m   kubernetes.io/kube-apiserver-client-kubelet   system:node:k8snode1   Approved,Issued
csr-dm8sj   81s   kubernetes.io/kubelet-serving                 system:node:k8snode1   Pending

手动签署证书:

[root@k8smaster1 k8s]# kubectl certificate approve csr-dm8sj
certificatesigningrequest.certificates.k8s.io/csr-dm8sj approved
[root@k8smaster1 k8s]# kubectl get csr
NAME        AGE    SIGNERNAME                                    REQUESTOR              CONDITION
csr-46fzp   26m    kubernetes.io/kube-apiserver-client-kubelet   system:node:k8snode1   Approved,Issued
csr-dm8sj   102s   kubernetes.io/kubelet-serving                 system:node:k8snode1   Approved,Issued

可以看到kubelet的--cert-dir目录里多了server证书。

[root@k8snode1 cert]# ll
total 36
-rw------- 1 root root 1598 Dec 16 11:13 kubelet-client-2020-12-16-11-13-01.pem
-rw------- 1 root root 1598 Dec 16 11:55 kubelet-client-2020-12-16-11-55-52.pem
-rw------- 1 root root 1598 Dec 16 12:44 kubelet-client-2020-12-16-12-44-21.pem
-rw------- 1 root root 1598 Dec 16 13:27 kubelet-client-2020-12-16-13-27-00.pem
-rw------- 1 root root 1598 Dec 16 14:13 kubelet-client-2020-12-16-14-13-21.pem
-rw------- 1 root root 1598 Dec 16 14:56 kubelet-client-2020-12-16-14-56-29.pem
-rw------- 1 root root 1598 Dec 16 15:44 kubelet-client-2020-12-16-15-44-36.pem
-rw------- 1 root root 1598 Dec 16 16:24 kubelet-client-2020-12-16-16-24-14.pem
lrwxrwxrwx 1 root root   59 Dec 16 16:24 kubelet-client-current.pem -> /opt/kubernetes/cert/kubelet-client-2020-12-16-16-24-14.pem
-rw------- 1 root root 1634 Dec 16 16:11 kubelet-server-2020-12-16-16-11-28.pem
lrwxrwxrwx 1 root root   59 Dec 16 16:11 kubelet-server-current.pem -> /opt/kubernetes/cert/kubelet-server-2020-12-16-16-11-28.pem

参数配置

测试环境:

[Unit]
Description=kubelet
Requires=docker.service

[Service]
ExecStart=/opt/kubernetes/bin/kubelet \
--bootstrap-kubeconfig=/opt/kubernetes/conf/bootstrp-kubeconfig \
--cert-dir=/opt/kubernetes/cert \
--cgroup-driver=systemd \
--cluster-dns=10.0.0.2 \
--cluster-domain=cluster.local \
--kubeconfig=/opt/kubernetes/conf/kubeconfig \
--log-dir=/opt/kubernetes/log/kubelet \
--logtostderr=false \
--rotate-certificates \
--v=4 \
--network-plugin=cni \
--client-ca-file=/opt/kubernetes/cert/kubernetes-ca.pem \
--authentication-token-webhook \
--anonymous-auth=false \
--authorization-mode=Webhook \
--authorization-webhook-cache-authorized-ttl=0s \
--authorization-webhook-cache-unauthorized-ttl=0s \
--root-dir=/opt/data/kubelet-data \
--pod-infra-container-image=harbor.qfpay.net/k8s/pause:3.2

Restart=on-failure

[Install]
WantedBy=multi-user.target