0부터 시작하는 Jenkins & GitLab 공부 - GitLab Runner 설치 & 환경 설정

Jaehong Lee·2022년 10월 30일
post-thumbnail

실습 환경 구조

  • 위와 같은 환경을 구축하고, 이용하자
  • 실제 작업하는 것은 Gitlab-Runner 이다. 우리는 Gitlab-Runner 에게 권한을 주어야 한다. Gitlab-Runner 는 홈디렉토리를 가지고 있다. 따라서 사용자처럼 동작하므로 권한을 주어야 한다
  • Gitlab-Runner 가 실행하는 명령을 Ansible 에게 전달하여, Ansible 이 각 Node 에 명령을 전달해주는 구조이다

Gitlab external_url 설정

docker 와 docker-compose 가 설치된 이유는 Gitlab 을 docker-compose 로 설치하기 때문이다

# vi /etc/gitlab/gitlab.rb

external_url 'http://192.168.8.199'
  • external_url 을 199 로 바꾸자. 이는 해당 Node 의 Ip 를 199 로 변경했기 때문이다
gitlab-ctl reconfigure
  • 변경 사항을 반영하여 서비스를 재시작한다
  • 기존 설정 사항은 그대로 반영된다

  • 로그인이 되는지 확인하자

Gitlab & Gitlab-Runner

Jenkins 는 Control 과 Agent 로 구성된다. Control 이 명령을 내리면 Agent 가 생성되고, Agent 는 명령 수행 후 Control 에게 보고한 후 삭제된다. Agent 에는 Shell, K8S, Docker 등 여러가지 있지만, Shell 만 사용해도 된다

Gitlab 에서는 Gitlab 이 Control 의 역활을 한다. 이 Gitlab 은 기본적으로 Hosting 만 해주는데, CI / CD 를 할려면 Agent 가 필요하다. 이 Agent 를 Gitlab-Runner 가 해준다


Gitlab-Runner 패키지 설치

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
  • Gitlab-Runner 패키지를 다운 받자
apt-get install -y gitlab-runner
apt-add-repository ppa:ansible/ansible
apt-get install -y ansible
apt-get update
  • Gitlab 과 Ansible 을 설치하자
ansible --version
cat /etc/passwd | grep gitlab-runner
  • 설치 확인

Docker 권한 조정

일반 사용자 처럼 동작하는 Agent 인 Gitlab-Runner 는 내부적으로 Docker 를 이용하여 Image 를 만들고, 이를 Push, Pull 할 수 있어야 한다

chmod 666 /var/run/docker.sock
  • Gitlab Node 에서 Socker 에 대해 권한 조정을 해주자
root@gitlab:~# cat /etc/docker/daemon.json
{
        "insecure-registries" : [ "192.168.8.100:5000" ]
}
  • docker 에서 사설 저장소에 대해 인증을 필요로 하지 않게 설정하자
systemctl restart docker
  • 변경 사항을 반영하자
#cat /etc/passwd | grep gitlab-runner
gitlab-runner:x:993:992:GitLab Runner:/home/gitlab-runner:/bin/bash
  • Gitlab-Runner 는 Agent 로 작동하므로, 설치시 기본적으로 bin/bash 를 사용하게 설정되있다

Ansible Hosts 등록

#vi /etc/ansible/hosts

[master]
192.168.8.100

[worker]
192.168.8.101
  • hosts 에 각 Node 의 주소를 등록하자

Key-Pair 생성 및 적용

ssh-keygen -q -N ""
  • Ansible 사용을 위해 Key-Pair 를 생성하자. -f 옵션을 통해 Key-Pair 파일의 이름을 지정할 수 있지만, 기본 이름만 사용해도 되므로 -f 옵션은 사용하지 않는다
  • 이는 gitlab-runner 계정에서 해야 한다
root@gitlab:~# mkdir /home/gitlab-runner/.ssh
root@gitlab:~# cp ~/.ssh/id_rsa /home/gitlab-runner/.ssh/id_rsa
root@gitlab:~# chmod 700 /home/gitlab-runner/.ssh/
root@gitlab:~# chmod 600 /home/gitlab-runner/.ssh/id_rsa
root@gitlab:~# chown gitlab-runner.gitlab-runner /home/gitlab-runner/.ssh
root@gitlab:~# chown gitlab-runner.gitlab-runner /home/gitlab-runner/.ssh -R
  • 만약 Root 에서 생성을 했다면, 위와 같이 gitlab-runner 디렉토리에 .ssh 디렉토리를 만들고, Private Key 를 옮기면 된다
  • chown 을 통해 .ssh 디렉토리와 .ssh 디렉토리 안에 들어있는 모든 것의 소유주를 gitlab_runner 계정과 그룹으로 설정하였다

