基于 openEuler 24.03 LTS 操作系统源码部署 Kubernetes 开发版本

基于 openEuler 24.03 LTS 操作系统源码部署 Kubernetes 开发版本

闫志聪
2024-12-02 / 0 评论 / 57 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年12月03日,已超过169天没有更新,若内容或图片失效,请留言反馈。

1 安装目标

使用源码编译安装 Kubernetes,可以方便的切换版本,方便开发测试工作。本文以 openEuler 24.03 LTS 系统作为基础环境,演示如何操作


2 环境准备

2.1 网络环境

由于编译 docker 所需的源代码资源都在外网,因此需要提前配置代理

# 配置代理
PROXY_IP=192.168.230.1
PROXY_PORT=10809
export http_proxy=http://${PROXY_IP}:${PROXY_PORT}
export https_proxy=http://${PROXY_IP}:${PROXY_PORT}
export ALL_PROXY=http://${PROXY_IP}:${PROXY_PORT}
export all_proxy=socks://${PROXY_IP}:${PROXY_PORT}

# 测试代理
$ curl www.google.com


2.2 系统环境

(1)设置主机名及域名解析

# 设置主机名
$ hostnamectl set-hostname k8s-master

# 配置域名解析
$ cat >>/etc/hosts <<EOF

192.168.230.240 k8s-master
EOF

(2)关闭防火墙及 SELinux

# 关闭防火墙
$ systemctl stop firewalld && systemctl disable firewalld

# 关闭 SELinux
$ setenforce 0 && sed -i 's/\(SELINUX=\).*/\1disabled/' /etc/selinux/config

(3)关闭 Swap 分区

# 关闭 Swap 分区
$ swapoff -a

# 禁止开机自动挂载 Swap 分区
$ sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab

(4)加载 netfilter 模块

# 加载 netfilter 模块
$ modprobe br_netfilter && lsmod | grep br_netfilter
br_netfilter           36864  0
bridge                397312  1 br_netfilter

# 设置开机自动加载 netfilter 模块
$ cat >/etc/modules-load.d/br_netfilter.conf <<EOF
br_netfilter
EOF

(5)调整内核参数

# 编写配置文件
$ cat  > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.max_map_count = 262144
EOF

# 加载配置文件
$ sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.max_map_count = 262144


2.3 工具环境

(1)安装编译及其他工具

# 安装编译工具
$ yum install -y gcc-c++ make rsync lxcfs

# 启动 lxcfs
$ systemctl start lxcfs && systemctl enable lxcfs

(2)安装 cfssl 工具

# 下载 cfssl 工具
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64 -P /root

# 安装 cfssl 工具
$ mv /root/cfssl_1.6.5_linux_amd64 /usr/local/bin/cfssl && chmod +x /usr/local/bin/cfssl

# 测试 cfssl 工具
$ cfssl version
Version: 1.6.5
Runtime: go1.22.0

# 下载 cfssljson 工具
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64 -P /root

# 安装 cfssljson 工具
$ mv /root/cfssljson_1.6.5_linux_amd64 /usr/local/bin/cfssljson && chmod +x /usr/local/bin/cfssljson

# 测试 cfssl 工具
$ cfssljson -version
Version: 1.6.5
Runtime: go1.22.0


2.4 go 环境

(1)配置环境变量

# 配置环境变量
$ cat >> /etc/profile <<"EOF"

export GOPATH=/root/go
export GOBIN=${GOPATH}/bin
export GOROOT=/usr/local/go
export PATH=${PATH}:${GOROOT}/bin
EOF

# 重载环境变量
$ source /etc/profile

(2)安装 go 二进制包

