if(재능이 없으면 시간으로 극복하라){return 성공;}

SAP BTP - Node.js Apllication를 Kyma에 배포하기

SAP BTP Cockpit에 접속하여 하위 계정으로 들어간다. 하위 계정의 하위 도메인을 복사한다. image

Kyma Cluster domain을 확인해야 한다. 이전에 받았던 kubeconfig.yml에서 확인한다.

image

//https://api.ccc3b58.kyma.ondemand.com

전 단계에서 어플리케이션을 Kyma 환경에 배포하기 위해선 OCI image를 만들어서 배포해야 한다. 해당 이미지는 pack tool을 이용하여 만든다.

Chocolatey 를 사용하여 설치할건데 설치가 안된 사람들은 구글링하여 찾아보세요..

choco install pack --version=0.33.2

image

packtool을 사용하여 OCI image를 빌드해 봅시다

pack build <dockerhub 계정>/multitenant-kyma-backend:v1 --builder paketobuildpacks/builder-jammy-base

빌드가 성공하면 이미지를 확인한다. (물론 도커가 설치가 되어있어야 합니다.)

docker images

image

docker에 로그인 하고 hub에 push해보자

이 때 로그인 할 때 계정은 이메일 이지만 @ 앞에만 써도 로그인이 되더랍..

docker login -u nuruhee -p 패스워드

이후 docker hub에 push 해보자

docker push nuruhee/multitenant-kyma-backend:v1

image

image

Docker hub에 배포된 이미지를 Kyma 환경에서 가져와보자

하위계정에서 대시보드에 링크 클릭 image

NameSpace를 만들어주고 image

Kyma가 Docker Hub에서 가져올 수 있도록 액세스 정보 설정

kubectl -n nuruhee create secret docker-registry registry-secret --docker-server=https://index.docker.io/v1/  --docker-username=nuruhee --docker-password=패스워드 --docker-email=nuruhee@gmail.com

명령어를 통해 액세스 정보를 설정하려고 하니 실패하였다.

error: failed to create secret Post "http://localhost:8080/api/v1/namespaces/nuruhee/secrets?fieldManager=kubectl-create&fieldValidation=Strict": dial tcp [::1]:8080: connectex: No connection could be made because the target machine actively refused it.

명령어를 통해 환경변수를 확인해보았다.

kubectl config view
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

아무것도 적용된 환경변수가 없어서 환경변수로 kubeconfig를 따로 잡았다. (이전에 명령어로 kubenconfig를 환경변수로 잡았지만 cmd창을 재기동하게 되면 환경변수가 초기화되는 현상이 있어서 아래 방법으로 진행하는 걸 권장한다.) image

다시 명령어를 쳐서 실행해보니 registry-secret이 생성되었다.

kubectl -n nuruhee create secret docker-registry registry-secret --docker-server=https://index.docker.io/v1/  --docker-username=nuruhee --docker-password=패스워드 --docker-email=nuruhee@gmail.com

image

하위계정 -> Kyma Dashboard -> Configuration -> Secrets 에 만든 registry-secret이 생겼다. image

요 과정은 Kubernetes 클러스터에서 특정 네임스페이스에 Docker 레지스트리 인증 정보를 저장하기 위한 시크릿을 생성한 것이다.

그렇다면 이제 Kubernetes 클러스터의 특정 네임스페이스에서 Docker 로그인 정보를 가진 상태가 된 것이다.

배포 전에 요약 파일을 yaml 파일로 만들어서 배포한다. k8s-deployment-backend.yml 파일을 만들고 안에 내용을 채워준다.

---
apiVersion: gateway.kyma-project.io/v1beta1
kind: APIRule
metadata:
  labels:
    app: kyma-multitenant-node-multitenancy
    release: multitenancy
  name: kyma-multitenant-node-multitenancy
spec:
  gateway: kyma-gateway.kyma-system.svc.cluster.local
  host: kyma-multitenant-node-multitenancy
  rules:
  - accessStrategies:
    - handler: allow
    methods:
    - GET
    - POST
    - PUT
    - PATCH
    - DELETE
    - HEAD
    path: /.*
  service:
    name: kyma-multitenant-node-multitenancy
    port: 8080

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kyma-multitenant-node-multitenancy
    release: multitenancy
  name: kyma-multitenant-node-multitenancy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kyma-multitenant-node-multitenancy
      release: multitenancy
  template:
    metadata:
      labels:
        app: kyma-multitenant-node-multitenancy
        release: multitenancy
    spec:
      imagePullSecrets:
        - name: registry-secret # replace with your own registry secret
      containers:
      - env:
        - name: PORT
          value: "8080"
        - name: TMPDIR
          value: /tmp
        image: <docker-hub-account>/multitenant-kyma-backend:v1  # replace with your Docker Hub account name
        name: kyma-multitenant-node-multitenancy
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /
            port: http
        readinessProbe:
          httpGet:
            path: /
            port: http
        startupProbe:
          httpGet:
            path: /
            port: http
          failureThreshold: 15
          periodSeconds: 2
        resources:
          limits:
            cpu: 100m
            memory: 256M
          requests:
            cpu: 100m
            memory: 256M
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          privileged: false
          runAsNonRoot: true
          readOnlyRootFilesystem: false
        volumeMounts:
        - mountPath: /tmp
          name: tmp
      volumes:
      - emptyDir: {}
        name: tmp

---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: kyma-multitenant-node-multitenancy
    release: multitenancy
  name: kyma-multitenant-node-multitenancy
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: kyma-multitenant-node-multitenancy
    release: multitenancy
status:
  loadBalancer: {}

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  creationTimestamp: null
  labels:
    release: multitenancy
  name: multitenancy
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: istio-system
      podSelector:
        matchLabels:
          app: istio-ingressgateway
  podSelector:
    matchLabels:
      release: multitenancy
  policyTypes:
  - Ingress

이 때 위의 내용을 그대로 복붙해서 쓰지 말고.. 꼭 설정 파일을 읽고 바꿔야 할 부분을 바꿔서 쓰자 ^^ image

배포 설명 파일까지 만들었으니 이제 Kyma에 배포를 해보자. 튜토리얼을 만들었던 루트 폴더로 이동해서 명령어 실행 image

kubectl -n 본인이설정해준네임스페이스 apply -f k8s-deployment-backend.yaml

image

도커 이미지를 이용하여 Kyma에 배포했으니 이제 브라우저로 해당 어플리케이션을 접근해보자.

하위 계정 -> Discovery Network -> Host image

뭔가 제대로 뜨지 않는다. 그래서 여러가지 명령어로 왜 제대로 뜨지 않나 확인을 해보았더니

kubectl get pods --all-namespaces
kubectl describe pod kyma-multitenant-node-multitenancy-86555db664-lnwj7 -n nuruhee

image를 땡겨 올 때 권한 문제가 걸렸다.

image

알고보니 액세스 설정을 할 때

kubectl -n nuruhee create secret docker-registry registry-secret --docker-server=https://index.docker.io/v1/  --docker-username=nuruhee --docker-password=패스워드 --docker-email=nuruhee@gmail.com

요 부분에서 docker-username 뒤에 이메일을 포함한 아이디가 들어가야 된다는거.. 재배포를 해보니 정상적으로 동작은 하나 image

화면은 제대로 뜨지 않는 현상이 나타남 image

이 부분 오류를 수정하면 마무리 할 예정