DevOps 개념알고 쿠버네티스 설치 후 구축까지

1. DevOps란 무엇인가?

  • 현재 상승세를 보이고 있고 앞으로도 많이 쓰이게될 클라우드 환경에서는 애플리케이션을 개발, 배포하고 운영하는 방식이 혁신적으로 변화 되고 있습니다. 오늘날 IT 비지니스의 가장 큰 경쟁력은 신속성이며, 이러한 환경에 부합하는 DevOps가 보편화되고 있습니다. 그러므로 우리는 DevOps에 대해 조금 더 알 필요가 있다고 생각합니다.

  • DevOps1개발(Development)운영(Opereations)의 합성어로 세계적 컨설팅 업체인 가트너에서는 시스템 중심의 접근 방식에서 신속하고 간결한 IT 서비스 제공에 중점을 둔 IT 문화의 변화로 정의하고 있습니다. DevOps에는 보안, 협업 방식, 데이터 분석을 비롯해 기타 여러 요소가 포함이 되며 이와 같이 DevOps는 기존의 개발 업무와 관리 업무로 구분되는 전통적인 방식에서 벗어나, 운영팀과 개발팀과의 협업을 향상하거나 통합함으로써 애플리케이션 수명 주기 전반에 더 빠르고, 안정적인 IT 서비스를 제공하고 있습니다. 양 팀간의 협업이 원활한다면 큰 업무 효율을 기대할 수 있겠다고 할 수 있겠습니다.

  • DevOps는 하나의 아이디어(새로운 소프트웨어 기능, 개선 요청 또는 버그 수정 등)가 사용자에게 가치를 제공할 수 있도록 운영 환경에서 개발로부터 배포로 진행되는 프로세스의 속도를 높이는 접근 방식을 의미합니다. 이러한 접근 방식을 적용하려면 개발 팀과 운영 팀이 자주 커뮤니케이션하고 팀원들과 공감하면서 업무에 접근해야 하며 확장성과 유연한 프로비저닝도 필요합니다. DevOps를 확립하면 셀프 서비스와 자동화를 통해 다양한 이점과 경쟁력을 얻을 수 있습니다. 대개 표준 개발 환경에서 코딩 (통합 개발 환경, Integrated Development Environment, IDE) 작업을 하는 개발자는 IT 운영 담당자와 긴밀하게 협력하여 소프트웨어 빌드, 테스트, 출시 속도를 가속화할 수 있습니다.

  • 이는 곧 코드 변경도 더 빈번해지고 인프라도 보다 역동적으로 사용해야 한다는 의미이며, 전통적인 관리 전략은 이러한 종류의 요구를 충족할 수 없으므로 경쟁력을 강화하려면 몇 가지 변화가 필요합니다. 관련하여 인프라를 조금 더 효율적으로 관리 할 수 있도록 필자는 쿠버네티스를 활용하여 IaC를 구축하여 소개하려 합니다.


2. 쿠버네티스(K8s)란 무엇인가?

  • 쿠버네티스2란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래되었고 K8s라는 표기는 “K”와 “s”와 그 사이에 있는 8글자를 나타내는 약식 표기입니다. 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화 하였고 그로 인해 많은 회사에서 연구를 진행하게 되었습니다. 쿠버네티스는 프로덕션 워크로드를 대규모로 운영하는 15년 이상의 구글 경험과 커뮤니티의 최고의 아이디어와 적용 사례가 결합되어 있습니다.

  • 쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼 입니다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해주며 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있고 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있습니다. 그리하여 이 도구에 대해 다뤄보는 시간을 가져보도록 하겠습니다.

2-1. K8s의 구조! 컴포넌트란!

  • 쿠버네티스는 여러 컴포넌트3의 집합이 모여 동작을 합니다. 또한 쿠버네티스를 배포 시 클러스터를 얻게 되며, 쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 워커 머신의 집합 모든 클러스터는 최소 한 개의 워커 노드를 가지게 됩니다.

  • 워커 노드는 애플리케이션의 구성요소인 파드를 호스트한다. 컨트롤 플레인은 워커 노드와 클러스터 내 파드를 관리한다. 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행되고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공된다.


3. K8s Cluster 환경 구축하기!

