K8S RD: Docker与Kubernetes运维核心技术整合指南
Docker服务快速部署
1 ) 镜像准备
- 支持在线拉取与离线导入:
# 在线拉取(如nginx) docker pull nginx:latest # 离线导入 docker load -i nginx.tar - 优先使用预下载镜像提升效率,支持多服务镜像(Nginx/MySQL/Redis/PostgreSQL)。
2 ) 容器运行
docker run -d --name [容器名] -p [宿主机端口]:[容器端口] --network=[网络模式] [镜像名]
参数说明:
| 参数 | 作用 | 常用值 |
|---|---|---|
-p | 端口映射 | 80:80 |
--network | 网络模式 | host/bridge/none |
-v | 宿主机与容器目录映射 | /data:/app/data |
- 示例(MySQL):
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password mysql:latest
Docker Compose编排与Docker对比
| 特性 | Docker | Docker Compose |
|---|---|---|
| 管理对象 | 单容器 | 多容器统一编排 |
| 部署效率 | 需多次执行run命令 | 单命令启动全栈服务 |
| 配置文件 | 命令行参数 | YAML声明式配置 |
| 适用场景 | 简单单服务部署 | 微服务架构复杂环境 |
| 效率优势 | - | 一键拉起全栈服务 |
常用命令:
docker-compose build # 构建镜像
docker-compose up -d # 后台启动所有服务
docker-compose stop # 停止服务
docker-compose start # 启动已停止服务
docker-compose down # 删除所有容器及网络
Docker Compose YAML文件编写
1 ) 编写流程:
- 定义单服务(测试端口映射/卷挂载)→ 复制模板修改参数 → 执行
docker-compose up -d拉起集群。
2 ) 完整示例:
version: '3'
services:web:image: nginx:alpineports:- "80:80"volumes:- ./conf:/etc/nginx # 配置文件挂载db:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: example volumes:- db_data:/var/lib/mysql # 数据持久化
volumes:db_data: # 命名卷声明
最佳实践:先定义单服务调试,再复制模板扩展多服务。
Docker网络模式
| 模式 | 作用 |
|---|---|
host | 容器直接使用宿主机网络栈,无NAT隔离 |
container | 多容器共享同一网络命名空间(IP相同,服务端口不同) |
none | 无网络连接,仅用于内部测试 |
bridge(默认) | NAT网桥模式,通过iptables转发流量 |
Dockerfile关键指令解析
1 ) 命令执行指令:
RUN:构建时执行命令(如RUN apt-get update),生成新镜像层。CMD:容器启动默认命令(如CMD ["nginx", "-g", "daemon off;"]),可被docker run覆盖。ENTRYPOINT:容器入口命令(如ENTRYPOINT ["/entrypoint.sh"]),不可覆盖。
2 ) 文件操作指令:
| 指令 | 功能 |
|---|---|
COPY | 仅复制本地文件/目录(不支持解压或网络资源) |
ADD | 额外支持: - 自动解压本地压缩包 - 下载网络资源(如 ADD http://example.com/data.tar.gz /tmp) |
# ADD示例:自动解压+网络资源获取
ADD app.tar.gz /usr/src/app
ADD https://example.com/data.zip /tmp
最佳实践:优先使用COPY,仅需解压或远程资源时用ADD
Docker镜像分层机制
1 ) 分层原理:
- 每条指令(
RUN/COPY等)创建独立只读层,当前层不影响上层。 - 分层设计提升构建效率与镜像复用性,减少冗余数据。
2 ) 轻量化优势: - 仅存储差异层数据,加速镜像拉取与存储。
Kubernetes Pod核心运维
1 ) 创建流程:
四步机制:请求提交 → 配置存储 → 调度计算 → 节点执行
1.1. 请求提交:kubectl或API发起创建请求
1.2. 状态存储:API Server写入配置至ETCD
1.3. 调度决策:Scheduler选择最优节点(基于资源利用率)
1.4. 节点执行:目标节点kubelet创建容器
2 ) 负载均衡实现:
-
Service配置:通过
selector匹配Pod标签提供统一入口apiVersion: v1 kind: Service metadata:name: web-svc spec:selector:app: nginxports:- protocol: TCP port: 80 targetPort: 8080 -
依赖组件:
kube-proxy维护iptables/IPVS规则实现轮询分发。 -
流量分发:请求均匀轮询后端Pod
3 ) 状态诊断与处理:
| 状态 | 含义 | 常见原因 | 解决方案 |
|---|---|---|---|
Pending | 调度中/镜像拉取中 | 节点资源不足、污点未容忍 | 调整资源请求或添加污点容忍 |
Running | 正常运行 | - | - |
Failed | 容器启动失败 | 应用错误、配置异常 | 检查日志:kubectl logs <pod> |
Succeeded | 任务型Pod执行完毕 | - | - |
Unknown | Master与Node通信中断 | 节点故障 | 检查节点网络及kubelet状态 |
CrashLoop | 应用崩溃 | 容器启动失败 | 排查应用配置或资源限制 |
4 ) 批量操作:
# 删除所有Failed状态Pod
kubectl get pods --field-selector=status.phase=Failed -o name | xargs kubectl delete
Kubernetes集群运维实践
1 ) 节点扩容(Token过期处理):
# Master节点操作
kubeadm token create --print-join-command # 生成新Token
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex # 获取CA哈希# Node节点执行
kubeadm join <Master_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
2 ) 常见问题解决:
- 初始化失败:清理残留文件后重试。
kubeadm reset rm -rf /etc/kubernetes/ - 节点不可见:检查
kubelet服务状态(二进制部署需手动安装)。 kubectl get cs显示Unhealthy:修改kubelet配置:# /var/lib/kubelet/config.yaml healthzBindAddress: 0.0.0.0:10248 # 确保端口监听正确
3 ) 资源操作命令:
| 命令 | 特性 |
|---|---|
kubectl create | 仅首次创建(不支持更新) |
kubectl apply | 支持创建及增量更新(推荐) |
4 ) 批量操作技巧
删除所有Failed状态Pod
kubectl get pods --field-selector=status.phase=Failed -o name | xargs kubectl delete
Pod资源共享与隔离
1 ) 共享存储:
apiVersion: v1
kind: Pod
metadata:name: shared-storage
spec:volumes:- name: log-volumeemptyDir: {} # 临时目录随Pod生命周期存在 containers:- name: appimage: nginxvolumeMounts:- name: log-volumemountPath: /var/log/app - name: log-collector image: fluentd volumeMounts:- name: log-volume mountPath: /data/logs
- 应用场景:日志收集(应用容器写入,Sidecar容器读取)。
2 ) 隔离机制:
- Linux命名空间(Network/PID/UTS/IPC/Mount)实现网络/进程隔离。
- cgroups控制CPU/内存/磁盘资源限制。
典型运维问题解决方案
1 ) 节点选择器:
| 类型 | 特点 |
|---|---|
nodeSelector | 硬性标签匹配(如disk=ssd),无标签则无法调度 |
nodeAffinity | 支持软/硬策略: - 硬策略( requiredDuringScheduling):必须满足- 软策略( preferredDuringScheduling):尽量满足 |
nodeName(少用) | 绕过调度器直指定节点 |
节点选择器
spec: nodeSelector: disktype: ssd # 硬性匹配标签
节点亲和性
| 策略类型 | 特性 |
|---|---|
requiredDuringSchedulingIgnoredDuringExecution | 必须满足条件(硬策略) |
preferredDuringSchedulingIgnoredDuringExecution | 尽量满足(软策略) |
配置示例:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone1
2 ) Pod长期Pending
- 资源不足:
resources:requests:memory: "512Mi"cpu: "250m"limits:memory: "1Gi"cpu: "500m" - 污点未容忍:添加
tolerations配置tolerations: - key: "disk-pressure"operator: "Exists"effect: "NoSchedule"
3 ) kubectl get cs显示Unhealthy
- 修改配置:
# /var/lib/kubelet/config.yaml healthzBindAddress: 0.0.0.0:10248 # 修正监听端口 - 重启服务:
systemctl restart kubelet
4 ) 初始化失败处理
kubeadm reset
rm -rf /etc/kubernetes/ # 清理残留配置
5 ) 节点不可见排查
- 原因:节点未部署
kubelet(常见于二进制部署) - 解决:安装并注册
kubelet服务至集群
关键总结:
- 镜像分层:镜像分层机制是Docker高效构建的核心,Dockerfile每条指令生成独立层(当前层不影响上层)
- 服务发现:Service通过Label匹配实现Pod负载均衡
- 故障排查黄金命令:
describe+logs+events组合定位问题根源 - 污点容忍:通过
tolerations解决Pod调度限制问题 - 节点亲和性策略优先使用
nodeAffinity软硬结合 - 诊断命令:
kubectl describe pod <pod>查看事件详情kubectl logs <pod> -c <container>检查容器kubectl get events --sort-by=.metadata.creationTimestamp:按时间排序事件
