这次我们来深入探讨一套完整的 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:port

4. 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-world

4.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 docker

4.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 nodes

5.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.yml

Worker 节点加入集群:

# 在 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-info

6. 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-pod

6.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-deployment

6.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: 10Gi

7.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: 5

8. 监控与日志管理

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-stack

8.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:
    - master

9.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.yaml

10. 安全配置最佳实践

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: 3306

10.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.io

11. 故障排查与性能优化

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 性能优化建议

  1. 资源请求和限制配置
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
  1. 节点亲和性配置
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values:
          - ssd
  1. HPA 自动扩缩容
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10

12. 生产环境部署检查清单

在将应用部署到生产环境前,务必完成以下检查:

  • [ ] 所有容器镜像都有明确的版本标签
  • [ ] 配置了正确的资源请求和限制
  • [ ] 设置了健康检查探针
  • [ ] 配置了日志收集和监控
  • [ ] 网络策略和安全策略已就绪
  • [ ] 备份和恢复方案已测试
  • [ ] 灾难恢复流程已文档化
  • [ ] 团队成员都经过相关培训

这套 Docker + K8s 教程涵盖了从基础概念到企业级实战的完整路径,配合提供的课件资料,可以帮助 Linux 运维工程师系统性地掌握云原生技术栈。建议按照章节顺序逐步实践,每个技术点都要亲手操作验证,遇到问题时参考排查指南进行调试。

更多推荐