跳到主要内容 Kubernetes (K8s) 从入门到实战:超详细教程 | 极客日志
编程语言
Kubernetes (K8s) 从入门到实战:超详细教程 Kubernetes 容器编排标准教程,涵盖环境准备、集群搭建、核心操作及高级特性。内容包括节点初始化、Docker/Containerd 安装、kubeadm 部署 Master/Worker 节点、网络插件 Calico 配置。实战部分涉及 Deployment、Service 创建,ConfigMap/Secret 管理,PV/PVC 持久化存储及探针配置。提供常见避坑指南与监控方案(Prometheus+Grafana),帮助开发者从零掌握 K8s 运维与故障排查。
laoliangsh 发布于 2026/3/15 更新于 2026/4/18 5 浏览Kubernetes(简称 K8s)是容器编排领域的事实标准,能够自动化容器的部署、扩缩容、运维和故障恢复。本文从环境搭建、核心概念、实战操作到高级特性,全方位讲解 K8s 的使用,适合零基础入门到企业级实战。
一、前置知识与环境准备
1. 核心概念预热(新手必看)
先掌握 3 个核心概念,避免后续操作迷茫:
Pod :K8s 最小部署单元,可包含 1 个或多个容器,共享网络和存储;
Node :运行 Pod 的服务器(物理机/虚拟机),分为 Master(控制节点)和 Worker(工作节点);
Controller :控制器,用于管理 Pod 的生命周期(如 Deployment 确保 Pod 数量稳定)。
2. 环境要求 角色 配置建议 系统要求 Master 节点 2 核 4G 以上,1 台 CentOS7+/Ubuntu20.04+,64 位 Worker 节点 2 核 2G 以上,至少 1 台(推荐 2+ 台) 同上 网络 所有节点互通,禁用防火墙/SELinux –
3. 环境初始化(所有节点执行)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
hostnamectl set-hostname k8s-master
cat >> /etc/hosts <<EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-worker1
192.168.1.102 k8s-worker2
EOF
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
4. 安装 Docker/Containerd(容器运行时) K8s 需要容器运行时,推荐 Containerd(Docker 已逐步淘汰):
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/registry.k8s.io\/pause/registry.aliyuncs.com\/google_containers\/pause/g' /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
systemctl restart containerd && systemctl enable containerd
5. 安装 K8s 组件(kubeadm/kubelet/kubectl)
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=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.28.3 kubeadm-1.28.3 kubectl-1.28.3
systemctl enable kubelet && systemctl start kubelet
二、K8s 集群搭建(单 Master+ 多 Worker)
1. 初始化 Master 节点
kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
mkdir -p $HOME /.kube
cp -i /etc/kubernetes/admin.conf $HOME /.kube/config
chown $(id -u):$(id -g) $HOME /.kube/config
kubectl get nodes
2. 安装网络插件(Calico,必装!)
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/g' calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
kubectl get nodes
3. 添加 Worker 节点到集群
kubeadm token create --print-join-command
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kubectl get nodes
三、K8s 核心操作实战
1. 部署第一个应用(Nginx)
(1)创建 Deployment(管理 Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24-alpine
ports:
- containerPort: 80
resources:
limits:
cpu:"0.5"
memory:"512Mi"
requests:
cpu:"0.1"
memory:"128Mi"
kubectl apply -f nginx-deployment.yaml
kubectl get deployments
kubectl get pods -o wide
(2)创建 Service(暴露应用)
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
kubectl apply -f nginx-service.yaml
kubectl get svc
curl http://192.168.1.101:30080
2. 核心运维操作
kubectl describe pod nginx-deployment-xxxx-xxxx
kubectl describe svc nginx-service
kubectl logs nginx-deployment-xxxx-xxxx
kubectl logs -f nginx-deployment-xxxx-xxxx
kubectl exec -it nginx-deployment-xxxx-xxxx -- /bin/sh
kubectl scale deployment nginx-deployment --replicas=5
kubectl set image deployment/nginx-deployment nginx=nginx:1.25-alpine
kubectl rollout undo deployment/nginx-deployment
kubectl delete deployment nginx-deployment
kubectl delete svc nginx-service
3. 配置管理(ConfigMap/Secret)
(1)ConfigMap(存储明文配置)
kubectl create configmap nginx-config --from-file=nginx.conf=/etc/nginx/nginx.conf
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
return 200 "Hello K8s!\n";
}
}
}
EOF
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-config-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-config
template:
metadata:
labels:
app: nginx-config
spec:
containers:
- name: nginx
image: nginx:1.24-alpine
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: nginx-config-volume
configMap:
name: nginx-config
EOF
(2)Secret(存储敏感信息)
kubectl create secret generic mysql-secret \
--from-literal=username=root \
--from-literal=password=123456
kubectl get secret mysql-secret -o yaml
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sleep", "3600"]
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: MYSQL_PWD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
EOF
四、高级特性实战
1. 持久化存储(PV/PVC)
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/nginx-pv
type: DirectoryOrCreate
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-pv-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pv
template:
metadata:
labels:
app: nginx-pv
spec:
containers:
- name: nginx
image: nginx:1.24-alpine
ports:
- containerPort: 80
volumeMounts:
- name: nginx-storage
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc
2. 健康检查(探针) apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-probe-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-probe
template:
metadata:
labels:
app: nginx-probe
spec:
containers:
- name: nginx
image: nginx:1.24-alpine
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 10
3. 命名空间与资源配额
kubectl create namespace dev
kubectl apply -f nginx-deployment.yaml -n dev
kubectl apply -f - <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
pods: "10" # 最多 10 个 Pod
requests.cpu: "2" # 总 CPU 请求不超过 2 核
requests.memory: "2Gi" # 总内存请求不超过 2Gi
limits.cpu: "4" # 总 CPU 限制不超过 4 核
limits.memory: "4Gi" # 总内存限制不超过 4Gi
EOF
五、避坑指南(新手必看)
1. 环境搭建类坑
坑 1 :初始化集群时拉取镜像失败。
✅ 避坑方案:kubeadm init 时指定 --image-repository 为阿里云镜像仓库,避免访问国外仓库超时。
坑 2 :节点状态一直 NotReady。
✅ 避坑方案:
检查网络插件是否部署成功:kubectl get pods -n kube-system;
检查 Pod 网段是否和网络插件配置一致;
查看 kubelet 日志:journalctl -u kubelet -f。
坑 3 :Worker 节点加入集群失败。
✅ 避坑方案:
检查 token 是否过期(默认 24 小时),重新生成:kubeadm token create --print-join-command;
检查 Master 节点 6443 端口是否开放;
所有节点时间同步:yum install -y ntp && ntpdate ntp.aliyun.com。
2. 应用部署类坑
坑 4 :Pod 状态为 ImagePullBackOff。
✅ 避坑方案:
使用国内镜像(如阿里云、网易云镜像仓库);
配置镜像拉取密钥:kubectl create secret docker-registry regcred --docker-server=xxx --docker-username=xxx --docker-password=xxx。
坑 5 :Service 暴露后无法访问。
✅ 避坑方案:
检查 Service 的 selector 是否和 Pod 的 label 匹配;
检查 NodePort 端口是否在 30000-32767 范围内;
检查节点防火墙是否放行 NodePort 端口。
3. 数据持久化类坑
坑 6 :PV 和 PVC 绑定失败。
✅ 避坑方案:
确保 PV 的 accessModes 和 PVC 一致;
确保 PVC 的 storage 请求不超过 PV 的 capacity;
检查 PV 的 storageClassName 是否和 PVC 匹配(若指定)。
六、集群监控与故障排查
1. 基础监控(kubectl 内置命令)
kubectl get componentstatuses
kubectl describe pod <pod-name>
kubectl top nodes
kubectl top pods
2. 进阶监控(Prometheus+Grafana)
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/0namespace-namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
kubectl patch svc grafana -n monitoring -p '{"spec":{"type":"NodePort"}}'
kubectl get svc grafana -n monitoring
总结
关键点回顾
K8s 集群搭建核心步骤:环境初始化 → 安装容器运行时 → kubeadm 初始化 Master → 部署网络插件 → 添加 Worker 节点;
核心资源关系:Deployment 管理 Pod 副本,Service 暴露 Pod 访问,ConfigMap/Secret 管理配置,PV/PVC 实现持久化;
避坑核心:优先使用国内镜像、确保网络互通、匹配资源标签/网段、检查端口和权限。
通过本文的教程,你可以从零搭建 K8s 集群,掌握应用部署、配置管理、持久化存储等核心操作,同时避开新手常见的坑。对于生产环境,建议使用多 Master 节点(高可用)、专业存储方案(如 NFS/CSI)和完善的监控告警体系,确保集群稳定运行。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online