젠킨스 ssh 키 설정
rm -rf ~/.ssh/*
ssh-keygen -t rsa -b 4096 -m PEM
엔터 3번
ssh-copy-id root@쿠버네티스마스터노드IP
- 왜냐면 젠킨스에 master node가 원격 ssh 접속을 해서 이미지로 불러온 파일들을 복사한 후, 쿠버로 올릴것이기 때문
확인
- 젠킨스 서버 터미널
- ssh root@마스터노드IP
- 접속 되면 된거임.
젠킨스 대시보드에서 설정 변경

- 젠킨스 대시보드 -> Jenkins 관리 -> 플러그인 관리 -> Available plugins -> Publish Over SSH 검색 후 체크 -> Download now and install after restart 클릭 -> 설치가 끝나고 실행중인 작업이 없으면 Jenkins 재시작 체크

키 받아오기
- jenkins 터미널에서
- cat ~/.ssh/id_rsa
- 해서 나온 키 파일 전체 복사

- 젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기, SSH Servers에서 추가

- 그러고 위와 같이 name은 아무거나 써주고, hostname은 쿠버 master ip, username은 root로 고정 그리고 Remote Directory는 원격 접속했을때 시작 디렉토리 위치이다.
- test를 해서 위와 같이 Success가 떠야함.
파이프라인 수정
- 그리고 미리 생성해놓은 파이프라인 클릭 후, 구성 -> 빌드 후 조치에서 Send build artifacts over SSH 클릭

- 그러먼 요런식으로 나옴.
- name은 방금 만든 이름 클릭
- source files는 jenkins의 현재 workspace에 있는 폴더들 전부 복사할것이기 때문에 *
- Remote directory는 /로 아까 원격 접속 설정했던것과 같이 설정
- Exec command는 우리가 이미지까지 빌드하고 push 한 후, 쿠버 master 노드에 입력할 명령어임.
sed -i "s/latest/$BUILD_ID/g" /httpd-deployment-prod.yml
kubectl apply -f /httpd-deployment-prod.yml
- 첫 줄 sed -i에 latest/~~는 latest라는 문자열을 찾아서 현재 build id로 바꿔주는 명령어임.
- 왜냐면 내가 이미지 올릴 때 현재 build id로 tag를 쓰기 때문에, 나중에 파드 생성 디플로이먼트에서도 latest를 써서 지금 현재 설정한대로 build id 따라가게 할것이기 때문
- 두번째줄은 파드를 생성하기 위한 yml 파일을 적용해서 파드를 생성하겠다는 코드.
- 저장
Dockerfile
FROM nginx:latest
RUN rm -rf /usr/share/nginx/html/index.html
ADD build /usr/share/nginx/html
RUN rm -rf /etc/nginx/conf.d/default.conf
ADD default.conf.template /etc/nginx/conf.d/default.conf.template
default.conf.template
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /dev {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://${BACKEND_SVC_NAME}:8000;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
deployment yml 파일 추가
- git 과 연동되어 있는 폴더에 yml 파일 추가 후, push
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment-dev
namespace: cdh-dev
spec:
selector:
matchLabels:
type: front
replicas: 1
template:
metadata:
labels:
type: front
spec:
containers:
- name: container
image: cis07385/front:latest
command: ["/bin/sh", "-ec", "envsubst '$BACKEND_SVC_NAME' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
envFrom:
- configMapRef:
name: frontend-cm
ports:
- containerPort: 80
- 여기서 이미지에 latest로 태그를 가장 최신껄 가져온다고 되어있는데, 아까 파이프라인에서 latest라는 글자를 찾아서 build id로 바꿔주는 작업을 했음.
- 그게 그거긴함 ㅋ
- 그리고 git에 push를 하면??!!

- 요렇게 파이프라인 작동!
- 그런데 지금 master node에는 복사가 잘되고 이미지도 잘 불러오는데, yml 파일 적용을 못시킨다.
- yml 파일이 잘못된거가 싶어서 직접 master node에 쳐봤는데도 잘된다.
- 뭐가 문제인지... 화요일날 물어보기
트러블 슈팅
- 일단 위에서 문제는 빌드 후 조치에서 문제가 있었다.
- 처음에는 원격 접속이 어떤사용자로 되는지 확인하기 위해 who라는 명령어를 이용해 확인해봤다.
- 그러니 root 사용자로 잘 나왔다.

- 당연히 처음에 jenkins 설정할때 이렇게 해줬으니깐 ㅎ..



- 명렁어에 디플로이먼트 파일의 위치를 상대 경로가 아닌 절대 경로로 해줘야 잘 읽는다..
- 분명히 시작 디렉토리를 가장 상위 디렉토리로 했고, 해당 디플로이먼트 파일도 최상위에 위치하는데 왜 상대경로가 안되는지 모르겠다..
- 그래서 위에처럼 절대경로로 바꾸니


- 디플로이먼트 잘 생성되고, 파드도 잘 생성됨
- 아직 backend와 db 컨테이너 생성 안해서 오류뜸.
- 이건 다음 게시글에 할 예정
번외 트러블

- 분명히 docker hub에 이미지 올리는게 잘 됐었는데 갑자기 안됨.
- docker를 돌리는데, docker.sock 파일로 돌림. 근데, 루트 권한이 없으면 사용하지 못함.

- 한번 껏다 키고, docker 설정을 다시 만진 후 적용했을 때, 파일이 덮어쓰기 되면서 권한이 풀림.

- 그래서 권한 바꿔주고 다시 해보니 이미지 잘 생성됨.