https://github.com/jaewonhimnae/docker-codes.git
위 Full Stack 프로젝트를 기반으로 환경 구축
docker compose up으로 해당 서비스를 빌드하면
error:0308010C:digital envelope routines::unsupported at new Hash
(node:internal/crypto/hash:68:19)
위와 같은 에러가 발생했을 때 아래와 같이 react의 package.json을 수정하여 해결
"scripts": {
"start": "react-scripts --openssl-legacy-provider start",
"build": "react-scripts --openssl-legacy-provider build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
현재 docker-compose 파일은 여러개의 이미지를 사용하기 때문에
docker push docker-full-stack-app-master-frontend
...
각 이미지를 PUSH하고 docker compose로 docker hub의 이미지를 가져와야 함
denied: requested access to the resource is denied
하지만 해당 docker 이미지의 Tag가 본인 계정과 일치하지 않을 경우
위와같이 access denied 에러가 발생하기 때문에 Docker Tag를 생성해야 함
docker tag docker-full-stack-app-master-frontend judemin/docker-full-front:lastest
...
이후 push를 다시 진행하면 정상적으로 동작하는 것을 볼 수 있음
$ docker push judemin/docker-full-front
Using default tag: latest
The push refers to repository [docker.io/judemin/docker-full-front]
12f69e4eba18: Pushed
1d2a58c8315b: Pushing 280.2MB/386.8MB
34fbf656c9b4: Pushed
684982f10f87: Pushed
6b051e78e16f: Pushed
e17f9f0f9abc: Pushed
5282665b6989: Pushing 176.2MB
cc2447e1835a: Pushed
https://forums.docker.com/t/docker-compose-push-multiple-services-containers-to-docker-hub/121826
apiVersion: apps/v1
kind: Deployment
metadata:
name: react-js-deployment
spec:
replicas: 1
selector:
matchLabels:
app: react-js
template:
metadata:
labels:
app: react-js
spec:
containers:
- name: react-js
image: judemin/docker-full-front
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: react-js-service
spec:
type: LoadBalancer
selector:
app: react-js
ports:
- protocol: TCP
port: 3000
targetPort: 3000
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-js-deployment
spec:
replicas: 2
selector:
matchLabels:
app: node-js
template:
metadata:
labels:
app: node-js
spec:
containers:
- name: node-js
image: judemin/docker-full-backend
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: node-js-service
spec:
type: LoadBalancer
selector:
app: node-js
ports:
- port: 5000
targetPort: 5000
protocol: TCP
작성한 이후 apply를 통해 서비스를 실행하고 kubectl로 상태 검사
kubectl apply -f node-deployment.yaml
kubectl apply -f react-deployment.yaml
kubectl get all
komodor
CrashLoopBackOff is a Kubernetes state that indicates a restart loop is happening in a pod. It’s a common error message that occurs when a Kubernetes container fails to start up properly for some reason, then repeatedly crashes.
CrashLoopBackOff가 react 앱 pod에서 모두 발생하여 트러블슈팅
# pod describe로 에러 발생 지점 찾기
kubectl describe pod react-js-deployment-78d56f6774-4zp9d
# pod log 출력
kubectl logs react-js-deployment-78d56f6774-4zp9d
# 해당 deployment의 모든 pod 로그 출력
kubectl logs -f deploy/react-js-deployment --all-containers=true
Found 2 pods, using pod/react-js-deployment-78d56f6774-xrw5g
> frontend@0.1.0 start
> react-scripts --openssl-legacy-provider start
ℹ 「wds」: Project is running at http://.../
ℹ 「wds」: webpack output is served from
ℹ 「wds」: Content not from webpack is served from /app/public
ℹ 「wds」: 404s will fallback to /
Starting the development server...
Dockerfile의 nginx의 기존 conf.d를 제거하고
...
FROM nginx
EXPOSE 3000
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
replicas를 1개로 줄이고 port를 설정한 후 아래와 같이 수정해 문제 해결
...
metadata:
name: react-js-deployment
spec:
replicas: 1
...
spec:
containers:
- name: react-js
image: judemin/docker-full-front
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: react-js-service
spec:
type: LoadBalancer
selector:
app: react-js
ports:
- protocol:
port: 3000
targetPort: 80
Ingress Nginx를 아래 명령어로 설치한다
git clone https://github.com/kubernetes/ingress-nginx/
kubectl apply -k `pwd`/ingress-nginx/deploy/static/provider/baremetal/
kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission
이후 react-js-deployment.yaml에 아래와 같이 ingress를 생성해준다
...
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: react-js-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- pathType: Exact
path: /
backend:
service:
name: react-js-service
port:
number: 80
이때 kubectl delete validatingwebhookconfigurations를 실행해주지 않으면 아래와 같이 x509 certificate 에러가 발생한다
Error from server (InternalError): error when creating "react-deployment.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": tls: failed to verify certificate: x509: certificate signed by unknown authority
이후 react-js 포드에 접속하여 curl 명령어로 리액트 앱 구동 여부를 알 수 있다
kubectl exec -it react-js-deployment-5659657dcc-p46dw -- bash
$ curl localhost:3000