# 下载 go 二进制包
$ wget https://golang.google.cn/dl/go1.20.8.linux-amd64.tar.gz -P /root
--2024-12-01 12:47:12--  https://golang.google.cn/dl/go1.20.8.linux-amd64.tar.gz
Connecting to 192.168.230.1:10809... connected.
Proxy request sent, awaiting response... 302 Found
Location: https://dl.google.com/go/go1.20.8.linux-amd64.tar.gz [following]
--2024-12-01 12:47:12--  https://dl.google.com/go/go1.20.8.linux-amd64.tar.gz
Connecting to 192.168.230.1:10809... connected.
Proxy request sent, awaiting response... 200 OK
Length: 100431921 (96M) [application/x-gzip]
Saving to: ‘/root/go1.20.8.linux-amd64.tar.gz’

go1.20.8.linux-amd64.tar. 100%[=============>]  95.78M  11.2MB/s    in 8.8s    

2024-12-01 12:47:21 (10.9 MB/s) - ‘/root/go1.20.8.linux-amd64.tar.gz’ saved [100431921/100431921]

# 解压二进制包
$ rm -rf /usr/local/go && tar -zxvf go1.20.8.linux-amd64.tar.gz -C /usr/local

# 查看 go 版本
$ go version
go version go1.20.8 linux/amd64


2.5 容器环境

(1)安装配置 Docker

# 安装 docker
$ yum install -y docker

# 启动 docker
$ systemctl start docker && systemctl enable docker

# 创建服务配置目录
$ mkdir -p /etc/systemd/system/docker.service.d

# 配置代理
$ cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://${PROXY_IP}:${PROXY_PORT}"
Environment="HTTPS_PROXY=http://${PROXY_IP}:${PROXY_PORT}"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF

# 重新加载配置
$ systemctl daemon-reload

# 重启 docker
$ systemctl restart docker

# 查看代理是否配置成功
$ docker info | grep Proxy
 HTTP Proxy: http://192.168.230.1:10809
 HTTPS Proxy: http://192.168.230.1:10809
 No Proxy: localhost,127.0.0.1

# 测试拉取镜像
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
......

(2)安装配置 CRI-Dockerd

2022 年 5 月 3 日,Kubernetes 1.24 版本正式发布,该版本 Kubernetes 正式移除对 Dockershim 的支持(参考文档:Kubernetes容器运行时弃用Docker转型Containerd | i4T)。因此,若还使用 Docker 作为容器运行时,则需要手动安装 CRI-Dockerd,或者使用 Containerd 作为容器运行时(安装方法见附录)

# 下载 cri-dockerd
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd-0.3.15.amd64.tgz -P /root

# 解压下载的压缩包
$ tar -xvf /root/cri-dockerd-0.3.15.amd64.tgz
cri-dockerd/
cri-dockerd/cri-dockerd

# 复制命令到 /usr/bin/ 目录,并添加可执行权限
$ cp /root/cri-dockerd/cri-dockerd /usr/bin/ && chmod +x /usr/bin/cri-dockerd

# 编写 cri-docker.service 文件
$ cat > /etc/systemd/system/cri-dockerd.service <<"EOF"
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-dockerd.socket

[Service]
Type=notify

ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.8

ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

EOF

# 编写 cri-docker.socket 文件
$ cat > /usr/lib/systemd/system/cri-dockerd.socket  <<"EOF"
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-dockerd.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

EOF

# 重载配置文件
$ systemctl daemon-reload

# 启动 cri-docker 并设置开机自启
$ systemctl start cri-dockerd && systemctl enable cri-dockerd
Created symlink /etc/systemd/system/multi-user.target.wants/cri-dockerd.service → /etc/systemd/system/cri-dockerd.service.

# 查看 cri-docker 状态
$ systemctl status cri-dockerd
● cri-dockerd.service - CRI Interface for Docker Application Container Engine
     Loaded: loaded (/etc/systemd/system/cri-dockerd.service; enabled; preset: disabled)
     Active: active (running) since Mon 2024-12-02 08:40:30 CST; 6s ago
TriggeredBy: ● cri-dockerd.socket
       Docs: https://docs.mirantis.com
   Main PID: 2655 (cri-dockerd)
      Tasks: 10
     Memory: 10.6M ()
     CGroup: /system.slice/cri-dockerd.service
             └─2655 /usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.k8s.io/pause:3.8
.....

