[F-Lab 모각코 챌린지 45일차] 젠킨스로 ssh 접속, 도커 컨테이너 띄우기

부추·2023년 7월 15일
0

F-Lab 모각코 챌린지

목록 보기
45/66

1) 젠킨스 띄우기

GCP 인스턴스 만들기를 클릭합니다.
대부분 설정은 default로 해줍니다. 인스턴스 이름은 jenkins-instance-1으로 했고, e2-medium 머신으로 설정했습니다. CentOS7을 사용했습니다. 사실 원래 e2-micro로 설정했는데, start jenkins에서 timeout 오류가 자꾸 떴습니다ㅠㅠ. 메모리를 2GB 가까이 잡아먹는 작업이지만 e2-micro는 메모리가 1GB였기 때문..

HTTP, HTTPS 트래픽(각각 80, 443번 포트)을 허용해주고 만들기를 클릭합니다.
대충.. 월 4만원 정도의 VM 인스턴스가 만들어졌다는 뜻입니당. 어차피 젠킨스 배포 실험만 하고 바로 끌것이고, 30만원 정도의 크레딧을 가입시 받았으므로 쿨하게 사용합니당.


VM 인스턴스가 잘 만들어졌으면 아래와 같이 방금 만든 인스턴스가 뜰텐데, SSH연결을 위해 해당 버튼을 클릭합니당. 그러면 원격 서버 컴퓨터를 제어할 수 있는 cmd 명령어 창이 뜨게됩니다.

이제, 명령어 창에서 yum으로 기본적인 모듈들을 다운받겠습니다. 다운로드 명령어를 순서대로 입력합니다!

sudo yum install wget
sudo yum install maven
sudo yum install git
sudo yum install docker

그리고 또 추가로, jenkins 최신버전은 java 11 미만 버전은 지원하지 않으므로 jdk 11을 따로 다운받아야됩니다. install maven을 할 적에 java 1.8이 다운받아졌을텐데 ㅜㅜ 다시 받아야합니다. 다음 명령어로 자바 11을 다운받읍시다..

sudo yum install java-11-openjdk-devel.x86_64

그리고 현재 default 버전일 1.8을 11로 바꾸겠습니다. 아래 명령어를 입력!

sudo alternatives --config java

그 뒤, 우리가 원하는 java 11버전에 맞는 selection을 합니다.
위 사진에 나와있는 것처럼, 저의 경우 2번이었기 때문에.. 2번을 택했습니다.

$ java --version

명령어를 통해 자바 11이 다운받아졌다면! 완료입니다.

이젠 jenkins 차례입니다. 아래 명령어를 쳐서 jenkins를 사용할 때의 key를 다운받습니다.

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

이것도 삽질했는데 ㅜㅜ 23년 4월 이후 배포된 새로운 젠킨스의 경우 키가 변경되었다고 해서 새로 다운받는 방법을 찾았습니다..

그리고 yum을 통해 이제 진짜로! 젠킨스를 VM에 다운받고 실행해보겠습니다.

sudo yum install jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins

아까 말했듯.. 두번째 줄에서 e2-micro 컴퓨터를 쓰면 한 5분 멈췄다 time out 에러가 뜹니다 그러니 e2-medium을 꼭 쓰시길ㅜ.ㅜ 마지막줄의 jenkins status를 확인하는 명령어를 입력했을 때 젠킨스가 잘 실행이 되면 아래와 같이 초록색 불이 예쁘게 뜹니다..


2) 젠킨스 접속

이제 젠킨스 인스턴스에 접속해봅시다. systemctl start jenkins를 한 뒤 젠킨스가 백그라운드에서 실행되면, 기본적으로 8080포트를 사용합니다. 저희가 최초에 jenkins 인스턴스를 만들 때, 80번과 443번 포트만을 방화벽으로 허용했기 때문에 8080번 포트도 추가로 열어주는 작업이 필요합니다.

방화벽 규칙 설정을 클릭, "방화벽 규칙 만들기"에 들어갑니다. 이름과 설명은 대충 jenkins-web으로 만들고, "수신 트래픽 방향"에 "Allow", 소스 IP에는 0.0.0.0/0, 지정된 프로토콜 및 포트에서 tcp 8080번만을 허용하는 설정을 합니다.

만들기를 누르면, 방금 설정한 방화벽이 뜹니다.
jenkins-web을 확인해주세용.

