인터넷이 되는 서버에서 RPM 을 의존성까지 모아 폐쇄망으로 옮기는 작업이다. RHEL 7 은 수명이 끝났고 CentOS 7 저장소도 vault 로 옮겨졌기 때문에, 패키지를 받는 단계부터 저장소·인증서 문제를 먼저 풀어야 한다. 아래는 구독이 붙어 있지 않은 RHEL 7.9 에서 겪는 순서 그대로다.
Docker CE 는 여러 패키지로 나뉘어 있고 각각이 OS 쪽 패키지를 요구한다.
| 묶음 | 패키지 |
|---|---|
| 본체 | docker-ce · docker-ce-cli · containerd.io |
| 플러그인 | docker-buildx-plugin · docker-compose-plugin |
| rootless | docker-ce-rootless-extras |
| OS 의존성 | container-selinux · slirp4netns · fuse-overlayfs · libseccomp · libcgroup |
container-selinux 는 Docker 저장소가 아니라 배포판의 extras 저장소에 있다. 이것 때문에 yumdownloader --resolve 가 "Processing Dependency: container-selinux >= 2:2.74" 에서 멈춘다.
Kubernetes 노드까지 만들 거라면 kubeadm 이 preflight 에서 요구하는 것도 함께 받는다.
yumdownloader --resolve --destdir=/root/k8s-rpms \
kubelet kubeadm kubectl cri-tools \
socat conntrack-tools ipset ipvsadm iptables
No Match for argument container-selinux 나 Error getting repository data for extras, repository not found 가 나오면 배포판 저장소가 아예 없는 상태다. /etc/yum.repos.d/ 를 보면 Docker 저장소만 남아 있는 경우가 많다. CentOS 7 은 수명이 끝나 미러에서 내려갔으므로 vault 를 쓴다.
# /etc/yum.repos.d/CentOS-Vault.repo
[base]
name=CentOS-7 - Base
baseurl=https://vault.centos.org/7.9.2009/os/x86_64/
enabled=1
gpgcheck=0
[updates]
name=CentOS-7 - Updates
baseurl=https://vault.centos.org/7.9.2009/updates/x86_64/
enabled=1
gpgcheck=0
[extras]
name=CentOS-7 - Extras
baseurl=https://vault.centos.org/7.9.2009/extras/x86_64/
enabled=1
gpgcheck=0
http:// 로 적으면 HTTPS Error 301 - Moved Permanently 로 끊긴다. vault 는 HTTPS 로 리다이렉트하는데 이 시점의 yum 이 그 리다이렉트를 따라가지 못한다. 처음부터 https:// 로 적는다.
yum clean all
yum makecache
yum list container-selinux
curl#60 - "Peer's Certificate issuer is not recognized." 가 나오는 것은 시스템의 CA 번들이 오래돼 요즘 발급된 서버 인증서의 발급자를 모르기 때문이다. 근본 해결은 ca-certificates 를 올리는 것인데, 그 패키지를 받으려면 저장소에 붙어야 하고 저장소에 붙으려면 인증서가 필요한 순환에 빠진다.
작업용 서버에서 임시로 검증을 끄고 진행한다.
sslverify=0
rpm --import 나 curl 이 같은 이유로 막히면 파일을 먼저 받아 설치한다.
curl -k -O https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
rpm -Uvh elrepo-release-7.el7.elrepo.noarch.rpm
검증을 끈 상태로 받은 패키지는 해시를 따로 확인하고, 이 설정을 운영 서버에 그대로 옮기지 않는다.
RHEL 7 의 커널은 3.10 이다. 최근 kubeadm 은 preflight 에서 이를 거부한다.
[ERROR SystemVerification]: kernel release 3.10.0-1160.el7.x86_64 is unsupported.
Recommended LTS version from the 4.x series is 4.19. Any 5.x or 6.x versions are also supported.
For cgroups v2 support, the minimal version is 4.15 and the recommended version is 5.8+
--ignore-preflight-errors=SystemVerification 으로 넘길 수는 있지만 검사를 끈다고 커널 기능이 생기지는 않는다. cgroup v2 를 쓸 수 없고 이후 CNI·런타임에서 문제가 이어진다. 선택지는 둘이다.
첫째, OS 를 올린다. RHEL 9 · Rocky 9 · Ubuntu 22.04 이상으로 다시 구성하는 것이 정상 경로다. 새로 만드는 클러스터라면 이쪽을 택한다.
둘째, ELRepo 커널을 올린다. kernel-lt 는 장기 지원 계열, kernel-ml 은 최신 안정 계열이다. 저장소는 손으로 만들지 말고 elrepo-release 패키지를 설치한 뒤 elrepo-kernel 을 켜서 쓴다. 손으로 만든 저장소 파일에 경로를 잘못 적어 No Match for argument kernel-lt 로 헤매는 일이 많다.
yum --enablerepo=elrepo-kernel install -y kernel-lt kernel-lt-devel
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0
reboot
uname -r
-headers 패키지는 대부분 필요 없다. 다른 서버에도 배포하려면 같은 방식으로 내려받아 옮긴다.
yumdownloader --resolve --enablerepo=elrepo-kernel \
--destdir=/root/kernel-rpms kernel-lt kernel-lt-devel
ELRepo 의 el7 커널은 CentOS 7 수명 종료 이후 갱신이 멈춘 것으로 보인다. 어느 버전까지 올라가는지는 확인 필요하다. 커널을 올려 쓰는 것은 임시 방편이고, 보안 갱신을 받지 못하는 상태가 이어진다.
받은 RPM 을 한 디렉터리에 모아 로컬 저장소로 만든다.
createrepo_c /opt/local-repo
# /etc/yum.repos.d/local.repo
[local]
name=Local Repo
baseurl=file:///opt/local-repo
enabled=1
gpgcheck=0
yum clean all
yum install -y docker-ce docker-ce-cli containerd.io
컨테이너 이미지는 RPM 과 별개다. 필요한 이미지를 docker save 로 내보내 옮기거나, 폐쇄망 안에 레지스트리를 두고 거기에 올려 둔다.