데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [3기 스터디] 딥다이브 쿠버네티스 네번째 스터디 (08.09)

      강만쥬 24.08.17
      234 2 0
      DEVOTEE 요약
      스터디에서는 minikube나 kind를 사용하지 않고, 직접 노드에 쿠버네티스를 설치해보았습니다. 먼저 우분투에서 필요한 리소스와 설정들을 조정한 후, 컨테이너 런타임 환경 및 쿠버네티스 패키지를 설치했습니다. 마지막으로, Calico를 이용해 네트워크를 설정하고, 샘플 애플리케이션을 배포하여 클러스터가 정상적으로 동작하는지 확인했습니다.
      DEVOTEE 추천 블로그

      안녕하세요, 데보션영 3기 카페인코더 조의 강대훈입니다 😊


      이번 네번째 스터디에서는 minikube나 kind를 사용하지 않고 노드에 쿠버네티스를 직접 설치하는 실습을 진행하였습니다.

      이러한 작업은 온프레미스나 클라우드 환경에서 실제로 멀티 노드 기반 클러스터를 운영하려면 꼭 진행해야 하는 과정입니다.


      ❕이 글의 모든 내용은 안승규님의 블로그 내용을 기반으로 이루어져 있습니다.❕


      환경

      CPU: 2core, amd64

      RAM: 3GB

      OS: Ubuntu 20.04

      주의 사항

      우분투를 기준으로 위처럼 키나 설정에 필요한 리소스들을 설치해주는 작업들은 로키 등 다른 os에서는 약간의 차이가 있을 수 있으니 주의해야 합니다.

      먼저 쿠버네티스 환경 구축을 위해 리눅스 기반 VM을 하나 준비한 뒤 작업을 해줍니다.

      사용자 추가 및 방화벽 제거

      먼저 ask라는 새로운 사용자를 추가하고, 해당 사용자에게 모든 명령어에 대한 권한을 부여합니다.

      $ sudo adduser ask
      
      $ cat <<EOF | sudo tee /etc/sudoers.d/sudoers-ask
      ask     ALL=(ALL:ALL)   NOPASSWD:ALL
      EOF

      다음으로 ufw과 Apparmor 서비스를 중단시켜줍니다.

      ufw은 방화벽, Apparmor은 리눅스의 보안 모듈입니다.

      또한 swapoff 명령어로 스왑 메모리를 비활성해줍니다.

      $ sudo systemctl stop ufw && 
      sudo systemctl disable ufw && 
      sudo systemctl stop apparmor.service && 
      sudo systemctl disable apparmor.service && 
      sudo swapoff -a

      만약 스왑메모리가 비활성되어있지 않다면 추후 에러가 발생합니다.

      쿠버네티스 모듈 추가

      다음 두 모듈을 쿠버네티스 conf에 입력합니다.

      • overlay: 컨테이너의 파일 시스템 계층을 관리하는데 사용

      • br_netfilter: 브리지 네트워크의 패킷 필터링 지원

      $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      overlay
      br_netfilter
      EOF
      
      $ sudo modprobe overlay
      $ sudo modprobe br_netfilter

      네트워크포워딩 설정

      다음으로 쿠버네티스 클러스터를 설정하기 위해 각종 네트워크 및 IP 파라미터를 조정하는 작업을 수행합니다.

      • net.bridge.bridge-nf-call-iptables=1 : 브리지 네트워크에서의 IP 패킷을 iptables가 처리하도롭 합니다.

      • net.ipv4.ip_forward= 1: IPv4 패킷 포워딩을 활성화 해 클러스터 내에서 노드 간 네트워크 트래픽이 전달되도록 합니다.

      • sudo iptables -P FORWARD ACCEPT: iptables에서 패킷이 노드를 넘어갈 수 있도록 정책을 설정합니다.

      $ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
      net.bridge.bridge-nf-call-iptables  = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      net.ipv4.ip_forward                 = 1
      EOF
      
      $ sudo sysctl --system
      $ sudo iptables -P FORWARD ACCEPT 

      포워딩 설정 확인

      네트워크 설정을 확인해봅니다.

      Forward 설정이 Accept가 되었으면 정상입니다.


      그러나 iptable은 filter와 nat 두가지 타입이 있습니다.

      default는 filter이므로 nat 타입도 확인을 해줍니다.


      컨테이너 런타임 설치

      이번에는 컨테이너 런타임을 설치하고 구성을 해줍니다.

      먼저 설치하기 위해 필요한 설정들을 해줍니다. (GPG 관리 도구 설치, Docker 패키지 저장소 추가 등등)

      $ sudo apt-get update
      $ sudo apt-get install -y apt-transport-https ca-certificates curl gpg
      $ sudo install -m 0755 -d /etc/apt/keyrings
      $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
      $ sudo chmod a+r /etc/apt/keyrings/docker.asc
      
      $ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
        $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

      다음으로 런타임으로서 containerd를 설치하고, 설정 및 시작을 해줍니다.

      $ sudo apt-get update
      $ sudo apt-get install -y containerd.io
      
      $ sudo mkdir -p /etc/containerd
      $ sudo containerd config default | sudo tee /etc/containerd/config.toml
      
      $ sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
      
      $ sudo systemctl restart containerd
      $ sudo systemctl enable containerd
      $ sudo systemctl status containerd

      다음 명령어를 치고, 어떤 내용인지를 살펴봅니다.

      sudo containerd config default

      crictl 설치

      crictl은 쿠버네티스에서 CRI를 통해 컨테이너를 관리하기 위한 커맨드 라인 도구입니다.

      crictl 명령을 통해 컨테이너의 생성, 시작, 중지, 삭제 등의 작업을 수행 가능합니다.


      kubectl 과의 차이점은 다음과 같습니다.


      kubectl

      • 쿠버네티스 클러스터의 전반적인 관리와 운영을 위한 도구이다.

      • 파드(Pods), 서비스(Services), 디플로이먼트(Deployments)와 같은 다양한 쿠버네티스 리소스의 생성, 관리, 삭제 등을 담당한다.

      • 쿠버네티스 API와 상호작용하여 클러스터의 고수준 작업을 수행한다.

      crictl

      • 컨테이너 런타임과 관련된 저수준의 작업을 위한 도구이다.

      • 이는 컨테이너의 생명 주기(생성, 실행, 중지, 삭제), 로그 확인, 이미지 관리 등 컨테이너 단위의 작업에 집중한다.

      • crictl은 주로 CRI(Container Runtime Interface) 호환 컨테이너 런타임을 관리하는 데 사용된다.

      먼저 다음과 같이 crictl을 다운로드 해줍니다.

      이번 실습에서는 v1.30.0 버전을 선택하였습니다.

      #----------------------------------------------------------
      # 서버가 arm64 or amd64 인지 확인하여 설치
      #----------------------------------------------------------
      $ VERSION="v1.30.0"
      $ curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
      
      $ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
      $ rm -f crictl-$VERSION-linux-amd64.tar.gz

      다음으로 crictl 설정을 해줍니다.

      runtime-endpoint와 image-endpoint 설정에서 컨테이너 런타임으로 containerd를 선태갷주었습니다.

      쿠버네티스에서 사용하는 컨테이너 런타임은 모두 같은 CRI 스펙을 준수하므로 다른 컨테이너 런타임을 사용해도 괜찮습니다.

      #----------------------------------------------------------
      # crictl 이 어느 container 를 접속할 것인지 세팅
      #----------------------------------------------------------
      $ cat <<EOF | sudo tee /etc/crictl.yaml
      runtime-endpoint: unix:///run/containerd/containerd.sock
      image-endpoint: unix:///run/containerd/containerd.sock
      timeout: 2
      debug: false
      pull-image-on-create: false
      EOF
      
      #----------------------------------------------------------
      # containerd 설정 확인
      #----------------------------------------------------------
      $ sudo crictl info

      설치가 완료되면 crictl info 명령어를 통해 여러 세팅값들을 확인 가능합니다.

      kubectl 설치

      #----------------------------------------------------------
      # 서버가 arm64 or amd64 인지 확인하여 설치
      #----------------------------------------------------------
      $ curl -LO "https://dl.k8s.io/release/v1.30.3/bin/linux/amd64/kubectl"
      $ chmod +x ./kubectl
      $ sudo mv ./kubectl /usr/local/bin/kubectl

      curl의 -L 옵션은 redirection을 따라가라는 명령어고, O 옵션은 받는 파일명 그대로 받으라는 옵션입니다.

      kubernetes 설치

      쿠버네티스 패키지를 설치하기 위해 gpg키를 추가하고, kubelet 및 kubeadm을 설치해줍니다.

      $ mkdir -p ~/kubeadm && cd ~/kubeadm
      
      #-----------------------------------------------
      # kubernetes 다운로드 key 와 url 등록
      #-----------------------------------------------
      $ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
      
      $ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
      $ sudo apt-get update
      
      #========================================================================
      # kubelet 설치 (아직 kubelet 이 뜨지는 않음)
      #========================================================================
      $ sudo apt-get install -y kubelet="1.30.3-*" kubeadm="1.30.3-*"
      $ sudo systemctl enable --now kubelet
      $ sudo systemctl start kubelet

      kubelet은 컨트롤 플레인 노드들을 띄워주기 위해서 필요하기 때문에 미리 설치해줍니다.

      (static 파드를 띄우는 용도)


      kubelet status를 보면 아직 loaded 상태입니다.

      이는 kubelet을 위한 세팅이 아직 완료되지 않았기 때문입니다.


      • kubelet 과 kubeadm은 마스터 노드에 띄우고, 워커 노드들에도 추후 둘 다 설치해줍니다.

      kubeadm을 통한 kubernetes 클러스터 초기화

      kubeadm이란?

      kubeadm은 쿠버네티스에서 제공하는 기본적인 도구로, 쿠버네티스 클러스터 생성을 위해 필요한 작업을 수행합니다.

      kubeadm.png

      #========================================================================
      # 1. kubeadm 설치
      #========================================================================
      $ sudo kubeadm config images pull
      
      #------------------------------------------------------------
      # 자기 노드의 ip: --apiserver-advertise-address
      # multi control-plane 일 경우 L4 ip: --control-plane-endpoint
      # cgroup driver 세팅 (https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/)
      #------------------------------------------------------------
      $ vi kubeadm-config.yaml
      
      apiVersion: kubeadm.k8s.io/v1beta3
      kind: InitConfiguration
      nodeRegistration:
        criSocket: "/var/run/containerd/containerd.sock"
      
      ---
      apiVersion: kubeadm.k8s.io/v1beta3
      kind: ClusterConfiguration
      apiServer:
        certSANs:
        - 127.0.0.1
        - localhost
        - <Node private IP>
        - <Node public IP>
      networking:
        serviceSubnet: 10.233.0.0/18
        podSubnet: 10.233.64.0/18
        dnsDomain: "cluster.local"

      certSANs에는 어떤 ip와 어떤 도메인으로 받아줄지를 작성합니다. (나머지 ip에서는 접속 불가)

      <Node private IP> 자리에는 이 클러스터의 사설 ip를,

      <Node public IP>자리에는 이 클러스터의 공인 ip를 작성해줍니다.


      apiserver-adverise-address 옵션은 클러스터 자신의 IP를 넣습니다.

      multi control-plane 옵션의 경우 API서버를 L4에서 로드밸런싱 해주는 경우 , L4의 IP를 --control-plane-endpoint에 작성해주는 것입니다.

      #----------------------------------------------------------------
      # kubeadm init 을 하고 나면 /var/lib/kubelet/config.yaml 이 생성되어
      # kubelet 이 정상적으로 실행됨
      #----------------------------------------------------------------
      $ sudo kubeadm init --config kubeadm-config.yaml --v=5
      
      #------------------------------------------------------------
      # kubeconfig
      #------------------------------------------------------------
      $ mkdir -p ~/.kube
      $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      $ sudo chown $(id -u):$(id -g) $HOME/.kube/config

      kubeadm-config.yaml 에 작성하는 파일은 crisocket을 어떤 걸 사용할지와 클러스터의 네트워크 설정들을 적어줍니다.

      crisocket은 컨테이너 런타임과 통신하기 위한 설정입니다.

      어차피 컨테이너 런타임들은 모두 표준화가 되어있으므로 위치만 작성해주면 됩니다.


      만약에 cillium을 사용한다면 이를 쿠버네티스는 관리하지 않습니다.

      그리고 cillium을 설치하면 kubeproxy가 필요하지 않습니다.


      따라서 cillium을 사용할 예정이라면 해당 파일에서 kubeproxy disable 설정도 넣어주어야 합니다.


      만약 sudo kubeadm init --config kubeadm-config.yaml --v=5 을 통해 init을 하는 과정에서 kubelet health 체크에 실패한다면 swap메모리가 켜져있는 것이므로, swap메모리를 꺼줍니다.

      sudo swapoff -a

      이후 kubeadm을 초기화하고

      sudo kubeadm reset
      sudo kubeadm init

      kubeconfig까지 설정이 끝나면, kubectl config get-contexts로 현재 컨텍스트 목록을 확인합니다.


      Calico(칼리코) 설정

      Calico란?

      Calico는 Kubernetes 클러스터 내에서 네트워크 정책을 적용하고, IP 주소 관리 및 네트워크를 설정하는 오픈 소스 솔루션입니다.


      Calico Operator란?

      Calico Operator는 쿠버네티스에서 Calico 네트워크와 관련된 리소스를 관리하는 데 사용되는 Kubernetes Operator입니다.

      Kubernetes Operator는 특정 애플리케이션의 배포와 관리를 자동화하는 컨트롤러입니다.


      이제 칼리코 오퍼레이터를 설치하고, 칼리코를 실행해 줄 것입니다.

      $ mkdir -p ~/calico && cd ~/calico
      
      $ curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml
      
      $ kubectl create -f tigera-operator.yaml
      
      $ curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml

      resource 파일에서 cidr IP를 아까 podSubnet으로 지정한 IP로 수정해줍니다.

      cidr은 Calico가 사용할 IP 주소 범위를 정의합니다.

      #------------------------------------------------------------
      # yaml 을 열어서 pod 네트워크를 확인하고 변경
      #------------------------------------------------------------
      $ vi custom-resources.yaml
      ...
          cidr: 10.233.64.0/18
      ...
      
      $ kubectl create -f custom-resources.yaml
      
      #------------------------------------------------------------
      # calico 설치 확인
      #------------------------------------------------------------
      $ kubectl get pods -n calico-system


      위처럼 파드들이 모두 running 상태가 되면 다음으로 넘어갈 수 있습니다.



      현재까지 정상적으로 진행했다면 전체 파드 목록은 위와 같습니다.

      taint 제거

      kubectl taint nodes --all node-role.kubernetes.io/control-plane-

      taint는 마스터 노드에는 일반 워커노드가 뜨지 못하도록 하는 설정이지만, 현재는 단일 노드이기 때문에 taint 설정을 제거합니다.

      끝에 - 까지만 주어도 제거가 가능합니다.

      $ mkdir -p ~/sample-yaml && cd ~/sample-yaml
      
      $ cat <<EOF | tee ./nginx-service.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: nginx-deployment
        name: nginx-deployment
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.21.0
              ports:
              - containerPort: 80
      
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service-nodeport
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 8080
          targetPort: 80
          nodePort: 30180
        type: NodePort
        externalTrafficPolicy: Local
      EOF
      
      $ kubectl apply -f nginx-service.yaml
      
      $ kubectl get pods

      이제 다른 노드(PC)에서 curl 명령을 하였을 때 통신이 되면 정상적으로 쿠버네티스 클러스터가 배포된 것입니다.

      $ curl <Node ip>:30180



      내용 자체는 멘토님의 블로그 글과 설명을 바탕으로 그대로 따라하기만 하면 됐지만, 의외로 여러 부분에서 막히며 쉽지 않았습니다 😅

      그래도 다음 스터디에서는 구축한 클러스터를 기반으로 더 많은 내용을 배울 수 있을 것 같아서 더욱 기대되네요 😝


      감사합니다. 🙇🏻‍♂️


      reference

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      강만쥬 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기