ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**node 节点包含2个组件**: **kubelet**: kube-node 与API通信,控制docker创建删除等一系列客户端操作 **kube-proxy**: 使用iptables规则发布应用服务与负载均衡 **kubelet-bootstrap用户赋权** ~~~ # 给与 kubelet-bootstrap 用户赋予权限(必须执行) kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap ~~~ 注:在装有kubectl的master节点执行,只需执行一次。 kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubel-bootstrap 用户赋予 system:node-bootstrapper cluster 角色(role),然后 kubelet 才能有权限创建认证请求(certificate signing requests) --user=kubelet-bootstrap 是在 /etc/kubernetes/token.csv 文件中指定的用户名,同时也写入了 /etc/kubernetes/bootstrap.kubeconfig 文件。 **安装conntrack** `yum install conntrack-tools -y` kube-proxy 组件会使用其处理 iptables 规则; **注意**:先部署node节点,master节点部署node组件涉及一些改动,文末会介绍。 **创建 kubelet 的 systemd** ~~~ mkdir /var/lib/kubelet vim /lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=-/etc/kubernetes/kubelet ExecStart=/usr/local/bin/kubelet \ $KUBELET_ADDRESS \ $KUBELET_PORT \ $KUBELET_HOSTNAME \ $KUBELET_POD_INFRA_CONTAINER \ $KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target ~~~ **kubelet配置文件** ~~~ vim /etc/kubernetes/kubelet ### ## kubernetes kubelet (minion) config ## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--node-ip=192.168.50.1 --address=192.168.50.1" ## The port for the info server to serve on #KUBELET_PORT="--port=10250" ## You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=192.168.50.1 --node-labels=node-role.kubernetes.io/k8s-node=true" ## pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-beijing.aliyuncs.com/k8s_images/pause-amd64:3.1" ## Add your own! KUBELET_ARGS="--allow-privileged=true \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --cluster-dns=10.254.0.2 \ --cluster-domain=cluster.local \ --cgroup-driver=cgroupfs \ --cert-dir=/etc/kubernetes/ssl \ --fail-swap-on=false \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --rotate-certificates \ --serialize-image-pulls=false \ --logtostderr=true \ --v=2" ~~~ **以下参数需要改动:** --node-ip:填写node节点ip,集群以这个ip作为node节点的ip --address:填写node节点ip,kubelet会监听此地址的10250端口提供服务,不能设置为 127.0.0.1,否则后续 Pods 访问 kubelet 的 API 时会失败,因为Pods访问的 127.0.0.1 指向自己而不是 kubelet; --hostname-override:设置节点名称,如果设置了该选项,kube-proxy 也需要设置该选项,否则会出现找不到 Node 的情况; --node-labels:标识节点是master还是node,node-role.kubernetes.io/k8s-node=true 如果是master节点则改为k8s-master=true; **以下参数不需要改动:** --pod-infra-container-image 任何容器启动前都会加载这个init镜像初始化容器网络等操作; --cgroup-driver 如果不配置默认也是cgroupfs,要保持 docker 和 kubelet 中的 cgroup driver 配置一致即可,不然启动失败。 --bootstrap-kubeconfig 指向 bootstrap kubeconfig 文件,kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS bootstrapping 请求;管理员通过了 CSR 请求后,kubelet 自动在 --cert-dir 目录创建证书和私钥,然后写入 kubelet-kubeconfig 文件并使用此文件启动kubelet; --cluster-dns 指定dns的ip,现在还没搭建dns先写上,--cluster-domain 指定域名后缀,这两个参数同时指定后才会生效; --cluster-domain 指定 pod 启动时 /etc/resolve.conf 文件中的 search domain; --serialize-image-pulls 默认是true,表示一次只拉取一个镜像; --fail-swap-on=false 如果不设置这个,需要关闭系统的swap; --rotate-certificates 开启证书到期自动续签; --kubeconfig=配置文件, kubelet.kubeconfig 文件在第一次启动 kubelet 之前并不存在,当通过CSR请求后会自动生成kubelet.kubeconfig 文件;里面包含server地址,通过此地址连接到apiserver。 **注:关于在master节点部署kubelet,node节点忽略** 按照前面的步骤正常配置,在启动服务前修改配置文件,将server的ip改成master自身节点的ip,修改后启动在kubelet服务。node节点不需要修改。 ~~~ vim /etc/kubernetes/bootstrap.kubeconfig server: https://192.168.50.101:6443 ~~~ **启动和检查kubelet服务** ~~~ systemctl daemon-reload systemctl start kubelet && systemctl enable kubelet #查看服务是否启动成功 systemctl status kubelet #查看日志是否有报错 journalctl -u kubelet ~~~ ~~~ 查看csr请求 kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-gNJtWd_FGjk3KDfWS2bjDarjP7KLrUCcJrv4IDOQJ6M 32s kubelet-bootstrap Pending 通过csr请求 kubectl certificate approve node-csr-gNJtWd_FGjk3KDfWS2bjDarjP7KLrUCcJrv4IDOQJ6M ~~~ node节点生成的证书位置`ls /etc/kubernetes/ssl/kubelet*`; 如果更新 kubernetes 的证书,只要没有更新 token.csv,当重启 kubelet 后,该 node 就会自动加入到 kuberentes 集群中。 **查看集群中的node节点** ~~~ kubectl get node NAME STATUS ROLES AGE VERSION 192.168.50.1 Ready k8s-node 4d v1.10.4 ~~~ **创建kube-proxy的systemd** ~~~ vim /lib/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/proxy ExecStart=/usr/local/bin/kube-proxy \ $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target ~~~ **kube-proxy配置文件** ~~~ vim /etc/kubernetes/proxy ### # kubernetes proxy config # default config should be adequate # Add your own! KUBE_PROXY_ARGS="--bind-address=192.168.50.1 \ --hostname-override=192.168.50.1 \ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ --cluster-cidr=10.254.0.0/16 \ --logtostderr=true \ --v=2" ~~~ **以下参数需要改动:** --bind-address 填写本机ip,作为proxy监听的地址,1.10版本无论填写什么后台都默认使用127.0.0.1; --hostname-override=节点名,保证和kubelet上的配置一样; **以下参数不需要改动:** kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT。 --kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息; 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限。 **关于在master节点部署kube-proxy,node节点忽略** 按照前面的步骤正常配置,在启动服务前修改配置文件,将server的ip改成master自身节点的ip,修改后启动在kube-proxy服务。node节点不需要修改。 ~~~ vim /etc/kubernetes/kube-proxy.kubeconfig server: https://192.168.50.101:6443 ~~~ **启动和检查kube-proxy服务** ~~~ systemctl daemon-reload systemctl start kube-proxy && systemctl enable kube-proxy #查看服务是否启动成功 systemctl status kube-proxy #查看日志是否有报错 journalctl -u kube-proxy ~~~ 注:具体修改原因请查看**部署master节点**文末