쿠버네티스 Web - 1

SangYeon Min·2023년 11월 8일
0

STUDY-K8s

목록 보기
3/7
post-thumbnail

전체 구조도


Local 환경 Docker 구축

https://github.com/jaewonhimnae/docker-codes.git
위 Full Stack 프로젝트를 기반으로 환경 구축

React Build 오류

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 이미지 push

현재 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


GCE Kubernetes 환경 웹 서버 구축

react_deployment.yaml 작성

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

node_deployment.yaml 작성

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

react-js-deployment CrashLoopBackOff

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

Pod Ingress with Nginx

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

0개의 댓글