Run The Bridge
mysql, wordpress, tomcat, python/flask를 pod, replicaset, deployment로 올리고 서비스 생성하기 본문
mysql, wordpress, tomcat, python/flask를 pod, replicaset, deployment로 올리고 서비스 생성하기
anfrhrl5555 2021. 8. 10. 20:490. 실습과제
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 실행
이제 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로 접속해서 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 받는 방식으로 해야 한다.
예전에 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 tag tomcat:0.0 anfrhrl5555/tomcat:0.0
docker push anfrhrl5555/tomcat:0.0 # 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의 사용자 지정 이름을 쓴다는 것을 이해하였다.
느낀 점: 나는 새로운 것을 배우는 것이 느리다. 항상 남들이 먼저 하고 나면 집에 가서 또는 마치고 이해를 하면서 "아 맞다! 그때 이렇게 하면 해결이 됐을 텐데"라고 생각한다. 하지만 배움이 느리다고 다른 것도 느릴까? 나 자신에게 물어보면 그건 아니라고 생각한다. 느린 만큼 꼼꼼히 더 자세히 많이 보려고 노력한다 이러한 블로그 리뷰도 내 의견에 밑받침이 충분히 될 수 있다.