3 minute read

3계층 아키텍처 구성

  1. mysql 이미지를 이용해서 DB서버 설정(시크릿, 볼륨, 파드, 서비스(클러스터IP))
  2. tomcat 이미지를 이용해서 was 서버 설정(파드, 서비스(클러스터IP))
  3. httpd 서비스를 이용해서 web 서버 설정(파드, 서비스(로드밸런서))
  4. 각 서버의 이중화 구성은 하지말고 1대씩만 설정

DB 설정

  • 시크릿 생성
    apiVersion: v1
    kind: Secret
    metadata:
    name: mysql-sec
    data:
    MYSQL_ROOT_PASSWORD: cXdlcjEyMzQ=
    
  • pv 생성 ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10G accessModes:
    • ReadWriteOnce local: path: /mysql-volume nodeAffinity: required: nodeSelectorTerms:
      • matchExpressions:
        • {key: kubernetes.io/hostname, operator: In, values: [node1]} ```
  • pvc 생성 ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes:
    • ReadWriteOnce resources: requests: storage: 10G storageClassName: “” ```
  • sql 파드 생성 ```yaml apiVersion: v1 kind: Pod metadata: name: mysql-pod labels: type: db spec: nodeSelector: kubernetes.io/hostname: node1 containers:
    • name: container image: mysql:latest ports:
      • containerPort: 3306 envFrom:
      • secretRef: name: mysql-sec volumeMounts:
      • name: mysql-pvc-pv mountPath: /var/lib/mysql volumes:
    • name : mysql-pvc-pv persistentVolumeClaim: claimName: mysql-pvc ```
  • node1에 퍼시스턴트 볼륨 디렉토리 생성
    cd /
    mkdir mysql-volume
    
  • 서비스(클러스터IP) ```yaml apiVersion: v1 kind: Service metadata: name: mysql-svc spec: selector: type: db ports:
    • port: 3306 targetPort: 3306 ```
  • 확인
    master
    yum install -y mysql-server
    mysql -u root -p -h 10.99.38.110 # 서비스의 아이피, 비밀번호를 치고 들어가지면 성공
    

    image

  • sql db 및 테이블 생성
    CREATE DATABASE kjh_db;
    use kjh_db;
    CREATE TABLE student (sname VARCHAR(10), sage INT);
    INSERT INTO student VALUES('kim',10);
    INSERT INTO student VALUES('lee',20);
    INSERT INTO student VALUES('park',30);
    INSERT INTO student VALUES('sim',40);
    

tomcat 설정

  • 도커 파일 생성
    master
    mkdir tomcat
    cd tomcat
    wget wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz
    tar zxvf mysql-connector-java-8.0.19.tar.gz
    vi Dockerfile
    
    FROM tomcat:9.0
    RUN rm -rf /usr/local/tomcat/conf/server.xml
    ADD ./server.xml /usr/local/tomcat/conf/server.xml
    RUN mkdir /usr/local/tomcat/webapps/kjh
    ADD ./test.jsp /usr/local/tomcat/webapps/kjh/test.jsp
    ADD ./mysql-connector-java-8.0.19/mysql-connector-java-8.0.19.jar /usr/local/tomcat/lib/mysql-connector-java-8.0.19.jar
    EXPOSE 8080
    EXPOSE 8009
    CMD catalina.sh run
    
  • 톰캣에 db연결하기
    vi server.xml
    

https://github.com/xc7230/Cloud/blob/main/kubernetes_3tier/tomcat/server.xml 참조

  • 테스트용 jsp만들기
vi test.jsp
<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Connection conn = null;
		ResultSet rs = null;
	      
		String url = "jdbc:mysql://mysql-svc:3306/kjh_db?serverTimezone=UTC";
		String id = "root";
		String pwd = "qwer1234";


		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, id, pwd);
			Statement stmt = conn.createStatement();
     
	
			String sql = "SELECT sname FROM student";
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				out.println(rs.getString("sname"));
			}


			conn.close();
		} catch (Exception e) {

			e.printStackTrace();
		}	
	%>
</body>
</html>
  • 이미지 생성
    docker build --tag xc7230/tomcat:0.1 .
    docker push xc7230/tomcat:0.1
    
  • 톰캣 파드 생성 ```yaml apiVersion: v1 kind: Pod metadata: name: tomcat-pod labels: type: was spec: containers:
    • name: container image: xc7230/tomcat:0.6 ports:
      • containerPort: 8009 ```
  • 톰캣 서비스 ```yaml apiVersion: v1 kind: Service metadata: name: tomcat-svc spec: selector: type: was ports:
    • port: 8009 targetPort: 8009 ```
  • 확인
    curl 192.168.104.7:8080/test.jsp
    

    image