# 查看套接字文件,调用方法:unix:///run/cri-dockerd.sock
$ ls -l /run/cri-dockerd.sock
srwxr-xr-x 1 root root 0 Dec  2 08:40 /run/cri-dockerd.sock


3 编译安装 Kubernetes

3.1 编译 Kubernetes

# 创建存放源代码的目录
$ mkdir -p ${GOPATH}/src/kubernetes

# 进入源代码目录
$ cd ${GOPATH}/src/kubernetes

# 克隆 Kubernetes 源代码
$ git clone https://github.com/kubernetes/kubernetes
Cloning into 'kubernetes'...
remote: Enumerating objects: 1593137, done.
remote: Counting objects: 100% (47/47), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 1593137 (delta 12), reused 33 (delta 8), pack-reused 1593090 (from 1)
Receiving objects: 100% (1593137/1593137), 1.05 GiB | 16.23 MiB/s, done.
Resolving deltas: 100% (1166449/1166449), done.
Updating files: 100% (26242/26242), done.

# 进入克隆的 Kubernetes 源代码目录
$ cd ${GOPATH}/src/kubernetes/kubernetes

# 查看所有版本分支
$ git ls-remote --tags origin

# 将 Kubernetes 切换到需要的版本
$ git checkout v1.29.11
Updating files: 100% (15331/15331), done.
Note: switching to 'v1.29.11'.
......

# 执行编译命令,编译所有工具
$ KUBE_BUILD_PLATFORMS="$(go env GOHOSTOS)/$(go env GOHOSTARCH)" make all GOFLAGS=-v GOGCFLAGS="-N -l"

# 查看编译生成的命令
$ ls -l ./_output/local/bin/linux/amd64
total 1152540
-rwxr-xr-x 1 root root  61943960 Dec  2 08:55 apiextensions-apiserver
-rwxr-xr-x 1 root root 147363496 Dec  2 08:55 e2e_node.test
-rwxr-xr-x 1 root root 169920112 Dec  2 08:55 e2e.test
-rwxr-xr-x 1 root root   9294084 Dec  2 08:55 ginkgo
-rwxr-xr-x 1 root root   1908996 Dec  2 08:55 go-runner
-rwxr-xr-x 1 root root  48709784 Dec  2 08:55 kubeadm
-rwxr-xr-x 1 root root  59478168 Dec  2 08:55 kube-aggregator
-rwxr-xr-x 1 root root 124129432 Dec  2 08:55 kube-apiserver
-rwxr-xr-x 1 root root 119271576 Dec  2 08:55 kube-controller-manager
-rwxr-xr-x 1 root root  50225304 Dec  2 08:55 kubectl
-rwxr-xr-x 1 root root  48554136 Dec  2 08:55 kubectl-convert
-rwxr-xr-x 1 root root 112603396 Dec  2 08:55 kubelet
-rwxr-xr-x 1 root root   1687704 Dec  2 08:55 kube-log-runner
-rwxr-xr-x 1 root root 110997656 Dec  2 08:55 kubemark
-rwxr-xr-x 1 root root  55877784 Dec  2 08:55 kube-proxy
-rwxr-xr-x 1 root root  56565912 Dec  2 08:55 kube-scheduler
-rwxr-xr-x 1 root root   1605784 Dec  2 08:55 mounter

# 配置环境变量
$ sed -i '$a export PATH=${PATH}:${GOPATH}/src/kubernetes/kubernetes/_output/local/bin/linux/amd64' /etc/profile

# 重载环境变量
$ source /etc/profile

# 测试环境变量是否生效
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.11", GitCommit:"960a2f019319ab5f7ac1c256efcc180a4113343a", GitTreeState:"clean", BuildDate:"2024-12-02T00:49:59Z", GoVersion:"go1.22.8", Compiler:"gc", Platform:"linux/amd64"}

说明:

如果只想编译其中一个组件,例如只编译 kubelet,可以使用该命令:

KUBE_BUILD_PLATFORMS="$(go env GOHOSTOS)/$(go env GOHOSTARCH)" make all WHAT=cmd/kubelet GOFLAGS=-v GOGCFLAGS="-N -l"


