개요
폐쇄망 환경에서는 외부 인터넷에 접근할 수 없기 때문에 apt와 같은 패키지 관리자를 사용하여 패키지를 설치하기가 어렵습니다.
proxy server라도 존재한다면 인터넷을 통해 패키지를 설치할 수 있지만 그렇지 못 한 상황 또한 존재합니다.
이번 포스팅에서는 다음과 같은 환경에서 k8s 관련된 파일들을 설치해보려고 합니다.
- 인터넷에 접근할 수 없는 폐쇄망 환경이다.
- 폐쇄망 환경에서 Linux 위에 k8s cluster 구축을 위한 파일들을 설치하려고 한다.
- 인터넷망 환경에서 Linux를 실행할 수 있다.
- 인터넷망에서 폐쇄망으로 파일을 전송할 수 있다.
- proxy server가 존재하지 않는다.
이번 포스팅에 앞서 k8s 구조에 대해 이해하고 오는 것을 추천합니다.
다음 개념을 이해하고 있으면 무엇을 설치해야 하는지 이해할 수 있습니다.
- kubelet은 CRI (Container Runtime Interface)를 활용하여 High-level container runtime(containerd, CRI-O)을 호출합니다.
- 고수준 continaer runtime은 OCI(Open Container Initiative)를 활용하여 runC와 같은 Low-level container runtime을 호출하여 container를 생성합니다.
- 최신 k8s는 docker engine 자체를 사용하지 않고 기본적으로 containerd를 container runtime으로 사용합니다.
https://growth-coder.tistory.com/368
VM으로 On-Premise 환경에서 k8s cluster 구축하기
개요On-Premise 환경에서 k8s cluster를 구축해보려고 합니다. container 기술 개념 정리k8s에 대해 이해하기 위해 먼저 container 기술에 대한 개념 정리를 하려고 합니다. container 기술이란?container 기술이란
growth-coder.tistory.com
인터넷 망의 offline 디렉토리 안에 필요한 파일들을 모두 설치해보겠습니다.
mkdir offline
container runtime 설치
High-Level container runtime인 containerd를 설치하겠습니다.
containerd는 Low-Level container runtime을 호출하기 때문에 Low-Level container runtime인 runc도 함께 설치하겠습니다.
설치 과정은 아래 링크를 참고했습니다.
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
containerd/docs/getting-started.md at main · containerd/containerd
An open and reliable container runtime. Contribute to containerd/containerd development by creating an account on GitHub.
github.com
먼저 Hgih-Level container runtime인 containerd를 설치해보겠습니다.
https://containerd.io/downloads/
containerd – containerd downloads
To install the binaries for containerd version 2.1.4 (latest), click on the Binaries (.tar.gz) button for that version in the Releases table below. That will copy the tarball URL to your clipboard. Use wget to download the tarball and untar it. The table b
containerd.io
버전 정보는 적절한 버전으로 변경하여 tar.gz 압축 파일을 다운받습니다.
mkdir -p offline
wget -P offline https://github.com/containerd/containerd/releases/download/v2.1.4/containerd-2.1.4-linux-amd64.tar.gz
systemd를 통해 containerd를 실행하려면 아래 containerd.service에서 파일을 다운로드 받습니다.
wget -P offline https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
다음은 Low-Level container runtime인 runc를 설치해보겠습니다.
https://github.com/opencontainers/runc/releases/tag/v1.4.0-rc.2
Release runc v1.4.0-rc.2 -- "私の役目は信じるかどうかではない。行うかどうかだ。" · opencontainers/runc
This is the second release candidate of the runc 1.4.0 release. It includes a few minor features that did not make the cut-off for v1.4.0-rc.1 (namely CLONE_INTO_CGROUP support and some new Intel R...
github.com
마찬가지로 architecture나 버전 정보는 적절한 버전으로 변경하면 됩니다.
wget -P ./offline https://github.com/opencontainers/runc/releases/download/v1.4.0-rc.2/runc.amd64
CNI plugin 설치
다음은 CNI plugin을 설치합니다. CNI plugin은 컨테이너 간 통신을 위해 필요합니다.
https://github.com/containernetworking/plugins/releases/
Releases · containernetworking/plugins
Some reference and example networking plugins, maintained by the CNI team. - containernetworking/plugins
github.com
마찬가지로 architecture나 버전 정보는 적절한 버전으로 변경하면 됩니다.
wget -P ./offline https://github.com/containernetworking/plugins/releases/download/v1.8.0/cni-plugins-linux-amd64-v1.8.0.tgz
Calico 설치
CNI plugin을 설치했으니 구현체인 Calico를 설치합니다.
Calico가 의존 중인 image는 다음과 같습니다.
- quay.io/calico/cni:v3.31.0
- quay.io/calico/node:v3.31.0
- quay.io/calico/kube-controllers:v3.31.0
# Calico에 필요한 모든 이미지를 다운로드합니다.
sudo docker pull quay.io/calico/cni:v3.31.0
sudo docker pull quay.io/calico/node:v3.31.0
sudo docker pull quay.io/calico/kube-controllers:v3.31.0
압축합니다.
sudo docker save quay.io/calico/cni:v3.31.0 quay.io/calico/node:v3.31.0 quay.io/calico/kube-controllers:v3.31.0 -o ./offline/calico_images.tar
YAML 파일도 다운받습니다.
wget -P ./offline https://raw.githubusercontent.com/projectcalico/calico/v3.31.0/manifests/calico.yaml
kubectl 설치
kubectl을 설치합니다.
https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
Install and Set Up kubectl on Linux
Before you begin You must use a kubectl version that is within one minor version difference of your cluster. For example, a v1.34 client can communicate with v1.33, v1.34, and v1.35 control planes. Using the latest compatible version of kubectl helps avoid
kubernetes.io
마찬가지로 architecture나 버전 정보는 적절한 버전으로 변경하면 됩니다.
wget -P offline "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
kubeadm, kubelet 설치
kubeadm, kubelet을 설치합니다.
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Installing kubeadm
This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.34. If
kubernetes.io
마찬가지로 architecture나 버전 정보는 적절한 버전으로 변경하면 됩니다.
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
ARCH="amd64"
sudo wget -P offline https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/kubeadm
sudo wget -P offline https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/kubelet
wget -P offline "https://raw.githubusercontent.com/kubernetes/release/v0.16.2/cmd/krel/templates/latest/kubelet/kubelet.service"
wget -P offline "https://raw.githubusercontent.com/kubernetes/release/v0.16.2/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf"
sudo mkdir -p /usr/lib/systemd/system/
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d/
cat kubelet.service | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service
cat 10-kubeadm.conf | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl enable --now kubelet
sudo mv ./kubelet /usr/local/bin
sudo mv ./kubeadm /usr/local/bin
sudo mv ./kubectl /usr/local/bin
docker image 다운로드
이제 docker image를 다운받을 예정입니다.
다음 명령어를 입력하면 kubeadm이 k8s cluster를 초기화 할 때 어떠한 이미지를 사용하는지 알 수 있습니다.
kubeadm config images list
인터넷이 되는 환경이었다면 kubeadm init 명령어를 사용해서 k8s cluster를 초기화 할 때 자동으로 이미지를 다운받습니다.
하지만 폐쇄망 환경에서는 연결이 되지 않기 때문에 인터넷 망에서 다운받아 폐쇄망으로 보내야 합니다.
인터넷 망에 docker가 설치되어 있어서 docker를 통해 image를 다운받았습니다.
sudo docker pull registry.k8s.io/kube-apiserver:v1.34.1
sudo docker pull registry.k8s.io/kube-controller-manager:v1.34.1
sudo docker pull registry.k8s.io/kube-scheduler:v1.34.1
sudo docker pull registry.k8s.io/kube-proxy:v1.34.1
sudo docker pull registry.k8s.io/coredns/coredns:v1.12.1
sudo docker pull registry.k8s.io/pause:3.10.1
sudo docker pull registry.k8s.io/etcd:3.6.4-0
모든 image를 묶어서 하나의 tar 파일로 생성했습니다.
sudo docker save registry.k8s.io/kube-apiserver:v1.34.1 registry.k8s.io/kube-controller-manager:v1.34.1 registry.k8s.io/kube-scheduler:v1.34.1 registry.k8s.io/kube-proxy:v1.34.1 registry.k8s.io/coredns/coredns:v1.12.1 registry.k8s.io/pause:3.10.1 registry.k8s.io/etcd:3.6.4-0 -o ./offline/k8s_images.tar
이제 모든 파일이 준비가 되었습니다. offline 디렉토리 자체를 압축합니다.
sudo tar -cvf offline.tar offline/
이제 폐쇄망으로 이 압축 파일을 보냅니다.
폐쇄망에서 설치
폐쇄망에서 이 압축 파일을 해제하여 설치를 해봅시다.
sudo tar -xvf offline.tar
containerd를 /usr/local directory 내부에 압축을 풉니다.
sudo tar Cxzvf /usr/local ./offline/containerd-2.1.4-linux-amd64.tar.gz
containerd.service를 등록합니다.
sudo mkdir -p /usr/local/lib/systemd/system/
sudo mv ./offline/containerd.service /usr/local/lib/systemd/system/containerd.service
containerd를 실행합니다.
sudo systemctl start containerd
containerd 설정을 초기화합니다.
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
2.1.4 버전의 containerd는 pause 3.10 버전을 사용하고 있는데 저희는 kubeadm 설정에 해당하는 pause 3.10.1을 쓸 것이기 때문에 버전을 맞춰줍니다.
sudo sed -i "s/sandbox = 'registry.k8s.io\/pause:3.10'/sandbox = 'registry.k8s.io\/pause:3.11'/" /etc/containerd/config.toml
containerd를 재실행합니다.
sudo systemctl restart containerd
runc를 설치합니다.
sudo install -m 755 ./offline/runc.amd64 /usr/local/sbin/runc
CNI plugin을 설치합니다.
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin ./offline/cni-plugins-linux-amd64-v1.8.0.tgz
kubelet service를 등록합니다.
sudo mkdir -p /usr/lib/systemd/system/
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d/
sudo cat ./offline/kubelet.service | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo cat ./offline/10-kubeadm.conf | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
kubelet과 kubectl에 실행 권한을 부여하고 kubelet, kubeadm, kubectl을 bin에 등록합니다.
sudo chmod +x ./offline/kubelet
sudo chmod +x ./offline/kubeadm
sudo chmod +x ./offline/kubectl
sudo mv ./offline/kubelet /usr/local/bin
sudo mv ./offline/kubeadm /usr/local/bin
sudo mv ./offline/kubectl /usr/local/bin
sudo systemctl enable --now kubelet
calico에 필요한 docker image를 import 합니다.
sudo ctr -n quay.io image import ./offline/calico_images.tar
kubectl apply -f ./offline/calico.yaml
k8s에 필요한 image를 모두 import 합니다.
폐쇄망에서는 docker를 따로 설치하지 않아 ctr 명령어를 사용했는데 docker 명령어를 사용해도 무방합니다.
sudo ctr -n k8s.io image import ./offline/k8s_images.tar
그리고 k8s cluster를 초기화 하기 전에 기본 세팅을 진행합니다. 자세한 설명은 아래 포스팅을 참고해주세요.
https://growth-coder.tistory.com/368
VM으로 On-Premise 환경에서 k8s cluster 구축하기
개요On-Premise 환경에서 k8s cluster를 구축해보려고 합니다. container 기술 개념 정리k8s에 대해 이해하기 위해 먼저 container 기술에 대한 개념 정리를 하려고 합니다. container 기술이란?container 기술이란
growth-coder.tistory.com
sudo swapoff -a
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system
위 명령어를 하나의 sh 파일로 만들어보았습니다.
<set.sh>
sudo swapoff -a
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system
sudo tar -xvf offline.tar
sudo tar Cxzvf /usr/local ./offline/containerd-2.1.4-linux-amd64.tar.gz
sudo mkdir -p /usr/local/lib/systemd/system/
sudo mv ./offline/containerd.service /usr/local/lib/systemd/system/containerd.service
sudo systemctl start containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i "s/sandbox = 'registry.k8s.io\/pause:3.10'/sandbox = 'registry.k8s.io\/pause:3.10.1'/" /etc/containerd/config.toml
sudo systemctl start containerd
sudo systemctl restart containerd
sudo install -m 755 ./offline/runc.amd64 /usr/local/sbin/runc
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin ./offline/cni-plugins-linux-amd64-v1.8.0.tgz
sudo mkdir -p /usr/lib/systemd/system/
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d/
sudo cat ./offline/kubelet.service | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo cat ./offline/10-kubeadm.conf | sed "s:/usr/bin:/usr/local/bin:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo chmod +x ./offline/kubelet
sudo chmod +x ./offline/kubeadm
sudo chmod +x ./offline/kubectl
sudo mv ./offline/kubelet /usr/local/bin
sudo mv ./offline/kubeadm /usr/local/bin
sudo mv ./offline/kubectl /usr/local/bin
sudo systemctl enable --now kubelet
sudo ctr -n k8s.io image import ./offline/k8s_images.tar
control plane node k8s cluster 초기화
이제 kubeadm으로 k8s cluster를 초기화하면서 잘 동작하는지 확인해봅시다.
# k8s cluster 초기화
sudo kubeadm init --apiserver-advertise-address <control plane node ip 주소> --pod-network-cidr=<pod network 대역> --cri-socket unix:///run/containerd/containerd.sock
초기화 후 출력문에 3줄 명령어가 나오는데 그대로 복사해서 입력합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
이제 calico images들을 import 하고 yaml 파일을 적용합니다.
sudo ctr -n k8s.io image import ./offline/calico_images.tar
kubectl apply -f ./offline/calico.yaml
kubectl get nodes를 했을 때 node가 ready 상태라면 성공입니다.