실습 환경 구조

- 위와 같은 환경을 구축하고, 이용하자
- 실제 작업하는 것은 Gitlab-Runner 이다. 우리는 Gitlab-Runner 에게 권한을 주어야 한다. Gitlab-Runner 는 홈디렉토리를 가지고 있다. 따라서 사용자처럼 동작하므로 권한을 주어야 한다
- Gitlab-Runner 가 실행하는 명령을 Ansible 에게 전달하여, Ansible 이 각 Node 에 명령을 전달해주는 구조이다
Gitlab external_url 설정
docker 와 docker-compose 가 설치된 이유는 Gitlab 을 docker-compose 로 설치하기 때문이다
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
apt-get install -y gitlab-runner
apt-add-repository ppa:ansible/ansible
apt-get install -y ansible
apt-get update
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:~
{
"insecure-registries" : [ "192.168.8.100:5000" ]
}
- docker 에서 사설 저장소에 대해 인증을 필요로 하지 않게 설정하자
systemctl restart docker
gitlab-runner:x:993:992:GitLab Runner:/home/gitlab-runner:/bin/bash
- Gitlab-Runner 는 Agent 로 작동하므로, 설치시 기본적으로 bin/bash 를 사용하게 설정되있다
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:~
root@gitlab:~
root@gitlab:~
root@gitlab:~
root@gitlab:~
root@gitlab:~
- 만약 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
root@master:~/.ssh
- authorized_keys 에 Public Key 를 붙여넣고, 권한을 600 으로 설정하자
SSH Public Key login 설정
Master Node & Worker Node 가 SSH-SERVER 입장이고, Gitlab Node 가 SSH-CLIENT 입장이다
- 아래 작업은 Master Node & Worker Node 에서 한다
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 권한을 호출하여 사용 가능하도록 해주어야 한다
gitlab-runner ALL=NOPASSWD: ALL
- 위의 설정을 추가하여 Shell 명령시 Password 를 요구하지 않게 하자
Gitlab ssh-config 설정
- Gitlab-runner Node 에서 설정한다
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:~
gitlab-runner@gitlab:/root$ cd
gitlab-runner@gitlab:~$ ssh-keyscan 192.168.8.100 >> ~/.ssh/known_hosts
gitlab-runner@gitlab:~$ ssh-keyscan 192.168.8.101 >> ~/.ssh/known_hosts
- 계정을 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
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 명령어를 실행할 수 없다