3.2 安装 etcd

# 进入克隆的 Kubernetes 源代码目录
$ cd ${GOPATH}/src/kubernetes/kubernetes

# 执行安装脚本
$ ./hack/install-etcd.sh
Downloading https://github.com/coreos/etcd/releases/download/v3.5.16/etcd-v3.5.16-linux-amd64.tar.gz succeed
etcd v3.5.16 installed. To use:
export PATH="/root/go/src/kubernetes/kubernetes/third_party/etcd:${PATH}"

# 查看编译生成的命令
$ ls -l third_party/etcd/
total 55180
drwxr-xr-x 3 1000 1000     4096 Sep 11 02:22 Documentation
-rwxr-xr-x 1 1000 1000 23621784 Sep 11 02:22 etcd
-rwxr-xr-x 1 1000 1000 17899672 Sep 11 02:22 etcdctl
-rwxr-xr-x 1 1000 1000 14893208 Sep 11 02:22 etcdutl
-rw-r--r-- 1 1000 1000    42066 Sep 11 02:22 README-etcdctl.md
-rw-r--r-- 1 1000 1000     7359 Sep 11 02:22 README-etcdutl.md
-rw-r--r-- 1 1000 1000     9210 Sep 11 02:22 README.md
-rw-r--r-- 1 1000 1000     7896 Sep 11 02:22 READMEv2-etcdctl.md

# 配置环境变量
$ sed -i '$a export PATH=${PATH}:${GOPATH}/src/kubernetes/kubernetes/third_party/etcd' /etc/profile

# 重载环境变量
$ source /etc/profile

# 测试环境变量是否生效
$ etcd --version
etcd Version: 3.5.16
Git SHA: f20bbad
Go Version: go1.22.7
Go OS/Arch: linux/amd64


4 使用 Kubernetes

4.1 启动 Kubernetes

# 进入克隆的 Kubernetes 源代码目录
$ cd ${GOPATH}/src/kubernetes/kubernetes

# 修改启动脚本中:允许特权容器运行、API 节点名称
$ sed -i \
      -e '/^ALLOW_PRIVILEGED=/c ALLOW_PRIVILEGED=${ALLOW_PRIVILEGED:-"true"}' \
      -e '/^HOSTNAME_OVERRIDE=/c HOSTNAME_OVERRIDE=${HOSTNAME_OVERRIDE:-"$(hostname)"}' \
./hack/local-up-cluster.sh

# 若 Kubernetes 版本大于等于 1.24,且使用 Docker 作为容器运行时,则还需要修改容器运行时的套接字
$ sed -i '/^CONTAINER_RUNTIME_ENDPOINT/c CONTAINER_RUNTIME_ENDPOINT=${CONTAINER_RUNTIME_ENDPOINT:-"unix:///run/cri-dockerd.sock"}' ./hack/local-up-cluster.sh

# 执行启动脚本
$ ./hack/local-up-cluster.sh -O
......
To start using your cluster, you can open up another terminal/tab and run:

  export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
  cluster/kubectl.sh

Alternatively, you can write to the default kubeconfig:

  export KUBERNETES_PROVIDER=local

  cluster/kubectl.sh config set-cluster local --server=https://localhost:6443 --certificate-authority=/var/run/kubernetes/server-ca.crt
  cluster/kubectl.sh config set-credentials myself --client-key=/var/run/kubernetes/client-admin.key --client-certificate=/var/run/kubernetes/client-admin.crt
  cluster/kubectl.sh config set-context local --cluster=local --user=myself
  cluster/kubectl.sh config use-context local
  cluster/kubectl.sh

------------------------------以下步骤重新打开一个终端执行------------------------------
# 刷新环境变量
$ source /etc/profile

# 声明连接 Kubernetes API 服务器信息的配置文件 
$ export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig

# 查看集群节点状态
$ kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    <none>   10m   v1.29.11-dirty


4.2 安装 Calico

