레이블이 systemctl인 게시물을 표시합니다. 모든 게시물 표시
레이블이 systemctl인 게시물을 표시합니다. 모든 게시물 표시

failed to start docker service

# docker 서비스 상태를 보면
sudo systemctl status docker.service

# 다음과 같이 failed 상태다.
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2023-11-07 10:37:32 KST; 3min 6s ago
     Docs: https://docs.docker.com
  Process: 3637521 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 3637521 (code=exited, status=1/FAILURE)
11월 07 10:37:32 ysoftman-dev1 systemd[1]: docker.service: Start request repeated too quickly.
11월 07 10:37:32 ysoftman-dev1 systemd[1]: docker.service: Failed with result 'exit-code'.
11월 07 10:37:32 ysoftman-dev1 systemd[1]: Failed to start Docker Application Container Engine.

# 도커 버전 확인
/usr/bin/dockerd --version
Docker version 24.0.7, build 311b9ff

# 서비스 시작 명령을 수행하면
sudo /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 다음과 같이 daemon.json 에 호스트를 설정이 있는데 -H 옵션으로 또 지정해서 문제가 된다.
# -H, --host list (Daemon socket(s) to connect to)
unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///var/run/docker.sock tcp://0.0.0.0:2375])

# /usr/lib/systemd/system/docker.service 파일을 보면 다음과 같이 -H 옵션이 있다.
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 찾아보니 같은 이슈가 많이 있다.
# 옵션 중복 허용을 하던가 설정 덮어쓰기를 하던가 수정이 필요해 보이는데 개선되지 않고 있다.
# 현재로선 daemon.json hosts 를 사용한다면 -H 옵션을 제거하는 방식으로 해결한다.

# 다음과 같이 -H 옵션은 제거해 daemon.json 설정만 사용하도록 했다.
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

systemd timer 에 etcdctl defrag 등록하기

# prometheus 알람 중 다음과 같은 k8s etcd 디스크 할당관련 에러가 온다
etcd cluster "kube-etcd": database size in use on instance 10.10.10.10:2379 is 48.18% of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.

# 실제 master 노드에 들어가 etcdctl 수행하기
# kube-apiserver 프로세스 옵션 중 인증 부분을 참고하자
ps -ef | grep kube-apiserver 
...
--etcd-cafile=/etc/ssl/etcd/ssl/ca.pem --etcd-certfile=/etc/ssl/etcd/ssl/node-master1.pem --etcd-keyfile=/etc/ssl/etcd/ssl/node-master1-key.pem

# etcdctl 옵션명으로 바꿔서 etcdctl 수행할 수 있다.
# cluster member 를 확인해 보자.
sudo etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-master1.pem --key=/etc/ssl/etcd/ssl/node-master1-key.pem member list

