1. 클라우드의 등장
- 예측불가능한 데이터의 증가로 인해 중앙 집중적 클라우드 탄생
2. 엣지 컴퓨팅의 필요성
1. 미래의 글로벌 데이터 사용량
IDC에서 2018년 발표한 향후 2025년까지의 글로벌 데이터 사용량 예상 그래프

- 2025년 175ZB의 데이터 사용량이 예상됨
2. 그렇다면 현재는?
네이버 IDC '각'

175ZB의 데이터를 처리하려면?

- 하지만 현재 우리나라의 데이터센터는 200곳도 안됨..
3. 무슨 문제가 생길까?
1. Volume

2. Variety

3. Velocity

4. 그렇다면 해결방법은?
엣지 컴퓨팅



- arm이 엣지 컴퓨팅에 유리하다
-> 열에 강하고
-> 저전력
1. PreProject - K8s
1. 개요
- 개인서버(이하 Host)에 3개의 Virtual Machine(이하 VM)을 생성
- 생성한 VM을 이용하여 Kubernetes 환경을 구성
- Kubernetes 환경은 Master노드 1개와 Worker노드 2개로 구성
1. 인프라 아키텍쳐
이 프로젝트의 라우터(공유기)는 192.168.20.0/24의 네트워크 대역을 사용
네트워크 및 서브넷 정보
- Network Address : 192.168.45.0
- Usable Host IP Range : 192.168.45.1 - 192.168.45.254
- Subnet Mask : 255.255.255.0
- 가상머신을 포함한 모든 서버는 동일한 네트워크 대역을 사용
가상머신의 IP
- 가상머신의 인터페이스를 브리지 어뎁터를 사용
- Host: 192.168.45.108(Host는 개인서버, PC 또는 노트북)
- Master: 192.168.45.211
- Worker#1: 192.168.45.212
- Worker#2: 192.168.45.213


2. 실습 환경
1. VM 성능 및 설정
1. VM 설정
- OS: Ubuntu 20.04 server
- vCPU : 2core
- Memory : 4GB

2. 컨테이너 엔진 버전
- Container runtimes engine : docker 20.10
- Container orchestration engine: Kuberentes 1.22.2
3. K8s 인프라 구축
- K8s는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템
- 컨테이너를 만들어주는 컨테이너 런타임 엔진은 도커를 사용
- 애플리케이션 배포는 apache(httpd) 사용
1. Docker 설치
1. apt 필수 패키지 설치
sudo apt-get install -y curl
sudo apt-get install -y apt-transport-https
sudo apt-get install -y ca-certificates
sudo apt-get install -y gnupg-agent
sudo apt-get install -y software-properties-common
sudo apt-get install -y gnupg2
sudo apt-get install -y lsb-release
sudo apt-get install -y curl apt-transport-https apt-transport-https ca-certificates gnupg-agent software-properties-common gnupg2 lsb-release
- 여기서 -y 옵션은 설치여부 질문에 대한 선입력
2. Docker apt 패키지 다운로드를 위한 GPG Key 등록
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3. Docker apt 패키지 저장소 등록
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Docker apt 패키지 다운로드
sudo apt-get update
sudo apt-get install -y docker-ce=5:20.10.0~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:20.10.0~3-0~ubuntu-$(lsb_release -cs) containerd.io docker-compose-plugin
5. swap 비활성화
sudo swapoff -a
sudo sed -i '/swap.img/s/^/#/' /etc/fstab
6. Docker 사용권한 설정
sudo chmod a+r /etc/apt/keyrings/docker.gpg
ls -al /var/run/docker.sock
sudo groupadd docker
sudo usermod -aG docker $USER
sudo chown root:docker /var/run/docker.sock
sudo service docker restart
sudo chmod 666 /var/run/docker.sock
7. cgroup 변경 설정
- daemon.json 파일 생성 및 내용 작성
vi daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
sudo chown root:root daemon.json
sudo mv ./daemon.json /etc/docker/.
8. Docker 서비스 등록 및 재시작
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl enable docker
9. cgroup 확인
docker info | grep -i cgroup

10. Docker Compose 설치
sudo apt-get install -y docker-compose
docker-compose -v

11. Docker 테스트
sudo docker run --name hello hello-world
docker rm -f hello

2. K8s 설치
1. iptables 설정 및 확인
sudo cat /sys/class/dmi/id/product_uuid

