[본 게시글은 22년 기준으로 작성되었음]
테스트 목적 : 폐쇄망에서 Docker 와 K8S를 설치하여 각 서비스의 구조 파악
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
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 로만 구성)
로컬에서 패키지를 받았으면
로컬 → GateWay(oliver) → offline vm 으로 이동
통신가능한 VM에서 패키지를 받았으면
online vm → GateWay(oliver) → offline vm 으로 이동
.deb가 있는 디렉토리에서 dpkg 를 통한 패키지 설치
$ sudo dpkg -i *.deb
dpkg: error processing package docker-ce (–install): dependency problems - leaving unconfigured
의존성 트러블은 패키지가 부족하면 수도 없이 나옴
$ sudo usermod -aG docker $USER
$ 재시작 하면 적용
사용자 그룹을 추가한다면 sudo 를 안붙여도 됨
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
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 까지 사용가능
필요한 패키지파일과 이미지 파일을 준비
패키지 파일은 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 설치 시 사용)
준비한 이미지 파일을 docker load 로 이미지 업로드
준비한 패키지 파일을 dpkg 로 설치
$ sudo dpkg -i *.deb
$ 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 확인 가능
calico 를 사용
앞 서 준비한 calico 이미지 사용
https://projectcalico.docs.tigera.io/manifests/calico.yaml
의 셀스크립트를 calico.yaml 파일 저장
$ kubectl apply -f calico.yaml
(확인)
$ kubectl get all -A
$ kubectl get nodes
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
앞선 Docker & K8S offline install을 통해 master node 1대, worker node 2대가 구성이 되어 있을 것 (재사용)
같은 방법으로 master node 2대 추가, 기존의 node들은 kubeadm reset 처리
총, master node 3대 worker node 2대를 연결예정
$ 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
( Controll-plane Node )
4.1 VM 세팅이 끝난 후 kubeadm init 대신 Controll-plane Token 값 적용 (위 빨간 상자 확인)
(Worker Node)
4.1 VM 세팅이 끝난 후 Worker Token 값 적용 (위 노란 상자 확인)
Master node에서 확인
$ kubectl get all -A
$ kubectl get nodes
Main Master 에서만 kubectl apply -f calico.yaml 하면 됨 ( Sub Master 에서 실행 X )
각 Node 들은 필요 이미지만 들고 있으면 됨
(참고)
Docker 참고 주소
K8S 참고 주소