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'로 환경변수를 설정할 수 있음
- 서비스 등록
# 서버 재부팅 시에 서비스 자동 시작
$ 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 인스턴스로 들어가지 않아도 된다.