kubernetes 每个节点运行一个容器_node 安装


通过上一篇文章“Kubernetes二进制安装之Master节点部署”的详细安装过程,我们清楚的了解到Kubernetes api-server,scheduler,controller-manager组件的工作原理,以及详细的配置参数。本篇文章我们着重介绍Kubernetes Node节点的安装过程。

  • kublet 运行在每个node节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如exec、run、logs 等;
  • kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况;

下面我们通过具体的步骤来描述下Node节点的安装过程。

步骤一:解压安装包,拷贝Kubernetes二进制文件到Node节点;

  • 在node01,node02,node03上分别执行如下命令,创建安装目录:
mkdir /k8s/etcd/{bin,cfg,ssl} -pmkdir /k8s/kubernetes/{bin,cfg,ssl} -p
  • 我们把所有需要用到的安装包都统一放到Master节点data目录存储,因此在Master节点执行如下命令解压缩包:
tar -zxvf kubernetes-node-linux-amd64.tar.gz
  • 拷贝二进制文件到node01,node02,node03
cd kubernetes/node/bin/scp kubelet kube-proxy node01:/k8s/kubernetes/bin/scp kubelet kube-proxy node02:/k8s/kubernetes/bin/scp kubelet kube-proxy node03:/k8s/kubernetes/bin/
  • 分别在node01,node02,node03上执行如下命令创建存放log目录:
mkdir /var/log/{kubernetes,etcd,flanneld} -p

步骤二:分发证书文件到Node节点;

  • 在安装Master节点的过程中,我们已经生成了证书文件,在Node节点的安装时候,我们只需要把证书文件分别拷贝到node01,node02,node03就可以了,执行如下命令:
cd /k8s/kubernetes/sslscp *.pem root@node01:/k8s/kubernetes/sslscp *.pem root@node02:/k8s/kubernetes/sslscp *.pem root@node03:/k8s/kubernetes/ssl

步骤三:创建kubelet bootstrap kubeconfig文件;

  • 在Master节点创建一个shell脚本用于生成配置文件:
vi env.sh# 创建kubelet bootstrapping kubeconfig BOOTSTRAP_TOKEN=cbe0a862edd731ae54b9dd147b054424KUBE_APISERVER="https://master:6443"# 设置集群参数kubectl config set-cluster kubernetes  --certificate-authority=/k8s/kubernetes/ssl/ca.pem  --embed-certs=true  --server=${KUBE_APISERVER}  --kubeconfig=bootstrap.kubeconfig# 设置客户端认证参数kubectl config set-credentials kubelet-bootstrap  --token=${BOOTSTRAP_TOKEN}  --kubeconfig=bootstrap.kubeconfig# 设置上下文参数kubectl config set-context default  --cluster=kubernetes  --user=kubelet-bootstrap  --kubeconfig=bootstrap.kubeconfig# 设置默认上下文kubectl config use-context default --kubeconfig=bootstrap.kubeconfig#----------------------# 创建kube-proxy kubeconfig文件kubectl config set-cluster kubernetes  --certificate-authority=/k8s/kubernetes/ssl/ca.pem  --embed-certs=true  --server=${KUBE_APISERVER}  --kubeconfig=kube-proxy.kubeconfigkubectl config set-credentials kube-proxy  --client-certificate=/k8s/kubernetes/ssl/kube-proxy.pem  --client-key=/k8s/kubernetes/ssl/kube-proxy-key.pem  --embed-certs=true  --kubeconfig=kube-proxy.kubeconfigkubectl config set-context default  --cluster=kubernetes  --user=kube-proxy  --kubeconfig=kube-proxy.kubeconfigkubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  • 然后执行该shell脚本
./env.sh
  • 将生成的配置文件分发到node01,node02,node03节点
cp bootstrap.kubeconfig kube-proxy.kubeconfig /k8s/kubernetes/cfg/scp bootstrap.kubeconfig kube-proxy.kubeconfig node01:/k8s/kubernetes/cfg/scp bootstrap.kubeconfig kube-proxy.kubeconfig node02:/k8s/kubernetes/cfg/scp bootstrap.kubeconfig kube-proxy.kubeconfig node03:/k8s/kubernetes/cfg/

步骤四:部署Kuberbetes kubelet组件

  • 创建 kubelet 参数配置模板文件
vi /k8s/kubernetes/cfg/kubelet.config


kubernetes 每个节点运行一个容器_配置文件_02


  • 创建node01 kubelet配置文件
vi /k8s/kubernetes/cfg/kubelet


