Dev./Kubernetes & Helm

Kubernetes: nks 에서 서비스 띄우기

Ivan'show 2023. 9. 26.
728x90
반응형

NCP k8s 클러스터 에서 서비스 띄우기

nodeport 로 서비스 생성해서 파드와 연결하기

# lion-svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: lion-svc-nodeport
spec:
  type: NodePort
  selector: # app 으로 레이블을 달아서 서비스가 해당 레이블 정보를 가진 파드를 관리할 수 있게 한다.
    app: lion-app
  ports:
      # 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다.
    - port: 80
      targetPort: 8000
			# 8000 포트를 80 으로 이어준다
k get all
# result

kimminhyeok@Ivans-Mac lion-k8s % k get all
NAME           READY   STATUS    RESTARTS   AGE
pod/lion-app   1/1     Running   0          18h

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes          ClusterIP   198.19.128.1     <none>        443/TCP        24h
service/lion-svc-nodeport   NodePort    198.19.177.197   <none>        80:31297/TCP   2m18s
k exec -it lion-app
apk add curl
curl <http://198.19.177.197/>
# result
/app # curl -I <http://198.18.1.162:8000/>
HTTP/1.1 404 Not Found
Server: gunicorn
Date: Thu, 07 Sep 2023 00:09:19 GMT
Connection: close
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
Content-Length: 2774
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin

node 를 확인해보면 ncp k8s 로 생성한 클러스터를 확인 할 수 있는데,

k get nodes -o wide
kimminhyeok@Ivans-Mac lion-k8s % k get nodes -o wide
NAME                   STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP      OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
k8s-node-pool-w-3cwo   Ready    <none>   18h   v1.25.8   10.10.5.9     101.79.8.172     Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.6.16
k8s-node-pool-w-3cwt   Ready    <none>   18h   v1.25.8   10.10.5.10    223.130.138.82   Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.6.16

vpc 이름을 확인한 뒤에, ncp 에서 ACG 설정을 해주고 포트를 연결해주면 된다

kimminhyeok@Ivans-Mac lion-k8s % k get svc
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP  PORT(S)        AGE
kubernetes          ClusterIP      198.19.128.1    <none>      443/TCP        27h
lion-svc-nodeport   NodePort       198.19.177.197   <none>    80:31297/TCP   3h38m

nodeport 가 아닌 lb 로 만들어서 dns 에 curl 날리기

# lion-svc-lb.yaml
apiVersion: v1
kind: Service
metadata:
  name: lion-svc-lb
spec:
  type: LoadBalancer
  selector: # app 으로 레이블을 달아서 서비스가 해당 레이블 정보를 가진 파드를 관리할 수 있게 한다.
    app: lion-app
  ports:
      # 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다.
    - port: 80
      targetPort: 8000
kimminhyeok@Ivans-Mac lion-k8s % k get svc
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP                                                          PORT(S)        AGE
lion-svc-lb         LoadBalancer   198.19.156.103   default-lion-svc-lb-fab52-19456190-4c9ebc1a2d05.kr.lb.naverncp.com   80:30643/TCP   88s
kimminhyeok@Ivans-Mac lion-k8s % curl <http://default-lion-svc-lb-fab52-19456190-4c9ebc1a2d05.kr.lb.naverncp.com/health/>
{"status": "ok"}%

ncp k8s 클러스터로 연결되어 있기 때문에 ncp 콘솔에서도 확인이 가능하다.

DB 설정하기

lion-app 을 파드로 띄워서 서비스가 관리할 수 있게 했다. 이제 DB 파드를 띄워서 app 과 연결시키는 과정을 해본다.

DB 용 파드를 새로 판다. 이때 레이블은 다르게 설정해줘야 다른 서비스가 관리할 수 있게 할 수 있다. 서비스를 다르게 해서 서비스 주로를 DB_HOST 로 쓸 예정이다.

# lion-pod-db.yaml : 기본 모양
apiVersion: v1
kind: Pod
metadata:
  name: lion-db
  labels:
    app: lion-db
