Docker & K8S offline Install

박민선·2025년 5월 3일
0

[본 게시글은 22년 기준으로 작성되었음]
테스트 목적 : 폐쇄망에서 Docker 와 K8S를 설치하여 각 서비스의 구조 파악

1. 환경 세팅

VM 3대를 준비 (master 1 + worker 2)
Offline 환경을 구성하기 위해 Outbound정책 Port에 제한을 둠

(단, KIC 환경에서는 VM 생성 시 아웃바운드 정책 Port를 모두 열고 VM생성이 끝나면 SG를 변경해 줄 것)

6443 - api server
2379 - etcd
2380 - etcd
4443 - metric server
179 - calico
10250 - kubelet API

2. Docker 설치

2.1 Docker 설치에 필요한 패키지를 준비

URL을 통해 받거나 Docker가 설치되어 있는 VM에서 구해도 됨 

focal 은 ubuntu 20.xx
bionic 은 ubuntu 18.xx
URL : https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/

VM 경로 : /var/cache/apt/archives 확인

필요 패키지 - yohan guide (버전을 맞추어 설치)
containerd~
docker-ce-cli~
docker-ce-rootless-extra~
docker-ce~
docker-compose~
docker-scan-plugin~
libltdl~
pigz~

(본 테스트에서는 containerd, docker-ce, docker-cli 로만 구성)

2.2 scp 를 통한 패키지 이동

로컬에서 패키지를 받았으면
로컬 → GateWay(oliver) → offline vm 으로 이동
통신가능한 VM에서 패키지를 받았으면
online vm → GateWay(oliver) → offline vm 으로 이동

2.3 dpkg 를 통한 설치

.deb가 있는 디렉토리에서 dpkg 를 통한 패키지 설치

$ sudo dpkg -i *.deb

Trouble Shooting❗️

  • containerd 버전문제로 1.4.1 이상으로 해결

dpkg: error processing package docker-ce (–install): dependency problems - leaving unconfigured

의존성 트러블은 패키지가 부족하면 수도 없이 나옴


2.4 docker 설정 및 croup 변경

2.4.1 docker 설정 (선택적)

$ sudo usermod -aG docker $USER 
$ 재시작 하면 적용
사용자 그룹을 추가한다면 sudo 를 안붙여도 됨

2.4.2 cgroup 변경

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

2.5 Docker 설치 확인

3. K8S 설치 

kube-apiserver 는 최대 1단계의 마이너 버전 차이까지 가능
ex) 하나의 kube-apiserver 의 버전이 1.21 라면 다른 kube-apiserver 는 1.20 or 1.21 이여야 함

kubelet 은 kube-apiserver 보다 최신이여서는 안됨 그리고 최대 2단계 이전의 마이너 버전 차이까지 가능
ex) kube-apiserver 가 1.21 이라면 kubelet 은 1.21 or 1.20 or 1.19 까지 사용가능

kubectl 은 kube-apiserver 과 최대 1단계의 마이너 버전 차이까지 가능
ex) kube-apiserver 가 1.21 이라면 kubectl 은 1.22 or 1.21 or 1.20 까지 사용가능

3.1 환경 설정

필요한 패키지파일과 이미지 파일을 준비
패키지 파일은 2.1 과 동일하게 구할 수 있음
이미지의 경우 docker save로 .tar 저장

필요 패키지
kubeadm~
kubectl~
kubelet~
kubernetes-cni~
conntrack~
cri-tools~
socat~

필요 이미지
kube-proxy
kube-apiserver
kube-controller-manager
kube-scheduler
etcd
coredns
pause
calico/cni                           (CNI 설치 시 사용)
calico/node                       (CNI 설치 시 사용)
calico/kube-controllers   (CNI 설치 시 사용)

3.2 K8S 설치 (master node)

3.2.1 설치

준비한 이미지 파일을 docker load 로 이미지 업로드 
준비한 패키지 파일을 dpkg 로 설치

$ sudo dpkg -i *.deb

3.2.2 설정

$ sudo swapoff -a
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
$ sudo kubeadm init

(master node)
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

(확인)
$ kubectl get nodes 

CNI 가 미설치 되어 NotReady 확인 가능

3.3 CNI 설치

calico 를 사용
앞 서 준비한 calico 이미지 사용
https://projectcalico.docs.tigera.io/manifests/calico.yaml
의 셀스크립트를 calico.yaml 파일 저장

$ kubectl apply -f calico.yaml

(확인)
$ kubectl get all -A
$ kubectl get nodes

3.4 worker node 구축

2.docker 설치와 3.k8s설치 내용대로 설치 (단, init 하지말 것)
worker node의 k8s 설치에 사용 했던 이미지

kube-proxy
coredns
pause
calico/cni (CNI 설치 시 사용)
calico/node (CNI 설치 시 사용)

(worker node)
master node 에서 init 했을 때 받은 토큰으로 조인
$ sudo kubeadm join 172.30.3.97:6443 --token gdpgce.j5mvth8gt7qu4u86 \
--discovery-token-ca-cert-hash sha256:ed4b205d09552dc4c957fb0e08c962560af5c9c93b0e3f222dfd7e29af7796e0 

(master node 에서 확인)
$ kubectl get all -A
$ kubectl get nodes

3.5 k8s 설치 결과

4. k8s Multi Master 구성

4.1 VM 세팅

앞선 Docker & K8S offline install을 통해 master node 1대, worker node 2대가 구성이 되어 있을 것 (재사용)
같은 방법으로 master node 2대 추가, 기존의 node들은 kubeadm reset 처리
총, master node 3대 worker node 2대를 연결예정

4.2 Main Master Token 얻기

$ sudo kubeadm init --token-ttl 0 --control-plane-endpoint "[Loadbalancer IP]:6443" --upload-certs --pod-network-cidr=192.168.50.0/24 >> kubeadm-init-result.txt

(pod network cidr 를 지정하지 않으면 추 후 조인 시에 중복으로 인해 에러발생할 수 있음)

빨간 상자= control-plane token
노란 상자 = worker token

4.3 각 노드 별 필요한 Token으로 Join

( Controll-plane Node )
4.1 VM 세팅이 끝난 후 kubeadm init 대신 Controll-plane Token 값 적용 (위 빨간 상자 확인)

(Worker Node)
4.1 VM 세팅이 끝난 후 Worker Token 값 적용 (위 노란 상자 확인)

4.4 연결 확인

Master node에서 확인

$ kubectl get all -A
$ kubectl get nodes


Main Master 에서만 kubectl apply -f calico.yaml 하면 됨 ( Sub Master 에서 실행 X )
각 Node 들은 필요 이미지만 들고 있으면 됨


(참고)
Docker 참고 주소

K8S 참고 주소

0개의 댓글