쿠버네티스 전문가 양성과정 12주차 1일(3/6)

최수환·2023년 3월 6일
0

Kubernetes

목록 보기
51/75
post-thumbnail

Devops

  • 데브옵스는 소프트웨어의 개발(Development)과 운영(Operations)의 합성어로서, 소프트웨어 개발자와 정보기술 전문가 간의 소통, 협업 및 통합을 강조하는 개발 환경이나 문화를 말한다
  • 개발자가 개발을 잘할수 있도록 도와준다.
  • 고객은 내부/외부 개발자가 된다.

Devops와 관련 기술 : 구성 요소 및 배치 크기를 세분화, 상향식 유연한 방법

  • Agile
  • ArchOps
  • CI/CD
  • Site-reliability
  • engineering DevSecOps

  • 기획 , 개발 , 검증 , 패키징 , 릴리즈 , 구성 , 모니터링 , 버전 관리
  • 시작과 끝이 있는 것이 아닌 계속적인 순환이 존재한다

Cloud Native

  • 현대적이고 동적인 환경에서 확장 가능한 애플리케이션을 개발하고 실행할 수 있게 해준다.
  • 컨테이너, 서비스 메쉬, 마이크로 서비스, 불변 인프라, 선언형 API가 이러한 접근 방식의 예시다.
  • 이러한 기술들은 느슨하게 결합된 시스템을 가능하게 해주고, 자동화 기능을 함께 사용하면 최소한의 노력으로 자주, 예측 가능하게 수행할 수 있다.

CI/CD

소프트웨어 엔지니어링에서 CI/CD는 CI(지속적 통합)와 CD(지속적 전달/배포)의 결합된 방식

  • CI (Continuous Integration)
    • 작은 변경 사항을 메인 브렌치로 자주 병합
    • Package, Build, Test
  • CD (Continuous Delivery)
    • 소프트웨어를 빠른 속도와 빈도로 짧은 주기로 생산하여 언제든지 신뢰할 수 있는 소프트웨어를 출시할 수 있도록 하고 배포를 결정할 때 간단하고 반복 가능한 배포 프로세스를 사용
    • Docker 이미지 생성
  • CD (Continuous Deployment)
    • 소프트웨어 기능이 완전히 자동으로 롤아웃
    • K8s를 통해 리소스로 배포

Jenkins

  • 젠킨스는 오픈 소스 자동화 서버(CI/CD)
  • 매우 오래된 프로젝트
  • 이전에는 Hudson 이라는 이름이였다.
  • java 기반이다.
  • CI를 위한 프로젝트이며, 수많은 플러그인을 가지기 때문에 CI의 기능을 확장시킬 수 있을 뿐더러 CD의 기능을 가질 수 있기 때문에 오래되었음에도 현재도 가장 많이 사용되는 프로젝트이다
  • DSL (Domain-Specific Language)
    • Scripted Pipeline : 스크립트 파이프라인 , Groovy
    • Declarative Pipeline : 선언적 / 서술적 파이프라인

📒 jenkins 홈페이지

< 젠킨스 시스템 >

< 젠킨스 글로벌 도구 >

< 젠킨스 플러그인 >

Linux에 Jenkins 설치

  • AWS에서 보안그룹 생성
  • 키페어 생성(pem키)
  • 생성한 보안그룹과 키페어를 적용한 인스턴스 생성
    • ubuntu 20.04 , 스토리지 40G
chmod 600 sshkey.pem
ssh -i sshkey.pem ubuntu@publicIP
sudo hostnamectl set-hostname mybuild
exec bash

📒 jenkins설치 참조

sudo apt update
sudo apt search openjdk-11-jdk
sudo apt install openjdk-11-jdk
# java11설치
  • jenkins는 java기반이기 때문에 반드시 java를 설치해야 한다.

  • jenkins설치
systemctl status jenkins 

브라우저에서 인스턴스 퍼블릭IP:8080으로 jenkins접속

sudo cat /var/lib/jenkins/secrets/initialAdminPassword
# 암호보기 

Install suggested plugins 선택 후 설치

📒 jenkins의 플러그인 검색

계정설정 : 이름 / PASSWORD

Jenkins URL

  • 도메인을 갖고있다면 해당 도메인 사용
  • 앞에 로드밸런서가 있다면 해당 주소를 사용
  • 현재는 인스턴스의 주소를 사용

Jenkins 활용

좌측 새로운 item클릭

  • project명 입력
  • project종류 입력 (현재는 프리스타일, 이후에는 주로 pipeline선택 )
  • 소스코드 관리 선택
  • git선택
  • git repository 주소 등록
  • master에서 main으로 변경

  • 테스트 명령어 입력
  • 지금 빌드 클릭
sudo -i -u jenkins 
#젠킨스 사용자 전환 
cd workspace/프로젝트명 
#빌드한 프로젝트가 존재하는 것을 확인 