spec:
  imagePullSecrets:
  - name: regcred
  containers:
    - name: lion-db
      resources: # k8s extension 설치 후 resource 제약조건
        limits:
          memory: "128Mi"
          cpu: "500m"
      image: postgres:13
      imagePullPolicy: Always # 기존의 이미지를 쓰지않고 항상 가져오게 끔
      env: 
        - name: POSTGRES_DB
          value: postgres
        - name: POSTGRES_USER
          value: postgres
        - name: POSTGRES_PASSWORD
          value: postgres
        - name: POSTGRES_PORT
          value: "5432"
      ports: 
        - containerPort: 5432
kimminhyeok@Ivans-Mac lion-k8s % k get po
NAME       READY   STATUS    RESTARTS   AGE
lion-app   1/1     Running   0          21h
lion-db    1/1     Running   0          4m48s
k exec -it lion-db -- /bin/bash
#
kimminhyeok@Ivans-Mac lion-k8s % k exec -it lion-db -- /bin/bash
root@lion-db:/# 
root@lion-db:/#
psql -U postgres -d p
# check
root@lion-db:/# psql -U postgres -d postgres
...
postgres=#
k exec lion-db -- env | grep POSTGRES

# ckeck
kimminhyeok@Ivans-Mac lion-k8s % k exec lion-db -- env | grep POSTGRES
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_PORT=5432

변수를 하나 하나 써주는 게 번거롭다. cofigMapRef 로 넘겨 받아서 돌려보자.

# db-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lion-db
  labels:
    app: lion-db
spec:
  imagePullSecrets:
  - name: regcred
  containers:
    - name: lion-db
      resources: # k8s extension 설치 후 resource 제약조건
        limits:
          memory: "128Mi"
          cpu: "500m"
      image: postgres:13
      imagePullPolicy: Always # 기존의 이미지를 쓰지않고 항상 가져오게 끔
      envFrom:
	    - configMapRef:
          name: db-config
      ports: 
        - containerPort: 5432
# db-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
data:
  POSTGRES_DB: postgres
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: postgres
  POSTGRES_PORT: "5432"

그런데 DB 정보가 노출되니 보기 좋지 않다. secret 을 이용해서 민감한 정보를 감싸주자.

# db-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lion-db
  labels:
    app: lion-db
spec:
  imagePullSecrets:
  - name: regcred
  containers:
    - name: lion-db
      resources: # k8s extension 설치 후 resource 제약조건
        limits:
          memory: "128Mi"
          cpu: "500m"
      image: postgres:13
      imagePullPolicy: Always # 기존의 이미지를 쓰지않고 항상 가져오게 끔
      envFrom:
      # - configMapRef:
      #     name: db-config
      - secretRef:
          name: db-secret
      ports: 
        - containerPort: 5432
# db-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  POSTGRES_DB: cG9zdGdyZXM=
  POSTGRES_USER: cG9zdGdyZXM=
  POSTGRES_PASSWORD: cG9zdGdyZXM=
  POSTGRES_PORT: NTQzMg==

db 정보를 base64 로 해싱해준 결과이다. 해싱은 터미널에서 해줄 수 있다.

# How to do it
kimminhyeok@Ivans-Mac lion-k8s % echo -n 'postgres' | base64 
cG9zdGdyZXM=

이제 데이터베이스 파드를 관리해줄 서비스를 만든다.

# db-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: lion-db
spec:
  type: NodePort
  selector:
    app: lion-db
  ports:
  - port: 5432
    targetPort: 5432
kimminhyeok@Ivans-Mac lion-k8s % k get svc
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP                                                          PORT(S)          AGE
kubernetes          ClusterIP      198.19.128.1     <none>                                                               443/TCP          32h
lion-db             NodePort       198.19.140.74    <none>                                                               5432:31057/TCP   123m
lion-svc-lb         LoadBalancer   198.19.156.103   default-lion-svc-lb-fab52-19456190-4c9ebc1a2d05.kr.lb.naverncp.com   80:30643/TCP     6h11m
lion-svc-nodeport   NodePort       198.19.177.197   <none>                                                               80:31297/TCP     8h
# label 로 endpoint 넣어주기
k label po lion-db app=lion-db
NAME       READY   STATUS    RESTARTS   AGE    LABELS
lion-app   1/1     Running   0          122m   app=lion-app
lion-db    1/1     Running   0          178m   app=lion-db
k get endpoints lion-db 