httpd 설정

master

mkdir httpd
cd httpd
vi Dockerfile
  • Dockerfile 작성
    FROM httpd:2.4
    ADD ./test.html /usr/local/apache2/htdocs/test.html
    RUN apt update
    RUN apt install -y libapache2-mod-jk
    RUN cp /usr/lib/apache2/modules/mod_jk.so /usr/local/apache2/modules/mod_jk.so
    RUN sed -i 's/localhost/tomcat-svc/g' /etc/libapache2-mod-jk/workers.properties
    RUN rm -rf /usr/local/apache2/conf/httpd.conf
    ADD ./httpd.conf /usr/local/apache2/conf/httpd.conf
    EXPOSE 80
    CMD httpd-foreground
    
  • test 화면 작성
    vi test.html
    

    ```html

test


- httpd.conf 파일 수정<br/>
https://github.com/xc7230/Cloud/blob/main/kubernetes_3tier/http/httpd.conf 참조
```conf
LoadModule jk_module modules/mod_jk.so
	
<IfModule jk_module>
	JkWorkersFile /etc/libapache2-mod-jk/workers.properties
	JkLogFile /usr/local/apache2/logs/mod_jk.log
	JkLogLevel info
	JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
	JkMount /*.jsp ajp13_worker
	JkShmFile /usr/local/apache2/logs/jk-runtime-status
</IfModule>
# 마지막에 추가
  • 이미지 파일 업로드
    docker build --tag xc7230/httpd:0.1 .
    docker push xc7230/httpd:0.1
    
  • 파드 생성 ```yaml apiVersion: v1 kind: Pod metadata: name: httpd-pod labels: type: web spec: containers:
    • name: container image: xc7230/httpd:0.2 ports:
      • containerPort: 80 ```
  • 서비스 생성 ```yaml apiVersion: v1 kind: Service metadata: name: httpd-svc spec: selector: type: web ports:
    • port: 80 targetPort: 80 type: LoadBalancer ```
  • 확인
    curl 192.168.104.8/test.html
    curl 192.168.104.8/test.jsp
    

    image

  • 서비스 ```yaml apiVersion: v1 kind: Service metadata: name: httpd-svc spec: selector: type: web ports:
    • port: 80 targetPort: 80 type: LoadBalancer ```
  • 확인 image
    다음 url을 참조하여
    http://192.168.197.221/test.jsp 접속
    image
    다음 화면처럼 was에 만들어 놨던 test.jsp가 실행되고 안에 DB정보가 나오면 성공적이다.

설정 파일 웹서버에서 불러오기

  • tomcat Dockerfile
    FROM tomcat:9.0
    RUN rm -rf /usr/local/tomcat/conf/server.xml
    RUN mkdir /usr/local/tomcat/webapps/kjh
    ADD ./mysql-connector-java-8.0.19/mysql-connector-java-8.0.19.jar /usr/local/tomcat/lib/mysql-connector-java-8.0.19.jar
    EXPOSE 8080
    EXPOSE 8009
    CMD wget http://192.168.197.1:1234/test.jsp -O /usr/local/tomcat/webapps/kjh/test.jsp && wget http://192.168.197.1:1234/server.xml -O /usr/local/tomcat/conf/server.xml && catalina.sh run
    
  • httpd Dockerfile
    FROM httpd:2.4
    ADD ./test.html /usr/local/apache2/htdocs/test.html
    RUN apt update
    RUN apt install -y libapache2-mod-jk wget
    RUN cp /usr/lib/apache2/modules/mod_jk.so /usr/local/apache2/modules/mod_jk.so
    RUN sed -i 's/localhost/tomcat-svc/g' /etc/libapache2-mod-jk/workers.properties
    RUN rm -rf /usr/local/apache2/conf/httpd.conf
    EXPOSE 80
    CMD wget http://192.168.197.1:1234/test.html -O /usr/local/apache2/htdocs/test.html && wget http://192.168.197.1:1234/httpd.conf -O /usr/local/apache2/conf/httpd.conf && httpd-foreground
    
  • apt update가 안될때는
    docker build --no-cache --tag [태그명] # 빌드할때 다음 명령어 추가