- /etc/modules-load.d/k8s.conf 파일내용 수정
sudo vi /etc/modules-load.d/k8s.conf
-----/etc/modules-load.d/k8s.conf-----
br_netfilter
- /etc/sysctl.d/k8s.conf 파일내용 수정
sudo vi /etc/sysctl.d/k8s.conf
------/etc/sysctl.d/k8s.conf------
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sudo sysctl --system
2. apt 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
3. Kuberentes apt 패키지 다운로드를 위한 GPG key 등록
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
4. Kuberentes apt 패키지 저장소 등록
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
5. kubelet, kubeadm, kubectl 설치
sudo apt-get update
sudo apt-get install -y kubeadm=1.22.2-00 kubelet=1.22.2-00 kubectl=1.22.2-00
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm version

6. (옵션) runtime service failed를 위한 사전설정
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
여기까지 기본설정 끝남, 개별 VM 만들고 이후 작업!!!!!
3. K8s Cluster 구축
1. Master VM 설정
sudo su
- K8s Cluster 초기화 설정
-> 이 게시글에서는 Master 가상머신의 IP가 192.168.45.211이므로, {마스터VM의 IP}에는 192.168.45.211을 입력한다. 개인실습환경에서 마스터 가상머신의 IP가 다를 경우 개인환경에 맞는 마스터IP를 입력
-> 이 실습에서는 Container Network Interface(CNI) 플러그인은 Calico를 사용할 예정이므로, {CNI 네트워크}에는 해당 플러그인에는 10.244.0.0/16을 입력
sudo kubeadm init --apiserver-advertise-address=192.168.45.211 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2
kubeadm join 192.168.45.211:6443 --token 7nc2gq.ui3jk5iibmi6wuu1 \
--discovery-token-ca-cert-hash sha256:c0de30792741c292273b742ae594eb1fbf2cfaabe314c40a04b1dd782440c2cf
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
- Cailco 설치
-> Tigera Calico 연산자 및 사용자 정의 자원 정의 설치
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
- 사용자 정의 자원을 작성하여 Calico를 설치
-> Calico의 경우 기본 CNI 주소는 192.168.0.0/16으로 되어 있으며, 본 게시글에서는 10.244.0.0/16으로 변경
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
vi custom-resources.yaml
-----custom-resources.yaml-----
...
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
-------------------------------
kubectl create -f custom-resources.yaml
- Pod를 스케줄할 수 있도록 제어 플레인에서 taint를 제거 (이부분 살짝 오류)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-

2. Worker VM 설정
sudo su
- Worker VM을 Master VM에 join한다. (마스터 등록시 나온 출력을 사용한다.)
kubeadm join 192.168.45.211:6443 --token 7nc2gq.ui3jk5iibmi6wuu1 \
--discovery-token-ca-cert-hash sha256:c0de30792741c292273b742ae594eb1fbf2cfaabe314c40a04b1dd782440c2cf
- 모든 Worker VM에 동일하게 적용
-> Worker1

-> Worker2

3. K8s Cluster 구축 완료
- Master VM에서 구축된 클러스터 확인(이부분도 오류인듯)
kubectl get nodes -o wide

- 클러스터 구축을 위한 Troubleshoot
-> Root 권한이 아니할 경우 error
sudo su

-> swap 영역을 끄지 않을 경우 error
sudo swapoff -a
sudo sed -i '/swap.img/s/^/#/' /etc/fstab

4. K8s 인프라 운영
- Kubernetes 인프라기반으로 apache(httpd) 애플리케이션을 배포한다.
1. apache(httpd) yaml 파일 작성
- Master VM에 접속한다.
- Root 권한으로 전환
sudo su
- vi를 이용하여 httpd.yaml 파일을 작성
vi httpd.yaml
------------ vi httpd.yaml --------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
labels:
app: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: httpd
spec:
ports:
- name: httpd
port: 80
protocol: TCP
targetPort: 80
selector:
app: httpd
type: NodePort
-------------------------------------------
2. apache(httpd) 배포
- kubectl을 이용하여 yaml 파일을 배포한다.
kubectl apply -f httpd.yaml

3. apache(httpd) 확인
kubectl get all

-> deployment를 이용해야 애플리케이션이 컨트롤하였으며, 네트워크는 NodePort 서비스를 이용해 30589포트로 웹서버(httpd)를 배포한다.
성공 !!!!!!!!!!!!!!!!!!!
