K8S R&D: Docker与Kubernetes运维核心技术整合指南
本文摘要: 介绍了Docker快速部署方法(镜像拉取/容器运行)及关键参数说明,对比了Docker与Docker Compose在单容器与多服务编排中的差异。详细解析了Docker Compose YAML编写流程、Docker网络模式及Dockerfile核心指令(RUN/CMD/ADD)。重点阐述了K8s Pod创建流程、负载均衡实现原理及状态诊断方法,包括常见状态(Pending/Faile
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:alpine
ports:
- "80:80"
volumes:
- ./conf:/etc/nginx # 配置文件挂载
db:
image: mysql:8.0
environment:
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: nginx ports: - 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-volume
emptyDir: {} # 临时目录随Pod生命周期存在
containers:
- name: app
image: nginx
volumeMounts:
- name: log-volume
mountPath: /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:按时间排序事件
更多推荐



所有评论(0)