1. 로컬에서 만든 도커 이미지를 private registry인 하버 서버에 올리기
프라이빗 클라우드를 사용하기 때문에 Docker Hub와 같은 Public Image Registry를 사용할 수 없었다. Private Registry인 하버의 IP 주소와 도메인 주소만을 알고 있었다.
따라서 Dockerfile을 사용해서 빌드한 이미지를 압축파일 형식인 tar 파일로 저장하여 배포해야 했다.
- 도커를 tar 파일로 저장하기 :
save
,export
명령어 사용 - tar 파일을 도커 이미지로 저장 :
load
,import
명령어 사용 - save, load 같이 사용 → 도커 이미지 저장하고 로드, 해당 이미지는 원본 이미지와 동일
- export, import 같이 사용 → 도커 컨테이너 저장하고 로드, 원본 이미지를 아카이빙하여 하나의 레이어로 저장된 이미지로 추출
save, load 명령어를 이용하여 tar 파일로 만든 뒤 harbor에 접속해서 이미지로 만들었다.
[로컬에서 해야할 일]
- Docker를 사용해서 빌드 파일 이미지로 생성
docker build {사용자 이름}/{이미지 이름}
docker build --platform linux/amd64 -t kimtaeheon/discoveryservice:1.0 .
docker save -o ${파일명.tar}
scp ${파일명.tar} root@${Harbor Server}:/root
[Harbor 서버에서 해야할 일]
docker load -i ${파일명.tar}
docker tag ${이미지} ${Harbor Domain}/${이미지}
docker push ${Harbor Domain}/${이미지}
여기까지 하면 Harbor 서버에 내가 만든 이미지가 올라간다.
[쿠버네티스에서 Deployment와 Service manifest 파일 작성]
- Deployment는 Pod 생성을 위해
- Service는 NodePort로 외부에 노출시켜서 실행 확인을 위해 30007번으로 포트를 열었다
apiVersion: apps/v1
kind: Deployment
metadata:
name: discovery-deploy
labels:
app: discovery
spec:
replicas: 1
selector:
matchLabels:
app: discovery
template:
metadata:
labels:
app: discovery
spec:
containers:
- name: discovery-service
image: msa.harbor.com/discovery-service
ports:
- containerPort: 8761
---
apiVersion: v1
kind: Service
metadata:
name: discovery-service
spec:
type: NodePort
selector:
app: discovery
ports:
- port: 8761
protocol: TCP
targetPort: 8761
nodePort: 30007
여기까지 하면 원래 정상적으로 30007번 포트로 Eureka Server가 보여야 한다. (그런데.. ㅜㅜ)
문제 1. ImagePullBackOff
pod 상태에서 해당 문제가 생겼다. 말 그대로 이미지를 제대로 가져올 수 없어서 생기는 문제였다.
Harbor에는 정상적으로 이미지가 있는데 이 문제가 생기는 이유는 harbor는 http이고 쿠버네티스는 https 서버이기때문에 이미지를 가져올 수가 없었다.
harbor를 https로 바꾸는 방법도 있지만, 쿠버네티스에서 컨테이너 런타임 엔진으로 사용하고 있는 containerd 설정과 harbor dns를 등록해두었다.
1. containerd 설정 변경
: containerd의 설정은 /etc/containerd/config.toml
에 있다. (Docker는 /etc/docker
)
이전에 설정된 것을 변경해야 하는데, insecure_skip_verify = true
로 설정해두어야 한다.
2./etc/hosts
파일에 하버 도메인 등록
/etc/hosts
파일은 호스트 이름과 IP주소를 매핑하는 로컬 호스트 파일이다. DNS를 사용하지 않고도 호스트 이름을 IP 주소로 해석할 수 있어서 내부망이나 개발 환경에서 별도의 DNS 서버를 구성하지 않고도 호스트 이름을 사용하여 다른 서버와의 통신을 지원할 수 있다.
해당 파일에 다음 내용을 추가한다.
127.0.0.1 localhost
"하버 IP 주소" "하버 도메인 이름"
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
이렇게 적용하면 ImagePullBackOff 오류는 사라진다.
문제 2. CrashLoopBackOff
이번에 Pod를 확인한 결과 다음과 같은 오류가 발생했다. 해당 오류의 원인을 찾기 위해 kubectl
을 이용해서 컨테이너에 접속해보았다.
[문제 찾는 과정..]
1. 컨테이너 접속
kubectl exec -it discovery-deployment-7f88c84866-rqm4r -- /bin/bash
→ 컨테이너를 찾을 수가 없었다. 로그를 확인해보았다.
2. 로그 확인
kubectl logs discovery-deployment-7f88c84866-rqm4r
→ exec /usr/local/openjdk-17/bin/java: exec format error
이건 Dockerfile의 첫 라인이였는데 여기서부터 오류가 난 것은 이미지 생성 오류라고 생각하여 검색해보았다.
예전에도 발생했었던,, Mac M1에서 이미지 빌드하면 linux에서 오류가 생기는 문제였다.
[해결] Docker: exec /usr/openjdk-11/bin/java: exec format error
그래서 이미지를 빌드할 때, docker build --tag dockerfile:0.1 .
이렇게만 하면 안되고 platform을 환경 변수로 줘야 한다.
docker build --platform linux/amd64 -t kimtaeheon/discoveryservice:1.0 .
여기까지 하면 Pod가 잘 생성되고 NodePort를 통해 외부 포트 30007번에서 접근 가능하다.
'프로젝트' 카테고리의 다른 글
Kafka Topic replicationFactor 오류 원인 및 해결(Spring Kafka) (0) | 2024.07.22 |
---|---|
Kafka, Zookeeper Docker-Compose로 Ubuntu 서버 배포 (0) | 2024.03.15 |
쿠버네티스 Discovery, API Gateway, Microservice 연동 (0) | 2024.03.14 |
Service Discovery (0) | 2024.03.05 |