--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/
--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的证书。
服务证书的例子
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