IDC 엔지니어의 기술 이야기

Kubernetes Kasten Backup 본문

OS_APP/Kubernetes

Kubernetes Kasten Backup

붉은볼곰팅이 2023. 5. 3. 14:10
반응형

쿠버네티스 설치후 카스텐을 활용한 백업 시스템을 구축해 보았다

 

[Kubernetes 설치]

** 해당 작업은 Virtual Box 상에서 진행하였으며 모든 노드는 프로세스 갯수를 최소 2개 이상 잡아야 구축이 된다

 

초록색 : 명령어 입력

파랑색 : 설정 입력(Vi,Nano등)

빨강색 : 주석 


환경 : CentOS 7.9
master : 192.168.43.35
worker-1 : 192.168.43.36
worker-2 : 192.168.43.37

[[ All Node에서 작업 ]]
1. 각 노드 별 패키지 업데이트
[root@ALL Node ~]# yum -y update

2. hosts 설정
[root@ALL Node ~]# vi /etc/hosts

192.168.43.35 master
192.168.43.36 worker-1
192.168.43.37 worker-2

2. 도커 설치 및 실행
2.1 필요 패키지들을 설치해준다.
[root@ALL Node ~]# yum install -y yum-utils  device-mapper-persistent-data  lvm2

2.2 방화벽 disable
[root@ALL Node ~]# systemctl stop firewalld && systemctl disable firewalld

2.3 repository 등록
[root@ALL Node ~]# yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

2.4 도커 설치
[root@ALL Node ~]# yum install -y docker-ce docker-ce-cli containerd.io

2.5 서비스 실행
[root@ALL Node ~]# systemctl enable docker && systemctl start docker

2.6 서비스 실행 확인
[root@ALL Node ~]# ps -ef | grep docker
root      2979     1  0 17:14 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      3108  8178  0 17:14 pts/1    00:00:00 grep --color=auto docke

2.7 컨테이너 런타임 설정
[root@ALL Node ~]# cat << END  > /etc/docker/daemon.json
> {
>  "exec-opts": ["native.cgroupdriver=systemd"],
>  "log-driver": "json-file",
>  "log-opts": {
>    "max-size": "100m"
>  },
>  "storage-driver": "overlay2"
> }
> END

3. 쿠버네티스 설치
3.1 swap disabled 스왑은 반드시 off로 해야한다.
[root@ALL Node ~]# swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

3.2 Letting iptables see bridged traffic 
[root@ALL Node ~]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

