
在企业级应用部署和运维领域传统方式往往面临环境不一致、资源利用率低、扩展困难等痛点。随着云原生技术的成熟Docker和KubernetesK8s已成为企业运维转型的核心工具。本文将系统讲解从Linux运维进阶到云原生技术的完整路径涵盖Docker容器化、K8s集群管理、生产环境实战等关键知识点并提供可复用的配置模板和排错方案。1. 云原生技术核心概念与价值1.1 什么是云原生云原生是一套构建和运行应用程序的方法论它充分利用云计算交付模型的优势。核心包含四个关键要素容器化通过Docker等容器技术打包应用及其依赖实现环境一致性微服务架构将单体应用拆分为松耦合的独立服务便于独立部署和扩展动态编排使用Kubernetes自动管理容器生命周期、调度和弹性伸缩DevOps文化开发与运维紧密协作实现持续集成和持续部署1.2 Docker与Kubernetes的关系定位Docker解决了应用打包和隔离的问题而Kubernetes解决了多容器集群管理的问题。两者关系可以理解为Docker是集装箱标准化应用打包格式实现环境一致性Kubernetes是港口调度系统管理大量集装箱的装卸、运输和资源分配实际生产中通常使用Docker构建镜像然后由Kubernetes调度运行这些镜像1.3 企业采用云原生的核心价值对于运维团队而言云原生技术带来的直接收益包括环境一致性开发、测试、生产环境完全一致避免在我这里能跑的问题资源利用率提升容器轻量级特性可比虚拟机提高3-5倍部署密度快速弹性伸缩根据业务负载自动扩缩容应对流量高峰故障自愈能力节点故障时自动迁移工作负载提高系统可用性标准化运维流程统一的部署、监控、日志收集方案2. 环境准备与版本规划2.1 基础环境要求建议使用CentOS 7.9或Ubuntu 20.04 LTS作为实验环境硬件配置最低要求2核CPU、4GB内存、20GB硬盘单节点测试3台以上节点建议每台4核8GB生产学习环境网络互通防火墙配置正确2.2 版本兼容性说明当前主流稳定版本组合Docker CE 20.10.xKubernetes 1.24.x注意1.24版本开始移除Docker Shim需使用containerd容器运行时containerd 1.6.x重要提醒生产环境部署前务必测试版本兼容性避免新版本特性不兼容问题。2.3 系统初始化配置# 关闭防火墙生产环境需配置安全组规则 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 关闭swap swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 设置时间同步 yum install -y ntpdate ntpdate time.windows.com # 配置内核参数 cat EOF /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sysctl --system3. Docker核心技术深度解析3.1 Docker架构与核心组件Docker采用客户端-服务器架构主要组件包括Docker Daemon守护进程管理容器、镜像、网络等Docker Client命令行工具与Daemon交互Docker Registry镜像仓库如Docker Hub、私有仓库Docker Images只读模板包含运行应用所需的所有内容Docker Containers镜像的运行实例3.2 Docker镜像管理实战# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:1.20 # 查看本地镜像 docker images # 镜像打标签 docker tag nginx:1.20 myregistry.com/nginx:1.20 # 推送镜像到私有仓库 docker push myregistry.com/nginx:1.20 # 导出导入镜像 docker save -o nginx.tar nginx:1.20 docker load -i nginx.tar3.3 Docker容器操作详解# 运行容器 docker run -d --name nginx-container -p 80:80 nginx:1.20 # 查看运行中的容器 docker ps # 查看所有容器包括停止的 docker ps -a # 进入容器 docker exec -it nginx-container /bin/bash # 查看容器日志 docker logs nginx-container # 停止和删除容器 docker stop nginx-container docker rm nginx-container # 容器资源限制 docker run -d --name limited-container --memory512m --cpus1 nginx:1.203.4 Dockerfile最佳实践# 使用官方基础镜像 FROM nginx:1.20-alpine # 设置维护者信息 LABEL maintainerdevopscompany.com # 设置工作目录 WORKDIR /usr/share/nginx/html # 复制文件充分利用分层构建 COPY package.json . RUN npm install # 复制源代码 COPY src/ . # 暴露端口 EXPOSE 80 # 健康检查 HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost/ || exit 1 # 使用非root用户运行 RUN chown -R nginx:nginx /usr/share/nginx/html USER nginx # 启动命令 CMD [nginx, -g, daemon off;]4. Kubernetes集群部署实战4.1 使用kubeadm部署集群# 安装kubeadm、kubelet、kubectl cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://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.24.0 kubeadm-1.24.0 kubectl-1.24.0 systemctl enable kubelet systemctl start kubelet # 初始化Master节点 kubeadm init \ --apiserver-advertise-address192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.24.0 \ --service-cidr10.96.0.0/12 \ --pod-network-cn10.244.0.0/16 # 配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件Flannel kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/README.md4.2 节点加入集群# 在Master节点获取加入命令 kubeadm token create --print-join-command # 在Worker节点执行加入命令 kubeadm join 192.168.1.100:6443 --token token \ --discovery-token-ca-cert-hash sha256:hash4.3 验证集群状态# 查看节点状态 kubectl get nodes # 查看集群组件状态 kubectl get pods -n kube-system # 查看集群信息 kubectl cluster-info5. Kubernetes核心概念与操作5.1 Pod管理与调度Pod是K8s最小部署单元一个Pod包含一个或多个容器apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx-container image: nginx:1.20 ports: - containerPort: 80 resources: requests: memory: 128Mi cpu: 100m limits: memory: 256Mi cpu: 500m5.2 Deployment控制器Deployment提供声明式更新支持滚动更新和回滚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 --- # 服务发现配置 apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 targetPort: 80 type: LoadBalancer5.3 服务发现与负载均衡K8s提供四种Service类型ClusterIP集群内部访问默认NodePort通过节点IP和端口访问LoadBalancer云提供商负载均衡器ExternalName外部服务别名5.4 配置管理实践# ConfigMap配置 apiVersion: v1 kind: ConfigMap metadata: name: app-config data: database.host: mysql-service database.port: 3306 app.log.level: INFO # Secret配置base64编码 apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: username: YWRtaW4 password: MWYyZDFlMmU2N2Rm6. 存储与网络进阶配置6.1 持久化存储方案apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment spec: template: spec: containers: - name: mysql image: mysql:5.7 volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc6.2 网络策略配置apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: db-network-policy spec: podSelector: matchLabels: role: db policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: api ports: - protocol: TCP port: 33067. 生产环境运维实战7.1 应用部署完整示例# 命名空间 apiVersion: v1 kind: Namespace metadata: name: production --- # 应用部署 apiVersion: apps/v1 kind: Deployment metadata: name: webapp namespace: production spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: myregistry.com/webapp:v1.2.3 ports: - containerPort: 8080 env: - name: DB_HOST valueFrom: configMapKeyRef: name: app-config key: database.host livenessProbe: httpGet: path: /health port: 8080 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 30 timeoutSeconds: 5 resources: requests: memory: 256Mi cpu: 250m limits: memory: 512Mi cpu: 500m7.2 自动扩缩容配置apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: webapp-hpa namespace: production spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: webapp minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 707.3 日志收集与监控# 部署EFK日志系统 kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/ # 部署Prometheus监控 kubectl apply -f https://raw.githubusercontent.com/prometheus-community/helm-charts/main/charts/prometheus8. 常见问题排查手册8.1 集群状态异常排查问题现象可能原因解决方案Node状态为NotReady网络插件未安装检查flannel/calico pod状态Pod一直Pending资源不足或调度问题kubectl describe pod查看事件服务无法访问网络策略限制检查NetworkPolicy配置8.2 应用部署问题排查# 查看Pod详细状态 kubectl describe pod pod-name # 查看Pod日志 kubectl logs pod-name # 进入Pod调试 kubectl exec -it pod-name -- /bin/bash # 查看服务端点 kubectl get endpoints service-name # 检查事件记录 kubectl get events --sort-by.metadata.creationTimestamp8.3 网络连通性测试# 检查DNS解析 kubectl run busybox --imagebusybox --rm -it -- nslookup kubernetes.default # 检查网络策略 kubectl get networkpolicies --all-namespaces # 端口连通性测试 kubectl run netcheck --imagealpine/curl --rm -it -- curl http://service-name:port9. 企业级最佳实践9.1 安全加固方案镜像安全使用可信基础镜像定期扫描漏洞网络隔离按命名空间划分网络策略权限控制使用RBAC最小权限原则Secret管理使用外部Secret管理工具如HashiCorp Vault9.2 高可用架构设计多Master节点部署使用负载均衡器跨可用区节点分布提高容灾能力设置合理的Pod反亲和性避免单点故障使用持久化存储保证数据安全9.3 备份与恢复策略# 集群配置备份 kubectl get all --all-namespaces -o yaml cluster-backup.yaml # 持久卷备份根据存储类型选择相应工具 # 使用Velero进行应用级备份 velero backup create production-backup --include-namespaces production9.4 性能优化建议合理设置资源请求和限制避免资源浪费使用HPA实现自动扩缩容应对流量波动优化镜像大小加快部署速度配置就绪和存活探针提高应用可用性10. 学习路径与资源推荐10.1 技能进阶路线基础阶段掌握Docker基本操作和镜像构建核心概念理解K8s各种资源对象和控制器网络存储深入学习CNI、CSI等扩展机制运维实战掌握监控、日志、安全等生产技能生态工具学习Helm、Istio、Prometheus等工具10.2 推荐学习资源官方文档Docker Docs、Kubernetes官方文档实践平台Katacoda、Play with Kubernetes认证考试CKAKubernetes管理员认证社区资源Kubernetes Slack频道、CNCF项目本教程涵盖的内容是企业运维向云原生转型的核心技能栈建议按照章节顺序逐步实践每个技术点都要亲手操作验证。在实际项目应用中先从非核心业务开始试点积累经验后再推广到重要业务系统。