위에서 등록한 강사님의 현재시점의 repo를 fork를 이용해서 나의 저장소로 가져온다 (추후 repo를 수정해야할 때 나의 repo가 아니면 수정권한이 없기 때문이다)

  • jenkins에서 구성을 클릭해 나의 저장소로 가져온 repo의 주소로 수정

mvn패키지를 이용해 아티펙트를 얻어낸다

sudo apt install maven # 쉘에 설치 

mvn clean package 
# 구성에서 build step에 입력 
  • jenkins사용자에서 workspace/프로젝트명에 접속해보면 target이 생성되어 있다.
  • target에서 hello-world.war파일을 얻을 수 있다.

위에서 명령어를 통해 mvn을 실행시켜 아티펙트를 얻어냈다면 이번에는 jenkins의 강력한 장점인 플러그인을 통해 프로젝트를 생성해 mvn을 실행한다.

대시보드 jenkins관리에서 플러그인 관리 접속

  • Available plugins에서 maven검색 후 integration설치

대시보드 jenkins관리에서 Global Tool configuration에서 아래와 같이 java , maven추가

which mvn
ls -l 심벌릭 링크 경로
which java
ls -l 심벌릭 링크 경로
  • java와 maven을 실행시킬 home디렉터리 경로는 which와 ls -l을 통해 심벌릭 링크 경로를 계속 따라가다보면 알 수 있다.

새로운 maven_project이름으로 프로젝트 생성 (프리스타일이 아닌 Maven Project 선택)

  • git repo등록, main변경
  • 빌드 항목에서 goal에 clean package입력

프로젝트를 빌드하면 마찬가지로 target이 생성되고 hello-world.war파일을 얻을 수 있다.

war파일을 서버에 배포

tomcat 서버 역할을 할 인스턴스 생성

  • 8G스토리지, 20.04 Ubuntu, t3.small

새로운 쉘을 열고 ssh로 해당 인스턴스 접속

sudo apt update && sudo apt install tomcat9 -y 
systemctl status tomcat9
# tomcat설치 

# jenkins서버 쉘에서 
ssh-keygen
cat .ssh/id_rsa.pub

vi .ssh/authorized_keys # tomcat서버 쉘에서 
  • jenkins에서 생성한 target디렉터리에 war파일을 tomcat서버의 /var/lib/tomcat9/webapps에 전달해야한다.
  • jenkins서버, tomcat서버 둘다 같은 키를 통해 접속했기 때문에 tomcat 서버의 ~/.ssh/authorized_keys에 jenkins의 ssh키를 등록해준다.
  • 키를 등록함으로써 jenkins에서 tomcat으로 ssh접속이 가능해진다.
  • 통신이 연결되었기 때문에 scp로 파일을 전달할 수 있다.
sudo usermod -aG tomcat $USER
#tomcat쉘에서 tomcat을 사용자 그룹에 추가 

scp /var/lib/jenkins/workspace/maven_project/target/hello-world.war ubuntu@172.31.45.89:/var/lib/tomcat9/webapps
  • tomcat의 프라이빗 ip를 통해 통신
  • 퍼블릭ip도 가능하지만 프라이빗 ip를 통해 scp로 파일을 복사하는 것이 안전

두 서버를 키를 통해 연결한 후, scp과정을 jenkins에 maven_project에서 Post Steps에 Execute shell에 아래와 같이 쉘 스크립트 작성을 통해 수행한다.

scp /var/lib/jenkins/workspace/maven_project/target/hello-world.war ubuntu@172.31.45.89:/var/lib/tomcat9/webapps
  • 하지만 실제로는 빌드가 실패한다.
    -> 모든 작업은 jenkins사용자가 실행한다. 하지만 jenkins 사용자가 tomcat VM에 접속할 권한이 없다.
    -> 따라서 사실 위의 모든 작업은 의미가없는 작업이였다.
sudo -i -u jenkins
ssh-keygen
cat ~/.ssh/id_rsa.pub
# jenkins사용자에 접속
# jenkins에 key를 생성후 publickey를 복사 

vi ~/.ssh/authorized_keys
# tomcat 서버의 같은 ssh디렉터리 authorized_keys 파일에 복사한 pub키를 추가한다.

ssh ubuntu@tomcat서버 프라이빗ip
# jenkins에서 tomcat에 접속이 잘 되는 것을 확인 
  • 이후 다시 위의 maven_project를 빌드한다.
    -> 정상적으로 tomcat서버의 /var/lib/tomcat9/webapps에 war파일이 전달(=scp)되어 ROOT에 의해 실행파일로 풀린것을 볼 수 있다.


-> 브라우저에 tomcat의 퍼블릭ip:8080/hello-world를 입력하면 웹 페이지가 뜨는 것을 알 수 있다.

Node를 이용한 빌드

  • 위의 실습은 모두 jenkins컨트롤러에서 작업한 것이다
  • 컨트롤러에서 작업하는 경우는 최악의 경우이고, 일반적으로는 node에서 작업을 한다.
  • 일반적으로 node10대를 배치해 빌드를 한다.

