概述
在Node上需要部署Docker
、kubelet
、kube-proxy
,在成功加入Kubernetes集群后,还需要部署CNI网络插件、DNS插件等管理组件。
本节以将192.168.3.138和192.168.3.139两台主机部署为Node为例进行说明。
在部署之前,先确保如下几件事情:
(1) 已经在Node主机上安装了Docker环境,注意k8s与Docker版本的对应关系。 (2) 将Master主机上的ca.crt、client.key、client.crt都拷贝到Node主机的/etc/kubernetes/pki目录下。 (3) 将Master主机上的kubeconfig配置文件拷贝到Node主机的/etc/kubernetes目录下。 (4) 将kubelet程序拷贝到Node主机的/usr/bin目录下。 (5) 将kube-proxy程序拷贝到Node主机的/usr/bin目录下。
对K8S Node节点服务的部署主要包含3部分内容:
- 部署kubelet服务
- 部署kube-proxy服务
- 在Master上通过kubectl验证Node信息
部署kubelet服务
(1)为kubelet服务创建systemd服务配置文件/usr/lib/systemd/system/kubelet.service
,内容如下:
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/kubernetes/kubernetes
After=docker.target
[Service]
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=always
[Install]
WantedBy=multi-user.target
(2)配置文件/etc/kubernetes/kubelet
的内容为通过环境变量KUBELET_ARGS
设置的kubelet的全部启动参数,示例如下:
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --config=/etc/kubernetes/kubelet.config
--hostname-override=192.168.3.138
--network-plugin=cni
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
对主要参数说明如下。
--kubeconfig
:设置与API Server连接的相关配置,可以与kube-controller-manager使用的kubeconfig文件相同。需要将相关客户端证书文件从Master主机复制到Node主机的/etc/kubernetes/pki目录下,例如ca.crt、client.key、client.crt文件。--config
:kubelet配置文件,从Kubernetes 1.10版本开始引入,设置可以让多个Node共享的配置参数,例如address、port、cgroupDriver、clusterDNS、clusterDomain等。--hostname-override
:设置本Node在集群中的名称,默认值为主机名,应将各Node设置为本机IP或域名。--network-plugin
:网络插件类型,建议使用CNI网络插件。
配置文件kubelet.config
的内容示例如下(需要拷贝到/etc/kubernetes
目录下):
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: cgroupfs
clusterDNS: ["169.169.0.100"]
clusterDomain: cluster.local
authentication:
anonymous:
enabled: true
在本例中设置的kubelet参数如下。
address
:服务监听IP地址。port
:服务监听端口号,默认值为10250。cgroupDriver
:设置为cgroupDriver驱动,默认值为cgroupfs,可选项包括systemd。clusterDNS
:集群DNS服务的IP地址,例如169.169.0.100。clusterDomain
:服务DNS域名后缀,例如cluster.local。authentication
:设置是否允许匿名访问或者是否使用webhook进行鉴权。
(3)在配置文件准备完毕后,在各Node主机上启动kubelet服务并设置为开机自启动:
代码语言:javascript复制# 启动kubelet服务并设置为开机启动
systemctl start kubelet && systemctl enable kubelet
# 查看kubelet服务运行状态
systemctl status kubelet
如果启动失败,查看kubelet日志:journalctl -xefu kubelet
。
部署kube-proxy服务
(1)为kube-proxy服务创建systemd服务配置文件/usr/lib/systemd/system/kube-proxy.service
,内容如下:
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=always
[Install]
WantedBy=multi-user.target
(2)配置文件/etc/kubernetes/proxy
的内容为通过环境变量KUBE_PROXY_ARGS
设置的kube-proxy的全部启动参数,示例如下:
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig
--hostname-override=192.168.3.138
--proxy-mode=iptables
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
对主要参数说明如下。
--kubeconfig
:设置与API Server连接的相关配置,可以与kubelet使用的kubeconfig文件相同。相关客户端CA证书使用部署kubelet服务时从Master主机复制到Node主机的/etc/kubernetes/pki目录下的文件,包括ca.crt、client.key和client.crt。--hostname-override
:设置本Node在集群中的名称,默认值为主机名,各Node应被设置为本机IP或域名。--proxy-mode
:代理模式,包括iptables、ipvs、kernelspace(Windows节点使用)等。
上述配置文件需要在所有Node节点进行。
(3)在配置文件准备完毕后,在各Node主机上启动kube-proxy服务,并设置为开机自启动:
代码语言:javascript复制# 启动kube-proxy服务并设置开机启动
systemctl start kube-proxy && systemctl enable kube-proxy
# 查看kube-proxy服务运行状态
systemctl status kube-proxy
如果启动服务失败,查看kube-proxy日志:journalctl -xefu kube-proxy
。
在Master上通过kubectl验证Node信息
在各个Node的kubelet
和kube-proxy
服务正常启动之后,会将本Node自动注册到Master上,然后就可以到Master主机上通过kubectl查询自动注册到Kubernetes集群的Node的信息了。
由于Master开启了HTTPS认证,所以kubectl也需要使用客户端CA证书连接Master,可以直接使用kube-controller-manager
的kubeconfig
文件,命令如下:
[root@m1 ~]# kubectl --kubeconfig=/etc/kubernetes/kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
192.168.3.138 NotReady <none> 3m29s v1.19.0
192.168.3.139 NotReady <none> 2m55s v1.19.0
可以看到各Node的状态为“NotReady”,这是因为还没有部署CNI网络插件,无法设置容器网络。
类似于通过kubeadm创建Kubernetes集群,例如选择Calico CNI插件运行下面的命令一键完成CNI网络插件的部署:
在Master节点上执行如下安装:
代码语言:javascript复制kubectl apply -f "https://docs.projectcalico.org/manifests/calico.yaml"
如果是网络原因无法正常访问https://docs.projectcalico.org/manifests/calico.yaml
,可以先手动下载到本地再执行。
比如保存到本地文件名为:calico.yaml
,则可以执行如下命令:
kubectl apply -f ./calico.yaml
遇到报错:The connection to the server localhost:8080 was refused - did you specify the right host or port?
解决:由于启用了CA认证,所以在使用kubectl命令时也必须指定kubeconfig配置文件。
代码语言:javascript复制kubectl --kubeconfig=/etc/kubernetes/kubeconfig apply -f ./calico.yaml
报错:error: unable to recognize "./calico.yaml": no matches for kind "PodDisruptionBudget" in version "policy/v1"
原因:下载的calico.yaml版本为:v3.26.1,即:https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
由于安装的k8s版本为:v1.19.0
版本,根据calico与k8s的版本对应关系,重新下载v3.19版本的calio.yaml,并命名为:calico_v319.yaml
。
再次执行:
代码语言:javascript复制kubectl --kubeconfig=/etc/kubernetes/kubeconfig apply -f ./calico_v319.yaml
安装成功。
在CNI网络插件成功运行之后,Node的状态会更新为“Ready”:
代码语言:javascript复制[root@m1 ~]# kubectl --kubeconfig=/etc/kubernetes/kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
192.168.3.138 Ready <none> 17h v1.19.0
192.168.3.139 Ready <none> 17h v1.19.0
[root@m1 ~]#
执行如下命令查看Node节点详细信息:
代码语言:javascript复制kubectl --kubeconfig=/etc/kubernetes/kubeconfig describe nodes
卸载cni:如果CNI插件版本不对需要卸载,执行如下命令:
代码语言:javascript复制kubectl --kubeconfig=/etc/kubernetes/kubeconfig delete -f ./calico_v319.yaml