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 mynamespacecontainerd存储管理#
管理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 removecontainerd镜像管理#
管理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 containerdcontainerd运行时#
配置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 containerdcontainerd与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 containerdcontainerd内容存储#
管理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 nodescontainerd监控#
监控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/grafanacontainerd安全#
配置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-systemcontainerd安全审计#
进行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部署微服务应用。
实施步骤:
构建镜像:
# 使用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创建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部署应用:
kubectl apply -f deployment.yaml kubectl apply -f service.yaml # 查看应用状态 kubectl get pods kubectl get svc
结果:
- 成功构建了Spring Boot应用的镜像
- 部署了高可用的微服务应用
- 应用可以通过Service访问
案例二:容器安全加固#
场景:加固containerd容器安全。
解决方案:配置containerd安全选项。
实施步骤:
配置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"]使用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"重启containerd服务:
systemctl restart containerd
结果:
- 成功配置了containerd安全选项
- 使用了gVisor运行时提高安全性
- 容器运行在更安全的环境中
案例三:containerd性能优化#
场景:优化containerd性能。
解决方案:配置containerd性能选项。
实施步骤:
配置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"]配置存储:
# 使用zfs作为快照器 apt install zfsutils-linux # 配置zfs快照器 [plugins."io.containerd.snapshotter.v1.zfs"] root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.zfs"重启containerd服务:
systemctl restart containerd
结果:
- 成功优化了containerd性能
- 提高了容器启动速度和运行效率
- 减少了资源使用
总结#
containerd是一种强大的容器运行时,通过本教程的学习,您已经掌握了从入门到大师级的containerd使用技术。
主要技术回顾#
- 基础操作:containerd的基本命令和操作
- 镜像管理:拉取、推送、构建镜像
- 容器管理:创建、启动、停止容器
- 存储管理:配置存储后端和快照器
- 网络管理:配置网络插件
- 运行时管理:配置不同的容器运行时
- 高级功能:集群管理、监控、安全加固
- 企业级应用:高可用性、负载均衡、性能优化
最佳实践#
- 使用最新版本:定期更新containerd版本,获取最新的安全补丁和功能
- 配置合理:根据实际需求配置containerd,避免过度配置
- 安全加固:使用非特权容器,配置适当的capabilities,使用gVisor等安全运行时
- 性能优化:根据硬件环境优化containerd配置,提高性能
- 监控容器:使用Prometheus等工具监控containerd状态
- 自动化部署:与CI/CD集成,实现自动化构建、测试和部署
- 备份策略:制定容器数据备份策略,确保数据安全
- 灾难恢复:建立容器环境的灾难恢复计划,应对突发情况
注意事项#
- 版本兼容性:确保containerd版本与Kubernetes版本兼容
- 资源管理:合理配置容器资源限制,避免资源争用
- 网络配置:合理配置网络,确保容器间通信安全
- 存储管理:定期清理未使用的镜像、容器和内容,释放存储空间
- 安全审计:定期进行containerd安全审计,发现和修复安全问题
- 故障排查:熟悉containerd日志和监控,快速排查问题
通过合理学习和使用containerd,您可以获得更高效、更安全的容器运行环境。containerd作为行业标准的容器运行时,已经被广泛应用于生产环境,掌握containerd技术将为您的职业发展带来更多机会。