[k8s] Service Cluster, NodePort

이정훈·2023년 4월 24일
0

k8s

목록 보기
8/17
post-thumbnail
  • 내부와 외부 pod를 연결 해주는 친구!
  • 내부적으로 문제가 생기면 pod는 쉽게 삭제되고 만들어진다. 근데 이때 IP가 계속 바뀌게 된다.
  • 그래서 지정해주자!

cluster IP

  • 클러스터 내부에서만 사용하는 IP 외부에 공개되지 않는다.
  • 서로 사용할 친구들의 이름을 잘 설정해줘야 한다.

2계층 django-db

service

  • django
apiVersion: v1
kind: Service
metadata:
  name: django-svc
spec:
  selector:
    type: backend
  ports:
  - port: 80
    targetPort: 8000
  • DB
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  selector:
    type: db
  ports:
  - port: 3306
    targetPort: 3306

configmap

  • djanog
apiVersion: v1
kind: ConfigMap
metadata:
  name: django-cm
data:
  DBNAME: "web"
  DBUSER: "root"
  DBPASS: "qwer1234"
  DBHOST: "mysql-svc"
  DBPORT: "3306"
  • DB
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  MYSQL_ROOT_PASSWORD: "qwer1234"

pod

  • DB
apiVersion: v1
kind: Pod
metadata:
  name: db-pod
  labels:
    type: db
spec:
  containers:
  - name: container
    image: mysql:8.0.32-debian
    envFrom:
    - configMapRef:
        name: mysql-cm
  • djnago
apiVersion: v1
kind: Pod
metadata:
  name: backend-pod
  labels:
    type: backend
spec:
  containers:
  - name: container
    image: ddarahakit2023/dj:1.2
    envFrom:
    - configMapRef:
        name: django-cm

  • 서비스 IP로 확인
  • 클러스터 내부에서 서비스이름으로 통신할 수 있다.
  • 서비스는 미리 많들어 놓고, 파드를 실행하면 서비스에 연결이 되고 서비스 클러스터 IP로 통신할 수 있다.
  • 3계층을 만들때 내부적으로는 클러스터 IP를 사용

3계층 front(nginx)-back(gunicorn)-db(mysql)

  • 각각의 service, configmap, pod 연동을 할 때 라벨, 셀렉터, 환경변수 이름 잘 설정해줘야 한다.

dockerfile

frontend(nginx)

FROM nginx:latest
RUN rm -rf /usr/share/nginx/html/index.html
ADD build /usr/share/nginx/html/
RUN rm -rf /etc/nginx/conf.d/default.conf
ADD default.conf.template /etc/nginx/conf.d/default.conf.template


  • build 만들어서 넣어주고, 환견변수를 사용하기 위해 defaul.conf.template 파일을 만들어 줬다. 여기에 환경변수를 적용하기 위해, 컨테이너 만들때 CMD 값 확인!
  • backend와 연결이 되야 하니깐, 근데 이게 지워졌다가 다시 만들어지면 IP값이 달라지니깐, 서비스로 묶어주고 그 값을 사요하면 된다.

backend(gunicorn)

FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY r.txt /app/r.txt
COPY . /app
RUN pip install -r r.txt  # pip로 설치되어야할 것들 잘 있는지 확인해주기!!
# 여기서 migrate 안했으니깐 컨테이너 만들때 같이 실행해줘야한다!

  • DB 환경변수 잘 설정해 놓기
  • 각 이미지를 만들 때, 파일들을 파일질라를 사용하여 master 노드에서 빌드하고 푸시해줬다.

service

frontend(nginx)

apiVersion: v1
kind: Service
metadata:
  name: frontend-svc
spec:
  selector:
    type: frontend
  ports:
  - port: 80
    targetPort: 80

backend(gunicorn)

apiVersion: v1
kind: Service
metadata:
  name: backend-svc
spec:
  selector:
    type: backend
  ports:
  - port: 8000
    targetPort: 8000

db(mysql)

apiVersion: v1
kind: Service
metadata:
  name: db-svc
spec:
  selector:
    type: db
  ports:
  - port: 3306
    targetPort: 3306

configmap

frontend(nginx)

apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-cm
data:
  BACKEND_SVC_NAME: "backend-svc"

backend(gunicorn)

apiVersion: v1
kind: ConfigMap
metadata:
  name: backend-cm
data:
  DBNAME: "web"
  DBUSER: "root"
  DBPASS: "qwer1234"
  DBHOST: "db-svc"
  DBPORT: "3306"

db(mysql)

apiVersion: v1
kind: ConfigMap
metadata:
  name: db-cm
data:
  MYSQL_ROOT_PASSWORD: "qwer1234"

pod

db(mysql)

apiVersion: v1
kind: Pod
metadata:
  name: db-pod
  labels:
    type: db
spec:
  containers:
  - name: container
    image: mysql:8.0.32-debian
    envFrom:
    - configMapRef:
        name: db-cm
  # create database web; web 데이터베이스를 만들어줘야한다.

backend(gucicorn)

apiVersion: v1
kind: Pod
metadata:
  name: backend-pod
  labels:
    type: backend
spec:
  containers:
  - name: container
    image: gugucone/back:1.2
    command: ["/bin/sh", "-ec", "python manage.py migrate && gunicorn config.wsgi --bind 0.0.0.0:8000"]
    envFrom:
    - configMapRef:
        name: backend-cm

frontend(nginx)

apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
  labels:
    type: frontend
spec:
  containers:
  - name: container
    image: gugucone/front:1.1
    command: ["/bin/sh", "-ec", "envsubst '$BACKEND_SVC_NAME' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
    envFrom:
    - configMapRef:
        name: frontend-cm
  • nginx에서 k8s의 환경변수를 사용하기 위해서는 envsubst 이 명령어를 사용해야한다!
    envsubst '$BACKEND_SVC_NAME' < # 이렇게 작성되어 있는 곳에 변수값을 사용하겠다
    /etc/nginx/conf.d/default.conf.template > # 변수로 수정된 친구를 출력하고 그 것을
    /etc/nginx/conf.d/default.conf # 여기에 저장해줘라!

  • 우린 이제 서비스에 있는 클러스터 IP로 연결 할 수 있다.

  • backend:8000/dev/data
    frontend:80/dev/data
    frontend 연결 확인

NodePort

  • 외부에 보여지는데 잠깐동안 테스트만 하기 위해 사용한다. 포트번호를 자동으로 받을 수 있고, 랜덤하게 받을 수 있다.
  ports:
  - port: 9000
    targetPort: 8000
    nodePort: 30000
  type: NodePort
  • 포트번호를 받고 싶으면 지정해주면 되는데 30000이상으로 해줘야 한다.

  • service 타입을 nodeport로 변경해서 포트번호를 받았고

  • 들어가지는데 어느 노드로 들어가도 접속이 가능하다 이건 k8s의 기능 포트번호만 알고 있으면 된다!

  • App.js 여기서 뭘 건드려야 포트번호 없이 들어가는지 모르겠다.

profile
싱숭생숭늉

0개의 댓글