# endpoint check
kimminhyeok@Ivans-Mac lion-k8s % k get endpoints lion-db 
NAME      ENDPOINTS          AGE
lion-db   198.18.1.28:5432   149m

lion-app 의 태그 설정을 latest 로 바꾸어 postgres 로 db 를 연결하게 끔 하고 이제 커넥션을 체크한다.

# lion-pod.yaml
 apiVersion: v1
kind: Pod
metadata:
  name: lion-app
  labels:
    app: lion-app
spec:
  imagePullSecrets:
  - name: regcred
  containers:
    - name: lion-app
      image: likelion-cr-mh.kr.ncr.ntruss.com/lion-app:latest
      imagePullPolicy: Always # 기존의 이미지를 쓰지않고 항상 가져오게 끔
      envFrom:
      - secretRef:
          name: db-secret
      - configMapRef:
          name: django-config
      - secretRef:
          name: django-secret
      ports: 
        - containerPort: 8000

app pod 에서도 변수 값들을 민감도에 따라 config 와 secret 으로 구분지어서 넣어주자.

# django-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: django-config
data:
  DJANGO_SETTINGS_MODULE: lion_app.settings.test
  DB_HOST: "198.19.140.74"

django-config 파일에는 db-svc 의 클러스터 IP 값을 넣어 연결시켜준다.

필요한 내용들이 충족되고 앱을 실행시키면,

kimminhyeok@Ivans-Mac lion-k8s % k get all
NAME           READY   STATUS    RESTARTS   AGE
pod/lion-app   1/1     Running   0          4h15m
pod/lion-db    1/1     Running   0          5h11m

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP                                                          PORT(S)          AGE
service/kubernetes          ClusterIP      198.19.128.1     <none>                                                               443/TCP          34h
service/lion-db             NodePort       198.19.140.74    <none>                                                               5432:31057/TCP   4h18m
service/lion-svc-lb         LoadBalancer   198.19.156.103   default-lion-svc-lb-fab52-19456190-4c9ebc1a2d05.kr.lb.naverncp.com   80:30643/TCP     8h
service/lion-svc-nodeport   NodePort       198.19.177.197   <none>                                                               80:31297/TCP     10h
kimminhyeok@Ivans-Mac lion-k8s % k get cm
NAME               DATA   AGE
db-config          4      6h
django-config      2      4h15m
kube-root-ca.crt   1      34h
kimminhyeok@Ivans-Mac lion-k8s % k get secret
NAME            TYPE                             DATA   AGE
db-secret       Opaque                           4      5h40m
django-secret   Opaque                           1      4h44m
regcred         kubernetes.io/dockerconfigjson   1      28h
# lion-db log
2023-09-07 06:01:27.578 UTC [60] LOG:  database system was shut down at 2023-09-07 06:01:27 UTC
2023-09-07 06:01:27.582 UTC [1] LOG:  database system is ready to accept connections
...
# lion-app log
Applying forumapp.0005_alter_post_image_url... OK
  Applying sessions.0001_initial... OK
[2023-09-07 06:57:24 +0000] [14] [INFO] Starting gunicorn 21.2.0
[2023-09-07 06:57:24 +0000] [14] [INFO] Listening at: <http://0.0.0.0:8000> (14)
[2023-09-07 06:57:24 +0000] [14] [INFO] Using worker: sync
[2023-09-07 06:57:24 +0000] [15] [INFO] Booting worker with pid: 15
...

db 에 연결 된 것을 확인할 수 있다.

 

728x90
반응형

'Dev. > Kubernetes & Helm' 카테고리의 다른 글

Kubernetes: PersistentVolumeClaim  (0) 2023.09.27
Kubernetes: ReplicaSet 적용하기  (0) 2023.09.26
Kubernetes: nks IAM 인증  (0) 2023.09.25
Kubernetes: run application via nks  (0) 2023.09.24
Kubernetes: ConfigMap  (0) 2023.09.18

댓글