第十三节:容器化技术:从Docker到Kubernetes实战
1. 容器化技术的核心目标与挑战
1.1 容器化的核心目标
- 环境一致性:消除“开发-测试-生产”环境差异。
- 资源隔离:确保应用间资源(CPU、内存、网络)互不干扰。
- 快速部署:秒级启动与销毁,支持持续集成/持续交付(CI/CD)。
- 弹性伸缩:根据负载动态调整实例数量。
1.2 容器化的四大挑战
- 网络复杂性:跨主机容器通信与负载均衡。
- 存储管理:持久化数据与容器生命周期的矛盾。
- 安全性:容器逃逸、镜像漏洞与权限控制。
- 编排复杂度:大规模容器集群的管理与调度。
2. Docker基础:从镜像到容器
2.1 Docker核心概念
镜像(Image)与容器(Container)
- 镜像:包含应用代码、运行时环境、库的只读模板。
- 容器:镜像的运行实例,具有可写层。
Docker架构
2.2 Docker快速入门
安装与配置
# Ubuntu安装Docker
sudo apt-get update
sudo apt-get install docker.io
sudo systemctl enable --now docker
# 验证安装
docker run hello-world
常用命令速查
命令 | 用途 |
docker pull nginx | 拉取镜像 |
docker run -d nginx | 后台运行容器 |
docker ps -a | 查看所有容器 |
docker exec -it | 进入容器Shell |
docker logs | 查看容器日志 |
3. Dockerfile与镜像构建
3.1 Dockerfile最佳实践
多阶段构建(Multi-stage Build)
# 构建阶段
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 运行阶段
FROM alpine:3.14
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
优化镜像体积
- 使用Alpine基础镜像:替换Ubuntu/CentOS为轻量级Alpine。
- 合并RUN指令:减少镜像层数。
RUN apt-get update && \
apt-get install -y nginx && \
rm -rf /var/lib/apt/lists/*
3.2 私有镜像仓库搭建(Harbor)
部署Harbor
# 下载Harbor安装包
wget https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz
tar zxvf harbor-offline-installer-v2.6.0.tgz
# 配置harbor.yml
hostname: harbor.example.com
http:
port: 80
harbor_admin_password: your_password
# 启动Harbor
sudo ./install.sh
推送镜像到Harbor
docker tag myapp:v1 harbor.example.com/library/myapp:v1
docker push harbor.example.com/library/myapp:v1
4. Docker网络与存储
4.1 网络模式与配置
网络模式 | 特性 | 适用场景 |
bridge | 默认模式,容器通过虚拟网桥通信 | 单主机容器互联 |
host | 容器共享主机网络栈 | 高性能场景 |
overlay | 跨主机容器通信(需Swarm/K8s) | 多主机集群 |
自定义网络
# 创建自定义网络
docker network create mynet
# 运行容器并加入网络
docker run -d --network mynet --name web nginx
docker run -d --network mynet --name db redis
4.2 数据卷与持久化存储
数据卷管理
# 创建数据卷
docker volume create myvol
# 挂载数据卷到容器
docker run -d -v myvol:/data --name app myapp
# 备份数据卷
docker run --rm -v myvol:/source -v $(pwd):/backup alpine tar czf /backup/myvol.tar.gz /source
绑定挂载(Bind Mount)
# 挂载主机目录到容器
docker run -d -v /host/data:/container/data nginx
5. Kubernetes基础:架构与核心概念
5.1 Kubernetes架构
核心组件
- API Server:集群操作的唯一入口。
- etcd:分布式键值存储,保存集群状态。
- kubelet:节点代理,管理Pod生命周期。
5.2 Kubernetes核心资源
资源类型 | 用途 | 示例 |
Pod | 最小部署单元,包含一个或多个容器 | Web应用+日志收集Sidecar |
Deployment | 管理Pod的副本与滚动更新 | 无状态应用部署 |
Service | 定义Pod的访问策略(负载均衡) | 暴露Web服务到集群外 |
ConfigMap | 存储非敏感配置数据 | 应用环境变量 |
6. Kubernetes实战:从部署到运维
6.1 集群部署(kubeadm)
初始化控制平面
# 安装kubeadm、kubelet、kubectl
sudo apt-get update
sudo apt-get install -y kubeadm=1.25.0-00 kubelet=1.25.0-00 kubectl=1.25.0-00
# 初始化集群
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件(Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
6.2 应用部署与管理
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.21
ports:
- containerPort: 80
暴露Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
7. 高级运维:持久化存储与安全
7.1 持久化卷(PersistentVolume)
动态存储供给(StorageClass)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
fsType: ext4
声明持久化卷(PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
storageClassName: fast
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
7.2 安全策略(PodSecurityPolicy/RBAC)
RBAC授权
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
Pod安全上下文
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
containers:
- name: sec-ctx-demo
image: busybox
command: ["sh", "-c", "sleep 1h"]
8. 生产级案例:高可用与故障恢复
8.1 案例一:数据库有状态应用部署(StatefulSet)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
8.2 案例二:集群节点故障自动恢复
配置健康检查
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
节点自动修复(Cluster Autoscaler)
# AWS EKS配置示例
kubectl autoscale nodegroup eks-nodegroup --min=3 --max=10 --cpu-percent=70
9. 未来趋势:Serverless与边缘计算
9.1 Knative:无服务器(Serverless)框架
部署Serverless函数
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello
spec:
template:
spec:
containers:
- image: gcr.io/knative-samples/helloworld-go
env:
- name: TARGET
value: "World"
9.2 KubeEdge:边缘计算平台
架构图
部署边缘应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: edge-sensor
labels:
kubeedge.io/device-model: "true"
spec:
template:
metadata:
labels:
app: edge-sensor
spec:
nodeSelector:
node-role.kubernetes.io/edge: ""
containers:
- name: sensor
image: edge-sensor:v1
总结:从容器到云原生的进化
容器化技术彻底改变了应用的开发、部署与运维方式。通过本节的学习,你已掌握从Docker基础到Kubernetes集群管理的全链路技能。下一节我们将深入DevOps实践,揭秘CI/CD流水线与自动化运维的终极方案!