Run The Bridge

mysql, wordpress, tomcat, python/flask를 pod, replicaset, deployment로 올리고 서비스 생성하기 본문

Cloud/k8s

mysql, wordpress, tomcat, python/flask를 pod, replicaset, deployment로 올리고 서비스 생성하기

anfrhrl5555 2021. 8. 10. 20:49
728x90

0. 실습과제


1. mysql Pod 올리기

위의 서비스는 모두 mysql에 의해 연동되므로 제일 먼저 mysql를 pod로 올려주어야 한다.

# vi mysql-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - name: my-mysql-container
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-password
          key: password
    - name: MYSQL_DATABASE
      value: my-db
    - name: MYSQL_USER
      value: test
    - name: MYSQL_PASSWORD
      value: test
    ports:
    - containerPort: 3306
      protocol: TCP

 

yaml파일을 분석해보자

kubectl apply -f mysql-pod.yaml  # pod.yaml 실행

run 성공!

이제 service를 올려야 DB를 자유롭게 control를 할 수 있다. service.yaml파일을 분석해보자.

# vi mysql-pod-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-pod-service
spec:
  ports:
   - name: mysql-port
     port: 3306
     targetPort: 3306
  selector:
    app: mysql
  type: ClusterIP

kubectl apply -f mysql-pod-service.yaml  # service.yaml 실행

kubectl get services  # service 목록 확인

mysql-pod-service가 잘 올라왔다.

 

이제 mysql pod로 접속해서 db_table를 생성시켜줘야 한다.

kubectl exec -it mysql -- bash  # pod안으로 접속

 

CREATE TABLE private( id varchar(100), email varchar(50), phone_number varchar(100));

INSERT INTO private(id, email, phone_number) values('choi', 'choi@gamil.com', '010-1234-5678');
INSERT INTO private(id, email, phone_number) values('kim', 'kim@gamil.com', '010-1111-2222');
INSERT INTO private(id, email, phone_number) values('park', 'park@gamil.com', '010-3333-4444');

exit || ctrl + p + q


2. wordpress를 replicaset으로 올리기(replicas 1)

wordpress.replicaset.yaml파일은 다음 구조로 이루어져 있다.

# vi "wordpress-replicaset.yaml"

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: wordpress-replicas
  labels:
    app: wordpress-replicas
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress-replicas
  template:
    metadata:
      name: wordpress-replicas
      labels:
        app: wordpress-replicas
    spec:
      containers:
      - name: wordpress
        image: wordpress:latest
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql-pod-service
        - name: WORDPRESS_DB_NAME
          value: my-db
        - name: WORDPRESS_DB_USER
          value: test
        - name: WORDPRESS_DB_PASSWORD
          value: test
        ports:
        - containerPort: 80
kubectl apply -f wordpress-replicaset.yaml  # replicaset.yaml 파일 실행

이어서 바로 서비스도 올려줘야 한다. 

 

서비스 파일명: wordpress-replicaset-nodePort.yaml

 

'wordpress-replicaset-nodePort.yaml'의 구조는 다음과 같다

# vi wordpress-replicaset-nodePort.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-replicaset-nodeport
spec:
  ports:
   - name: wordpress-port
     port: 8080
     targetPort: 80
  selector:
    app: wordpress-replicas
  type: NodePort
kubectl apply -f wordpress-replicaset-nodePort.yaml  # nodeport.yaml 파일 실행

 

192.168.100.140:32049(자신의 host node IP)를 입력해주면 wordpress가 뜬다.


3. tomcat를 replicaset 으로 올리기(replicas 2)

tomcat은 다음의 구조로 이루어져 있다.

# vi tomcat-replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: tomcat-replicas
  labels:
    app: tomcat-replicas
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat-replicas
  template:
    metadata:
      name: tomcat-replicas
      labels:
        app: tomcat-replicas
    spec:
      containers:
      - name: tomcat
        image: anfrhrl5555/k8s_project:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

구조는 위에 wordpress와 동일하다.

tomcat는 /ROOT, /ROOT/WEB-INF 등 tree구조에 맞게 구성시켜줘야 접속이 가능한데, k8s에서는 명령을 전달할 방법이 없다.(현재 내 지식수준에서는) 그래서 미리 tomcat image를 docker public repository에 push 시켜놓고 pull 받는 방식으로 해야 한다.

tomcat의 tree구조, mysql연동을 위한 jar파일

 

예전에 docker에서 사용한 tomcat를 쓰기 위해 docker를 가지고 있는 vm를 부팅시켜준다.

# vi Dockerfile

FROM tomcat
ADD ROOT /usr/local/tomcat/webapps/ROOT/
WORKDIR /usr/local/tomcat/bin/
RUN ./shutdown.sh && ./startup.sh
EXPOSE 8080

Dockerfile에는 별 다른 내용이 존재하지 않는다.

 

위의 tree구조에서 *.jsp 파일들은 db연결 유무와 db_table를 보여주는 코드를 담고 있다. 이 부분은 각자 구글링에서 추가하면 된다.

 

이제 Dockerfile를 build 시켜야 한다.(예전에 쓴 명령어를 다시 상기시켜보자)

docker build -t tomcat:0.0 .

이제 docker hub로 push 하기 위해 docker login를 하고 알맞은 명령어를 쳐준다. 아래의 docker 2일 차에서 확인가능

https://anfrhrl5555.tistory.com/98?category=1011076 

 

docker 2일차

