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 에 연결 된 것을 확인할 수 있다.
'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 |
댓글