containerd教程#

技术介绍#

containerd是一个行业标准的容器运行时,专注于简单性、健壮性和可移植性。它是Docker Engine的核心组件之一,也可以作为独立的容器运行时使用。containerd提供了容器生命周期管理、镜像管理、存储管理和网络管理等功能。

containerd核心概念#

  • 容器:运行在隔离环境中的应用
  • 镜像:容器的只读模板
  • 任务:容器的运行实例
  • 命名空间:容器的隔离环境
  • 快照:容器文件系统的分层存储
  • 内容:容器镜像的内容
  • 镜像仓库:存储和分发镜像

containerd架构#

  • 核心组件:containerd daemon、shim、runtime
  • 插件系统:存储、网络、内容、镜像等插件
  • API:gRPC API,用于与containerd交互
  • 集成:与Kubernetes、Docker等集成

入门级使用#

安装containerd#

在不同操作系统上安装containerd:

# Ubuntu/Debian
apt-get update
apt-get install containerd

# CentOS/RHEL
yum install containerd

# 配置containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 启动containerd服务
systemctl start containerd
systemctl enable containerd

# 验证安装
containerd --version
ctr version

基本containerd命令#

使用containerd的基本命令:

# 查看containerd版本
containerd --version

# 查看ctr版本
ctr version

# 查看containerd状态
systemctl status containerd

# 查看镜像
ctr images list

# 拉取镜像
ctr images pull docker.io/library/ubuntu:20.04

# 运行容器
ctr run --rm docker.io/library/ubuntu:20.04 ubuntu-container

# 查看容器
ctr containers list

# 查看任务
ctr tasks list

# 停止任务
ctr tasks stop ubuntu-container

# 删除容器
ctr containers delete ubuntu-container

# 删除镜像
ctr images remove docker.io/library/ubuntu:20.04

容器操作#

操作containerd容器:

# 进入运行中的容器
ctr tasks exec --exec-id bash -t ubuntu-container /bin/bash

# 查看容器详细信息
ctr containers info ubuntu-container

# 查看任务详细信息
ctr tasks info ubuntu-container

# 暂停任务
ctr tasks pause ubuntu-container

# 恢复任务
ctr tasks resume ubuntu-container

# 导出容器
ctr export ubuntu-container > container.tar

# 导入容器
ctr import container.tar

初级使用#

containerd命名空间#

使用containerd命名空间:

# 查看命名空间
ctr namespaces list

# 创建命名空间
ctr namespaces create mynamespace

# 在命名空间中拉取镜像
ctr --namespace mynamespace images pull docker.io/library/ubuntu:20.04

# 在命名空间中运行容器
ctr --namespace mynamespace run --rm docker.io/library/ubuntu:20.04 ubuntu-container

# 查看命名空间中的容器
ctr --namespace mynamespace containers list

# 删除命名空间
ctr namespaces delete mynamespace

containerd存储管理#

管理containerd存储:

# 查看快照器
ctr plugins ls | grep snapshotter

# 查看内容存储
ctr content ls

# 查看快照
ctr snapshots ls default

# 清理内容存储
ctr content ls -q | xargs ctr content delete

# 清理快照
ctr snapshots ls default -q | xargs ctr snapshots remove

containerd镜像管理#

管理containerd镜像:

# 拉取镜像
ctr images pull docker.io/library/ubuntu:20.04

# 标记镜像
ctr images tag docker.io/library/ubuntu:20.04 ubuntu:20.04

# 推送镜像
ctr images push docker.io/myuser/ubuntu:20.04

# 导出镜像
ctr images export ubuntu-20.04.tar docker.io/library/ubuntu:20.04

# 导入镜像
ctr images import ubuntu-20.04.tar

# 清理未使用的镜像
ctr images ls -q | xargs ctr images remove

中级使用#

containerd配置#

配置containerd:

# 查看默认配置
containerd config default

# 编辑配置文件
vim /etc/containerd/config.toml

# 配置示例
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "k8s.gcr.io/pause:3.2"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  runtime_type = "io.containerd.runc.v2"

# 重启containerd服务
systemctl restart containerd

containerd运行时#

配置containerd运行时:

# 查看运行时
ctr plugins ls | grep runtime

# 配置runc运行时
# 在/etc/containerd/config.toml中添加
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  runtime_type = "io.containerd.runc.v2"
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

# 配置gVisor运行时
# 安装gVisor
gcurl -fsSL https://gvisor.dev/archive/master/latest/x86_64/releases/runsc | sudo tee /usr/local/bin/runsc > /dev/null
sudo chmod +x /usr/local/bin/runsc

# 在/etc/containerd/config.toml中添加
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
  runtime_type = "io.containerd.runsc.v1"

# 重启containerd服务
systemctl restart containerd

containerd与Kubernetes集成#

将containerd与Kubernetes集成:

