想学习 Kubernetes (k8s) 搭建教程吗?一份从入门到实操的完整指南,帮你快速搭建并运行一个 Kubernetes 集群。
Kubernetes (k8s) 搭建教程
1. Kubernetes 简介
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它支持集群管理、多副本部署、负载均衡、服务发现等功能。
2. 环境准备
- 准备至少一台 Linux 服务器(推荐 Ubuntu 20.04+ 或 CentOS 7+)
- 建议配置至少 2GB 内存和 2核 CPU(单节点实验)
- 服务器间网络连通
- 关闭交换分区(swap)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
3. 安装 Docker
Kubernetes 依赖容器运行时,Docker 是最常用的。
Ubuntu 安装 Docker
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
4. 安装 kubeadm、kubelet 和 kubectl
Kubeadm 用于快速搭建集群,kubelet 是集群节点代理,kubectl 是命令行客户端。
添加 Kubernetes 官方源并安装
sudo apt update && sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5. 初始化 Kubernetes Master 节点
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
- --pod-network-cidr 需根据所用网络插件调整,这里以 Flannel 为例使用 10.244.0.0/16。
初始化完成后,会输出加入集群的命令,示例:
kubeadm join 192.168.0.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxx
6. 配置 kubectl 使用权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
7. 安装 Pod 网络插件 (Flannel 示例)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
8. 加入 Worker 节点
在每个工作节点执行 kubeadm join 命令(第5步中 kubeadm init 输出的)。
9. 验证集群状态
kubectl get nodes
kubectl get pods -A
10. 部署示例应用测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
通过 NodePort 端口访问 nginx 服务。
Kubernetes Dashboard 部署教程
1. 下载并部署 Dashboard 组件
执行以下命令,直接从官方 GitHub 仓库部署 Dashboard:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.8.0/aio/deploy/recommended.yaml
2. 创建访问 Dashboard 的 ServiceAccount 和 ClusterRoleBinding
Dashboard 默认需要身份认证,建议创建一个管理员权限的账户(仅用于测试环境,生产环境请严格控制权限):
cat <<EOF | kubectl apply -f -
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
EOF
3. 获取访问令牌(Token)
运行命令获取刚才创建的 ServiceAccount 的 Token:
kubectl -n kubernetes-dashboard create token admin-user
复制输出的 Token,后续登录 Dashboard 用。
4. 访问 Dashboard
默认 Dashboard 是 ClusterIP 类型,无法直接从外网访问。可通过 kubectl proxy 代理访问:
kubectl proxy
然后在浏览器打开:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
5. 登录 Dashboard
用第3步获取的 Token 登录 Dashboard,进入后即可图形化管理 Kubernetes 资源。
6. 可选:暴露 Dashboard 服务(不推荐生产环境,安全风险)
如果需要从外网访问,可以修改服务类型为 NodePort 或 LoadBalancer(视环境而定),示例:
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
把 type: ClusterIP 改为:
type: NodePort
然后保存,查看 NodePort 端口:
kubectl -n kubernetes-dashboard get svc kubernetes-dashboard
通过节点 IP 和端口访问。
注意事项
- Dashboard 默认会管理集群资源,生产环境请使用最小权限账号。
- 建议配合身份认证和 HTTPS 代理(Ingress、反向代理)使用。
- 结合 kubectl proxy 是最安全的访问方式。
一键部署 Kubernetes Dashboard 的 Bash 脚本,包括安装 Dashboard、创建管理员账户、获取访问 Token,并给出后续访问提示。
#!/bin/bash
set -e
echo "1. 部署 Kubernetes Dashboard..."
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.8.0/aio/deploy/recommended.yaml
echo "2. 创建管理员 ServiceAccount 和 ClusterRoleBinding..."
kubectl apply -f - <<EOF
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
EOF
echo "3. 等待 Dashboard Pod 运行..."
kubectl -n kubernetes-dashboard wait --for=condition=Ready pod -l k8s-app=kubernetes-dashboard --timeout=120s
echo "4. 获取 admin-user 的访问 Token..."
TOKEN=$(kubectl -n kubernetes-dashboard create token admin-user)
echo "--------------------------------------------"
echo "Dashboard 部署完成!"
echo "请使用下面的 Token 登录 Dashboard:"
echo
echo "$TOKEN"
echo
echo "--------------------------------------------"
echo "启动访问代理:"
echo "kubectl proxy"
echo "然后浏览器访问:"
echo "http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/"
echo "--------------------------------------------"
使用说明:
- 保存脚本,比如 deploy-dashboard.sh
- 赋予执行权限:chmod +x deploy-dashboard.sh
- 运行脚本:./deploy-dashboard.sh
- 脚本结束后会打印登录 Token 和访问方式提示
- 打开新终端运行 kubectl proxy,然后浏览器访问提示的地址即可
增强版 Kubernetes 集群搭建
环境优化建议
- 多节点推荐配置:
- Master节点:2核CPU/4GB内存/50GB磁盘
- Worker节点:根据应用需求调整(建议至少2核/2GB)
- 系统统一化:
# 所有节点执行
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo systemctl disable --now firewalld
Docker 配置优化
# 配置cgroup驱动为systemd(与k8s一致)
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
sudo systemctl restart docker
kubeadm 初始化增强
# 更完整的初始化命令(替换你的步骤5)
sudo kubeadm init \
--control-plane-endpoint="YOUR_MASTER_IP" \
--pod-network-cidr=10.244.0.0/16 \
--upload-certs \
--apiserver-advertise-address=0.0.0.0
必备插件推荐
- 网络插件对比:
Flannel:最简单
Calico:支持网络策略
# Calico安装(替代Flannel)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
- 可视化工具:
# 安装Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 创建访问令牌
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
快速测试脚本
#!/bin/bash
# 部署测试应用并自动获取访问URL
kubectl create deployment test-app --image=nginx
kubectl expose deployment test-app --port=80 --type=NodePort
PORT=$(kubectl get svc test-app -o jsonpath='{.spec.ports[0].nodePort}')
IP=$(hostname -I | awk '{print $1}')
echo "访问地址: http://$IP:$PORT"
故障排查锦囊
- 节点NotReady:
journalctl -u kubelet -f # 查看kubelet日志
- Pod卡在Pending:
kubectl describe pod <pod-name> | grep -A 10 Events
- 重置集群:
kubeadm reset && rm -rf /etc/cni/net.d
进阶路线图
- 存储方案:
NFS动态供给
Rook Ceph分布式存储
- 安全加固:
# 定期轮换证书
kubeadm certs renew all
- CI/CD集成:
ArgoCD GitOps实践
Tekton流水线