본문 바로가기

인프라/Kubernetes

Kubernetes 퍼시스턴트 볼륨

2023.08.27 - [인프라/Kubernetes] - Kubernetes 실습 및 서비스 구축

 

Kubernetes 실습 및 서비스 구축

예상 k8s 서비스 아키텍쳐 Kubernetes 란? 쿠버네티스는 컨테이너화된 서비스를 쉽고 빠르게 배포,확장,관리하기 자동화 해주는 오픈소스 플랫폼입니다. k8s 사용 이유 쿠퍼네티스는 분산 되어 있는

younyellow.tistory.com

 

이미지 업로드 구현

package com.example.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import jakarta.servlet.http.HttpServletResponse;

@RestController
public class Controller {
	@GetMapping("/")
	public ResponseEntity<String> Main() throws Exception {
		try {
			InetAddress inetAddress = InetAddress.getLocalHost();
			String strIpAdress = inetAddress.getHostAddress();
			String html = "2번 서비스 현재 내부 아이피 주소는 <b>" + strIpAdress+"</b> 입니다.";
			return ResponseEntity.status(HttpStatus.OK).body(html);
		} catch (UnknownHostException e) {
			e.printStackTrace();
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("아이피 주소를 불러 올 수 없습니다");
		}
			
	}
	
	@GetMapping("/image.jpg")
	public void getMusic(  HttpServletResponse response) throws Exception {
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		String UPLOAD_PATH = "/upload/";
		try {
			response.setHeader("Content-Disposition", "inline;");
			byte[] buf = new byte[1024];
			fis = new FileInputStream(UPLOAD_PATH + "image.jpg");
			bis = new BufferedInputStream(fis);
			bos = new BufferedOutputStream(response.getOutputStream());
			int read;
			while ((read = bis.read(buf, 0, 1024)) != -1) {
				bos.write(buf, 0, read);
			}
		} finally {
			bos.close();
			bis.close();
			fis.close();
		}
	}
	

}

 

빌드 후 이미지 업로드

PS C:\eclipse-workspace\KubernetesDemo> docker image build -t sihyun2/secondservice .
[+] Building 291.9s (11/11) FINISHED                                                                                                                                                                                                                                                                                                                                       docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                                                                                                 0.0s
 => => transferring dockerfile: 201B                                                                                                                                                                                                                                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/openjdk:latest                                                                                                                                                                                                                                                                                                                    0.0s
 => [1/6] FROM docker.io/library/openjdk                                                                                                                                                                                                                                                                                                                                             0.0s
 => [internal] load build context                                                                                                                                                                                                                                                                                                                                                    0.0s
 => => transferring context: 12.84kB                                                                                                                                                                                                                                                                                                                                                 0.0s
 => CACHED [2/6] RUN microdnf install findutils                                                                                                                                                                                                                                                                                                                                      0.0s
 => CACHED [3/6] RUN mkdir /project                                                                                                                                                                                                                                                                                                                                                  0.0s
 => CACHED [4/6] WORKDIR /project                                                                                                                                                                                                                                                                                                                                                    0.0s
 => [5/6] COPY ./ .                                                                                                                                                                                                                                                                                                                                                                  0.1s
 => [6/6] RUN ./gradlew build                                                                                                                                                                                                                                                                                                                                                      290.0s
 => exporting to image                                                                                                                                                                                                                                                                                                                                                               1.6s
 => => exporting layers                                                                                                                                                                                                                                                                                                                                                              1.6s
 => => writing image sha256:158e7f4d64f996a9130e9afb39b0e1868dec74eca24c5ca12021dee5f8244cd8                                                                                                                                                                                                                                                                                         0.0s
 => => naming to docker.io/sihyun2/secondservice                                                                                                                                                                                                                                                                                                                                     0.0s
PS C:\eclipse-workspace\KubernetesDemo> git push sihyun2/secondservice
fatal: 'sihyun2/secondservice' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
PS C:\eclipse-workspace\KubernetesDemo> docker push sihyun2/secondservice
Using default tag: latest
The push refers to repository [docker.io/sihyun2/secondservice]
95dc43f42f43: Pushed
63088103e987: Pushed
5f70bf18a086: Mounted from sihyun2/firstservice
1c1b3bf25883: Mounted from sihyun2/firstservice
5d9f424e0267: Mounted from sihyun2/firstservice
56285d9a7760: Mounted from sihyun2/firstservice
077bff59ce57: Mounted from sihyun2/firstservice
9cd9df9ffc97: Mounted from sihyun2/firstservice
latest: digest: sha256:7b09c1bbf94cb0ab62001ab67bb2e485d08953e0c95bc166ee157d0fe3dea1b8 size: 2005

3번 노드에 배포할 예정이니까 3번 노드에 라벨링을 해줍니다.

root@DESKTOP-Q4VBHGG:/home/yellownyou# kubectl label node kubernetes-worker3 seletor=worker3
node/kubernetes-worker3 labeled

clusterIp및 nfs pods 정의 kind-nfs-server.yaml

kind: Service
apiVersion: v1
metadata:
  name: nfs-service
spec:
  selector:
    role: nfs
  ports:
    # Open the ports required by the NFS server
    # Port 2049 for TCP
    - name: tcp-2049
      port: 2049
      protocol: TCP

    # Port 111 for UDP
    - name: udp-111
      port: 111
      protocol: UDP
---

kind: Pod
apiVersion: v1
metadata:
  name: nfs-server-pod
  labels:
    role: nfs
spec:
  containers:
    - name: nfs-server-container
      image: cpuguy83/nfs-server
      securityContext:
        privileged: true
      args:
        - /exports
  nodeSelector:
    seletor: worker3

yaml 파일 실행

root@DESKTOP-Q4VBHGG:/home/yellownyou# kubectl apply -f kind-nfs-server.yaml
service/nfs-service created
pod/nfs-server-pod created

persistentvolume 정의 kind-persistent.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 2Gi # 스토리지 용량 2GB
  volumeMode: Filesystem # 파일 시스템 형식
  accessModes: # 읽기/쓰기 옵션
  - ReadWriteMany
  storageClassName: manual
  nfs:
    path: / 
    server: 10.96.255.130

pvc 작성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

새로운 파드 작성 

apiVersion: v1
kind: Pod
metadata:
  name: pv-pod
spec:
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
        claimName: pv-claim
  containers:
    - name: pv-container
      image: ubuntu
      args: ["tail", "-f", "/dev/null"]
      volumeMounts:
        - mountPath: "/upload"
          name: pv-storage

pv-pod /upload에 파일 작성

원래 이미지를 넣을려고 했는데 너무 복잡해질거 같아서 텍스트로 대체하였습니다.

kind-server2-pod 작성

nodeport작성 및 포트 개방

apiVersion: v1
kind: Service
metadata:
  name: node-port
spec:
  ports:
    - name: web-server-port
      port: 80
      targetPort: 8080
  selector: 
    app: my-web-server2
  type: NodePort

테스트

파일이 정상적으로 들어있는 것을 볼 수 있습니다.

 

Kubernetes 관련 파일은 

https://github.com/Sihyun3/LearningKubernetes/tree/main

 

GitHub - Sihyun3/LearningKubernetes

Contribute to Sihyun3/LearningKubernetes development by creating an account on GitHub.

github.com

여기서 확인 가능합니다.