구축 전 읽고가기!

  • 필자의 경우에는 돈이 없기에 제일 일반인이 많이 사용하고 다루기 쉬운 Host VM을 사용하기로 했습니다. 단순하게 VM 4대를 가지고 다루도록 하겠습니다. VM 생성 및 OS 설치의 경우 따로 다루지는 않겠습니다. 구글링을 늘려가며 어떠한 IT 환경에 적응하는 것도 무엇보다 가장 중요하다고 저는 생각합니다.

  • Linux가 익숙하지 않으신분들께는 이해가 안되실 부분들이 많겠지만 그 또한 개인이 공부하며 매워가기 충분하다고 생각합니다. 아래 내용들을 단순하게 Ctrl + C, V 만을 하는 일이 없도록 변수 부분은 따로 지정하게 만들었습니다. 단순 Ctrl + C, V으로 공부하는 일이 없기를 바라며 진행하겠습니다!

구축 환경 (아래 환경들은 준비가 되었다고 생각하고 서버시점에서 부터 시작하겠습니다.)

  • VM Management Tool : Vagrant 2.2.19 (Custom)
  • Host VM : Oracle VM VirtualBox 6.1.30 (Custom)
  • K8s Version : 1.8 이상
  • Destro : CentOS 7.7
    Node : 4대 이상 / ※ Local PC Memory 15G 정도 필요※
    Master Spec : CPU: 2, Mem: 3072, NIC: 2EA
    Worker Spec : CPU: 1, Mem: 2560, NIC: 1EA

2-2. K8s 구축 시작하기

  1. 구축에 앞서 도메인 서버 등록과 VM간 도메인 활용을 위한 설정을 해주자
    • 수동으로 변경해주는 부분을 ※주의※하며 Ctrl + C, V를 방지합시다!
    • 아래 내용들의 옵션에 대해서는 간단하게 의미만 확인하겠습니다. 어떠한 기능인지는 구글링 스터디 추천드립니다~!
      [root@KM-k8s ~]# cat << EOF > /etc/hosts					## VM간 도메인 통신 등록
      > <KM-IP> KM-k8s
      > <KW1-IP> KW1-k8s
      > <KW2-IP> KW2-k8s
      > <KW3-IP> KW3-k8s
      > EOF
      [root@KM-k8s ~]# cat << EOF >> /etc/resolve.conf				## 패키지 설치를 위한 도메인 서버 등록
      > nameserver 1.1.1.1
      > nameserver 8.8.8.8
      > EOF
      
  2. 필요한 패키지를 설치해주자 (Master, Worker 노드 모두 적용)
    • 수동으로 변경해주는 부분을 ※주의※하며 Ctrl + C, V를 방지합시다!
      [root@KM-k8s ~]# yum install epel-release vim bash-comple* docker -y
      [root@KM-k8s ~]# Kuver="<Vers Int>"						## K8s 버전을 변수로 등록(Ctrl + C, V 주의)
      [root@KM-k8s ~]# kube_pkg="packages.cloud.google.com/yum/doc"		## Repo 변수 등록
      [root@KM-k8s ~]# cat << EOF > /etc/yum.repos.d/kubernetes.repo		## Repo 등록
      > [kubernetes]
      > name=Kubernetes
      > baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
      > enabled=1
      > gpgcheck=0
      > repo_gpgcheck=0
      > gpgkey=https://${kube_pkg}/yum-key.gpg https://${kube_pkg}/rpm-package-key.gpg
      > EOF
      [root@KM-k8s ~]# yum install kubectl-$Kuver kubelet-$Kuver kubeadm-$Kuver	## K8s 설치
      [root@KM-k8s ~]# systemctl enable --now docker				## docker 시작 데몬 등록
      [root@KM-k8s ~]# systemctl enable --now kubelet				## kubelet 시작 데몬 등록
      
  3. K8s에 적합환 환경 만들어 주자 (Master, Worker 노드 모두 적용)
    • 수동으로 변경해주는 부분을 ※주의※하며 Ctrl + C, V를 방지합시다!
      [root@KM-k8s ~]# vim /etc/fstab						## 파일 수정
      /dev/swap ==> #/dev/swap							## swap 파티션 행 주석처리
      [root@KM-k8s ~]# swapoff -a
      [root@KM-k8s ~]# setenforce 0							## SELinux 컨텍스트 강제 모드 해제
      [root@KM-k8s ~]# vim /etc/selinux/config					## 파일 내용 변경
      SELINUX=enforcing ==> SELINUX=permissive					## 허용 모드로 변경
      [root@KM-k8s ~]# cat << EOF > /etc/sysctl.d/k8s.conf				## br_netfilter 커널 변수 값 변경
      > net.bridge.bridge-nf-call-ip6tables = 1
      > net.bridge.bridge-nf-call-iptables = 1
      > EOF
      [root@KM-k8s ~]# modprobe br_netfilter					## netfilter 커널 모듈 적재
      
  4. K8s Cluster Master 구성을 위한 설정을 해보자 (Master 노드만 적용)
    • 아래 세부 옵션들의 의미는 생략하겠습니다. 구글링을 통한 스터디를 하는것이 더 도움이 될것이라 생각합니다.
    • CNI 파일은 세부적으로 설정할 부분이 많아 내용을 다루지는 않겠습니다.
      ※ 필자가 적용한 CNI 파일이 필요하신분은 메일 또는 연락 주시면 공유드리겠습니다. ※
    • 수동으로 변경해주는 부분을 ※주의※하며 Ctrl + C, V를 방지합시다!
      [root@KM-k8s ~]# kubeadm init --token <임의 token값>.<임의 token값> \
      --token-ttl <ttl값> --pod-network-cidr=172.16.0.0/16 \
      --apiserver-advertise-address=<Master IP>					## K8s Master 초기 설정 및 API 서버 등록
      [root@KM-k8s ~]# mkdir -p $HOME/.kube						## 디렉토리 생성
      [root@KM-k8s ~]# cp -ari /etc/kubernetes/admin.conf $HOME/.kube/config	## kubectl 권한 가져오기
      [root@KM-k8s ~]# chown $(id -u):$(id -g) $HOME/.kube/config			## kubectl 소유권 설정
      [root@KM-k8s ~]# kubectl apply -f <CNI File>					## Calico CNI 파일 적용
      
  5. K8s Cluster Worker 를 Master에 연결을 해보자 (Worker 노드들만 적용)
    • 수동으로 변경해주는 부분을 ※주의※하며 Ctrl + C, V를 방지합시다!
      [root@KW$n-k8s ~]# kubeadm join --token <임의 token값>.<임의 token값> \
      --discovery-token-unsafe-skip-ca-verification <API IP>:<API port>		## Master에 token만을 이용한 인증
      
  6. K8s Cluster 구축 완료에 대한 점검
    • 구축이 완료된 상태에 대해 Running으로 정상인지 확인 합니다.
      [root@KM-k8s ~]# kubectl get nodes						## Master와 Worker 노드 들의 연결 상태 확인
      NAME     STATUS     ROLES    AGE   VERSION
      KM-k8s    Ready      master   21h   v1.18.4					## Master  노드 정상 동작중
      KW1-k8s   Ready      <none>   21h   v1.18.4					## Worker1 노드 정상 동작중
      KW2-k8s   NotReady   <none>   21h   v1.18.4					## Worker2 노드 미 동작중
      KW3-k8s   NotReady   <none>   21h   v1.18.4					## Worker3 노드 미 동작중
      