이제 jenkins 인스턴스 외부 IP의 8080포트로 접속합니당.
위 창이 뜨면 성공!

이제 관리자 비밀번호를 입력해야하는데요, jenkins를 설치할 적에 이미 그쪽에서 지정한 path에 비밀번호를 생성해놨습니다. jenkins를 띄운 인스턴스 컴퓨터에서 다음 명령어를 쳐서 비밀번호를 확인합시당.

$ sudo cat sudo cat /var/lib/jenkins/secrets/initialAdminPassword

나온 결과를 브라우저 창에 복붙하면?로그인이 잘 되네요. 당연히 suggested plugins을 선택합니다. 한 2-3분 기다리면 플러그인들이 다운받아집니다.

그 뒤 회원가입? 아무튼 기본 정보를 입력하는 창과 jenkins URL을 설정하는 창이 차례로 뜨는데, 전자는 원하는 정보를 입력하면 되고 후자는 딱히 건들지 않고 그대로 "Save and Finish"했습니다.
이자식 보려고.. 개고생을.

이제 화면상의 좌측에 있는 Jenkins 관리 > 플러그인 관리 > Available Plugins를 클릭한 뒤, "Publish Over SSH" 플러그인을 다운받겠습니당다. 얘는 플러그인 이름 그대로, 특정 서버에 SSH로 접속하여 일련의 커맨드를 입력하는 기능을 합니다.다운 성공!!


3) 젠킨스 보안 설정

Jenkins를 왜 사용하냐? 서버 프로그램이 설치된 worker instance에 젠킨스가 SSH로 접속해서, 우리가 push한 도커 이미지를 pull받고 워커노드 하나하나에 컨테이너를 설치하기 위함입니다. 그러기 위해 워커 노드에 오직 jenkins 인스턴스만 접속할 수 있도록 보안 설정을 할 필요가 있는데요.

이 때 비대칭키 암호화 방식이 이용됩니다. jenkins에 맞는 개인키로 암호화하면, jenkins의 공개 키로 복호화 했을 때 해당 명령이 jenkins로부터 왔다는 "전자 서명"이 가능합니다. 결국, 이 과정을 위해 워커 노드들에 jenkins의 공개 키를 심어주는 과정이 필요한 것입니다.

jenkins 인스턴스의 ssh 명령어 창에서 아래 명령어를 입력해 공개키-개인키 쌍을 생성합니다.

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa

RSA 알고리즘을 이용한 비대칭키 쌍을 만들어라~ 하는 명령어입니다. 그 뒤 엔터를 두 번 쳐서 추가 설정은 생략합니다. 아마 .ssh 디렉토리에 키 쌍이 생성되었을 것입니다. 해당 디렉토리로 이동해서 생성된 비대칭키 쌍을 확인해봅시다.
id_rsa가 개인키, id_ras.pub가 공개키입니다. 대충 cat 명령어를 사용해서 내용을 확인해보면 정체를 알 수 없는 문자열이 쫙 나열되어있을 것입니다.


이제 jenkins의 배포 대상인 워커 인스턴스를 만듭니다. 이번에야말로 e2-micro 옵션을 선택했습니다 ㅋㅋ. 인스턴스 이름은 worker-instance-1입니다.
역시 해당 인스턴스에 SSH로 접속합니당.

원래는 아래 경로의 파일에 접속해서, SSH로 접속할 수 있는 서버의 공개키를 저장하는 과정이 필요합니다. 해당 공개키에 맞는 비밀키를 가진 서버의 접속만을 허용합니다~ 정도의 표시로 이해합시다.

$ vi ~/.ssh/authorized_keys

만약 GCP가 아니었다면, 위 경로의 파일에 방금 생성한 id_rsa의 공개 키 문자열을 그대로 복붙하여 추가하면 됩니다. 그러나 GCP에서는 구글 자체적으로 SSH 접속 가능 공개키를 관리하고 있었고.. 그것 때문에 또 삽질을 해버렸습니다ㅜ.. worker instance에 SSH로 접속 가능한 서버를 추가하기 위해, GCP 콘솔 창의 "메타데이터"를 클릭합니다.
그리고 "SSH 키" 항목에, 아까 jenkins 인스턴스에서 생성한 비대칭키 쌍의 공개 키를 등록합니다. id_rsa의 내용을 그대로 복붙하면 됩니다.
그대로 저장!

