devops/minikube

7. [Ubuntu] 서비스 등록 (systemd)

꼬락이 2024. 11. 19. 22:08

EC2에 Minikube를 올렸기 때문에 인스턴스를 stop하게 되면 관련 서비스들도 다 멈추게 된다.  minikube와 port-forwarding도 마찬가지다. 그래서 재부팅을 하게되면

1. minikube start
2. kubectl rollout restart ~
3. sudo iptables ~

 

이런 명령어를 입력해야하는데 이거 매번 하는게 영 귀찮은게 아니다. 그래서 좀 수고롭지만 ubuntu가 켜지거나 재부팅될때마다 실행되는 명령어로 바꾸도록 하겠다.

 

linux의 service를 이용하면  쉽게 해결할 수 있다.

일단 간단한 스크립트를 만들도록 하자.

cat <<EOF>> /home/ubuntu/startup.sh
#!/bin/bash
date >> /home/ubuntu/date_log.txt
exit 0
EOF

 

 

/etc/systemd/system/date_test.service라는 파일을 아래처럼 만든다. 이렇게 되면 서비스 이름은 date_test가 된다.

[Unit]
Description=Test Service
After=multi-user.target
StartLimitIntervalSec=1

[Service]
Type=simple
User=ubuntu
Group=sudo
WorkingDirectory=/home/ubuntu
ExecStart=/bin/bash startup.sh
Restart=on-failure
Restart=alwayes
RestartSec=1

[Install]
WantedBy=multi-user.target
  • User, Group / WorkingDirectory
    • [옵션] 프로그램 실행 유저 / 프로그램 작업 디렉터리
    • ExecStart 앞에 위치해야 설정이 적용됨
  • Restart=on-failure: 서비스 종료 시 자동 재시작
  • 필요 시 'Environment'로 환경변수를 설정할 수 있음
  1. 서비스 등록
# 서버 재부팅 시에 서비스 자동 시작
$ sudo systemctl daemon-reload
$ sudo systemctl enable date_test.service

# 서비스 시작
$ sudo systemctl start date_test.service
$ sudo rm -rf /home/ubuntu/date_log.txt
$ sudo reboot
cat /home/ubuntu/date_log.txt
# Mon Nov 18 00:51:46 UTC 2024
# Mon Nov 18 00:56:37 UTC 2024

아주 잘 작동하는걸 볼 수있다.  이제 스크립트를 변경해서 사용하도록 하자. 나는 자동화를 하기 위해 make를 이용하겠다.

$ sudo apt-get -y install make
$ cat <<EOF>> Makefile
.PHONY: up
up:
        bash ./.start.sh

.PHONY: down
down:
        bash ./.down.sh
EOF

 

이제 minikube와 teleport 서비스를 재시작하는 스크립틀 짜기만하면된다. SERVICEMESH_PORT, HEALTHCHECK_PORT를 본인에 맞게 수정하면  크게 바뀔건 없을것으로 보인다.

$ cat << EOF > .start.sh
#!/bin/bash

echo "telpoert service start!!"
sudo systemctl start teleport
sudo systemctl enable teleport

# sudo iptables -t nat -D PREROUTING {조회한 포워딩 내용 id 번호}
# sudo iptables -t nat -D PREROUTING 2

# sudo iptables -t nat -L --line-numbers
export PROFILE=camping
export SERVICEMESH_PORT=31031
export HEALTHCHECK_PORT=31021
export NETWORK_INTERFACE=ens5
export MINIKUBE_IP=192.168.49.2

minikube profile list
minikube start -p ${PROFILE}

echo "================================"
echo "[INFO] port-forwarding..."

# healthcheck portforwarding
sudo iptables -A PREROUTING -t nat -i \${NETWORK_INTERFACE} -p tcp --dport \${HEALTHCHECK_PORT} -j DNAT --to \${MINIKUBE_IP}:\${HEALTHCHECK_PORT}
sudo iptables -A FORWARD -p tcp -d \${MINIKUBE_IP} --dport \${HEALTHCHECK_PORT} -j ACCEPT

# servicemesh portforwarding
sudo iptables -A PREROUTING -t nat -i \${NETWORK_INTERFACE} -p tcp --dport \${SERVICEMESH_PORT} -j DNAT --to \${MINIKUBE_IP}:\${SERVICEMESH_PORT}
sudo iptables -A FORWARD -p tcp -d \${MINIKUBE_IP} --dport \${SERVICEMESH_PORT} -j ACCEPT

echo "[INFO] port-forwarding... Done"

# minikube service restart
echo "[INFO] minikube service restart..."

kubectl rollout restart deployments -n istio-system
kubectl rollout restart deployments -n metallb-system
kubectl rollout restart daemonsets -n metallb-system
echo "[INFO] minikube service restart... Done"
EOF
$ cat <<EOF > .down.sh
#!/bin/bash
export PROFILE=camping

minikube stop -p ${PROFILE}
EOF

이렇게 파일을 만들어주고 아래 명령어를 실행해준다.

$ sudo su
$ cat <<EOF > /etc/systemd/system/camping.service
[Unit]
Description=minikube start
After=multi-user.target

[Service]
Type=simple
User=ubuntu
Group=sudo
WorkingDirectory=/home/ubuntu
ExecStart=/usr/bin/make up
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable camping.service
reboot

 

 

다시 접속하고 아래 명령어로 확인하면 service가 시작되는 것을 볼 수 있다.

$ sudo systemctl status camping
● camping.service - minikube start
     Loaded: loaded (/etc/systemd/system/camping.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-11-18 01:38:42 UTC; 4s ago
   Main PID: 1030 (make)
      Tasks: 10 (limit: 18714)
     Memory: 188.3M
     CGroup: /system.slice/camping.service
             ├─1030 /usr/bin/make up
             ├─1033 bash ./.start.sh
             └─1095 minikube start -p camping

Nov 18 01:38:43 ip-172-31-15-127 make[1064]: | Profile | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes | Activ>
Nov 18 01:38:43 ip-172-31-15-127 make[1064]: |---------|-----------|---------|--------------|------|---------|---------|-------|------>
Nov 18 01:38:43 ip-172-31-15-127 make[1064]: | camping | docker    | docker  | 192.168.49.2 | 8443 | v1.31.0 | Stopped |     3 |      >
Nov 18 01:38:43 ip-172-31-15-127 make[1064]: |---------|-----------|---------|--------------|------|---------|---------|-------|------>
Nov 18 01:38:43 ip-172-31-15-127 make[1095]: * [camping] minikube v1.34.0 on Ubuntu 20.04
Nov 18 01:38:43 ip-172-31-15-127 make[1095]:   - MINIKUBE_IP=192.168.49.2
Nov 18 01:38:44 ip-172-31-15-127 make[1095]: * Using the docker driver based on existing profile
Nov 18 01:38:44 ip-172-31-15-127 make[1095]: * Starting "camping" primary control-plane node in "camping" cluster
Nov 18 01:38:44 ip-172-31-15-127 make[1095]: * Pulling base image v0.0.45 ...
Nov 18 01:38:44 ip-172-31-15-127 make[1095]: * Restarting existing docker container for "camping" ...

 

이제 귀찮게 ec2 인스턴스로 들어가지 않아도 된다.