K8S集群扩容多master大概思路步骤

   一.先把master1 master2 master3主机上安装 nginx,keepalived ,做成高可用VIP集群,实现任意master1宕机,备用机实现自动接管master1的服务;
  二.上传k8s kubeadm安装所需要的k8simages.tar.gz到master1 master2 master3以及各个node节点上,并且使用docker load -i k8simages.tar.gz 加载镜像;

 三.拷贝证书以及ETCD证书到master2 master3
四.查看join token: kubeadm token create --print-join-command
![在这里插入图片描述](https://img-blog.csdnimg.cn/a6a1f78497824f03a952eefd2f05df73.png#pic_center)

在master2 master3执行:

kubeadm join 192.168.92.168:6443 --token 67n9b1.nckpjxtixp3oda4n --discovery-token-ca-cert-hash sha256:37d30389e7add6e47300fac1d8e4000ec4834f2fa62cc96959c4806be172d4d2 --control-plane //使master2 加入k8s集群

master2节点扩容完毕。

<think>我们正在处理关于二进制部署的Kubernetes集群扩容Node节点的操作步骤的问题。根据用户提供的引用内容,我们可以总结出以下关键点: 1. 用户之前已经部署了一个Kubernetes集群(v1.20.15),包括master节点和worker节点。 2. 在部署worker节点时,引用了生成kube-proxy的kubeconfig文件以及kubelet的配置过程。 3. 在扩容节点时,我们需要在新节点上执行类似的步骤,但要注意一些配置的差异。 扩容Node节点步骤通常包括: - 准备新节点的环境(包括系统配置、软件安装等) - 在新节点上部署必要的Kubernetes组件(kubelet、kube-proxy、容器运行时等) - 生成并配置kubelet和kube-proxy所需的kubeconfig文件 - 启动服务并加入集群 根据引用内容,我们特别注意到: - 引用[2]和[3]提到了生成kube-proxy.kubeconfig文件的过程,这需要从已有的CA证书和为新节点生成的证书来配置。 - 引用[4]展示了kubelet的启动命令,其中包含了bootstrap-kubeconfig、cert-dir、client-ca-file等参数。 因此,扩容Node节点的具体步骤可以归纳如下: ### 一、准备工作 1. **新节点系统配置** 确保新节点满足Kubernetes运行要求(如关闭swap、防火墙设置、主机名解析、时间同步等)[^1]。 2. **安装依赖软件** 在新节点安装: - 容器运行时(如containerd/docker) - kubelet、kube-proxy二进制文件(版本与集群一致) ### 二、证书与配置文件生成 1. **生成节点证书** 在CA所在机器(通常为master节点)为新节点签发证书: ```bash # 创建证书请求配置文件(如node-csr.json) { "CN": "system:node:<节点主机名>", "hosts": ["<节点IP>", "<节点主机名>"], "key": {"algo": "rsa", "size": 2048}, "names": [{"O": "system:nodes"}] } ``` 使用cfssl生成证书: ```bash cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes node-csr.json | cfssljson -bare node ``` 2. **生成kubeconfig文件** - **kubelet bootstrap kubeconfig**(用于TLS bootstrapping)[^4] 引用[4]中命令: ```bash kubelet --bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.kubeconfig ... ``` 在master节点生成并分发到新节点: ```bash kubectl config set-cluster ... --kubeconfig=kubelet-bootstrap.kubeconfig kubectl config set-credentials ... --kubeconfig=kubelet-bootstrap.kubeconfig ``` - **kube-proxy kubeconfig** 参考引用[2]生成: ```bash KUBE_CONFIG="/path/kube-proxy.kubeconfig" kubectl config set-cluster kubernetes ... --kubeconfig=${KUBE_CONFIG} kubectl config set-credentials kube-proxy ... --kubeconfig=${KUBE_CONFIG} kubectl config set-context default ... --kubeconfig=${KUBE_CONFIG} ``` ### 三、部署组件与服务 1. **部署kubelet** 创建kubelet配置文件(如`/etc/kubernetes/kubelet.json`): ```json { "kind": "KubeletConfiguration", "apiVersion": "kubelet.config.k8s.io/v1beta1", "address": "0.0.0.0", "port": 10250, "cgroupDriver": "systemd", "clusterDNS": ["10.96.0.10"], "clusterDomain": "cluster.local" } ``` 启动服务(参考引用[4]): ```bash /usr/local/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.kubeconfig \ --cert-dir=/etc/kubernetes/ssl \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --config=/etc/kubernetes/kubelet.json \ --container-runtime-endpoint=unix:///run/containerd/containerd.sock ``` 2. **部署kube-proxy** 创建配置文件(如`kube-proxy.yaml`): ```yaml apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: iptables clusterCIDR: "10.244.0.0/16" clientConnection: kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig" ``` 启动服务: ```bash kube-proxy --config=/etc/kubernetes/kube-proxy.yaml ``` ### 四、加入集群 1. **批准节点CSR** 在新节点启动kubelet后,在master节点执行: ```bash kubectl get csr # 查看Pending状态的CSR kubectl certificate approve <CSR名称> ``` 2. **验证节点状态** ```bash kubectl get nodes ``` ### 关键配置注意事项 | 组件 | 配置文件 | 关键参数 | |----------|------------------------------|-----------------------------------| | kubelet | `kubelet.json` | `cgroupDriver`, `clusterDNS` | | kube-proxy| `kube-proxy.yaml` | `clusterCIDR`, `kubeconfig` | | 证书 | 由CA签发 | 确保`O=system:nodes`(节点身份) | > **拓扑关系**: > $$ \text{新节点} \xrightarrow{\text{CSR请求}} \text{API Server} \xleftarrow{\text{批准}} \text{Master} $$ ### 五、常见问题处理 - **节点NotReady**:检查容器运行时状态、网络插件配置、证书有效期 - **证书过期**:重新生成证书并更新kubeconfig §§相关问题§§ 1. 如何实现Kubernetes节点的自动缩放? 2. 节点证书过期后如何更新? 3. 如何安全地移除Kubernetes节点? </think> ## 二进制部署Kubernetes集群扩容Node节点的操作步骤 以下是基于v1.20.15版本的二进制部署Kubernetes集群扩容Node节点的完整流程: ### 一、准备工作 1. **新节点环境配置** - 确保新节点与原有集群网络互通 - 配置相同的主机名解析(/etc/hosts) - 禁用swap并同步时间: ```bash swapoff -a sed -i '/swap/s/^/#/' /etc/fstab apt install ntpdate -y && ntpdate time.windows.com ``` 2. **安装基础组件** ```bash # 安装容器运行时(containerd/docker) apt install containerd -y # 创建containerd配置文件 containerd config default > /etc/containerd/config.toml systemctl restart containerd # 下载kubelet和kube-proxy二进制文件(版本与集群一致) wget https://dl.k8s.io/v1.20.15/bin/linux/amd64/{kubelet,kube-proxy} cp kubelet kube-proxy /usr/local/bin/ chmod +x /usr/local/bin/kubelet /usr/local/bin/kube-proxy ``` ### 二、证书与配置文件生成 1. **创建节点证书(在CA服务器操作)** ```bash # 创建证书请求文件(node-csr.json) cat > node-csr.json <<EOF { "CN": "system:node:<新节点主机名>", "hosts": ["<新节点IP>", "<新节点主机名>"], "key": {"algo": "rsa", "size": 2048}, "names": [{"O": "system:nodes"}] } EOF # 生成证书 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \ -config=ca-config.json -profile=kubernetes \ node-csr.json | cfssljson -bare node ``` 2. **生成kubeconfig文件(在CA服务器操作)** ```bash # kubelet引导配置(引用[4]) KUBE_CONFIG="/etc/kubernetes/kubelet-bootstrap.kubeconfig" KUBE_APISERVER="https://<MASTER_IP>:6443" kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=${KUBE_CONFIG} kubectl config set-credentials system:bootstrap:$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') \ --client-certificate=/etc/kubernetes/ssl/kubelet-bootstrap.pem \ --client-key=/etc/kubernetes/ssl/kubelet-bootstrap-key.pem \ --embed-certs=true \ --kubeconfig=${KUBE_CONFIG} kubectl config set-context default \ --cluster=kubernetes \ --user=system:bootstrap:$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') \ --kubeconfig=${KUBE_CONFIG} kubectl config use-context default --kubeconfig=${KUBE_CONFIG} # kube-proxy配置(引用[2]) KUBE_PROXY_CONFIG="/etc/kubernetes/kube-proxy.kubeconfig" kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=${KUBE_PROXY_CONFIG} ... # 完整过程参考引用[2] ``` ### 三、新节点部署 1. **配置kubelet** ```bash # 创建配置文件(引用[4]) cat > /etc/kubernetes/kubelet.json <<EOF { "kind": "KubeletConfiguration", "apiVersion": "kubelet.config.k8s.io/v1beta1", "address": "0.0.0.0", "port": 10250, "cgroupDriver": "systemd", "clusterDNS": ["10.96.0.10"], "clusterDomain": "cluster.local" } EOF # 创建systemd服务 cat > /etc/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet [Service] ExecStart=/usr/local/bin/kubelet \\ --bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.kubeconfig \\ --cert-dir=/etc/kubernetes/ssl \\ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\ --config=/etc/kubernetes/kubelet.json \\ --container-runtime-endpoint=unix:///run/containerd/containerd.sock \\ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF ``` 2. **配置kube-proxy** ```bash # 创建配置文件 cat > /etc/kubernetes/kube-proxy.yaml <<EOF apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "iptables" clusterCIDR: "10.244.0.0/16" kubeProxyIPTablesConfiguration: masqueradeAll: true clientConnection: kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig" EOF # 创建systemd服务 cat > /etc/systemd/system/kube-proxy.service <<EOF [Unit] Description=Kubernetes Kube Proxy [Service] ExecStart=/usr/local/bin/kube-proxy --config=/etc/kubernetes/kube-proxy.yaml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF ``` 3. **启动服务** ```bash systemctl daemon-reload systemctl enable --now kubelet kube-proxy ``` ### 四、集群端操作 1. **批准节点CSR** 在master节点执行: ```bash # 查看待批准请求 kubectl get csr # 批准加入请求(NAME替换为实际值) kubectl certificate approve <CSR_NAME> ``` 2. **验证节点状态** ```bash kubectl get nodes -w # 预期输出 NAME STATUS ROLES AGE VERSION new-node Ready <none> 30s v1.20.15 ``` ### 五、关键配置说明 | 组件 | 配置文件 | 核心参数 | |------|----------|----------| | kubelet | `kubelet.json` | `cgroupDriver`(需与容器运行时一致)[^4] | | kube-proxy | `kube-proxy.yaml` | `clusterCIDR`(需与CNI插件匹配) | | 证书 | `kubelet-bootstrap.kubeconfig` | `system:bootstrap`用户权限 | ### 六、常见问题处理 1. **节点NotReady状态(引用[4])** - 检查`/var/log/messages`日志 - 验证证书有效性: ```bash openssl x509 -in /etc/kubernetes/ssl/kubelet-client-current.pem -text -noout ``` - 检查CNI网络插件是否安装 2. **证书配置错误** 确保所有证书中的O(Organization)字段为`system:nodes`: ```bash openssl x509 -in node.pem -text | grep "O =" # 正确输出:O=system:nodes ``` > **拓扑关系**: > $$ \text{新节点} \xrightarrow{\text{CSR请求}} \text{API Server} \xleftarrow{\text{批准}} \text{Master} $$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值