Calico 下载地址:https://github.com/projectcalico/calico

Calico 版本与 Kubernete 版本需要有对应关系,可参考文档:Documentation archive | Calico Documentation

# 下载 calico
$ wget https://github.com/projectcalico/calico/releases/download/v3.28.2/release-v3.28.2.tgz -P /root

# 解压 calico
$ tar -xvf /root/release-v3.28.2.tgz -C /root

# 加载 calico 镜像
$ for img in $(ls /root/release-v3.28.2/images/*); do docker load -i "${img}"; done
fc72e302317a: Loading layer [==========================>]  3.692MB/3.692MB
17f473a5550b: Loading layer [==========================>]  205.5MB/205.5MB
5f70bf18a086: Loading layer [==========================>]  1.024kB/1.024kB
Loaded image: calico/cni:v3.28.2
4e9f7ac9fb07: Loading layer [==========================>]  38.33MB/38.33MB
Loaded image: calico/dikastes:v3.28.2
3bdcbcc4896a: Loading layer [==========================>]  124.9MB/124.9MB
Loaded image: calico/flannel-migration-controller:v3.28.2
b99a8e25f25e: Loading layer [==========================>]   75.3MB/75.3MB
Loaded image: calico/kube-controllers:v3.28.2
31f1fc200f28: Loading layer [==========================>]  374.2MB/374.2MB
Loaded image: calico/node:v3.28.2
03b5f1752b13: Loading layer [==========================>]  9.832MB/9.832MB
Loaded image: calico/pod2daemon-flexvol:v3.28.2
67c02963f81a: Loading layer [==========================>]  67.58MB/67.58MB
Loaded image: calico/typha:v3.28.2

# 获取 Pod 网络
$ grep "^CLUSTER_CIDR" ${GOPATH}/src/kubernetes/kubernetes/hack/local-up-cluster.sh | awk -F'[-}]' '{print $2}'
10.1.0.0/16

# 修改 yaml 文件,将 CALICO_IPV4POOL_CIDR 修改为获取的 Pod 网络
$ sed -i \
      -e '/CALICO_IPV4POOL_CIDR/ s/#\ //' \
      -e '/192.168.0.0\/16/ s/#\ //' \
      -e "/192.168.0.0\/16/ s/192.168.0.0\/16/10.1.0.0\/16/" \
/root/release-v3.28.2/manifests/calico.yaml

# 启动 calico
$ kubectl apply -f /root/release-v3.28.2/manifests/calico.yaml

# 查看 pod 是否正常运行
$ kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-658958974b-m6jn2   1/1     Running   0          29s
kube-system   calico-node-4c84x                          1/1     Running   0          29s
kube-system   coredns-69cbfb9798-hlqvv                   1/1     Running   0          5m5s


5 如何切换版本

# 进入克隆的 Kubernetes 源代码目录
$ cd ${GOPATH}/src/kubernetes/kubernetes

# 查看所有版本分支
$ git ls-remote --tags origin

# 将 Kubernetes 强制切换到需要的版本
$ git checkout -f v1.31.3
Previous HEAD position was 960a2f01931 Release commit for Kubernetes v1.29.11
HEAD is now at c83cbee114d Release commit for Kubernetes v1.31.3

# 执行编译命令,编译所有工具
$ KUBE_BUILD_PLATFORMS="$(go env GOHOSTOS)/$(go env GOHOSTARCH)" make all GOFLAGS=-v GOGCFLAGS="-N -l"

# 测试新版本命令
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.3", GitCommit:"c83cbee114ddb732cdc06d3d1b62c9eb9220726f", GitTreeState:"clean", BuildDate:"2024-12-02T06:04:02Z", GoVersion:"go1.22.8", Compiler:"gc", Platform:"linux/amd64"}

# 执行 etcd 安装脚本
$ ./hack/install-etcd.sh
Downloading https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz succeed

# 测试新版本命令
$ etcd --version
etcd Version: 3.5.15
Git SHA: 9a5533382
Go Version: go1.21.12
Go OS/Arch: linux/amd64

# 必须删除 cni 插件,否则会导致 coredns 启动失败。详见 6(2)
$ rm -rf /opt/cni

# 后续按照第 4 章中的方法启动即可


6 FAQ

(1)/root/go/src/kubernetes/kubernetes/_output/local/.gimme/versions/go1.22.8.linux.amd64/pkg/tool/linux_amd64/link: mapping output file failed: no space left on device

问题现象:

image-20241202093237888

问题原因:

编译过程中需要向 /tmp 目录写入临时文件,但该目录空间不足

解决方案:

若 /tmp 为单独挂载的 tmpfs 文件系统。则将其卸载:

# 查看 /tmp 是否挂载
$ df -Th /tmp
Filesystem     Type   Size  Used Avail Use% Mounted on
tmpfs          tmpfs  2.7G   66M  2.6G   3% /tmp

# 卸载 /tmp
$ umount -fl /tmp

(2)切换分支后,coredns 启动失败

问题现象:

执行 kubectl describe pod -n kube-system coredns-*-* 命令,看到包含类似如下报错:

image-20241202160708456

问题原因:

切换版本后,cni 插件不兼容,导致网络有问题

解决方案:

每次切换版本,都要及时删除 cni 插件:

$ rm -rf /opt/cni


附录 部署 Containerd

# 下载 containerd 包
$ wget https://github.com/containerd/containerd/releases/download/v1.7.15/cri-containerd-cni-1.7.15-linux-amd64.tar.gz -P /root
 
# 将下载的包解压到根目录中,压缩包自带目录结构
$ tar -xvf /root/cri-containerd-cni-1.7.15-linux-amd64.tar.gz -C /

# 创建配置文件目录
$ mkdir /etc/containerd

# 生成配置文件
$ containerd config default > /etc/containerd/config.toml
 
# 配置 systemdcgroup 驱动程序
$ sed -i '/SystemdCgroup/ s/false/true/' /etc/containerd/config.toml

# 更新runc,因为cri-containerd-cni-1.6.6-linux-amd64.tar.gz的runc二进制文件有问题,最后说明。这一步很重要 ✰ ✰ ✰ 
# wget https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
# mv runc.amd64 /usr/local/sbin/runc 
# mv:是否覆盖"/usr/local/sbin/runc"? y
# chmod +x /usr/local/sbin/runc

# 创建服务配置目录
$ mkdir -p /etc/systemd/system/containerd.service.d

# 配置代理
$ cat > /etc/systemd/system/containerd.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://${PROXY_IP}:${PROXY_PORT}"
Environment="HTTPS_PROXY=http://${PROXY_IP}:${PROXY_PORT}"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF

# 重新加载配置
$ systemctl daemon-reload

# 启动 containerd 服务并设置开机自启
$ systemctl start containerd && systemctl enable containerd
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /etc/systemd/system/containerd.service.

# 查看 containerd 服务状态
$ systemctl status containerd
● containerd.service - containerd container runtime
     Loaded: loaded (/etc/systemd/system/containerd.service; enabled; preset: disabled)
     Active: active (running) since Mon 2024-12-02 08:54:44 CST; 19s ago
       Docs: https://containerd.io
   Main PID: 3129 (containerd)
      Tasks: 12
     Memory: 10.6M ()
     CGroup: /system.slice/containerd.service
             └─3129 /usr/local/bin/containerd
......

# 测试拉取镜像
$ ctr image pull docker.io/library/hello-world:latest
docker.io/library/hello-world:latest:                                             resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:c1ec31eb59444d78df06a974d155e597c894ab4cda84f08294145e845394988e:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 5.1 s                                                                    total:  14.4 K (2.8 KiB/s)                                       
unpacking linux/amd64 sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966...
done: 29.001739ms

# 查看套接字文件,调用方法:unix:///run/containerd/containerd.sock
$ ls -l /run/containerd/containerd.sock
srw-rw---- 1 root root 0 Dec  2 09:15 /run/containerd/containerd.sock
0

评论

博主关闭了当前页面的评论