# etcdctl defrag 를 수행한다.
sudo etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-master1.pem --key=/etc/ssl/etcd/ssl/node-master1-key.pem defrag --cluster
Finished defragmenting etcd member[https://10.10.10.10:2379]


#####


# 주기적으로 etcdctl defrag 수행하기
# etcd 서비스 설정이 이미 있다.
# /etc/systemd/system/etcd.service
# etcd 서비스 동작 확인
sudo journalctl -f -u etcd.service

# etcdctl defrag 를 주기적으로 실행하기 위해선 cron 대신 systemd service timer 를 사용하자
# 서비스명.service 와 서비스명.timer 로 파일명에서 서비스명이 같아야 한다.
# etcdctl defrag 서비스 등록
sudo vi /etc/systemd/system/etcdctl-defrag.service
[Unit]
Description=Run etcdctl defrag
# 유닛(이서비스)의 의존성, network.target(네트워크가 연결된 이후여야 한다.)
After=network.target
[Service]
# oneshot: 한번 실행하고 끝나는 서비스
Type=oneshot
Environment="LOG_DIR=/var/log"
Environment="ETCDCTL_API=3"
ExecStart=/usr/local/bin/etcdctl defrag --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-master1.pem --key=/etc/ssl/etcd/ssl/node-master1-key.pem
[Install]
# linux run level 중 3 단계(multi-user.target, 네트워크등이 활성화 되는 시점)일대 동작(서비스로 설치)
WantedBy=multi-user.target

# 매일 1시에 etcdctl-defrag 서비스가 수행할 수 있도록 timer 파일 생성
sudo vi /etc/systemd/system/etcdctl-defrag.timer
[Unit]
Description=Run etcd-defrag.service every day
After=network.target
[Timer]
OnCalendar=*-*-* 01:00:0
[Install]
WantedBy=multi-user.target

# systemctl 로 서비스, 타이머 시작(등록)
sudo systemctl start etcdctl-defrag
sudo systemctl start etcdctl-defrag.timer

# systemctl 동작  확인
sudo systemctl status etcdctl-defrag --no-pager
sudo systemctl status etcdctl-defrag.timer

# 참고

jenkins systemctl failed

# jenkins systemctl 상태를 확인하면 Failed 로 나온다.
sudo systemctl status jenkins -n 30 -l

# jenkins 서비스(데몬) 시작시 문제가 되는 부분을 찾기 위해 디버깅
sudo vi /etc/init.d/jenkins
...
case "$1" in
    start)
        echo -n "Starting Jenkins "
        daemon --user "$JENKINS_USER" --pidfile "$JENKINS_PID_FILE" $JAVA_CMD $PARAMS > /dev/null
        RETVAL=$?
        echo "java version: $(/usr/bin/java -version 2>&1 | grep -i version)"
        echo "JENKINS_USER: $JENKINS_USER"
        echo "JENKINS_PID_FILE: $JENKINS_PID_FILE"
        echo "JAVA_CMD: $JAVA_CMD"
        echo "PARAMS: $PARAMS"
        echo "RETVAL: $RETVAL"
        if [ $RETVAL = 0 ]; then
...

# 실제 다음과 같은 명령이 실행된다.
# 참고로 daemon 은 . /etc/init.d/functions 로 로딩한 함수다.
daemon --user ysoftman --pidfile /var/run/jenkins.pid /usr/bin/java -Djava.awt.headless=true -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 -Dcom.sun.jndi.ldap.connect.pool.prefsize=10 -Dcom.sun.jndi.ldap.connect.pool.timeout=5000 -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20

# /etc/init.d/jenkins 변경 사항 반영을 위해 다시 로딩
sudo systemctl daemon-reload

# jenkins 서비스 재시작
sudo systemctl restart jenkins

# daemon 함수 실행시 root 가 아니라고 메시지로 실패(RETVAL=1)된다.
Starting Jenkins runuser: may not be used by non-root users

# 해결방법
# /etc/sysconfig/jenkins 에서 다음과 같이 root 로 변경한다.
JENKINS_USER="root"

# 그리고 /etc/init.d/jenkins 의 daemon 실행시 --user 옵션없이 다음과 같이 실행한다.
daemon --pidfile "$JENKINS_PID_FILE" $JAVA_CMD $PARAMS > /dev/null

# 이제 다시 시작하면 아름 스샷과 같이 데몬서비스로 동작한다.
sudo systemctl daemon-reload
sudo systemctl restart jenkins

docker pull forbidden 해결하기

# private registry 를 사용하는데 docker pull 하면, 다음과 같은 에러가 발생한다.
docker pull ysoftman.test.com/drone/drone:2
Error response from daemon: Get https://ysoftman.test.com/: Forbidden

# docker login 을 해도 forbidden 에러가 발생한다.
sudo docker login -u "ysoftman" -p "password" ysoftman.test.com

# docker daemon 정보를 보면 프록시가 설정되어 있고,
# ysoftman.test.com 이 프록시를 사용해 접근이 안되고 있었다.
docker system info | grep -i proxy
HTTP Proxy: http://ysoftman.proxy.test
HTTPS Proxy: http://ysoftman.proxy.test
No Proxy: localhost,127.0.0.1,aaa

# 프록시를 사용하지 않도록 http-proxy 파일을 수정한다.
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
No Proxy: localhost,127.0.0.1,aaa,ysoftman.test.com

# 변경된 설정 파일을 reload 하기 위해서 daemon-reload 을 실행해야 한다.
sudo systemctl daemon-reload

# docker daemon(service) 재시작
sudo systemctl restart docker

# 이제 docker daemon 정보를 보면 no proxy 에 추가된 것을 확인할 수 있고
# docker pull ysoftman.test.com/drone/drone:2 도 잘된다.

vscode 원격 개발