4. 구축된 K8s 환경 확인하기

  • K8s Cluster 환경을 구축했다면 어떤 요소들이 자리잡고 있는지 확인을 해야합니다. 이러한 구성요소를 모르고 지나친다면 나중 혹은 가까운 미래에 제대로 사용 할 수 없겠죠? ㅎㅎ 위에서 다뤘던 구축 환경에 대해서 간단하게 살펴볼 예정이니 부담갖지 않으시고 잘 따라와 주셨으면 좋겠습니다! 그럼 확인해볼까요~?
  1. Network Interface 살펴보자
    • Master 노드에 접속하여 ifconfig 혹은 ip address 명령어를 입력하면
      아래와 같이 새로운 가상 Interface가 생성된걸 보실 수 있습니다.
    • 이 가상 Interface는 Worker 노드와 Master 노드간 통신을 위한 Interface 입니다.
      하지만 이 모든 가상 Interface가 K8s에만 사용하는 것은 아닙니다. Docker와 Container4를 위한 통신 Interface로도 쓰입니다.
      [root@KM-k8s ~]# ip address
      ... 불필요 부분 생략 ...
      4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
      5: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000
      6: cali3cf5a014911@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
      7: calif54aafbee3a@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
      8: cali904b28dd793@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
      

이 글을 마치며

  • 이렇게 하여 K8s Cluster MasterWorker 노드에 대해서 다뤄보았습니다. 약간 속성으로 달린 느낌도 있긴 하지만 구글링을 통해 개념이 잘 자리잡을 수 있도록 하다보니 그랬던것 같습니다. 작성하고 있는 필자도 작성을 하면서 다시 한번 복습을 하게 되는 시간이 되어 도움이 된것같습니다. ㅎㅎ

  • 다음 시간에는 K8s로 마이크로 서비스를 만들고 배포하는 과정에 대해서 다루도록 하겠습니다.
    긴글 읽고 따라와 주셔서 감사합니다. 다음 시간에 뵙겠습니다!


참조 링크 및 각주

Address

대한민국(Republic of Korea, KOR), 경기도(Gyeonggi-do) 부천(bucheon)