20250708-2-Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记
一、操作系统初始化配置(一个旧版本的K8S部署记录,仅供参考)
1. 关闭防火墙
- 关闭防火墙:
- 临时关闭:systemctl stop firewalld
- 永久关闭:systemctl disable firewalld
- 清空iptables规则:
- 使用iptables -F清空规则
- 原因:默认规则会限制部分端口访问,可能导致集群通信问题
- 防火墙工具关系:
- firewalld和iptables都是配置Linux内核netfilter的工具
- firewalld是红帽在CentOS 7中加入的替代iptables的工具
2. 关闭SELinux
- 关闭方法:
- 永久关闭:sed -i 's/enforcing/disabled/' /etc/selinux/config
- 临时关闭:setenforce 0
- 验证状态:
- 使用getenforce命令检查,显示"Disabled"表示已关闭
- 关闭原因:
- SELinux使用复杂且安全系数不高
- 企业环境和公有云中普遍不使用
3. 关闭swap
- 关闭方法:
- 临时关闭:swapoff -a
- 永久关闭:sed -ri 's/.*swap.*/#&/' /etc/fstab
- 关闭原因:
- Kubernetes 1.22前版本不支持使用swap
- swap使用硬盘空间,性能比内存低几十倍
- 固态硬盘可改善性能但成本较高
4. 设置主机名
- 设置方法:
- 使用hostnamectl set-hostname <hostname>设置
- 执行bash刷新当前解释器使更改立即生效
- 主机名规划示例:
- Master节点:k8s-master
- Node1节点:k8s-node1
- Node2节点:k8s-node2
5. 配置hosts文件
- 配置方法:
- 在master节点执行:cat >> /etc/hosts << EOF
- 添加格式:<IP地址> <主机名>
- 配置原因:
- API server连接node节点时会使用hosts解析
- 只需在master节点配置即可
6. 网络参数配置
- 配置内容:
- 创建/etc/sysctl.d/k8s.conf文件
- 添加桥接IPv4流量传递到iptables的规则
- 生效方法:
- 执行sysctl --system使配置生效
- 配置原因:
- 避免出现网络相关问题
- Kubernetes官方建议配置
7. 时间同步
- 同步方法:
- 安装ntpdate:yum install ntpdate -y
- 同步时间:ntpdate time.windows.com
- 同步重要性:
- 确保集群所有节点时间一致
- 时间不一致可能导致各种问题
二、安装Docker、kubeadm、kubelet
1. 安装Docker
- 安装方式:可以通过yum安装或二进制方式安装,在所有节点都需要执行
- 容器引擎选择:默认使用Docker作为容器引擎,也可以替换为containerd等其他引擎
- 具体步骤:
- 下载Docker的yum源:wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
- 安装Docker:yum -y install docker-ce
- 设置开机启动并启动服务:systemctl enable docker && systemctl start docker
- 验证安装:docker info
- 加速器配置:为提高镜像下载速度,需要配置镜像加速器
- 创建配置文件:cat > /etc/docker/daemon.json << EOF {"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]} EOF
- 重启服务生效:systemctl restart docker
2. 添加阿里云YUM软件源
- 配置目的:CentOS 7默认源中没有Kubernetes包,需要添加阿里云源来安装kubeadm等工具
- 配置方法:
3. 安装kubeadm、kubelet和kubectl
- 组件功能:
- kubeadm:用于搭建Kubernetes集群的工具
- kubelet:每个节点上运行的agent
- kubectl:命令行管理工具
- 安装命令:yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
- 版本选择:示例使用1.21.0版本,也可选择其他版本如1.22
- 服务管理:
- 设置开机启动:systemctl enable kubelet
- 注意:此时不要直接启动kubelet服务,因为配置文件尚未准备好
三、部署Kubernetes Master
1. 执行kubeadm init命令
- 集群通告地址:使用--apiserver-advertise-address=192.168.31.71指定集群通信地址,生产环境中建议使用内网IP(服务器通常有内外网双网卡,内网用于服务器间高速通信)
- 镜像仓库覆盖:通过--image-repository registry.aliyuncs.com/google_containers指定阿里云镜像仓库,解决默认k8s.gcr.io国内无法访问的问题
- 版本一致性:--kubernetes-version v1.21.0必须与安装的kubelet/kubeadm版本严格一致
- 网络规划:
- --service-cidr=10.96.0.0/12定义Service虚拟网络(Pod统一访问入口)
- --pod-network-cidr=10.244.0.0/16定义Pod网络(需与后续CNI网络组件配置保持一致)
- 注意避免与宿主机网段冲突,无特殊需求可直接使用示例配置
- 配置文件替代方案:可通过kubeadm.conf文件定义集群配置,使用kubeadm init -config kubeadm.conf初始化
- 包含版本、镜像仓库、网络等关键参数
- 适合需要重复部署或参数复杂的场景
2. 拷贝kubectl配置文件到默认路径
- 必要操作:执行以下命令使kubectl工具生效:
- 替代方案:root用户可直接设置环境变量:
- 节点状态验证:执行kubectl get nodes查看,此时状态应为NotReady(因尚未部署网络插件)
3. 配置文件拷贝默认路径执行示例
- 关键输出:初始化完成后会生成node节点加入命令,格式为:
- 需妥善保存该命令用于后续节点加入
- 网络插件提示:输出中包含部署CNI网络插件的提示,需按指引完成部署后集群才可用
四、加入Kubernetes Node
1. 执行kubeadm join命令
- 命令结构:kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash <hash>
- 有效期:默认token有效期为24小时,过期后需使用kubeadm token create --print-join-command重新生成
- 常见错误:复制命令时可能出现多余字符(如.),需粘贴到文本编辑器检查并拼接为完整一行
- 哈希值验证:需确保sha256哈希值完整无误,少一位都会导致节点加入失败
- 配置拷贝:需执行sudo cp -i /etc/kubernetes/admin.conf$HOME/.kube/config和权限设置命令
- 网络插件:加入节点后必须部署CNI网络插件(如Calico),否则节点状态显示为NotReady
- 多节点加入:相同join命令可在多个worker节点重复执行,需确保网络连通性和参数准确性
2. 网络插件配置
- CIDR匹配:必须修改Calico YAML中的CALICO_IPV4POOL_CIDR与kubeadm init时指定的--pod-subnet一致
- YAML获取:可通过wget https://docs.projectcalico.org/manifests/calico.yaml下载模板文件
- 版本兼容性:不同Kubernetes版本(如v1.21.0)可能需要特定版本的Calico配置文件
3. 节点状态检查
- 查看命令:在master节点执行kubectl get nodes可查看所有节点状态
- 正常状态:成功加入的节点应显示为Ready状态,控制平面节点会标注control-plane角色
- 连接问题:若出现连接拒绝错误,需检查$HOME/.kube/config文件是否配置正确
五、部署容器网络
1. 网络部署过程
- 节点加入命令:使用kubeadm join命令将新节点加入集群,格式为:
- Token有效期:默认token有效期为24小时,过期后需重新生成,使用命令:
- 网络插件选择:Calico是纯三层数据中心网络方案,当前Kubernetes主流选择
- 部署步骤:
- 下载YAML文件:
- 修改CALICO_IPV4POOL_CIDR参数,需与kubeadm init时指定的--pod-network-cidr一致
- 应用配置:
- 检查状态:
2. 初始化过程详解
- 预检阶段:
- 系统检查:验证节点配置是否满足集群要求,包括SWAP是否关闭等
- 镜像下载:可能出现coredns镜像拉取失败警告(需后续处理)
- 证书生成:
- 通信安全:所有K8s组件基于HTTPS通信,需要自签名证书
- 自动生成:kubeadm脚本会自动创建各类组件证书,包括:
- API Server证书
- etcd相关证书
- 前端代理证书
- 配置文件:为kube-controller-manager等组件生成连接集群的kubeconfig文件
- kubelet启动:
- 配置文件:自动生成/var/lib/kubelet/config.yaml等配置文件
- 静态Pod:控制平面组件(API Server等)通过静态Pod方式启动
- 特殊机制:静态Pod是K8s的特殊启动形式(后续会专门讲解)
3. 节点加入问题处理
- 常见警告:
- 驱动警告:Docker使用cgroupfs驱动而非推荐的systemd驱动(可忽略)
- 主机名解析:未配置hosts导致主机名无法解析(不影响功能)
- 核心流程:
- kubelet启动:节点加入主要启动kubelet服务
- TLS引导:完成证书签名请求(CSR)流程建立安全连接
- 网络就绪条件:
- NotReady状态:未部署网络插件前节点显示NotReady
- 解决方案:必须部署网络插件为Pod提供网络服务
- 验证命令:
六、CoreDNS问题处理
1. Token有效期问题
- 默认有效期:kubeadm生成的token默认有效期为24小时,过期后不可用
- 解决方法:需要重新创建token才能继续使用
- 完整命令示例:
2. 网络插件未部署问题
- 典型表现:节点状态显示为NotReady,日志报错"NetworkPluginNotReady"
- 根本原因:CNI(容器网络接口)插件未正确部署
- 日志特征:
- "Unable to update cni config"
- "no networks found in /etc/cni/net.d"
- "Container runtime network not ready"
- 诊断方法:通过journalctl -u kubelet命令查看kubelet日志
3. CNI配置缺失问题
- 关键错误:
- 网络状态:NetworkReady=false,原因显示为cni config未初始化
- 容器运行时:Docker报告网络插件未就绪
- 解决方案:需要部署CNI网络插件(如Calico、Flannel等)
4. 网络插件部署验证
- 验证步骤:
- 部署CNI网络插件
- 检查/etc/cni/net.d目录下是否有网络配置文件
- 使用kubectl get node查看节点状态是否变为Ready
- 完整流程:网络插件部署后需要等待一段时间(通常1-2分钟)让组件完成初始化
七、部署容器网络
1. 前提条件与准备
- token有效期:默认token有效期为24小时,过期后不可用
- token重新生成:使用命令kubeadm token create --print-join-command快速生成新token
2. 安装Docker与kubeadm
- 阿里云镜像源配置:
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg EOF
- 组件安装:yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
3. 部署Kubernetes Master
- 关键参数:
- --apiserver-advertise-address:集群通告地址
- --image-repository:指定阿里云镜像仓库地址
- --pod-network-cidr:Pod网络,需与CNI网络组件yaml中保持一致
- 配置文件方式:可通过kubeadm.conf文件引导初始化
4. 配置网络插件Calico
- 网络方案选择:Calico是纯三层的数据中心网络方案,Kubernetes主流选择
- 部署步骤:
- 下载YAML:wget https://docs.projectcalico.org/manifests/calico.yaml
- 修改CALICO_IPV4POOL_CIDR与kubeadm init的--pod-network-cidr一致
- 部署:kubectl apply -f calico.yaml
- 执行位置:所有yaml文件都只在Master节点执行
5. 解决CoreDNS镜像拉取问题
- 问题现象:ImagePullBackOff错误,因镜像tag路径不匹配
- 解决方案:
- 在所有节点执行:
- 等待Pod自动恢复
- 关键注意:必须在所有节点执行上述操作
6. 测试Kubernetes集群
- 测试方法:
- 访问验证:通过http://NodeIP:Port访问测试服务
7. 部署Dashboard
- 官方UI:Dashboard是Kubernetes官方提供的管理界面
八、部署Dashboard
1. 下载与上传Dashboard文件
- 官方UI功能:Dashboard是Kubernetes官方提供的Web UI界面,可用于基本管理K8s资源
- 文件获取方式:
- 官方下载地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
- 课件中文件名:kubernetes-dashboard.yaml
- 上传注意事项:由于网络访问限制,建议使用老师提供的已下载文件,上传到master节点执行
2. 修改Service为NodePort类型
- 默认访问限制:Dashboard默认只能集群内部访问
- 修改关键配置:
- 将Service类型改为NodePort
- 添加nodePort: 30001
- 完整配置示例:
3. 部署Dashboard
- 部署步骤:
- 应用修改后的yaml文件:kubectl apply -f kubernetes-dashboard.yaml
- 检查Pod状态:kubectl get pods -n kubernetes-dashboard
- 部署结果验证:
- 成功后会创建namespace、serviceaccount、service等资源
- Pod状态应为Running:dashboard-metrics-scraper和kubernetes-dashboard
4. 创建用户并授权
- 创建管理员用户:
- 创建serviceaccount:kubectl create serviceaccount dashboard-admin -n kube-system
- 绑定cluster-admin角色:kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
- 获取登录Token:
- 命令:kubectl describe secrets -n kube-system$(kubectl -n kube-system get secret | awk '/dashboard-admin/{print$1}')
- Token用途:用于登录Dashboard的身份凭证
5. 访问Dashboard
- 访问地址:https://NodeIP:30001
- 访问注意事项:
- 必须使用HTTPS协议访问
- 浏览器会显示不安全警告(因使用自签名证书),需手动继续访问
- 登录时使用之前获取的Token
- 节点选择:可以访问集群中任意节点的IP
6. Dashboard功能概览
- 核心功能:
- 查看集群节点状态和资源使用情况
- 管理命名空间和各类资源(Deployments、Pods、Services等)
- 查看容器日志和进入容器终端
- 编辑和更新资源配置
- 操作示例:
- 创建Deployment:kubectl create deployment web --image=nginx
- 查看Pod日志:通过UI界面直接查看
- 进入容器终端:通过UI提供的Shell功能
- 使用场景:适合临时调试和基本资源管理,生产环境仍需依赖命令行工具
九、知识小结
知识点 | 核心内容 | 关键操作/命令 | 注意事项 |
系统初始化 | 关闭防火墙和SELinux | systemctl stop firewalld setenforce 0 | 防火墙规则会影响节点通信 SELinux默认开启需关闭 |
基础环境配置 | 设置主机名和时间同步 | hostnamectl set-hostname ntpdate | 主机名用于集群识别 时间同步至关重要 |
Docker安装 | 配置镜像加速器 | yum install docker 配置阿里云镜像加速 | 国内需替换默认仓库 设置开机自启 |
Kubernetes组件安装 | 安装kubeadm/kubelet | yum install kubelet-1.21.0 | 版本需严格一致 先配置阿里云yum源 |
Master节点初始化 | 使用kubeadm init | kubeadm init --apiserver-advertise-address | 注意API Server地址 记录join命令 |
Node节点加入 | 执行kubeadm join | kubeadm join <master-ip>:6443 | 检查token有效性 解决格式错误问题 |
网络插件部署 | 安装Calico网络 | kubectl apply -f calico.yaml | 修改CIDR匹配集群 仅在Master执行 |
Dashboard部署 | 安装Web UI界面 | kubectl apply -f dashboard.yaml | 需配置Service类型 创建访问token |
常见问题处理 | 镜像拉取失败 | docker pull 阿里云镜像 docker tag重命名 | 所有节点需同步操作 检查tag准确性 |
集群验证 | 检查节点状态 | kubectl get nodes kubectl get pods -A | Ready状态确认 组件运行状态检查 |