第十三节:容器化技术:从Docker到Kubernetes实战

第十三节:容器化技术:从Docker到Kubernetes实战

解决方案goocz2025-03-10 13:13:3247A+A-

1. 容器化技术的核心目标与挑战

1.1 容器化的核心目标

  1. 环境一致性:消除“开发-测试-生产”环境差异。
  2. 资源隔离:确保应用间资源(CPU、内存、网络)互不干扰。
  3. 快速部署:秒级启动与销毁,支持持续集成/持续交付(CI/CD)。
  4. 弹性伸缩:根据负载动态调整实例数量。

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 bash

进入容器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流水线与自动化运维的终极方案!

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5