
在当今云原生技术快速发展的背景下掌握 Docker 和 Kubernetesk8s已成为运维工程师和开发者的必备技能。无论是企业级应用部署、微服务架构管理还是自动化运维流程这两项技术都发挥着核心作用。本文将从 Linux 基础命令入手逐步深入 Docker 容器化技术和 k8s 集群管理通过完整实战演示帮助读者系统掌握云计算运维的核心技术栈适合零基础入门或有一定经验需要巩固的开发者。1. Linux 基础命令与运维环境准备Linux 作为容器化技术的基石掌握其常用命令是学习 Docker 和 k8s 的前提。下面将介绍运维工作中最核心的命令和操作技巧。1.1 文件与目录管理命令文件操作是 Linux 运维的基础以下命令使用频率最高# 查看当前目录 pwd # 列出目录内容详细格式 ls -la # 创建目录 mkdir -p /opt/apps/logs # 复制文件 cp source.txt destination.txt # 移动或重命名文件 mv oldname.txt newname.txt # 删除文件或目录 rm -rf /tmp/cache_files注意事项使用rm -rf命令时要格外小心特别是在生产环境中。建议先使用ls确认要删除的内容再执行删除操作。1.2 系统监控与进程管理运维工程师需要实时掌握系统状态以下命令帮助监控系统健康度# 查看系统负载 uptime # 监控系统资源使用情况 top # 查看内存使用 free -h # 检查磁盘空间 df -h # 查看指定进程 ps -ef | grep nginx # 终止进程 kill -9 进程ID在实际运维中建议将常用监控命令封装成脚本定期执行并记录日志便于问题排查和性能分析。1.3 网络配置与连通性测试网络是容器化技术的核心Linux 网络命令必须熟练掌握# 查看IP地址和网络接口 ip addr show # 测试网络连通性 ping 8.8.8.8 # 查看端口监听状态 netstat -tulpn | grep 80 # 跟踪网络路由 traceroute www.baidu.com # 配置防火墙规则CentOS/RHEL firewall-cmd --list-all2. Docker 容器化技术详解Docker 通过容器化技术实现了应用与运行环境的隔离大大简化了部署流程。下面从安装到实战全面讲解 Docker 的使用。2.1 Docker 安装与配置以 Ubuntu 系统为例演示 Docker 的安装过程# 更新软件包索引 sudo apt-get update # 安装依赖包 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common # 添加 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加 Docker 软件源 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 安装 Docker CE sudo apt-get update sudo apt-get install docker-ce # 启动 Docker 服务 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version安装完成后建议将当前用户加入 docker 组避免每次使用 sudosudo usermod -aG docker $USER需要重新登录使权限生效。2.2 Docker 镜像管理镜像是容器的基础掌握镜像操作是使用 Docker 的关键# 搜索镜像 docker search nginx # 拉取官方镜像 docker pull nginx:latest # 查看本地镜像 docker images # 删除镜像 docker rmi 镜像ID # 导出镜像到文件 docker save -o nginx.tar nginx:latest # 从文件导入镜像 docker load -i nginx.tar最佳实践在生产环境中建议使用特定版本标签而非 latest避免因版本更新导致兼容性问题。2.3 Docker 容器操作实战容器是 Docker 的核心概念以下是常用容器操作命令# 运行容器后台模式 docker run -d --name my-nginx -p 80:80 nginx:latest # 运行容器交互模式 docker run -it ubuntu:20.04 /bin/bash # 查看运行中的容器 docker ps # 查看所有容器包括停止的 docker ps -a # 停止容器 docker stop my-nginx # 启动已停止的容器 docker start my-nginx # 进入运行中的容器 docker exec -it my-nginx /bin/bash # 查看容器日志 docker logs my-nginx # 删除容器 docker rm my-nginx2.4 Dockerfile 编写与镜像构建Dockerfile 是构建自定义镜像的蓝图下面是一个完整的示例# 使用官方 Python 运行时作为父镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将当前目录内容复制到容器的 /app 中 COPY . /app # 安装 requirements.txt 中指定的依赖 RUN pip install --no-cache-dir -r requirements.txt # 暴露端口 80 EXPOSE 80 # 定义环境变量 ENV NAME World # 容器启动时运行 app.py CMD [python, app.py]构建自定义镜像docker build -t my-python-app .3. Kubernetes 集群架构与核心概念Kubernetesk8s是容器编排的事实标准理解其架构和核心概念至关重要。3.1 k8s 集群组件详解一个典型的 k8s 集群包含以下核心组件Master 节点集群的大脑负责调度和管理API Server集群管理的统一入口etcd键值存储数据库保存集群状态Scheduler负责 Pod 的调度决策Controller Manager运行各种控制器Worker 节点运行工作负载的机器Kubelet与 API Server 通信的节点代理Kube-proxy实现服务发现和负载均衡Container Runtime如 Docker、containerd3.2 k8s 核心资源对象k8s 通过资源对象管理应用生命周期主要对象包括Pod最小的部署单元包含一个或多个容器Deployment定义 Pod 的部署策略和更新方式Service提供稳定的网络端点访问 PodConfigMap存储应用配置信息Secret存储敏感信息如密码、密钥Namespace实现资源隔离和多租户管理4. Kubernetes 集群搭建实战下面以 kubeadm 工具为例演示如何快速搭建一个 k8s 集群。4.1 环境准备与前置配置在所有节点上执行以下准备工作# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭 SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 关闭 swap swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 设置主机名 hostnamectl set-hostname k8s-master # 将节点主机名加入 hosts 文件 echo 192.168.1.100 k8s-master /etc/hosts echo 192.168.1.101 k8s-node1 /etc/hosts echo 192.168.1.102 k8s-node2 /etc/hosts # 配置内核参数 cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOF sysctl --system4.2 安装 Docker 和 k8s 组件在所有节点上安装容器运行时和 k8s 组件# 安装 Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable docker systemctl start docker # 添加 k8s 源 cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF # 安装 k8s 组件 yum install -y kubelet kubeadm kubectl systemctl enable kubelet systemctl start kubelet4.3 初始化 Master 节点在 Master 节点上执行初始化kubeadm init --apiserver-advertise-address192.168.1.100 --pod-network-cidr10.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/config4.4 安装网络插件部署 Flannel 网络插件kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml4.5 加入 Worker 节点在 Worker 节点上执行 Master 初始化时输出的 join 命令kubeadm join 192.168.1.100:6443 --token token --discovery-token-ca-cert-hash hash验证集群状态kubectl get nodes kubectl get pods --all-namespaces5. Kubernetes 应用部署与管理掌握集群搭建后下面通过实战演示如何部署和管理应用。5.1 使用 YAML 文件部署应用创建 nginx-deployment.yaml 文件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.19 ports: - containerPort: 80 resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m部署应用并验证kubectl apply -f nginx-deployment.yaml kubectl get deployments kubectl get pods -l appnginx5.2 创建 Service 暴露应用创建 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 kubectl get services5.3 应用扩缩容与更新k8s 提供了便捷的扩缩容和滚动更新机制# 手动扩容到 5 个副本 kubectl scale deployment nginx-deployment --replicas5 # 自动扩缩容需要 metrics-server kubectl autoscale deployment nginx-deployment --min3 --max10 --cpu-percent50 # 更新镜像版本触发滚动更新 kubectl set image deployment/nginx-deployment nginxnginx:1.20 # 查看更新状态 kubectl rollout status deployment/nginx-deployment # 回滚到上一版本 kubectl rollout undo deployment/nginx-deployment6. 运维监控与日志管理生产环境中监控和日志是保障系统稳定性的关键。6.1 使用 Prometheus 监控集群部署 Prometheus 监控栈apiVersion: v1 kind: ConfigMap metadata: name: prometheus-server-conf labels: name: prometheus-server-conf data: prometheus.yml: | global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: kubernetes-apiservers kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https6.2 日志收集与分析部署 EFKElasticsearch、Fluentd、Kibana日志系统apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: kube-system 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 match kubernetes.** type elasticsearch host elasticsearch-logging port 9200 logstash_format true logstash_prefix kubernetes include_tag_key true /match7. 常见问题排查与解决方案在实际运维中经常会遇到各种问题下面列出常见问题及解决方法。7.1 Pod 启动失败问题排查问题现象可能原因解决方案ImagePullBackOff镜像拉取失败检查镜像名称、标签、仓库权限CrashLoopBackOff容器启动后立即退出查看容器日志检查应用配置Pending资源不足或调度问题检查节点资源、污点容忍度排查命令示例# 查看 Pod 详细信息 kubectl describe pod pod-name # 查看 Pod 日志 kubectl logs pod-name # 查看事件信息 kubectl get events --sort-by.lastTimestamp7.2 网络连通性问题网络问题排查流程# 检查 Service 和 Endpoints kubectl get svc nginx-service kubectl get endpoints nginx-service # 检查网络策略 kubectl get networkpolicies # 在 Pod 内测试网络连通性 kubectl exec -it pod-name -- nslookup kubernetes.default.svc.cluster.local kubectl exec -it pod-name -- ping target-ip7.3 存储卷挂载问题存储问题排查方法# 检查 PVC 状态 kubectl get pvc # 查看 PV 详情 kubectl get pv # 检查存储类 kubectl get storageclass # 查看 Pod 挂载详情 kubectl describe pod pod-name | grep -A 10 Mounts8. 生产环境最佳实践基于实际运维经验总结以下最佳实践建议。8.1 安全配置建议安全性是生产环境的生命线# 使用 SecurityContext 限制权限 apiVersion: apps/v1 kind: Deployment metadata: name: security-demo spec: template: spec: securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 2000 containers: - name: app image: nginx:1.19 securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL8.2 资源管理与优化合理分配资源保障应用稳定性apiVersion: apps/v1 kind: Deployment metadata: name: resource-demo spec: template: spec: containers: - name: app image: nginx:1.19 resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 58.3 备份与灾难恢复定期备份 etcd 数据和重要资源# 备份 etcd ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save snapshot.db # 备份重要资源 kubectl get all --all-namespaces -o yaml all-resources-backup.yaml通过系统学习 Linux 基础命令、Docker 容器化技术和 Kubernetes 集群管理读者可以建立起完整的云计算运维知识体系。建议按照本文的步骤进行实践操作从单机部署开始逐步扩展到集群环境在实际项目中不断积累经验。