Public Key 를 Master Node 와 Worker Node 의 authorized_keys 에 등록하자

  • 아래 작업은 Master Node & Worker Node 에서 한다
mkdir ~/.ssh
chmod 700 ~/.ssh
  • 각 Node 에 .ssh 디렉토리를 만들고, 권한을 조정하자
  • ssh-keygen 을 하면 .ssh 디렉토리가 자동으로 만들어진다. 이때 권한은 자동으로 조정된다
root@master:~/.ssh# vi authorized_keys
root@master:~/.ssh# chmod 600 authorized_keys
  • authorized_keys 에 Public Key 를 붙여넣고, 권한을 600 으로 설정하자

SSH Public Key login 설정

Master Node & Worker Node 가 SSH-SERVER 입장이고, Gitlab Node 가 SSH-CLIENT 입장이다

  • 아래 작업은 Master Node & Worker Node 에서 한다
#vi /etc/ssh/sshd_config
Port 22
PermitRootLogin yes
StrictModes yes
AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
PubkeyAuthentication yes
PasswordAuthentication no
  • master Node 와 worker Node 에 Public Key 로 login 이 가능하게 설정하자
  • 주석을 해제하고 설정하면 된다
systemctl restart ssh
  • 변경 사항을 반영하자

Gitlab-Runner 권한 조정

Gitlab-Runner 가 실행하는 명령은 향후 ansible 등에게 전달할 때 사용해야 한다. Shell 을 실행할 때, 먄약 Password 를 요구한다면, CI 도중 멈춤이 발생할 것이다. 이를 위해 Gitlab-Runner 사용자의 명령은 Password 요구 없이, Root 권한을 호출하여 사용 가능하도록 해주어야 한다

#vi /etc/sudoers
gitlab-runner  ALL=NOPASSWD: ALL # 27 번째 줄에 추가
  • 위의 설정을 추가하여 Shell 명령시 Password 를 요구하지 않게 하자

Gitlab ssh-config 설정

  • Gitlab-runner Node 에서 설정한다
#vi /etc/ssh/ssh_config

Host 192.168.8.0/24
    IdentityFile /home/gitlab-runner/.ssh/id_rsa
  • 위와 같이 192.168.8.0/24 에 SSH 접속할 때는 Key 로 /home/gitlab-runner/.ssh/id_rsa 파일을 사용하게 설정하자

SSH Key-scan

root@gitlab:~# su gitlab-runner
gitlab-runner@gitlab:/root$ cd
gitlab-runner@gitlab:~$ ssh-keyscan 192.168.8.100 >> ~/.ssh/known_hosts
# 192.168.8.100:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.100:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.100:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.100:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.100:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
gitlab-runner@gitlab:~$ ssh-keyscan 192.168.8.101 >> ~/.ssh/known_hosts
# 192.168.8.101:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.101:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.101:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.101:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
# 192.168.8.101:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
  • 계정을 gitlab-runner 로 변경하고, keyscan 을 해서 Server 인증키를 가져오자

Ansible 작동 확인

gitlab-runner@gitlab:~$ ansible all -m ping -u root
192.168.8.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.8.100 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
  • root 로 접속해서 명령 실행이 가능한지 확인하자
gitlab-runner@gitlab:~$ ansible worker -m command -a 'hostname' -u root
192.168.8.101 | CHANGED | rc=0 >>
worker1
gitlab-runner@gitlab:~$ ansible master -m command -a 'hostname' -u root
192.168.8.100 | CHANGED | rc=0 >>
master
  • hostname 명령어도 가능하다
gitlab-runner@gitlab:~$ ansible master -m command -a 'kubectl get node' -u root
192.168.8.100 | FAILED | rc=1 >>
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")non-zero return code
  • 허나 Gitlab Node 는 Kubernetes 인증서를 가지고 있지 않으므로 Kubernetes 명령어를 실행할 수 없다
profile
멋진 엔지니어가 될 때까지

0개의 댓글