[root@ALL Node ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

[root@ALL Node ~]# sudo sysctl --system

3.3 kubeadm. kubectl installation

[root@ALL Node ~]# cat <<EOF |  tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 
exclude=kubelet kubeadm kubectl
EOF

[root@ALL Node ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

 

((특정버전 설치시))_Kasten 호환 이슈때문에 특정 버전을 설치해야만 됬다
[root@ALL Node ~]# yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0 --disableexcludes=kubernetes
[root@ALL Node ~]# systemctl enable kubelet && systemctl start kubelet

3.4 selinux 종료

[root@ALL Node ~]# setenforce 0
[root@ALL Node ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

3.5 kubeadm init (master에서 적용)
[root@master ~]# kubeadm init

((CRI 에러 발생시))
[ERROR CRI]: container runtime is not running: output: time="2023-04-14T17:23:33+09:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

[root@master ~]# sudo rm /etc/containerd/config.toml
[root@master ~]# sudo systemctl restart containerd

((kubeadm init 실행후 아래 내용 복사))
mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  export KUBECONFIG=/etc/kubernetes/admin.conf

kubeadm join 192.168.43.35:6443 --token b4hwrl.2y9en5nl8dhxuwni \
--discovery-token-ca-cert-hash sha256:d031a0437a42a1e33463413c4febf660020bb269ca5843f807f48a1af5e2e078 

3.6 master node에서 kubectl 명령을 쓸 수 있도록 허용 ( master에서 적용)
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

3.7 CNI - Weave 적용 (master에서 적용)
[root@master ~]# kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

3.8 master 확인
[root@master ~]# kubectl get nodes

Master Node 확인


* 쿠버네티스 자동완성 적용

>> (1~3)번은 편의성을 위한 것이므로 굳이 하지 않아도 된다.

     "kubectl" 대신에 간단히 "k" 만 치고 하고 싶은 분들만 하면 된다.
1. bash_complete 설치
[root@master ~]# yum -y install bash-completion

2. bash쉘에 영구적으로 추가
[root@master ~]# source <(kubectl completion bash) 
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

3. kubectl을 k로 alias 적용
[root@master ~]# alias k=kubectl
[root@master ~]# complete -F __start_kubectl k

4. Worker Join
[root@worker-1 ~]# kubeadm join 192.168.43.35:6443 --token b4hwrl.2y9en5nl8dhxuwni --discovery-token-ca-cert-hash sha256:d031a0437a42a1e33463413c4febf660020bb269ca5843f807f48a1af5e2e078

4.1 Master에서 확인
[root@master ~]# kubectl get node -o wide

Worker Join 확인

=============================================================================
[Kasten 설치]
((사전환경))

>> 백업 저장소를 NAS를 사용하지 않을경우 굳이 NFS를 연동하지 않아도 된다
- NFS 연동(모든 노드)
- Synology NAS NFS 연동
[root@ALL Node ~]# yum install -y nfs-utils

{Synology NAS 연동 방법}
https://24xsiempre.com/en/how-to-configure-nfs-repository-for-kasten-k10/
1. NFS Utils 설치(마스터노드+워커노드)
[root@ALL Node ~]# yum install -y nfs-utils

2. helm 저장소 구성(마스터노드)
[root@master ~]# helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

3. nfs install
[root@master ~]# helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.43.250 \
--set nfs.path=/volume1/Kasten

4. nfs delete(구성오류시 삭제)
[root@master ~]# helm delete nfs-subdir-external-provisioner

5. nfs 설치 확인
[root@master ~]# kubectl get pods

NFS Pod 확인

6. 스토리지 클래스 구성(자동생성되므로 확인만 하면됨)
[root@master ~]# kubectl get sc

SC 확인

7. Persistenet Disk 구성
[root@master ~]# kubectl apply -f disco-pvc-nfs.yaml

(disco-pvc-nfs.yaml 내용)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: prueba-disco-nfs
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi

8. Disk 구성 확인
[root@master ~]# kubectl get pvc

9. K10용 디스크 준비
[root@master ~]# kubectl delete pvc prueba-disco-nfs

10. K10용 디스크 생성
[root@master ~]# kubectl apply -f repo-nfs-pvc.yaml

(repo-nfs-pvc.yaml 내용)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: repo-nfs-respaldos
  namespace: kasten-io
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi

11. 디스크 확인
[root@master ~]# kubectl get pvc -n kasten-io

PVC 확인

12. NFS 마운트
[root@ALL Node ~]# mount -t nfs 192.168.43.250:/volume1/Kasten /tmp/k8s-pv/
=============================================================================
[Kasten 설치]
1. PV 볼륨 yaml 작성
[root@master ~]# vi /root/k10-pv-1.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: k10-pv-1
spec:
  capacity:
    storage: 30Gi # 스토리지 용량 2GB
  volumeMode: Filesystem # 파일 시스템 형식
  accessModes: # 읽기/쓰기 옵션
  - ReadWriteOnce
  storageClassName: ""
  persistentVolumeReclaimPolicy: Delete
  hostPath:
    path: /tmp/k8s-pv # 스토리지를 연결할 Path

1.1 PV 볼륨 생성
[root@master ~]# k apply -f k10-pv-1.yaml
>> 6까지 생성

1.2 PV 불륨생성 확인
[root@master ~]# k get pv

PV 확인

2. helm 설치
[root@master ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
[root@master ~]# chmod 700 get_helm.sh
[root@master ~]# ./get_helm.sh

3. Kasten 설치
[root@master ~]# helm repo add kasten https://charts.kasten.io/
[root@master ~]# helm install k10 kasten/k10 --namespace=kasten-io
((kasten 삭제))
[root@master ~]# helm uninstall k10 --namespace=kasten-io

3.1 서비스 확인
[root@master ~]# k get pods -n kasten-io

>> pods Runnnig 확인은 대략 10분 안쪽으로 완료 되는것 같다

>> Runnig이 안되는것들은 "kubectl describe pods -n kasten-io catalog-svc" 와 같은 명령어로 로그 확인해보면 될듯

Kasten Pod 확인

[root@master ~]# k get pvc -n kasten-io

Kasten PVC 확인

4. 외부에서 시스템 접속
[root@master ~]# vi kasten-gateway.yaml 
apiVersion: v1
kind: Service
metadata:
  name: gateway-nodeport
  namespace: kasten-io
spec:
  ports:
  - name: http
    port: 8000
    nodePort: 30010
  selector:
    service: gateway
  type: NodePort

4.1 yaml 파일 적용
[root@master ~]# kubectl apply -f kasten-gateway.yaml

4.2 게이트웨이 서비스 확인만
[root@master ~]# kubectl get svc -n kasten-io | grep gateway-nodeport

외부 접속 포트 확인

 

5. Kasten Dashbord 접속 확인

>> 별도의 로그인 과정이 없다

http://192.168.43.35:30010/k10/#/

Kasten Dashboard

 

6. 백업 및 복원은 GUI로 되어있어 어렵지 않게 테스트 가능하다

반응형