接下来两个章节是部署Kube-Node相关的服务,包含:kubelet,kube-proxy。node
# kubelet采用TLS Bootstrapping 机制,自动完成到kube-apiserver的注册,在node节点量较大或者后期自动扩容时很是有用。 # kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,须要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予ClusterRole system:node-bootstrapper 角色(经过kubectl get clusterroles可查询),而后 kubelet 才有权限建立认证请求,经过建立ClusterRoleBinding可实现; # --user=kubelet-bootstrap 指定用户名,这里即文件 /etc/kubernetes/bootstrap/token.csv (前文建立)中指定的用户名,同时也须要写入kubeconfig文件 /etc/kubernetes/bootstrap.kubeconfig; [root@kubenode1 ~]# kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap
# ClusterRoleBinding:kubelet-bootstrap建立成功 [root@kubenode1 ~]# kubectl get clusterrolebinding
[root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/ # 配置集群参数; # --embed-certs:设置为 true 表示将 certificate-authority 证书写入到生成的 bootstrap.kubeconfig 文件中 [root@kubenode1 bootstrap]# kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://172.30.200.10:6443 \ --kubeconfig=bootstrap.kubeconfig # 配置客户端认证参数; # 认证用户为前文token.csv文件中的“kubelet-bootstrap”; # 指定token,前文中已设定的token的环境变量,证书与私钥由kube-apiserver在kubeler首次注册是自动生成 [root@kubenode1 bootstrap]# kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig # 配置上下文参数 [root@kubenode1 bootstrap]# kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig # 配置默认上下文 [root@kubenode1 bootstrap]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
# 分发bootstrap.kubeconfig到全部node节点 [root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.22:/etc/kubernetes/bootstrap/ [root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.23:/etc/kubernetes/bootstrap/
相关可执行文件在部署kubectl时已部署完成。git
# kubelet依赖于docker.service服务,在其启动以后启动; # 可经过ExecStartPost设置iptables开放tcp 4194端口,为cAdvisor作准备 [root@kubenode1 ~]# touch /usr/lib/systemd/system/kubelet.service [root@kubenode1 ~]# vim /usr/lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=/usr/local/kubernetes/kubelet.conf ExecStart=/usr/local/kubernetes/bin/kubelet $KUBELET_ARGS Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target # 建立工做目录 [root@kubenode1 ~]# mkdir -p /var/lib/kubelet # 配置启动参数文件; # --address:绑定主机ip地址,默认值”0.0.0.0”表示使用所有网络接口; # --hostname-override:设置node在集群中的主机名,默认使用主机hostname;若是设置了此项参数,kube-proxy服务也须要设置此项参数; # --pod-infra-container-image:用于Pod内namespace共享的基础pause镜像,默认值即” gcr.io/google_containers/pause-amd64:3.0”;建议节点上提早pull相关镜像以提高部署效率; # --bootstrap-kubeconfig:kubelet首次启动在没有客户端证书文件时,将使用指定的kubeconfig配置到kube-apiserver获取客户端证书;经过csr请求,成功获取后在--kubeconfig指定的路径生成kubeconfig文件;证书与私钥文件将被保存到--cert-dir指定的目录下; # --cluster-dns:指定集群内dns服务器,以逗号分隔;kubelet在新建立的Pod中设DNS域名解析配置文件/etc/resolv.conf文件,写入nameserver与search配置; # --cluster-domain:集群内dns服务器域名; # --allow-privileged:是否容许以特权模式启动容器,默认false; # --serialize-image-pulls:按顺序pull镜像,默认值true; # --fail-swap-on=false:若是节点开启了swap,节点不能启动kubelet服务,默认值true,在v1.8.x与v1.9.x版本时注意 [root@kubenode1 ~]# touch /usr/local/kubernetes/kubelet.conf [root@kubenode1 ~]# vim /usr/local/kubernetes/kubelet.conf KUBELET_ARGS="--address=172.30.200.21 \ --hostname-override=172.30.200.21 \ --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0 \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/bootstrap/kubelet.kubeconfig \ --cert-dir=/etc/kubernetes/bootstrap \ --cluster-dns=169.169.0.11 \ --cluster-domain=cluster.local. \ --allow-privileged=true \ --serialize-image-pulls=false \ --fail-swap-on=false \ --logtostderr=false \ --log-dir=/var/log/kubernetes/kubelet \ --v=2" # 建立日志目录 [root@kubenode1 ~]# mkdir -p /var/log/kubernetes/kubelet
[root@kubenode1 ~]# systemctl daemon-reload [root@kubenode1 ~]# systemctl enable kubelet [root@kubenode1 ~]# systemctl start kubelet [root@kubenode1 ~]# systemctl status kubelet
kubelet 首次启动向 kube-apiserver 发送证书签名请求,必须由 kubernetes 系统容许经过后,才会将该 node 加入到集群。github
以kubenode1为例,其他节点相似。docker
# 查看未受权的csr请求,处于”Pending”状态 [root@kubenode1 ~]# kubectl get csr
# 经过csr请求,状态变动为”Approved, Issued”; # 集群节点已“Ready” [root@kubenode1 ~]# kubectl certificate approve node-csr-Gl5zdgp6IZYQBAV1S59vXDZzHbirH9qDMb0xHaDnDIA [root@kubenode1 ~]# kubectl get nodes
# 在指定的目录,可查询自动生成的kubelet证书,私钥及kubeconfig文件等; [root@kubenode1 ~]# ll /etc/kubernetes/bootstrap/