Normal of the normal docker 2일차 본문 Cloud/docker docker 2일차 평범한 anfrhrl5555 2021. 7. 18. 23:44 Prev 1 ··· 4 5 6 7 8 9 Next

anfrhrl5555.tistory.com

 

docker tag tomcat:0.0 anfrhrl5555/tomcat:0.0

anfrhrl5555/tomcat 생성

docker push anfrhrl5555/tomcat:0.0  # docker hub로 push

docker hub에 잘 push 되었다.

이제 다시 k8s가 깔린 vm으로 이동한다.

 

tomcat-replicaset.yaml 파일에서 image부분을 docker_hub처럼 고쳐준다.

이제 replicaset.yaml 파일을 실행한다.

kubectl apply -f tomcat-replicaset.yaml

 

마찬가지로 service로 올려준다.

 

tomcat-replicaset-service.yaml의 구조는 다음과 같다.(구조 분석은 위와 동일하다)

# vi tomcat-replicaset-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tomcat-replicas
spec:
  ports:
  - name: tomcat-replicas
    port: 8081
    targetPort: 8080
  selector:
    app: tomcat-replicas
  type: NodePort
kubectl apply -f tomcat-replicaset-service.yaml

 

index.jsp에 db내용을 호출하는 코드를 담고 실행하면 매우 잘 보인다.


4. python/flask api1를 deployment으로 올리기(replicas 2)

python은 replicaset과 다른 deployment로 올려야 한다. 크게 다른 점은 없다. 위의 tomcat과 내용이 동일하므로 코드와 결과 파일만 첨부하겠다.

 

python-flask.yaml 파일 구조는 다음과 같다

# vi python-flask.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-flask-replicas
spec:
  replicas: 2
  selector:
    matchLabels:
      app: python-flask-replicas
  template:
    metadata:
      name: python-flask-replicas
      labels:
        app: python-flask-replicas
    spec:
      containers:
      - name: python-flask
        image: anfrhrl5555/python-flask:0.0  # 마찬가지로 docker hub에 push 시키고 pull
        imagePullPolicy: Always
        ports:
        - containerPort: 9091

 

python-flask-nodePort.yaml의 구조는 다음과 같다.

# vi python-flask-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: python-flask-replicas
spec:
  ports:
  - name: python-flask-replicas
    port: 9091
    targetPort: 9091
  selector:
    app: python-flask-replicas
  type: NodePort

 

app.py의 구조는 다음과 같다.

# vi app.py

import pymysql
import time
from flask import Flask


time.sleep(5)
app = Flask(__name__)


@app.route("/select", methods=["GET"])
def select():
    juso_db = pymysql.connect(
        user='test',
        password='test',
        host='mysql-pod-service',
        port=3306,
        db='my-db',
        charset='utf8'
    )
    cursor = juso_db.cursor()
    sql = "select id, email, phone_number from private;"
    cursor.execute(sql)
    row = cursor.fetchall()
    print(row)

    lst = []
    for data in row:
        dic = {
            'id' : data[0],
            'email' : data[1],
            'phone_number' : data[2]
        }
        lst.append(dic)

    juso_db.close()

    return str(lst)


@app.route('/')
def hello_world():
    return 'Hello, world!'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9091)

 

결과화면

 


5. 실습 1~4에 대한 서비스 생성(mysql - 서비스 포트만 생성, 이 외 - 서비스 포트 및 노드 포트 생성)

  5-1. tomcat, python 등, 본인이 생성한 이미지를 docker hub사이트에 push 한 후 pull 해서 사용해야 한다.

 

 

만약 실행 중에 문제가 없는데 오류가 뜨면 calico.yaml 파일을 내렸다가 재 시작해볼 것(인마 때문에 시간 개 많이 날림)

kubectl delete -f calico.yaml

kubectl apply -f calico.yaml

6. 소감

 

어려웠던 점: 처음 써보는 k8s에 yaml파일이라는 낯선 구조, 어떻게 접근해야 할지 몰라서 많이 헤맸다. 하지만 뒤에 갓 준영님과 강사님의 도움으로 차근차근 해결하고 한 개가 해결되자 나머지도 얼추 감이 잡혔다. 하지만 port 설정 부분과 yaml과 service.yaml 파일 간의 app 이름 간의 연관성을 이해하는 것이 어려웠다.

 

해결방안: 복습을 통해 yaml 파일을 분석하고, 모르는 것은 질문을 통하여 해소하였다. 그 결과 원리를 이해하고 분석을 하여 블로그 리뷰를 쓸 수 있었다. 또한 이름 간의 연관성을 app과 metadata의 사용자 지정 이름을 쓴다는 것을 이해하였다.

 

느낀 점: 나는 새로운 것을 배우는 것이 느리다. 항상 남들이 먼저 하고 나면 집에 가서 또는 마치고 이해를 하면서 "아 맞다! 그때 이렇게 하면 해결이 됐을 텐데"라고 생각한다. 하지만 배움이 느리다고 다른 것도 느릴까? 나 자신에게 물어보면 그건 아니라고 생각한다. 느린 만큼 꼼꼼히 더 자세히 많이 보려고 노력한다 이러한 블로그 리뷰도 내 의견에 밑받침이 충분히 될 수 있다.

728x90

'Cloud > k8s' 카테고리의 다른 글

k8s 4일차  (0) 2021.08.11
wordpess-mysql 환경변수를 configmap으로 올리기, nginx 관련 실습  (0) 2021.08.10
k8s 3일차  (0) 2021.08.10
k8s 2일차  (0) 2021.08.06
k8s 1일차  (0) 2021.08.05
Comments