setup.sh
파일은 Dockerfile
을 통해 각 서비스의 image를 만들어야 한다./wordpress
경로로 접근할 경우 IP:WPPORT
로 307 redirect 되어야 한다./phpmyadmin
경로로 접근할 경우 IP:PMAPORT
로 reverse proxy 해야 한다.kubectl port-forward
command는 금지된다.44BITS의 유튜브 : https://youtu.be/SNA1sSNlmy0
Container Orchestration의 등장
: 복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구, 관리할 docker container가 많을수록 관리가 까다로워져서 등장하게 됨.
Container Orchestration의 특징
Deployment
, StatefulSets
, DaemonSet
, Job
, CronJob
등의 다양한 배포방식을 지원한다. 각 서비스별 필요한 기능에 따라 배포방식을 골라 쓰면 된다.조대협님의 블로그에 게재된 Kubernetes 관련 글을 참고할 것이다.
https://bcho.tistory.com/1256?category=731548
Master
와 여러개의 Node
(컨테이너가 배포되는 머신 ex. 가상머신이나 물리적인 서버머신)로 구성된다.
Kubernetes의 오브젝트들은
기본 오브젝트
와 기본 오브젝트를 생성하고 관리하는컨트롤러
로 구성된다. 그리고 이러한 오브젝트들은 기본 스펙이외에 추가적인 메타정보들로 정의될 수 있다.
- 오브젝트의 기본 스펙 : yaml파일에 기본적으로 정의되어야 하는 오브젝트의 상태를 의미한다.
- 메타정보 : 개인 임의대로 정의할 수 있는 정보로 보면 될 것 같다.
Pod
Service
Volume
Namespace
4가지가 있다.Pod
는 컨테이너화된 애플리케이션, Volume
은 디스크, Service
는 로드밸런서 그리고 Namespace
는 패키지명)volume
: pod내에서 각 컨테이너에 로컬디스크가 할당이 되는데, 할당된 로컬디스크는 영구적이지 않다.(컨테이너를 재시동하거나 새로 시작할 때, 기존 디스크의 데이터는 제거되고 새로운 로컬 디스크가 할당되기 때문에) 그래서 각 pod마다 영구적으로 데이터를 저장할 수 있는 volume
이라는 공간을 두어 영속적으로 저장해야하는 데이터를 여기에 저장한다. volume
은 같은 pod내의 컨테이너들이 모두 공유할 수 있다.
service
: 여러개의 pod를 서비스할 때, Load balancer
를 활용하여 하나의 IP와 Port로 묶어서 서비스를 제공한다. pod는 동적으로 생성되고 제거되기 때문에 각 pod마다 ip주소 이용이 힘들고, 동적으로 추가 및 삭제된 pod들의 목록을 Load balancer
가 유연하게 선택해줘야 한다. > label과 label selector의 등장
label selector : 어떤 pod들을 하나의 service로 묶을 것인지 service를 생성할 때 정의
label : pod를 생성할 때 해당 pod가 어떤 label로 묶일지 정의
서비스 type별 설명은 추후 추가 예정
특징
1) 네임스페이스별 접근 권한을 다르게 운영할 수 있다.
2) 리소스의 할당량을 지정할 수 있다. 개발계에는 CPU 100, 운영계에는 CPU 400과 GPU 100개 식으로, 사용 가능한 리소스의 수를 지정할 수 있다.
3) 네임 스페이스별로 리소스를 나눠서 관리할 수 있다.
네임 스페이스는 논리적인 분리 단위이지 물리적이나 기타 장치를 통해서 환경을 분리(Isolation)한것이 아니다.
라벨은 쿠버네티스의 리소스를 선택하는데 사용이 된다. 각 리소스는 라벨을 가질 수 있고, 라벨 검색 조건에 따라서 특정 라벨을 가지고 있는 리소스만을 선택할 수 있다. metadata 섹션에 키/값 쌍으로 정의가 가능하며, 하나의 리소스에는 하나의 라벨이 아니라 여러 라벨을 동시에 적용할 수 있다. (키 값은 label, value 값은 임의의 값)
기본 오브젝트로 애플리케이션의 설정 및 배포가 가능하지만, 좀 더 편리한 관리를 위해서 Controller를 사용함. 컨트롤러는
Replication Controller (aka RC)
,Replication Set
,DaemonSet
,Job
,StatefulSet
,Deployment
가 있다.
pod selector : 먼저 Pod selector는 라벨을 기반으로 하여, RC가 관리한 Pod를 가지고 오는데 사용한다.
Replica 수 : RC에 의해서 관리되는 Pod의 수인데, 그 숫자만큼 Pod 의 수를 유지하도록 한다.
pod template : 생성할 pod에 대한 정보(docker image, port, label 등)를 정의한다.
주의할 점 : 이미 기동되고 있는 pod가 있는 상태에서 새로운 RC를 생성하고, 생성된 RC의 label selector가 기동되고 있는 pod의 label를 가리키는 경우 해당 pod들은 새로 생성된 RC의 컨트롤을 받게된다. 이렇게 되면 pod의 스펙과 RC에서 정의한 pod의 스펙과 다를지라도 pod를 삭제하지 않는다.
ReplicaSet : RC의 새버전이다. Replication Controller 는 Equality 기반 Selector를 이용하는데 반해, Replica Set은 Set 기반의 Selector를 이용한다.
Deployment : ReplicaSet의 상위 추상화 개념이며 ReplicaSet의 버전 upgrade를 도와준다.
쿠버네티스 클러스터를 실행하려면 최소한 scheduler, controller, api-server, etcd, kubelet, kube-proxy를 설치해야 하고 필요에 따라 dns, ingress controller, storage class등을 설치해야 한다.
minikube는 이러한 설치를 쉽고 빠르게 하기 위한 도구이다.
brew install minikube
: minikube 설치~/.zshrc
에 환경변수(export MINIKUBE_HOME=~/goinfre
) 추가(42서울 클러스터 컴퓨터는 개인이 사용할 수 있는 메모리가 한정되어 있어서 추가적인 메모리 공간이 필요함)managed software center
를 검색한 후 virtual box를 설치해준다.minikube start --driver=virtualbox
: virtualbox vm을 활용하여 minikube 실행(minikube의 default driver는 virtualbox라고 한다.)minikube status
: 동작이 잘 되는지 확인한다.MetalLB는 BareMetalLoadBalancer의 약자이다. Kubernetes의 Service 객체들이 Loadbalancer type으로 선언되어 외부 IP를 할당받을 수 있도록 도와준다.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
: metallb-system으로 지정된 namespace(클러스터 내의 논리적인 분리 단위) 오브젝트를 클러스터에 배포한다.kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
: metallb의 controller와 speaker가 생성된다.kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
: memberlist secret을 만들어 speaker간 통신을 암호화한다.metallb-system
namespace로 configmap yaml파일을 만들어 적용시켜주면 된다.minikube ip
명령어로 확인 가능하다.)Kubernetes에 서비스를 배포 하기 전에 먼저 숙지해야할 공통적인 부분을 다룰 것이다.
앞으로 디버깅 할 일이 많이 생길 것이다. 간편한 디버깅을 위해
kubectl
명령어를 숙지하자.
kubectl get all
: 현재 실행되고 있는 모든 object들의 상태를 보여준다.kubectl get pod
: 현지 실행되고 있는 모든 pod들의 상태를 보여준다.(pod대신 다른 object(Service)를 넣어도 된다.)kubectl describe pods
: 특정 replicaset이 제어하는 pod들의 정보 및 상태 출력kubectl logs
: 특정 이름을 가진 pod의 로그 조회kubectl delete
: 현재 실행되고 있는 모든 object 실행 중지Kubernetes는 Virtualbox라는 remote 환경에서 실행이 되지만, image build를 로컬에서 하면 Virtualbox에 image가 생성되는 것이 아니라 로컬에서 생성된다.
eval $(minikube -p minikube docker-env)
명령어를 사용하면 Virtualbox의 Docker CLI를 활용할 수 있고 로컬에서 Virtualbox에 image를 생성할 수 있다.alpine version마다 설치할 수 있는 패키지가 다르다. 없는 패키지를 설치할 경우
DNS Lookup
에러가 발생한다.
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
명령어를 활용하여 alpine OS에 없는 패키지들을 추가하여 사용하였다.: nginx는 동시 접속 처리에 특화된 웹 서버 프로그램이다.
Nginx image 만들기
a. Dockerfile 작성하기
- 과제에서 Kubernetes의 Container는 alpine OS를 기반으로 하기 때문에 image는 alpine OS 기반으로 만들어준다.
- alpine OS의 패키지 툴은 apk 이다. apk 명령어를 활용하여 Nginx를 설치해준다.
- Container에서 사용할 포트들을 Dockerfile에서 Expose 해준다.
- Openssl를 설치하고 인증서를 만들어준다.
- 생성된 인증서를 default.conf 파일에 추가해준다.
- Nginx에 redirection 및 reverse proxy 기능을 추가하기 위해 로컬에서 default.conf 파일을 작성한다.
- default.conf 파일을 Container의 nginx/conf.d 경로에 넣어주는 설정을 Dockerfile에 추가한다.
- location 제어문을 추가하여 uri에 /wordpress
입력시에 http://$host:5050/
로의 redirection 기능을 추가해준다.(http 상태코드는 307)
- location 제어문을 추가하여 uri에 /phpmyadmin
입력시에 http://$host:5000/
로의 reverse proxy 기능을 추가해준다.(reverse proxy 포스트 참고)
- image가 Container로 실행될 때 Nginx가 foreground로 실행될 수 있도록 sh파일을 만들어 Entrypoint로 지정해준다.
- pod의 resource data를 InfluxDB에 전달하기 위해 telegraf를 설치한다. telegraf.conf 파일을 수정하여 data를 전송할 InfluxDB의 Host 주소와 데이터를 저장할 데이터베이스의 이름을 입력한다.
- telegraf는 오픈소스 시스템 모니터링 에이전트이다. 웹 서버나 데이터베이스 등이 사용하는 리소스 사용량 데이터를 수집한다.
- Container 내에서 필요한 프로그램을 실행하고 관리하기 위해 Supervisor를 설치한다.
- Supervisor는 supervisor.conf 파일에 실행이 정의된 프로그램을 실행시켜준다.
- command = sh -c "nginx -g 'daemon off;' && kill -s SIGTERM $(cat supervisord.pid)"
명령어로 프로그램을 실행시키면 프로그램이 실행될 때 foreground로 실행되므로 && 연산 뒤의 명령어가 실행되지 않고 hold 된다. 그리고 foreground로 실행되던 프로세스에 문제가 생겨 중지되면 && 연산 뒤의 명령어가 실행되어 전체 프로세스를 관리하는 supervisor를 kill 명령어로 중지시킨다.
- Container 내부에서 자식 프로세스로 다른 모든 프로세스를 실행시키던 Supervisor 프로세스가 중지되면 Container 역시 중지되어 이를 감지한 replicaset은 pod를 재실행한다.(pod의 상태를 체크하는 livenessProbe의 대안)
Nginx yaml 파일 작성하기
a. deployment 오브젝트 배포하기
- deployment는 pod들을 포괄하는 replicaset의 상위 개념이다. 버전 관리에 용이하다.
- Container 필드에서 Container로 배포할 Nginx image 이름을 넣어준다.(직접 만든 image)
- 과제에서 기본적으로 Hub 에서의 image pull을 금지하고 있기 때문에 ImagePullPolicy는 Never로 설정해준다.
- Container에서 사용할 포트를 설정해주고 포트에 이름을 붙여준다.(80 : http, 443 : https)
b. service 오브젝트 배포하기
- 외부와의 통신 방법을 정의하기 위해 Service 오브젝트를 배포한다. 과제에서는 Load Balancer type의 통신을 요구하고 있다.
- metadata 필드에서 metallb.universe.tf/allow-shared-ip: shared
설정을 안해주면 클러스터 Load Balancer의 IP를 클러스터 내부의 오브젝트 간에 공유를 하지 않기 때문에 각 pod에 접근할 수 있는 IP가 달라진다.
- ports 필드에서 해당 pod의 특정 port로 접근하면 임의로 설정한 Container port로 연결한다는 설정을 추가해준다.(포트 포워딩 기능인듯)
- type 필드에서 Load Balancer type으로 정의해준다.
- Service를 Load balancer type으로 선언하면 해당 pod가 Load balancer가 되는 것이 아니라 Load balancer를 이용하여 통신을 할 수 있다는 뜻이다. 그리고 Loadbalancer type의 Service에 Loadbalancer IP를 지정해주지 않으면 metallb에서 지정해준 ip 범위의 처음 ip 값이 Service의 External IP로 설정된다.
kubectl apply -f 명령어를 활용하여 작성한 yaml 파일을 적용시켜준다.
: Wordpress는 세계 최대의 오픈소스 저작물 관리 시스템이다. 우리나라의 서울특별시 홈페이지가 Wordpress기반으로 만들어졌다.
https://wordpress.org/latest.tar.gz
에서 wordpress 압축파일을 가져온다.metallb.universe.tf/allow-shared-ip: shared
설정하기: phpMyAdmin은 MySQL 데이터베이스를 월드 와이드 웹 상에서 관리할 목적으로 PHP로 작성한 오픈 소스 도구이다.
phpMyAdmin image 만들기
a. Dockerfile 작성하기
- phpMyAdmin은 php를 활용하는 동적인 웹사이트이므로 phpMyAdmin 구동에 필요한 php 모듈을 설치해준다.
- 과제에서 phpMyAdmin은 Nginx 서버 기반으로 동작해야하므로 Nginx도 설치해준다.
- Openssl를 설치하고 인증서를 만들어준다.
- 생성된 인증서를 default.conf 파일에 추가해준다.
- Nginx 설정 파일인 default.conf 파일에 php-fpm으로의 redirection 기능을 넣어준다.(php-fpm 포스트 참고)
- Entrypoint로 실행될 sh 파일을 통해 https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
을 받아서 phpMyAdmin을 설치해준다.
- phpMyAdmin 디렉토리 내부의 config.inc.php 파일을 수정하여 phpMyAdmin과 MySQL 서버를 연동시켜 준다.
- image가 Container로 실행될 때 php-fpm이 실행될 수 있도록 sh파일을 만들어 Entrypoint로 지정해준다.
- pod의 resource data를 InfluxDB에 전달하기 위해 telegraf를 설치한다. telegraf.conf 파일을 수정하여 data를 전송할 InfluxDB의 Host 주소와 데이터를 저장할 데이터베이스의 이름을 입력한다.
- Container 내에서 필요한 프로그램을 실행하고 관리하기 위해 Supervisor를 설치한다.
- Supervisor는 supervisor.conf 파일에 실행이 정의된 프로그램을 실행시켜준다.
phpMyAdmin yaml 파일 작성하기
a. deployment 오브젝트 배포하기
- Container 필드에서 Container로 배포할 Wordpress image 이름을 넣어준다.
- ImagePullPolicy는 Never로 설정해 준다.
- Container port를 5000으로 설정해준다.
b. service 오브젝트 배포하기
- metallb.universe.tf/allow-shared-ip: shared
설정하기
- 포트포워딩 기능 추가하기
- Load Balancer type 정의하기
kubectl apply -f 명령어를 활용하여 작성한 yaml 파일을 적용시켜준다.
: MySQL은 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다.
MySQL image 만들기
a. Dockerfile 작성하기
- apk add
명령어를 활용하여 mysql
과 mysql-client
를 설치해준다.
- mysql-client
는 쿼리를 작성하여 데이터를 받아오는 역할만 하고, 실제로 데이터를 관리해주는 것은 mysql
이다.
- 과제에서는 MySQL pod가 데이터베이스를 관리하고 쿼리를 통해 데이터베이스의 데이터를 보내주는 역할도 해야하기 때문에 두 모듈을 모두 설치하는 것이다.
- my.cnf 디렉토리에 있는 server.conf 파일을 수정해준다.
- server.conf 파일 수정을 통해 소켓통신 경로를 설정해주고 user와 port를 설정해준다. 또한, mysql 서버는 기본적으로 로컬에서 소켓통신만 가능한데 skip-networking을 0으로 설정해줌으로써 외부 네트워크의 접근을 허용한다.
- OpenRC 명령어인 rc-service를 이용하여 MySQL을 실행한다.
- rc-status는 OpenRC의 상태를 확인할 수 있을 뿐만 아니라 runlevel를 set 해준다.
- mysql -u root
명령어를 활용하여 root 계정으로 MySQL 프로그램에 접속한다. 그리고 데이터베이스를 생성하고 user에게 권한 부여를 한다. 또한, 임의로 만든 sql 파일을 데이터베이스에 적용한다.
- mysqld_safe
명령어로 MySQL server를 실행합니다.
- mysqld
명령어로도 MySQL server를 실행할 수 있지만 굳이 mysqld_safe
명령어를 사용하는 이유는 다음과 같습니다 : mysqld_safe이 내부 스크립트에서 mysqld를 실행하고 mysqld 프로세스를 모니터링하고, 어떤 문제로 mysqld가 강제 종료되면 mysqld를 다시 실행합니다.
- pod의 resource data를 InfluxDB에 전달하기 위해 telegraf를 설치한다. telegraf.conf 파일을 수정하여 data를 전송할 InfluxDB의 Host 주소와 데이터를 저장할 데이터베이스의 이름을 입력한다.
MySQL yaml 파일 작성하기
a. deployment 오브젝트 배포하기
- Container 필드에서 Container로 배포할 MySQL image 이름을 넣어준다.
- ImagePullPolicy는 Never로 설정해 준다.
- Container port를 3306으로 설정해준다.
- livenessProbe 기능을 추가한다. Kubernetes는 최소 pod 단위로 상태를 체크할 수 있어서 컨테이너 내부의 프로세스에 이상이 생겨도 컨테이너가 이상이 없는 한 Kubernetes는 현재 상태를 유지한다. 이를 보완한 기능이 livenessProbe이다. livenessProbe의 동작원리는 다음과 같다.
1) livenessProbe - exec - command 필드에서 livenessProbe로 실행할 프로그램과 프로그램이 입력으로 받을 파일을 정의한다.
2) 정의한 프로그램의 실행 결과가 오류일 경우, livenessProbe는 해당 pod에 오류가 발생했음을 감지하고 replicaset이 pod를 재생성한다.(ex. 실행프로그램 : sh, 실행파일 : healty.sh 일 때, sh healty.sh
동작이 오류로 인지되면 pod를 재생성한다.)
- initialDelaySeconds
필드를 통해 pod가 실행된 후 몇 초후에 livenessProbe 기능을 실행시킬 것인지 결정한다.
- periodSeconds
필드를 통해 몇 초마다 livenessProbe에서 정의된 프로그램의 실행 상태를 확인할 것인지 결정한다.
- PVC
를 이용하여 Volume을 생성하고 mysql 디렉토리에 mount 한다.
b. PVC (Persistent Volume Claim) 생성하기
- PVC를 알아보기 전에 먼저 PV (Persistene Volume)을 알아본다.
- PV는 개발자의 개발활동과 시스템관리를 분리시키기 위해 생긴 개념이다. PV를 통해 인프라에 종속적인 부분인 Volume에 관한 부분은 시스템 관리자가 함께 관리하도록 하여 개발자는 Volume을 쉽게 활용할 수 있다.
- 시스템 관리자는 물리 디스크를 생성하여 PV라는 이름으로 Kubernetes에 등록한다.
- 개발자는 PVC를 지정하여 시스템 관리자가 생성한 PV를 pod와 연결한다.
- 즉, 시스템 관리자가 생성한 물리 디스크를 쿠버네티스 클러스터에 표현한것이 PV이고, Pod의 볼륨과 이 PV를 연결하는 관계가 PVC가 된다.
- Kubernetes 1.6부터 동적생성 기능이 지원된다. PV를 굳이 미리 만들어놓지 않아도 PVC를 지정하면 이에 맞게 PV를 동적으로 생성하여 pod와 연결해준다.
- accessModes
필드에서 MySQL만 접근할 수 있도록 ReadWriteOnce
로 설정해준다.
- resources - requests - storage 필드에서 Volume의 용량을 정한다.
c. service 오브젝트 배포하기
- metallb.universe.tf/allow-shared-ip: shared
설정하기
- 포트포워딩 기능 추가하기
- metadata 필드에서 name으로 지정한 부분이 데이터베이스의 host가 된다.
- Load Balancer type 정의하기
kubectl apply -f 명령어를 활용하여 작성한 yaml 파일을 적용시켜준다.
toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
무분별하게 docker build를 많이 하면 위의 오류가 발생한다. build 횟수는 100회로 제한되어 있고 소모된 build 횟수는 6시간마다 충전된다.: Grafana는 메트릭 데이터를 시각화하는데 가장 최적화된 대시보드를 제공하는 오픈소스 메트릭 데이터 시각화 도구이다.
Grafana image 만들기
a. Dockerfile 작성하기
- Grafana를 설치한다. 설치 시에 http://dl-3.alpinelinux.org/alpine/edge/testing/
repository에 접근해야 한다.
- 사전에 임의로 만들어둔 대시보드를 표현하기 위해 Grafana.db
대시보드 파일을 /grafana/data 경로에 넣어준다.
- image가 Container로 실행될 때 Grafana가 실행될 수 있도록 sh파일을 만들어 Entrypoint로 지정해준다.
- pod의 resource data를 InfluxDB에 전달하기 위해 telegraf를 설치한다. telegraf.conf 파일을 수정하여 data를 전송할 InfluxDB의 Host 주소와 데이터를 저장할 데이터베이스의 이름을 입력한다.
- Container 내에서 필요한 프로그램을 실행하고 관리하기 위해 Supervisor를 설치한다.
- Supervisor는 supervisor.conf 파일에 실행이 정의된 프로그램을 실행시켜준다.
Grafana yaml 파일 작성하기
a. deployment 오브젝트 배포하기
- Container 필드에서 Container로 배포할 Grafana image 이름을 넣어준다.
- ImagePullPolicy는 Never로 설정해 준다.
- Container port를 3000으로 설정해준다.
b. service 오브젝트 배포하기
- metallb.universe.tf/allow-shared-ip: shared
설정하기
- 포트포워딩 기능 추가하기
- Load Balancer type 정의하기
kubectl apply -f 명령어를 활용하여 작성한 yaml 파일을 적용시켜준다.
: InfluxDB는 인플럭스데이터가 개발한 오픈 소스 시계열 데이터베이스(TSDB)이다. InfluxDB는 SQL 계열 언어를 제공하고 8086 포트를 사용하며, 자료 구조를 조회하기 위한 시간 중심 함수를 내장하고 있다.
InfluxDB image 만들기
a. Dockerfile 작성하기
- apk add
명령어를 활용하여 InfluxDB를 설치한다.
- pod의 resource data를 InfluxDB에 전달하기 위해 telegraf를 설치한다. telegraf.conf 파일을 수정하여 data를 전송할 InfluxDB의 Host 주소(localhost)와 데이터를 저장할 데이터베이스의 이름을 입력한다.
- Container 내에서 필요한 프로그램을 실행하고 관리하기 위해 Supervisor를 설치한다.
- Supervisor는 supervisor.conf 파일에 실행이 정의된 프로그램을 실행시켜준다.
InfluxDB yaml 파일 작성하기
a. deployment 오브젝트 배포하기
- Container 필드에서 Container로 배포할 InfluxDB image 이름을 넣어준다.
- ImagePullPolicy는 Never로 설정해 준다.
- Container port를 8006으로 설정해준다.
- PVC
를 이용하여 Volume을 생성하고 influxdb 디렉토리에 mount 한다.
b. PVC (Persistent Volume Claim) 생성하기
- accessModes
필드에서 MySQL만 접근할 수 있도록 ReadWriteOnce로 설정해준다.
- resources - requests - storage 필드에서 Volume의 용량을 정한다.
c. service 오브젝트 배포하기
- metallb.universe.tf/allow-shared-ip: shared
설정하기
- 포트포워딩 기능 추가하기
- Load Balancer type 정의하기
kubectl apply -f 명령어를 활용하여 작성한 yaml 파일을 적용시켜준다.
FTPS를 살펴보기 이전에 FTP를 먼저 짚고 넘어가겠다.
액티브 모드 : 서버가 자신의 20번 포트에서 클라이언트가 지정한 포트(1023 이상)로의 연결을 만든다.
패시브 모드 : 클라이언트가 자신이 지정한 포트(1023 이상)에서 서버가 지정한 포트(1023 이상)로의 연결을 만든다. 패시브 모드는 클라이언트가 방화벽이나 NAT 등을 사용하는 환경일 때 주로 사용된다.
FTPS는 기존의 FTP에 전송 계층 보안(TLS)과 보안 소켓 계층(SSL) 암호화 프로토콜에 대한 지원이 추가된 프로토콜이다.
SSL 및 TLS의 원리
출처 : https://nhj12311.tistory.com/76
간략히 설명하면 서버가 건네주는 보자기(공개키)에 클라이언트가 데이터를 넣어서 서버에 보내주면 보자기 내부의 데이터는 서버만 열어볼 수 있다는 원리이다.
SSL과 TLS의 차이 : TLS는 SSL3.0을 기반으로 만들어졌고, 큰 차이점은 없다고 한다.
apk add
명령어를 활용하여 FTP 서버 프로그램인 vsftpd(very secure FTPD)를 설치해준다.adduser
명령어를 활용하여 FTPS 서버에서 사용할 계정을 만들어준다.telegraf & vsftpd /etc/vsftpd/vsftpd.conf
명령어로 telegraf와 vsftpd를 실행시켜준다. && 연산과 & 연산의 차이가 있는 것 같다.(&& 연산을 넣었을 때 vsftpd가 실행되지 않음)vsftpd.conf
을 설정에 맞게 수정한다.(https://linux.die.net/man/5/vsftpd.conf)initialDelaySeconds
필드를 통해 pod가 실행된 후 몇 초후에 livenessProbe 기능을 실행시킬 것인지 결정한다.periodSeconds
필드를 통해 몇 초마다 livenessProbe에서 정의된 프로그램의 실행 상태를 확인할 것인지 결정한다.metallb.universe.tf/allow-shared-ip
shared 설정하기