Kubernetes集群搭建教程从入门到精通完整指南
在当今云原生时代,容器化技术已成为应用部署和运维的基石。而Kubernetes,作为容器编排领域的事实标准,能够高效地管理、扩展和自动化容器化应用的部署。本指南旨在提供一个从零开始,逐步深入的Kubernetes集群搭建教程。我们将从基础概念讲起,逐步完成一个生产可用集群的搭建,并融入Linux系统管理、数据库优化思路以及TypeScript在云原生生态中的应用视角,帮助你不仅“搭起来”,更能“用得好”。
一、搭建前的准备:环境与概念梳理
在动手之前,我们需要明确目标和准备环境。一个典型的Kubernetes集群包含一个控制平面和多个工作节点。
- 控制平面 (Control Plane): 集群的大脑,负责调度、API服务、状态存储等。核心组件包括
kube-apiserver,etcd,kube-scheduler,kube-controller-manager。 - 工作节点 (Worker Node): 运行实际容器负载的机器。核心组件包括
kubelet,kube-proxy, 容器运行时(如Docker或containerd)。
环境要求:
- 至少两台运行Linux的机器(虚拟机或物理机),建议使用Ubuntu 20.04/22.04 LTS或CentOS 7/8。
- 每台机器2GB以上RAM,2个以上CPU核心。
- 网络互通,主机名唯一,并正确配置
/etc/hosts或DNS。 - 关闭交换分区:
sudo swapoff -a,并注释掉/etc/fstab中的swap行。 - 关闭防火墙或配置相应规则(生产环境慎用)。
以下是一个简单的Linux主机名和 hosts 配置示例:
# 在所有节点上执行,设置主机名(以控制节点为例)
sudo hostnamectl set-hostname k8s-master
# 编辑 /etc/hosts,确保所有节点都能解析彼此
# 假设IP地址如下:
# 192.168.1.100 k8s-master
# 192.168.1.101 k8s-node1
sudo vi /etc/hosts
# 添加行:192.168.1.100 k8s-master
# 添加行:192.168.1.101 k8s-node1
二、使用kubeadm快速搭建集群
kubeadm是Kubernetes官方提供的集群生命周期管理工具,能极大简化搭建过程。我们以一台控制节点(master)和一台工作节点(node)为例。
步骤1:在所有节点安装容器运行时和kubeadm
我们选择containerd作为容器运行时,它比Docker更轻量,是Kubernetes推荐的运行时。
# 1. 安装必要的工具和配置内核参数
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 2. 安装containerd
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y containerd.io
# 3. 配置containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 将SystemdCgroup设置为true(重要!)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
# 4. 安装kubeadm, kubelet, kubectl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.27.3-00 kubeadm=1.27.3-00 kubectl=1.27.3-00
sudo apt-mark hold kubelet kubeadm kubectl # 防止自动更新
步骤2:初始化控制平面
在控制节点上执行初始化命令。这里我们使用flannel作为Pod网络插件(CNI)。
# 初始化集群,指定API Server的访问地址(控制节点的IP)
sudo kubeadm init --apiserver-advertise-address=192.168.1.100 --pod-network-cidr=10.244.0.0/16
# 初始化成功后,按照提示配置kubectl(普通用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装Pod网络插件(Flannel)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
记录下初始化成功时输出的kubeadm join命令,用于工作节点加入。
步骤3:加入工作节点
在工作节点上,运行上一步记录的kubeadm join命令。
sudo kubeadm join 192.168.1.100:6443 --token <your-token> --discovery-token-ca-cert-hash sha256:<your-hash>
回到控制节点,验证节点状态:
kubectl get nodes
# 输出应显示两个节点,状态均为 Ready
三、部署应用与深入配置
集群搭建完成后,我们来部署一个简单的应用,并介绍一些关键概念。
部署一个Nginx应用
创建一个YAML文件nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21-alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort # 通过节点IP和端口访问
应用配置:
kubectl apply -f nginx-deployment.yaml
kubectl get pods,svc # 查看Pod和服务
融入数据库优化与TypeScript视角
在真实场景中,应用往往需要连接数据库。Kubernetes中运行数据库(如MySQL、PostgreSQL)时,数据库优化的经典原则依然适用,但需结合云原生特点:
- 持久化存储: 必须使用
PersistentVolume (PV)和PersistentVolumeClaim (PVC)来保存数据,防止Pod重启后数据丢失。 - 资源限制: 为数据库Pod设置合理的
resources.limits(CPU、内存),避免其占用过多资源影响其他应用,也防止其因内存不足被OOM Killer终止。 - 配置分离: 将数据库连接字符串、密码等敏感信息存储在
Secret中,将普通配置(如连接池大小)存储在ConfigMap中。
同时,现代应用后端越来越多地使用TypeScript(配合Node.js)编写。在Kubernetes中部署TypeScript应用的最佳实践是:
- 使用多阶段Docker构建,将TypeScript编译为JavaScript,最终镜像只包含运行时的Node环境和编译后的JS文件,减小镜像体积。
- 在Deployment中配置
livenessProbe和readinessProbe,对健康检查接口进行探活。 - 利用Kubernetes的
HorizontalPodAutoscaler (HPA),根据CPU或自定义指标(如QPS)自动扩缩容应用实例。
四、生产环境进阶考量
从“可用”到“生产可用”,还需要考虑以下方面:
- 高可用控制平面: 使用多个Master节点,并通过负载均衡器暴露
kube-apiserver。使用kubeadm的--control-plane-endpoint参数和外部etcd集群可以实现。 - 安全的镜像仓库: 搭建私有镜像仓库(如Harbor),并配置Kubernetes使用其拉取镜像。
- 网络策略: 使用
NetworkPolicy实现Pod间的网络隔离,遵循最小权限原则。 - 日志与监控: 集成EFK(Elasticsearch, Fluentd, Kibana)栈进行日志收集,集成Prometheus + Grafana进行集群和应用监控。
- Ingress控制器: 部署Ingress Controller(如Nginx Ingress或Traefik),管理集群外部HTTP/S流量的路由。
- 备份与恢复: 定期备份
etcd集群数据,这是恢复整个集群状态的关键。
一个简单的NetworkPolicy示例,只允许带有特定标签的Pod访问数据库:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access-policy
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: my-api
ports:
- protocol: TCP
port: 5432
五、日常运维与故障排查命令
掌握以下命令是运维Kubernetes集群的基础:
kubectl get <resource>: 查看资源状态(pods, nodes, svc, deployments等)。kubectl describe <resource> <name>: 查看资源的详细信息和事件,是故障排查的第一选择。kubectl logs <pod-name> [-c <container-name>]: 查看Pod或容器的日志。kubectl exec -it <pod-name> -- /bin/sh: 进入Pod内的容器进行调试。kubectl apply -f <file.yaml>/kubectl delete -f <file.yaml>: 应用或删除配置。kubectl cordon/uncordon/drain <node-name>: 标记节点不可调度、恢复调度、安全驱逐节点上的Pod。
总结
通过本指南,我们完成了一个从零到一的Kubernetes集群搭建之旅。我们从环境准备、核心概念入手,利用kubeadm工具快速搭建了一个基础集群,并部署了示例应用。更重要的是,我们超越了简单的搭建,探讨了如何将数据库优化的思维融入云原生环境,以及TypeScript应用在Kubernetes中的部署模式。最后,我们展望了生产环境所需的高可用、安全、监控等进阶主题。
Kubernetes的学习曲线虽然陡峭,但其带来的自动化、弹性和可移植性收益是巨大的。建议读者在掌握本指南内容后,继续深入探索Helm包管理、Operator模式、服务网格(如Istio)等高级主题,并始终在测试环境中充分验证后再应用于生产。记住,扎实的Linux系统管理功底是玩转Kubernetes的坚实后盾。祝你在这条云原生道路上越走越远!