# vscode 1.35 부터 remote develop extension 을 설치해
# ssh, docker container, wsl 의 원격 개발 환경을 이용 할 수 있다.
# 참고로 아이콘도 좀 심플하게(예쁘게) 변경됐다.~ㅎ

# 원격 접속은 원격 서버의 ${HOME}/.vscode-server 프로그램을 설치하고 vscode-server 가 실행돼 원격으로 접속하게 된다.
# vscode-server 는 wget 로 다운로드를 하게 되는데
# 참고로 사내망이라면 http_proxy 환경 변수를 설정 해줘야 한다.

# docker container 가 이미 떠있는 경우
remote-containers : attach to running container
-> 현재 떠있는 컨테이너 선택 -> 새 vscode 창이 오픈

# 새 vscode 가 생성되면 컨테이너의 소스 파일을 열어 볼 수 있고,
# vscode 터미널에서 빌드 커맨드 등을 실행할 수 있는 상태가 된다.

# remote ssh 는 ~/.ssh/config 와 ~/.ssh/authorized_keys 사용한다.
# kerberos 인증 환경에서도 접속할 수 있다.
# settings.json 설정에 다음을 추가하면 로그인 터미널 상태를 표시해준다.
"remote.SSH.showLoginTerminal": true

# 로그인 터미널에 다음과 같은 에러가 발생하는 경우
channel 2: open failed: administratively prohibited: open failed

# 대상 호스트 서버의 /etc/ssh/sshd_config 에 tcp 포워딩 가능하도록 설정한다.
AllowTcpForwarding yes

# 그리고 sshd 서버를 재시작한다.
sudo systemctl restart sshd

# 기타 접속 이슈 해결방법 참고
https://code.visualstudio.com/docs/remote/troubleshooting#_troubleshooting-hanging-or-failing-connections

# remote develop 기능은 vscode live share(로컬 코드를 공유)와 비슷하지만
# 원격 장비의 코드를 vscode 로 볼 수 있어 좋은것 같다.

docker sshd 설정

# redhat 계열(centos) 리눅스에서 서비스 관리 프로그램 변화
# centos6  RHEL(RedHat Enterprise Linux)6
서비스 시작,중지 : service 서비스명 start|stop|restart|status
부팅시 서비스 등록 : chkconfig 서비스명 on|off
서비스 상태 확인 : chkconfig --list

# centos7, RHEL(RedHat Enterprise Linux)7
서비스 시작,중지 : systemctl start|stop|restart|status 서비스명
부팅시 서비스 등록 : systemctl enable|disable 서비스명
서비스 상태 확인 : systemctl list-unit-files

# 그리고 systemctl 은 systemd 데몬이 실행되고 있어야 한다.
예전 service 의 SysV(system5)의 init 스크립트를 systemd 로 대체하고 있다.
/usr/sbin/init -> ../lib/systemd/systemd

#####

# systemctl 실행시 systemd 가 실행중이지 않다면 아래 에러가 발생한다.
Failed to get D-Bus connection: Operation not permitted

# systemd 실행을 위해서
# (--privileged 옵션을 사용하지 않는다면) --tmpfs 옵션으로 컨테이너의 /tmp /run 를 tmpfs 로 마운트해야 한다.
# /sys/fs/cgroup 가 read only로 마운트돼있어야 한다.
# 호스트에 /sys/fs/cgroup 가 존재하지 않아도 된다.
# /sbin/init 가 PID 1 로 실행되도록 한다.
docker run --name centos7 --hostname centos7 -p 9022:22 --user root --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d centos:7 /sbin/init

# 현재 도커 이미지 root 가 아니면 다음처럼 권한 에러가 발생한다.
# 이 경우 docker run 시 --user root 를 사용해야 한다.
docker logs -f centos7
Failed to create root cgroup hierarchy: Permission denied

# 컨터네이너 접속해서 systemd 확인
docker exec -it centos7 /bin/bash
ps -ef | grep systemd

# 컨테이너 삭제
docker rm -f centos7

# 참고
https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container

#####

# docker sshd 를 사용하지 말도록 권하고 있다.
# https://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil
# 서비스가 아닌 개인 테스트 용도로 sshd 를 적용해 보자.
# sshd 설치
yum install -y openssh-server
# sshd 구동 및 상태 확인
systemctl start sshd && systemctl status sshd

# ysoftman 사용자 추가
useradd ysoftman