# 安装kubeadm、kubelet、kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl

# 初始化Kubernetes集群
kubeadm init --pod-network-cidr=10.244.0.0/16

# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 查看节点状态
kubectl get nodes

# 查看Pod状态
kubectl get pods --all-namespaces

中上级使用#

containerd插件系统#

使用containerd插件系统:

# 查看插件
ctr plugins ls

# 查看插件详情
ctr plugins info io.containerd.snapshotter.v1 overlayfs

# 配置插件
# 在/etc/containerd/config.toml中添加插件配置

[plugins."io.containerd.snapshotter.v1.overlayfs"]
  root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"

[plugins."io.containerd.metadata.v1.bolt"]
  content_sharing_policy = "shared"

# 重启containerd服务
systemctl restart containerd

containerd内容存储#

管理containerd内容存储:

# 查看内容
ctr content ls

# 查看内容详情
ctr content info sha256:...

# 清理未使用的内容
ctr content ls -q | xargs ctr content delete

# 配置内容存储
# 在/etc/containerd/config.toml中添加
[plugins."io.containerd.content.v1.content"]
  root_path = "/var/lib/containerd/io.containerd.content.v1.content"

containerd镜像构建#

使用containerd构建镜像:

# 安装buildkit
apt-get install buildkit

# 启动buildkit服务
systemctl start buildkit
systemctl enable buildkit

# 使用buildctl构建镜像
buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=myapp:latest

# 使用ctr导入镜像
ctr images import myapp.tar

# 运行容器
ctr run --rm myapp:latest myapp-container

高级使用#

containerd集群管理#

管理containerd集群:

# 在多个节点上安装containerd
# 节点1
ssh node1 "apt install containerd"

# 节点2
ssh node2 "apt install containerd"

# 节点3
ssh node3 "apt install containerd"

# 配置containerd集群
# 在每个节点上配置相同的containerd配置

# 部署Kubernetes集群
kubeadm init --pod-network-cidr=10.244.0.0/16

# 加入工作节点
kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>

# 查看集群状态
kubectl get nodes

containerd监控#

监控containerd:

# 启用containerd指标
# 在/etc/containerd/config.toml中添加
[debug]
  metrics_address = "0.0.0.0:1338"

# 重启containerd服务
systemctl restart containerd

# 使用Prometheus监控containerd
# 创建Prometheus配置
cat > prometheus.yml <<EOF
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'containerd'
    static_configs:
      - targets: ['localhost:1338']
EOF

# 运行Prometheus
podman run -d --name prometheus \
  -p 9090:9090 \
  -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

# 使用Grafana查看监控数据
podman run -d --name grafana \
  -p 3000:3000 \
  grafana/grafana

containerd安全#

配置containerd安全:

# 配置TLS
# 创建证书
mkdir -p /etc/containerd/certs

# 在/etc/containerd/config.toml中添加
[grpc]
  address = "tcp://0.0.0.0:6666"
  tls_ca = "/etc/containerd/certs/ca.crt"
  tls_cert = "/etc/containerd/certs/server.crt"
  tls_key = "/etc/containerd/certs/server.key"

# 配置镜像验证
[plugins."io.containerd.content.v1.content"]
  root_path = "/var/lib/containerd/io.containerd.content.v1.content"
  [plugins."io.containerd.content.v1.content".validation]
    enabled = true

# 重启containerd服务
systemctl restart containerd

大师级使用#

containerd企业级部署#

企业级containerd部署:

# 配置高可用性
# 部署多个containerd节点

# 配置负载均衡
# 使用HAProxy负载均衡containerd服务

# 配置存储
# 使用分布式存储作为containerd存储后端

# 配置网络
# 使用Calico或Cilium作为Kubernetes网络插件

# 部署应用
# 使用Kubernetes部署应用
kubectl apply -f deployment.yaml

# 配置监控
# 使用Prometheus和Grafana监控containerd和Kubernetes

# 配置日志
# 使用ELK Stack收集和分析日志

containerd与Istio集成#

将containerd与Istio集成:

# 安装Istio
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH

# 部署Istio
istioctl install --set profile=demo -y

# 标记命名空间以启用Istio
kubectl label namespace default istio-injection=enabled

# 部署应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 查看应用状态
kubectl get pods

# 访问应用
kubectl get svc istio-ingressgateway -n istio-system

containerd安全审计#

进行containerd安全审计:

# 检查containerd配置
cat /etc/containerd/config.toml

# 检查containerd插件
ctr plugins ls

# 检查容器状态
ctr containers list

# 检查镜像
ctr images list

# 使用Trivy扫描镜像漏洞
ctr images export docker.io/library/ubuntu:20.04 | trivy image --input -

# 检查运行时安全
# 使用gVisor运行时
ctr run --runtime io.containerd.runsc.v1 --rm docker.io/library/ubuntu:20.04 ubuntu-container