새로운 jenkins-node 인스턴스 생성

  • 40G스토리지, ubuntu 20.04버전 , t3.small
#ssh로 jenkins-node에 접속 
sudo apt update && sudo apt install openjdk-11-jdk maven -y
#maven과 java 설치
sudo useradd jenkins -d /var/lib/jenkins -m -s /bin/bash
#jenkins 유저 생성 

sudo -i -u jenkins
#jenkins 유저로 접속
mkdir .ssh
vi .ssh/authorized_keys
#jenkins서버의 id_rsa.pub의 내용을 추가 

cat .ssh/id_rsa.pub # jenkins서버 jenkis사용자의 public키 내용 
ssh jenkins@node의 privateIP # 노드로 접속이 잘 되는지 확인 

대시보드 - jenkins관리 - 노드관리 - 신규노드

  • 이름지정

  • executors : 2 # 너무 많으면 cpu사양에 따라 오류 발생

  • 노드의 레이블과 디렉터리 경로 지정

  • 접속 방법 정의

    -> ssh접속, 노드의 privateIP입력

  • ssh접속 인증 방식 정의

  • key등록

    cat .ssh/id_rsa # jenkins서버의 jenkins사용자 프라이빗 키 복사 

    -> 사용자 이름 등록 및 key항목에 복사한 내용 삽입

  • 노드가 생성된 것을 확인

  • 생성한 노드 이외에 기본적을 존재하는 built-in node는 다른 노드에 장애가 발생했을 때 controller가 실행시키는 최후의 노드라고 생각하면 된다.
  • executor는 1개, 레이블과 Usage를 설정한다.

이후에 maven_project를 빌드해보면 에러가 발생한다. maven_project가 node에게 시켜서 mvn clean package를 실행시키고 target에 있는 war파일을 tomcat서버의 /var/lib/tomcat9/webapps에 scp를 수행해야하지만 tomcat서버의 authorized_keys에 노드의 키는 등록되어있지 않다.
따라서 node의 jenkins사용자의 publickey를 등록해주어야 한다

ssh-keygen # 노드에서 키 생성 
cat id_rsa.pub # 퍼블릭 키 내용 복사 

vi ~/.ssh/authorized_keys # tomcat의 authorized_keys에 추가 
ssh ubuntu@tomcat프라이빗ip
# 노드에서 접속이 잘 되는지 확인 
  • 노드에서 키를 생성할때는 위의 실습에서와 마찬가지로 jenkins가 작업을 하는 주체이므로 ubuntu사용자에서 키를 생성하면 안되고 반드시 jenkins사용자로 전환 후에 key를 생성하여 key의 소유자가 jenkins가 되게 만든다
  • node와 tomcat을 연결한 후 빌드를 해보면 처음에는 실패하게되는데 이것은 처음 접속할때는 known_hosts파일에 등록되지 않았기 때문이고 , 다시 빌드해보면 이전에 접속을 통해 known_hosts에 등록되었기 때문에 성공적으로 빌드가 된다.

    -> node의 executor 두개중 하나가 작업을 수행하고 있는 것을 확인

jenkins cronjob

프로젝트의 구성 - 빌드유발항목에서 cronjob을 설정할 수 있다.

  • 예시로 shedule은 1분간격으로 진행되게 설정
    -> 1분간격으로 등록한 git repo에 변경사항( =새로운 commit)이 존재하는지 자동으로 체크한다.
    -> 변경사항이 없다면 아무작업도 안하고, 새로운 commit이 올라오면 그에 맞게 자동으로 빌드한다.

쉘에 home디렉터리에 적당한 git디렉터리(=Working Dir)를 생성한다.

git clone git@github.com:suhwan12/abc.git
# 디렉터리에서 clone으로 원하는 remote repo를 가져온다
  • 이전에 ssh인증을 등록해놨기 때문에 해당 remote repo의 ssh주소로 clone한다
vi src/main/webapp/WEB-INF/views/index.jsp
  • 브라우저에 tomcat퍼블릭IP:8080/hello-world를 입력했을때 보이는 화면을 구성하는 html코드에 버전을 아래와 같이 바꾸어준다
git add . 
git commit -m 'Git version 1.0.3'
git push 
# remote repo에 새로운 commit을 push한다.

  • remote repo(= Github)에 새로운 commit이 push된 것을 확인

  • Git Polling Log를 확인해보면 매분마다 등록한 git 주소에 새로운 commit이 생겼는지 확인한다.
  • 새로운 commit이 생기고 1분뒤에 'change found'라는 로그가 출력되면서 좌측하단에 보이는 것처럼 자동으로 새로운 빌드를 하게된다.

  • 실제로 브라우저에 주소를 다시 입력해보면 원래 버전이 1.0.0이였는데 1.0.3으로 바뀐것을 확인
profile
성실하게 열심히!

0개의 댓글