kubernetes 每个节点运行一个容器_node 安装_03


  1. --logtostderr:log是否写入系统文件;
  2. --v:log级别;
  3. --address:绑定的ip地址,0.0.0.0表示监听所有的IP地址;
  4. --anonymous-auth:是否允许auth
  5. --authorization-mode:authorization认证模式,有如下值可选:AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node. (default [AlwaysAllow]);
  6. --enable-server:是否开启server模式;
  7. --healthz-bind-address:健康检查绑定的ip地址;
  8. --healthz-port:健康检查绑定的port;
  9. --node-ip:节点的ip地址;
  10. --port:节点的port,默认是10250;
  11. --read-only-port:只读端口;
  12. --register-node:是否向api server注册自己,这也是Kubernetes推荐的Node管理方式;
  13. --hostname-override:Node节点的hostname;
  14. --kubeconfig,--config:配置文件路径;
  15. --bootstrap-kubeconfig:bootstrap配置文件路径;
  16. --pod-infra-container-image:docker pull infra镜像的默认url;
  17. --log-dir:log目录;
  18. --log-file:完整的log文件存放位置;
  • node02的配置文件如下:


kubernetes 每个节点运行一个容器_node安装_04


  • node03的配置文件如下:


kubernetes 每个节点运行一个容器_node 安装_05


步骤五:创建kubelet自启动脚本

  • 创建启动脚本
vi /usr/lib/systemd/system/kubelet.service


kubernetes 每个节点运行一个容器_node安装_06


  • 将启动脚本分发到node02,node03
scp /usr/lib/systemd/system/kubelet.service root@node02:/usr/lib/systemd/system/scp /usr/lib/systemd/system/kubelet.service root@node03:/usr/lib/systemd/system/
  • 将kubelet-bootstrap用户绑定到系统集群角色,在Master执行如下命令:
kubectl create clusterrolebinding kubelet-bootstrap  --clusterrole=system:node-bootstrapper  --user=kubelet-bootstrap
  • 启动kubelet服务
systemctl daemon-reloadsystemctl enable kubeletsystemctl restart kubelet
  • 查看kubelet是否启动成功
ps auwx | grep kubelet


kubernetes 每个节点运行一个容器_node 安装_07


kubernetes 每个节点运行一个容器_node 安装_08


kubernetes 每个节点运行一个容器_启动脚本_09


  • approve kubelet CSR 请求
kubectl get csrkubectl certificate approve node-csr-An1VRgJ7FEMMF_uyy6iPjyF5ahuLx6tJMbk2SMthwLskubectl certificate approve node-csr-dWPIyP_vD1w5gBS4iTZ6V5SJwbrdMx05YyybmbW3U5skubectl get nodes


kubernetes 每个节点运行一个容器_启动脚本_10


步骤六:部署Kubernetes proxy组件

kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡;

  • 创建kube-proxy配置文件
vi /k8s/kubernetes/cfg/kube-proxy


kubernetes 每个节点运行一个容器_node安装_11


  1. --logtostderr:是否将log写入系统log文件;
  2. --v:log级别;
  3. --hostname-override: 参数值必须与kubelet的值一致,否则kube-proxy启动后会找不到该Node,从而不会创建任何 ipvs 规则;
  4. --cluster-cidr: kube-proxy根据cluster-cidr判断集群内部和外部流量,指定–cluster-cidr或–masquerade-all选项后kube-proxy才会对访问Service IP的请求做SNAT;
  5. --kubeconfig:配置文件;
  6. --log-dir:log存放目录;
  7. --log-file:log文件存放位置;
  • 将kube-proxy分发到node01,node02,node03节点上
cd /k8s/kubernetes/cfg/scp kube-proxy root@node01:/k8s/kubernetes/cfg/scp kube-proxy root@node02:/k8s/kubernetes/cfg/scp kube-proxy root@node03:/k8s/kubernetes/cfg/
  • 创建kube-proxy自启动脚本
vi /usr/lib/systemd/system/kube-proxy.service


kubernetes 每个节点运行一个容器_node安装_12


  • 将启动脚本分发到node01,node02,node03节点
scp /usr/lib/systemd/system/kube-proxy.service root@node01:/usr/lib/systemd/system/scp /usr/lib/systemd/system/kube-proxy.service root@node02:/usr/lib/systemd/system/scp /usr/lib/systemd/system/kube-proxy.service root@node03:/usr/lib/systemd/system/
  • 启动kube-proxy服务
systemctl daemon-reloadsystemctl enable kube-proxysystemctl restart kube-proxy
  • 查看kube-proxy服务是否启动成功
ps auwx | grep kube-proxy


kubernetes 每个节点运行一个容器_node 安装_13


kubernetes 每个节点运行一个容器_bootstrap_14


kubernetes 每个节点运行一个容器_bootstrap_15


kubernetes 每个节点运行一个容器_启动脚本_16


步骤七:验证集群状态

kubectl get node,cs


kubernetes 每个节点运行一个容器_配置文件_17



到此,Kubernetes master节点和Node节点基本部署完成,在Node节点中我们主要部署了Kubernetes kubelet,kube-proxy组件;并且详细介绍了配置文件。通过验证node01,node02,node03都处于ready状态,一个4节点的最小化的Kubernetes cluster我们已经搭建起来了,下一期文章我们将介绍下Kubernetes的dashboard部署过程,也相当于我们部署一个service到我们的Kubernetes cluster中。敬请期待!

文章如有不妥之处,欢迎指正!谢谢!