# 检查网络安全
# 使用Cilium网络插件
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.9/install/kubernetes/quick-install.yaml

实战案例#

案例一:部署微服务应用#

场景:部署一个基于Spring Boot的微服务应用。

解决方案:使用containerd和Kubernetes部署微服务应用。

实施步骤

  1. 构建镜像

    # 使用buildkit构建镜像
    buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=myapp:latest
    
    # 推送镜像到仓库
    ctr images tag myapp:latest myregistry.com/myapp:latest
    ctr images push myregistry.com/myapp:latest
  2. 创建Kubernetes部署

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: myregistry.com/myapp:latest
            ports:
            - containerPort: 8080
  3. 部署应用

    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    
    # 查看应用状态
    kubectl get pods
    kubectl get svc

结果

  • 成功构建了Spring Boot应用的镜像
  • 部署了高可用的微服务应用
  • 应用可以通过Service访问

案例二:容器安全加固#

场景:加固containerd容器安全。

解决方案:配置containerd安全选项。

实施步骤

  1. 配置containerd安全选项

    # 编辑/etc/containerd/config.toml
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
      runtime_type = "io.containerd.runc.v2"
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        SystemdCgroup = true
        NoNewPrivileges = true
        CapDrop = ["ALL"]
        CapAdd = ["NET_BIND_SERVICE"]
  2. 使用gVisor运行时

    # 安装gVisor
    curl -fsSL https://gvisor.dev/archive/master/latest/x86_64/releases/runsc | sudo tee /usr/local/bin/runsc > /dev/null
    sudo chmod +x /usr/local/bin/runsc
    
    # 配置gVisor运行时
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
      runtime_type = "io.containerd.runsc.v1"
  3. 重启containerd服务

    systemctl restart containerd

结果

  • 成功配置了containerd安全选项
  • 使用了gVisor运行时提高安全性
  • 容器运行在更安全的环境中

案例三:containerd性能优化#

场景:优化containerd性能。

解决方案:配置containerd性能选项。

实施步骤

  1. 配置containerd性能选项

    # 编辑/etc/containerd/config.toml
    [plugins."io.containerd.grpc.v1.cri"]
      [plugins."io.containerd.grpc.v1.cri".containerd]
        snapshotter = "overlayfs"
        [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
          runtime_type = "io.containerd.runc.v2"
          [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
            SystemdCgroup = true
            RuntimeArgs = ["--cpu-manager-policy=static", "--memory-manager-policy=static"]
  2. 配置存储

    # 使用zfs作为快照器
    apt install zfsutils-linux
    
    # 配置zfs快照器
    [plugins."io.containerd.snapshotter.v1.zfs"]
      root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.zfs"
  3. 重启containerd服务

    systemctl restart containerd

结果

  • 成功优化了containerd性能
  • 提高了容器启动速度和运行效率
  • 减少了资源使用

总结#

containerd是一种强大的容器运行时,通过本教程的学习,您已经掌握了从入门到大师级的containerd使用技术。

主要技术回顾#

  • 基础操作:containerd的基本命令和操作
  • 镜像管理:拉取、推送、构建镜像
  • 容器管理:创建、启动、停止容器
  • 存储管理:配置存储后端和快照器
  • 网络管理:配置网络插件
  • 运行时管理:配置不同的容器运行时
  • 高级功能:集群管理、监控、安全加固
  • 企业级应用:高可用性、负载均衡、性能优化

最佳实践#

  1. 使用最新版本:定期更新containerd版本,获取最新的安全补丁和功能
  2. 配置合理:根据实际需求配置containerd,避免过度配置
  3. 安全加固:使用非特权容器,配置适当的capabilities,使用gVisor等安全运行时
  4. 性能优化:根据硬件环境优化containerd配置,提高性能
  5. 监控容器:使用Prometheus等工具监控containerd状态
  6. 自动化部署:与CI/CD集成,实现自动化构建、测试和部署
  7. 备份策略:制定容器数据备份策略,确保数据安全
  8. 灾难恢复:建立容器环境的灾难恢复计划,应对突发情况

注意事项#

  1. 版本兼容性:确保containerd版本与Kubernetes版本兼容
  2. 资源管理:合理配置容器资源限制,避免资源争用
  3. 网络配置:合理配置网络,确保容器间通信安全
  4. 存储管理:定期清理未使用的镜像、容器和内容,释放存储空间
  5. 安全审计:定期进行containerd安全审计,发现和修复安全问题
  6. 故障排查:熟悉containerd日志和监控,快速排查问题

通过合理学习和使用containerd,您可以获得更高效、更安全的容器运行环境。containerd作为行业标准的容器运行时,已经被广泛应用于生产环境,掌握containerd技术将为您的职业发展带来更多机会。