그 뒤 vi ~/.ssh/authorized_keys를 통해 등록된 공개키를 확인해보면, 방금 우리가 추가한 공개 SSH키가 추가된 것을 확인할 수 있습니당.
하..되다! :wq를 통해 해당 내용을 저장한 뒤, 보안을 위해 ssh 키 파일의 접근 권한을 바꿔줍시다.

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

./ssh 디렉토리는 사용자만 rwx 가능하고, authorized_keys 파일은 사용자만 rw가능하도록 권한을 바꾼 것입니다. 다른 계정으로 워커 노드의 ssh 접근 권한을 바꾸는 것을 막기 위함입니다.


이제 젠킨스 설정입니다. jenkins 인스턴스의 8080포트로 접속해서, Jenkins 관리 > System 에 접속합니다. 스크롤을 쫙쫙 내려서 "Publis over SSH"항목의 Key란에, jenkins 인스턴스에서 생성한 개인 키를 복붙해서 넣어줄겁니다.
해당 키는 jenkins가 특정IP 서버로 SSH 접속을 할 때(여기선 worker instance) 전자 서명으로 사용할 개인 키입니다. 그리고 그 밑에! Publish over SSH로 접속할 서버를 등록합니다.
이름은 뭐 적당한 worker-instance-1 정도로. Hostname란은 접속할 서버의 IP 주소인데, ssh 명령어를 입력할 worker node의 내부 IP주소를 넣었습니다(아래 참고). Username에는 접속할 id 이름을, Remote Directory는 접속할 서버의 root 디렉토리를 적어주면 됩니다. cd ~로 이동했을 때 pwd 명령어를 통해 얻어진 디렉토리를 입력하면 됩니다.
jenkins와 worker 인스턴스는 같은 네트워크부에 포함되어있기 때문에 내부 IP를 이용해도 상관없습니다! "Test Configuration" 버튼을 눌렀을 때, Success가 뜬다면 jenkins를 통해 SSH 명령어를 보낼 준비가 끝났다고 보면 됩니다.


4) SSH 명령어 설정

이제 실제로 jenkins 인스턴스를 통해 docker 이미지 파일을 받고 실행할 수 있도록 커맨드를 설정해봅시다! 젠킨스 인스턴스 홈(8080 포트)에 접속, '새로운 Item'을 클릭합니다.
일단, Jenkins를 이용한 docker 빌드 체험이 목표이므로 Freestye Project를 선택했습니다.

그리고 스크롤을 쫙쫙 내려서 "빌드 후 조치"란으로 갑니다. "빌드 후 조치 추가"의 Send build artifacts over SSH를 클릭합니다. 아까 3) 과정에서 추가한 worker-instance-1을 선택하고, 오류가 났을 때 로그를 확인하기 위해 Verbose output in console을 체크해줍니다.
그리고 밑의 Transfer Set의 Exec Command 드디어!!! 실제로 실행할 command를 입력합니다. 전날 도커허브에 올린 이미지 파일을 내려받을 수 있도록 하겠습니다.

nohub sudo docker run -p 80:80 buchukim/spring-boot-cpu-bound > dev/null 2>&1 &
  • nohub ~ &는 해당 명령을 백그라운드에서 실행하겠다는 의미를 가집니다.
  • 2>&1은 표준 에러를 표준 출력으로, > dev/null은 표준 출력을 버리라는 의미입니다. 현재 도커의 jar 이미지를 갖고오는 상황에, jenkins 입장에서 시스템이 잘 실행되고 있는지 확인하기 힘들어 (..) 일단 표준에러와 출력을 없앤 상황입니다.

[저장] 클릭!!!!!!!!


진짜 마지막으로, worker instance에서 도커 컨테이너를 받을 준비를 합시다. worker 인스턴스에 들어가, docker를 다운받고 실행합니다.

$ sudo yum install docker
$ sudo systemctl strart docker

끝났습니다. 방금 생성한 아이템으로 들어가서, "지금 빌드"를 클릭합시다.
왼쪽 아래, #4 에 초록불이 뜬게 보이세요? 성공한겁니다.........

worker instance의 80번 포트로 들어가봐요. 그리고 /hash/123 path로 접속해봅시다 ..

(성불)

profile
부추튀김인지 부추전일지 모를 정도로 빠싹한 부추전을 먹을래

0개의 댓글