1. Linux:云原生的基石
作为一名在运维领域摸爬滚打多年的老手,我始终认为Linux是云原生技术栈中最重要的基础。记得刚入行时,我的导师说过:"不会Linux的运维就像不会游泳的水手"。这句话在云原生时代依然适用。
1.1 基础命令:运维的瑞士军刀
文件操作命令是每个Linux用户的起点:
ls -alh:我习惯加上-alh参数,这样能显示隐藏文件、详细权限和人性化的文件大小单位grep -rn "keyword" /path:全局搜索时,-r递归和-n显示行数的组合特别实用find / -name "*.log" -mtime +7 -exec rm {} \;:定期清理日志的经典命令
经验之谈:在生成环境执行删除命令前,先用
-exec echo {} \;预览要删除的文件,避免误操作
1.2 用户权限:安全的第一道防线
权限管理是Linux安全的核心:
chmod 750 /opt/app # 给目录设置rwxr-x---权限 chown app:appgroup /data # 修改文件属主和属组我曾遇到过一个典型案例:某Java应用因/tmp目录权限过松(777)导致被植入挖矿脚本。正确的做法是:
chmod 1777 /tmp # 设置粘滞位,防止用户删除他人文件1.3 进程管理:理解容器化的基础
Linux进程模型直接影响对容器的理解:
ps aux --forest # 查看进程树状结构 nice -n 10 java -jar app.jar # 调整进程优先级通过pstree -p命令,可以清晰看到:
- 每个容器实际是宿主机上的一个进程
- Kubernetes的pause容器作为Pod内所有容器的父进程
1.4 文件系统:容器存储的底层支撑
关键目录的用途:
| 目录 | 典型用途 | 容器化注意事项 |
|---|---|---|
| /var/log | 日志文件 | 需要持久化存储 |
| /etc | 配置文件 | ConfigMap的挂载点 |
| /tmp | 临时文件 | 可能影响性能 |
我曾用df -Th排查过一个容器磁盘满的问题,发现是某应用在/var/lib/docker下堆积了大量未清理的镜像层。
1.5 网络配置:CNI插件的基础
网络排查三板斧:
ip addr show # 查看接口配置 netstat -tulnp # 查看端口监听 tcpdump -i eth0 port 80 # 抓包分析理解这些命令后,再学习Calico、Flannel等CNI插件会容易很多。
2. Docker:云原生的细胞
2.1 镜像构建的艺术
一个高效的Dockerfile示例:
FROM alpine:3.14 RUN apk add --no-cache nginx && \ mkdir -p /var/log/nginx && \ rm -rf /var/cache/apk/* COPY nginx.conf /etc/nginx/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]构建技巧:
- 多阶段构建减小镜像体积
- 合理利用
.dockerignore文件 - 固定基础镜像版本(避免使用latest)
2.2 容器运行时解析
Docker的核心隔离机制:
- Namespace:实现视图隔离
- PID namespace:进程隔离
- Network namespace:网络隔离
- Cgroups:资源限制
docker run --memory=512m限制内存--cpu-shares设置CPU权重
我曾用nsenter命令进入容器的namespace进行调试,这对理解隔离机制很有帮助。
2.3 存储驱动选择
常见存储驱动对比:
| 驱动类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| overlay2 | 性能好 | 占用inode多 | 生产环境首选 |
| devicemapper | 稳定性高 | 配置复杂 | RHEL默认 |
| aufs | 兼容性好 | 已淘汰 | 旧系统兼容 |
通过docker info可以查看当前存储驱动。
3. Kubernetes:云原生操作系统
3.1 Pod设计模式
常见Pod模式示例:
apiVersion: v1 kind: Pod metadata: name: web-app spec: containers: - name: web image: nginx:1.19 ports: - containerPort: 80 - name: log-agent image: fluentd:latest volumeMounts: - name: logs mountPath: /var/log/nginx volumes: - name: logs emptyDir: {}这种边车模式(Sidecar)在实际中很常见,比如:
- 日志收集容器
- 监控代理容器
- 网络代理容器
3.2 控制器详解
Deployment的滚动更新策略:
spec: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 1这表示:
- 最多允许25%的Pod不可用
- 更新时最多超配1个Pod
3.3 服务发现机制
Service的几种类型:
- ClusterIP:默认类型,集群内访问
- NodePort:通过节点端口暴露
- LoadBalancer:云厂商的负载均衡器
- ExternalName:CNAME记录
我曾用kubectl get endpoints命令排查过服务不可用的问题,发现是标签选择器配置错误。
4. 网络与存储实战
4.1 CNI插件选型
主流CNI插件对比:
| 插件 | 特点 | 适用场景 |
|---|---|---|
| Calico | BGP路由、网络策略 | 需要细粒度安全控制 |
| Flannel | 简单易用、Overlay网络 | 中小规模集群 |
| Cilium | eBPF高性能、服务网格集成 | 高性能需求场景 |
我曾用Calico的网络策略实现过微服务间的零信任网络:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy spec: podSelector: matchLabels: app: payment ingress: - from: - podSelector: matchLabels: app: order ports: - protocol: TCP port: 80804.2 存储方案实践
持久卷的典型配置:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: ssd nfs: path: /data/mysql server: 192.168.1.100在云环境中,更推荐使用动态供给:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fast provisioner: kubernetes.io/aws-ebs parameters: type: gp3 fsType: ext45. GitOps工作流实现
5.1 Argo CD部署示例
典型的Application定义:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: web-app spec: destination: namespace: production server: https://kubernetes.default.svc source: path: kustomize/overlays/prod repoURL: git@github.com:myorg/web-app.git targetRevision: main syncPolicy: automated: prune: true selfHeal: true5.2 多环境管理策略
使用Kustomize管理不同环境:
base/ ├── deployment.yaml ├── kustomization.yaml └── service.yaml overlays/ ├── dev │ ├── kustomization.yaml │ └── replica.yaml └── prod ├── hpa.yaml └── kustomization.yaml这种结构可以实现:
- 基础配置共享
- 环境差异隔离
- 版本控制追踪
6. 架构演进实战
6.1 从单体到微服务
迁移过程中的经验:
- 先拆分无状态服务
- 引入API网关统一入口
- 逐步迁移数据层
- 实现服务发现和负载均衡
我曾用Spring Cloud和Kubernetes配合完成过这种迁移:
- Eureka → Kubernetes Service
- Ribbon → Service Mesh
- Config Server → ConfigMap
6.2 服务网格实践
Istio的典型配置:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 90 - destination: host: reviews subset: v2 weight: 10这种金丝雀发布方式比直接修改Deployment更安全可控。
7. 运维进阶方向
7.1 可观测性体系建设
完整的监控方案应包含:
- 指标监控(Prometheus)
- 日志收集(Loki+ELK)
- 链路追��(Jaeger)
- 事件告警(Alertmanager)
我曾用以下查询定位过性能问题:
rate(container_cpu_usage_seconds_total{namespace="production"}[5m]) > 0.97.2 安全加固实践
关键安全措施:
- Pod安全策略
- 网络策略
- 镜像扫描
- RBAC最小权限
- 审计日志
一个安全的Deployment示例:
securityContext: runAsNonRoot: true runAsUser: 1000 capabilities: drop: - ALL readOnlyRootFilesystem: true在云原生这条路上,我最大的体会是:基础越扎实,走得越远。每次新技术出现时,那些Linux底层知识总能帮我快速理解其本质。建议初学者不要急于追求最新工具,先把Linux和容器原理吃透,后面的路会顺畅很多。