Docker与Kubernetes企业级实战:从零搭建云原生运维平台
这次我们来深入探讨一套完整的 Linux 运维云原生技术教程,重点聚焦 Docker 和 Kubernetes(K8s)在企业级环境中的实际应用。这套教程不仅包含核心概念解析,还提供了完整的课件资料,帮助 Linux 运维工程师快速进阶到云原生技术栈。
对于已经掌握基础 Linux 运维技能的工程师来说,Docker 和 K8s 是必须攻克的下一代技术门槛。大厂普遍采用云原生架构的核心原因在于其能够实现应用快速部署、弹性伸缩和高可用性。本文将带你从零开始搭建完整的 Docker + K8s 环境,并通过实际案例演示企业级部署流程。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 技术栈组成 | Docker 容器化 + Kubernetes 容器编排 |
| 学习门槛 | 需要具备 Linux 基础运维知识和命令行操作能力 |
| 硬件要求 | 最低 2核4G 内存,推荐 4核8G 以上配置 |
| 部署方式 | 单机学习环境、多节点集群部署 |
| 企业应用场景 | 微服务部署、持续集成、自动扩缩容、故障自愈 |
| 配套资源 | 完整课件、配置模板、实战案例 |
2. 适用场景与使用边界
这套教程特别适合以下人群:
- 已有 Linux 运维经验,希望转型云原生技术的工程师
- 需要为企业搭建容器化平台的技术团队
- 准备面试容器化相关岗位的求职者
- 想要理解大厂技术架构背后原理的技术爱好者
适用场景:
- 传统应用向容器化迁移
- 微服务架构的部署和管理
- 开发测试环境快速搭建
- 生产环境的高可用部署
技术边界:
- 不适合完全没有 Linux 基础的初学者
- 生产环境部署需要更严格的安全配置
- 大规模集群需要专业的网络和存储方案支持
3. 环境准备与前置条件
在开始实践之前,需要确保你的实验环境满足以下要求:
3.1 硬件配置要求
- CPU:至少 2 核,支持虚拟化
- 内存:最低 4GB,推荐 8GB 以上
- 磁盘空间:至少 20GB 可用空间
- 网络:需要互联网连接以下载依赖包
3.2 软件环境要求
- 操作系统:Ubuntu 18.04+ / CentOS 7+ / RHEL 8+
- Linux 内核版本:3.10 或更高
- 软件依赖:systemd、iptables、cgroup 支持
3.3 网络环境配置
确保服务器可以正常访问外网,需要配置正确的 DNS 解析和网络代理(如有需要):
# 检查网络连通性 ping -c 3 baidu.com # 检查 DNS 解析 nslookup docker.com # 如有代理需要配置 export http_proxy=http://your-proxy:port export https_proxy=http://your-proxy:port4. Docker 安装与配置实战
4.1 Docker 安装步骤
以下是基于 Ubuntu 系统的 Docker CE 安装流程:
# 1. 更新软件包索引 sudo apt-get update # 2. 安装必要的依赖包 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 3. 添加 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 4. 设置稳定版仓库 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 # 5. 安装 Docker Engine sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 6. 启动 Docker 服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 7. 验证安装 sudo docker --version sudo docker run hello-world4.2 Docker 基础配置优化
安装完成后,需要进行一些基础配置以优化使用体验:
# 1. 将当前用户加入 docker 组(避免每次使用 sudo) sudo usermod -aG docker $USER # 2. 重新登录使组权限生效 newgrp docker # 3. 配置 Docker 镜像加速器(国内用户必备) sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } } EOF # 4. 重启 Docker 服务 sudo systemctl daemon-reload sudo systemctl restart docker4.3 Docker 常用命令实战
掌握以下核心命令是容器化运维的基础:
# 镜像管理 docker images # 查看本地镜像 docker pull nginx:latest # 拉取镜像 docker rmi <image_id> # 删除镜像 # 容器管理 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器 docker run -d --name my-nginx nginx # 后台运行容器 docker exec -it my-nginx bash # 进入容器 docker stop my-nginx # 停止容器 docker rm my-nginx # 删除容器 # 容器日志查看 docker logs my-nginx # 查看容器日志 docker logs -f my-nginx # 实时查看日志 # 资源监控 docker stats # 查看容器资源使用情况5. Kubernetes 集群搭建实战
5.1 单机学习环境搭建(Minikube)
对于初学者,建议从 Minikube 开始:
# 1. 安装 Minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 2. 安装 kubectl 命令行工具 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # 3. 启动 Minikube 集群 minikube start --driver=docker --memory=4096 --cpus=2 # 4. 验证集群状态 kubectl cluster-info kubectl get nodes5.2 多节点生产级集群搭建
对于生产环境,推荐使用 kubeadm 搭建多节点集群:
Master 节点配置:
# 1. 关闭 swap sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 2. 安装 kubeadm、kubelet、kubectl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb 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 kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 3. 初始化集群 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 # 4. 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 5. 安装安装网络插件(Flannel) kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlWorker 节点加入集群:
# 在 Worker 节点执行 Master 初始化时输出的 join 命令 kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>5.3 集群状态验证
搭建完成后,需要验证集群各组件运行状态:
# 查看节点状态 kubectl get nodes # 查看集群状态 kubectl get cs # 查看所有命名空间的 Pod kubectl get pods --all-namespaces # 查看集群信息 kubectl cluster-info6. Kubernetes 核心概念与实战操作
6.1 Pod 管理与部署
Pod 是 K8s 的最小调度单位,以下是 Pod 的创建和管理:
# nginx-pod.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80应用配置并验证:
# 创建 Pod kubectl apply -f nginx-pod.yaml # 查看 Pod 状态 kubectl get pods # 查看 Pod 详情 kubectl describe pod nginx-pod # 进入 Pod 内部 kubectl exec -it nginx-pod -- bash # 查看 Pod 日志 kubectl logs nginx-pod6.2 Deployment 部署与管理
Deployment 提供了 Pod 的声明式更新:
# nginx-deployment.yaml apiVersion: : apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80部署和更新策略:
# 创建 Deployment kubectl apply -f nginx-deployment.yaml # 查看 Deployment 状态 kubectl get deployments # 扩容到 5 个副本 kubectl scale deployment nginx-deployment --replicas=5 # 更新镜像版本 kubectl set image deployment/nginx-deployment nginx=nginx:1.21 # 回滚到上一个版本 kubectl rollout undo deployment/nginx-deployment6.3 Service 服务发现与负载均衡
Service 为 Pod 提供稳定的网络访问入口:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort创建和测试服务:
# 创建 Service kubectl apply -f nginx-service.yaml # 查看 Service kubectl get services # 获取 NodePort 端口 kubectl get svc nginx-service # 测试服务访问 curl http://<node-ip>:<node-port>7. 企业级应用部署实战
7.1 多环境配置管理
使用 ConfigMap 和 Secret 管理应用配置:
# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: database.host: "mysql-service" database.port: "3306" app.log.level: "INFO" # secret.yaml apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: database.password: cGFzc3dvcmQxMjM= # base64 编码7.2 有状态应用部署(MySQL)
有状态服务需要 PersistentVolume 支持:
# mysql-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: "mysql" replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: root-password ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-persistent-storage spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi7.3 应用健康检查与自愈
配置存活探针和就绪探针:
apiVersion: apps/v1 kind: Deployment metadata: name: webapp-with-probes spec: replicas: 3 template: spec: containers: - name: webapp image: myapp:latest livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 58. 监控与日志管理
8.1 集群监控方案
部署 Prometheus 和 Grafana 进行集群监控:
# 添加 Helm 仓库 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update # 安装 Prometheus Stack helm install prometheus prometheus-community/kube-prometheus-stack8.2 应用日志收集
配置 Fluentd 进行日志收集:
apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config data: fluent.conf: | <source> @type tail path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag kubernetes.* read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>9. 持续集成与持续部署
9.1 GitLab CI/CD 集成
配置自动化部署流水线:
# .gitlab-ci.yml stages: - build - test - deploy build: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA deploy: stage: deploy script: - kubectl set image deployment/myapp myapp=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA only: - master9.2 蓝绿部署策略
实现零停机部署:
# 蓝绿部署脚本示例 #!/bin/bash # 部署新版本(绿环境) kubectl apply -f green-deployment.yaml # 等待新版本就绪 kubectl rollout status deployment/green-deployment # 切换服务指向新版本 kubectl apply -f green-service.yaml # 保留旧版本一段时间后清理 sleep 3600 # 等待1小时 kubectl delete -f blue-deployment.yaml10. 安全配置最佳实践
10.1 网络策略配置
限制 Pod 间网络访问:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database-isolation spec: podSelector: matchLabels: role: database policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: api ports: - protocol: TCP port: 330610.2 RBAC 权限控制
配置基于角色的访问控制:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io11. 故障排查与性能优化
11.1 常见问题排查命令
# 查看 Pod 详细状态 kubectl describe pod <pod-name> # 查看 Pod 日志 kubectl logs <pod-name> # 进入 Pod 调试 kubectl exec -it <pod-name> -- /bin/bash # 查看节点资源使用 kubectl top nodes # 查看 Pod 资源使用 kubectl top pods # 检查集群事件 kubectl get events --sort-by='.lastTimestamp' # 检查网络连通性 kubectl run debug --image=busybox --rm -it --restart=Never -- ping <service-name>11.2 性能优化建议
- 资源请求和限制配置:
resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"- 节点亲和性配置:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd- HPA 自动扩缩容:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=1012. 生产环境部署检查清单
在将应用部署到生产环境前,务必完成以下检查:
- [ ] 所有容器镜像都有明确的版本标签
- [ ] 配置了正确的资源请求和限制
- [ ] 设置了健康检查探针
- [ ] 配置了日志收集和监控
- [ ] 网络策略和安全策略已就绪
- [ ] 备份和恢复方案已测试
- [ ] 灾难恢复流程已文档化
- [ ] 团队成员都经过相关培训
这套 Docker + K8s 教程涵盖了从基础概念到企业级实战的完整路径,配合提供的课件资料,可以帮助 Linux 运维工程师系统性地掌握云原生技术栈。建议按照章节顺序逐步实践,每个技术点都要亲手操作验证,遇到问题时参考排查指南进行调试。