# ysoftman password 설정
passwd ysoftman

# 호스트에서 접속해보자
# 위에서 컨테이너 실행시 9022 -> 22(sshd) 로 바인딩해뒀다.
ssh ysoftman@localhost -p 9022

golang couchbase 사용

테스트 내용

install jenkins

# Debian/Ubuntu 에서 패키지 저장소 추가해서 설치하는 경우
# jenkins 접속 키 추가
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

# jenkins 저장소 위치 추가
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'

# apt-get 갱신
sudo apt-get update

# jenkins 설치
sudo apt-get install jenkins

# jenkins.war 위치 파악
dpkg -L jenkins


#####


# Redhat/Centos 에서 rpm 패키지 다운받아 설치하는 경우
wget https://pkg.jenkins.io/redhat/jenkins-2.112-1.1.noarch.rpm
sudo rpm -ivh jenkins-2.112-1.1.noarch.rpm

# jenkins rpm 버전 업데이트시 다음과 같이 설치하면 현재 설치된 jenkins(서비스가 중지된 상태라도)와 충돌 에러가 발생한다.
sudo rpm -ivh jenkins-2.112-1.1.noarch.rpm
jenkins-2.112-1.1.noarch에서 설치되는 /etc/init.d/jenkins 파일은 jenkins-2.40-1.1.noarch 패키지의 파일과 충돌합니다
jenkins-2.112-1.1.noarch에서 설치되는 /etc/sysconfig/jenkins 파일은 jenkins-2.40-1.1.noarch 패키지의 파일과 충돌합니다
jenkins-2.112-1.1.noarch에서 설치되는 /usr/lib/jenkins/jenkins.war 파일은 jenkins-2.40-1.1.noarch 패키지의 파일과 충돌합니다

# jenkins rpm 버전 업데이트시 rpm 옵션으로 -U(업그레이드)하면 된다.
sudo rpm -Uvh jenkins-2.112-1.1.noarch.rpm

# jenkins home 디렉토리 변경
sudo vi /etc/sysconfig/jenkins
JENKINS_HOME="/home/ysoftman/jenkinsdata"

# 기본 포트 변경시
sudo vi /etc/default/jenkins
HTTP_PORT=8080

# 서비스로 jenkins 구동
# 정지할때는 stop 옵션 사용
sudo service jenkins start

# 최신 OS 라면 systemctl 사용
sudo systemctl start jenkins


#####


# mac 에서 패키지로 설치하는 경우
# 설치
brew install jenkins

# 실행
/usr/local/opt/jenkins/bin/jenkins 스크립트 파일에서 아래 명령을 실행한다.
java -jar /usr/local/opt/jenkins/bin/libexec/jenkins.war

# 디폴트 JENKINS_HOME 디렉토리
cd $HOME/.jenkins


#####


# .war 로 구동하는 경우
java -jar /usr/share/jenkins/jenkins.war

# 8080 포트를 이미 다른 프로세스가 사용하고 있다면 다음과 같은 에러 발생
Caused by: java.io.IOException: Failed to listen on port 8080

# 다른 포트를 사용하여 구동
java -jar /usr/share/jenkins/jenkins.war --httpPort=8888


#####


# 구동시 참고 사항
# 로그 위치
vi /var/log/jenkins/jenkins.log

# 또는
https://127.0.0.1:8080/log/all

# 접속해 보기
http://127.0.0.1:8080

# admin 패스워드는 다음 로그 파일에 기록되어있다.
# 로그 파일로 이 파일을 수정후 재시작해도 admin 패스워드는 변경되지 않았다.
cat /var/lib/jenkins/secrets/initialAdminPassword

# 암호 분실시 /var/lib/jenkins/config.xml 에서 다음과 같이 수정하여 재시작
<useSecurity>false</useSecurity>

# jenkins home, jenkins 서버 이전시 홈 디렉토리를 복사(백업/복구)하면 된다.
/var/lib/jenkins

# job 설정은 다음 위치에 config.xml 파일로 저장된다.
/var/lib/jenkins/jobs/job이름/config.xml

# 재시작시 '곧 Jenkins가 종료될 예정입니다.' 메시지 후 재시작 되지 않을때
# /restart 페이지에서 바로 종료 할 수 있다. (rest api 참고)
http://127.0.0.1/restart