1. Kubernetes实战入门:从零搭建生产级集群
最近在尚硅谷学习了Kubernetes课程,发现很多同学在课后自己搭建环境时遇到各种问题。作为过来人,我把自己的实践过程整理成这份保姆级教程,包含从环境准备到集群部署的全套操作,特别适合刚接触k8s的新手参考。
这份指南基于我实际在CentOS 7.9系统上的部署经验,所有命令都经过实测验证。相比官方文档,我会重点说明每个步骤的注意事项和常见报错解决方案,帮你避开我踩过的那些坑。我们将使用kubeadm工具部署一个包含1个master节点和2个worker节点的生产可用集群,并安装Dashboard可视化界面。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与系统要求
建议每个节点至少满足以下配置:
- 2核CPU
- 2GB内存
- 20GB磁盘空间
- CentOS 7.6+或Ubuntu 16.04+系统
注意:生产环境建议master节点配置更高,特别是内存至少4GB。我在测试时发现内存不足会导致各种组件频繁崩溃。
2.2 基础环境配置
所有节点都需要执行以下操作:
bash复制# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置主机名解析
cat <<EOF >> /etc/hosts
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
EOF
2.3 内核参数优化
Kubernetes对Linux内核参数有特殊要求,需要调整以下参数:
bash复制cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
3. 容器运行时与Kubernetes组件安装
3.1 Docker安装与配置
我们使用Docker作为容器运行时:
bash复制# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装指定版本(较新版本可能不兼容)
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
# 配置Docker
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
# 启动Docker
systemctl enable docker && systemctl start docker
3.2 安装kubeadm、kubelet和kubectl
bash复制cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装指定版本(保持各组件版本一致)
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
# 设置开机启动
systemctl enable kubelet
4. 初始化Master节点
4.1 初始化集群
在master节点执行:
bash复制kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
初始化成功后,会输出加入集群的命令,类似这样:
bash复制kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
重要提示:务必保存好这个join命令,后续worker节点加入集群时需要用到!
4.2 配置kubectl
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.3 安装网络插件
我们选择flannel作为网络插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证网络插件状态:
bash复制kubectl get pods -n kube-system
5. Worker节点加入集群
在每个worker节点上执行之前保存的kubeadm join命令:
bash复制kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
加入成功后,在master节点检查节点状态:
bash复制kubectl get nodes
常见问题:如果节点长时间处于NotReady状态,通常是网络插件没有正确安装,可以检查kube-system命名空间下的pod日志。
6. 部署Dashboard可视化界面
6.1 安装Dashboard
bash复制kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
6.2 创建管理员用户
创建dashboard-adminuser.yaml文件:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
应用配置:
bash复制kubectl apply -f dashboard-adminuser.yaml
6.3 获取访问令牌
bash复制kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
6.4 访问Dashboard
启动代理:
bash复制kubectl proxy
访问地址:http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
7. 常见问题排查
7.1 kubelet无法启动
症状:systemctl status kubelet显示不断重启
解决方案:
- 检查/var/log/messages中的日志
- 常见原因是cgroup驱动不一致,确保docker和kubelet使用相同的cgroup驱动
7.2 Pod一直处于Pending状态
可能原因:
- 资源不足
- 没有合适的节点调度
- PV/PVC问题
排查命令:
bash复制kubectl describe pod <pod-name>
kubectl get events --sort-by=.metadata.creationTimestamp
7.3 网络不通
检查步骤:
- 确认flannel pod正常运行
- 检查节点路由表
- 测试跨节点ping
8. 生产环境优化建议
8.1 高可用部署
生产环境建议:
- 至少3个master节点
- 使用外部etcd集群
- 配置负载均衡器
8.2 安全加固
必要措施:
- 定期轮换证书
- 启用RBAC
- 限制dashboard公开访问
- 配置网络策略
8.3 监控与日志
推荐组件:
- Prometheus + Grafana 监控
- EFK (Elasticsearch+Fluentd+Kibana) 日志收集
- Alertmanager 告警
9. 学习资源推荐
- 官方文档:https://kubernetes.io/docs/home/
- Kubernetes in Action(中文版《Kubernetes实战》)
- 尚硅谷Kubernetes课程进阶部分
- Katacoda在线实验平台
我在实际部署中发现,k8s的学习曲线确实比较陡峭,但一旦掌握了核心概念和操作流程,就能体会到它的强大之处。建议新手先按照本指南完成基础集群搭建,再逐步深入学习各个组件的原理和高级功能。
