1. 개요

개인서버(이하 Host)에 3개의 Virtual Machine을 생성하고, 생성한 VM을 이용하여 Kubernetes 환경을 구성한다. Kubernetes 환경은 Master노드 1개와 Worker노드 2개로 구성되며, 아키텍쳐는 아래 그림과 같다.

1.1. 인프라 아키텍쳐

2.Kubernetes 인프라 구축

Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템이다. 이 실습에서는 컨테이너를 만들어주는 컨테이너 런타임 엔진은 도커를 사용하며, 애플리케이션 배포는 apache(httpd)를 활용하도록 한다.

2.1 Docker 설치

2.1.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

2.1.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

2.1.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

2.1.4 Docker apt 패키지 다운로드

  • Docker apt 패키지 업데이트
    sudo apt-get update
  • Docker 엔진 설치
    sudo apt-get install -y docker-ce=5:20.10.0~3-0~ubuntu-(lsbreleasecs)dockercecli=5:20.10.0 30 ubuntu(lsb_release -cs) docker-ce-cli=5:20.10.0~3-0~ubuntu-(lsb_release -cs) containerd.io docker-compose-plugin

2.1.5 swap 비활성화

sudo swapoff -a
sudo sed -i '/swap.img/s/^/#/' /etc/fstab

2.1.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

2.1.7 cgroup 변경 설정

daemon.json 파일 생성 및 내용 작성
vi daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}

2.1.8 권한 설정 및 파일위치 변경

sudo chown root:root daemon.json
sudo mv ./daemon.json /etc/docker/.

2.1.9 Docker 서비스 등록 및 재시작

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl enable docker

2.1.10 cgroup 확인

docker info | grep -i cgroup
docker-compose 설치
sudo apt-get install -y docker-compose

2.1.11 최신버전 확인

docker-compose -v

2.1.12 Docker 테스트

sudo docker run --name hello hello-world
docker rm -f hello

2.2 Kuberentes 설치

2.2.1 Kuberentes는 모든 VM에 설치해야 한다.

2.2.2 iptables 설정 및 확인

  • sudo cat /sys/class/dmi/id/product_uuid
    /etc/modules-load.d/k8s.conf 파일내용 수정
    sudo vi /etc/modules-load.d/k8s.conf
    br_netfilter
  • /etc/sysctl.d/k8s.conf 파일내용 수정
    sudo vi /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
  • 시스템을 로드한다.
    sudo sysctl --system

2.2.3 apt 필수 패키지 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

2.2.4 Kuberentes apt 패키지 다운로드를 위한 GPG key 등록

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

2.2.5 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

2.2.6 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

2.2.7 (옵션) runtime service failed를 위한 사전설정

sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd

2.3 Kuberentes Cluster 구축

2.3.1 Master VM 설정

  • Root 권한으로 전환

sudo su

  • Kuberentes Cluster 초기화 설정

이 게시글에서는 Master 가상머신의 IP가 192.168.20.11이므로, {마스터VM의 IP}에는 192.168.0.11을 입력한다. 개인실습환경에서 마스터 가상머신의 IP가 다를 경우 개인환경에 맞는 마스터IP를 입력한다.

이 실습에서는 Container Network Interface(CNI) 플러그인은 Calico를 사용할 예정이므로, {CNI 네트워크}에는 해당 플러그인에는 10.244.0.0/16을 입력한다.

sudo kubeadm init --apiserver-advertise-address={마스터VM의 IP} --pod-network-cidr={CNI 네트워크} --kubernetes-version=v1.22.2

  • ex :

    sudo kubeadm init --apiserver-advertise-address=192.168.20.11 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2

kubeadm join 192.168.0.11:6443 --token cgnybx.ottaw3i2ckle9vn3 \
--discovery-token-ca-cert-hash sha256:104e47a86555953427accda49cff4df9428ac8

  • 결과값
To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as roo                 t:

kubeadm join 192.168.0.11:6443 --token cgnybx.ottaw3i2ckle9vn3 \
        --discovery-token-ca-cert-hash sha256:104e47a86555953427accda49cff4df9428ac8                 7d5cb535f32a0eeb814c74d9d8

2.3.2 마스터 등록후, 설정

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

 curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
vi 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.3.3 Worker VM 설정

  • Root 권한으로 전환

    sudo su

2.3.4 Worker VM을 Master VM에 join한다. (마스터 등록시 나온 출력을 사용한다.)

kubeadm join 192.168.20.11:6443 --token cf85i0.lyi1go2frnk22mlr \
--discovery-token-ca-cert-hash sha256:5b1508058a2efc... c4b34bf
모든 Worker VM에 동일하게 적용한다.
Kuberentes Cluster 구축 완료

2.3.5 Master VM에서 구축된 클러스터 확인

kubectl get nodes -o wide

3.Kubernetes 인프라 운영

3.1 apache(httpd) yaml 파일 작성

  • Master VM에 접속한다.
  • Root 권한으로 전환
    sudo su
  • 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
---
# httpd 서비스 생성
apiVersion: v1
kind: Service
metadata:
  name: httpd
spec:
  ports:
  - name: httpd
    # 외부로 노출할 포트
    port: 80
    protocol: TCP
    # 파드의 컨테이너 포트
    targetPort: 80
  selector:
    app: httpd
  # 서비스 타입 : 로드밸런서
  type: NodePort

3.5 apache(httpd) 배포

  • kubectl을 이용하여 yaml 파일을 배포한다.

    kubectl apply -f httpd.yaml

3.6 apache(httpd) 확인#

  • 배포된 애플리케이션을 확인한다.

    kubectl get all

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

  • Master VM과 동일한 네트워크(192.168.0.0/24)의 서버(예: host)에서 해당 웹서버(httpd)를 확인한다

http://192.168.20.11:32542/

0개의 댓글

Powered by GraphCDN, the GraphQL CDN