쿠버네티스 정리부터 실습까지 정리된글입니다. 너무 양이 많아서, 1~7번 까지 글과 0번 글이 같습니다. 편한거 보시면 됩니다. 내용은 같습니다.
내용들은 추가적으로 제가 쿠버네티스를 공부하며, 중요하다고 생각된 내용들을 정리해서 작성해두었습니다..
컨테이너 오케스트레이션이란? : 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화 하는 기술을 말한다.
하나의 서비스를 구현하다보면, 여러개의 서버, 여러개의 클라이언트들을 사용하게 된다. 이러한 다양한 종류의 서버와 클라이언트를 하나의 컴퓨터에서 돌릴때 라이브러리 버전이 다르거나, 충돌이 발생할수 있는데, 이러한 오류들을 방지하기위해, 각각의 서버나 클라이언트를 컨테이너화 하게 된다. 문제는 이러한 컨테이너의 수가 많아지면 배포, 관리 ,확장, 네트워킹 자동화가 힘들어지는데 이러한 작업들을 컨테이너 오케스트레이션에서 자동화 시켜줄수 있다.
한번 보고 넘어가기 : 컨테이너 오케스트레이션은 YAML 또는 JSON 파일을 사용해 애플리케이션 설정에 대해 설명하게 됩니다.
컨테이너는 리눅스 기술을 사용하여 선박의 컨테이너 처럼 프로세스가 사용하는 애플리케이션을 관련 라이브러리 및 종속 항목을 격리 하는 것입니다
vm 과 도커 차이 : vm의 경우, 호스트 os위에 각각의 vm즉 guestOS를 하나씩 설치한다. (호스트 os와 게스트 os사이에 커널을 하나씩 생성해야하고, 이러한 커널작업과, guest마다 os를 생성하다 보니, 무겁고 느려진다.) 컨테이너의 경우, 하나의 호스트에 도커 엔진을 올리고 도커 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다.
사진!
(사진참고)[https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd][vm과 도커 차이 잘 정리 되어있음.](https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90)
컨테이너 원리 : 컨테이너는 계층형태로 구성되어있다. 도커에서 컨테이너를 만들 떄 이미지 계층 방식을 이용한다. 예를들면 하나의 컨테이너 위에 os와 nginx를 올리고 싶다면, os레이어를 컨테이너에 쌓고, 추가적으로 nginx레이어를 추가해서 os와 nginx가 설치된 컨테이너를 만들수 있다. 이렇듯 컨테이너를 만들떄는 한층한층씩 쌓는데, 쌓을때 필요한 데이터인 이미지는 도커에서 올릴때 읽기 전용으로 만 사용되며, 여러개의 컨테이너를 만들떄 하나의 이미지로 여러개의 똑같은 컨테이너를 쉽게 만들수 있다.
컨테이너의 원리
로드벨런서란? : 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도저하 등을 고려하여 적절히 분산처리하여 해결해주는 서비스입니다.
마스터에는 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker등이 실행됩니다
클러스터 내부에서 실행중인 컨테이너의 상태를 모니터링하기 위해서는 cpu, 메모리 같은 필요한 메트릭 데이터들을 시계열형식으로 저장하고 볼수 있는 방법을 제공하는데 필요한 애드온입니다. (에드온은 쿠버네티스에서 데쉬보드같이 여러 형태로 사용자가 볼수 있게 제공해준다.)
(조대협님 블로그 사진참조)[https://bcho.tistory.com/1256][쿠버네티스 아키텍처](https://arisu1000.tistory.com/27827)
앞서 살펴본 마스터와 마스터와 노드로 구성된게 클러스터입니다.
쿠버네티스 클러스터는 크게 2가지 종류로 구성됩니다. 클러스터를 관리하는 역할을 하는 마스터(master)와 실제 컨테이너를 실행시키는 작업을 하는 노드(node)입니다.
클러스터는 쿠버네티스에서 컨테이너화된 애플리케이션을 실행하기 위한 일련의 노드 머신입니다. 쿠버네티스를 실행 중이라면 클러스터를 실행하고 있는 것입니다.
쿠버네티스 클러스터에는 원하는 상태가 있으며, 이 상태는 실행해야 할 애플리케이션이나 워크로드, 사용하는 이미지, 사용할 수 있는 리소스 등과 같은 기타 구성 세부 사항을 정의합니다.
쿠버네티스 클러스터가 갖춰야 할 특성은 다음과 같습니다.
보안성: 최신 보안 모범 사례를 따라야 합니다.
사용 편이성: 몇 가지 간단한 명령으로 작동할 수 있어야 합니다.
확장 가능성: 하나의 제공업체만을 선호해서는 안 되고 구성 파일을 통해 사용자 정의할 수 있어야 합니다.
pod 특징 : Pod 내의 컨테이너는 IP와 Port를 공유한다. 서로다른 컨테이너가 하나의 pod를 통해서 배포 되었을경우, localhost 를 통해서 통신이 가능하다. 예를들면 하나의 컨테이너 A가 포트가 8080이고 다른 하나는B가 7002라면 배포가 되었을 때, B에서 A를 호출할떄, localhost:7001로 호출하면 된다., Pod 내에 배포된 컨테이너간에는 디스크 볼륨을 공유할 수 있다.
persistentvolume 이란? 시스템 관리자가 생성한 물리 디스크를 쿠버네티스 클러스터에 표현한것이 PV 입니다. 시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록합니다
persistentvolumeclame 이란? : pv를 사용할떄는 pvc도 함께 사용하는데, pvc는 PVC는 사용자가 PV에 하는 요청이다. 사용하고 싶은 용량은 얼마인지, 읽기/쓰기는 어떤 모드를 사용하고 싶은지 등을 정하여 요청한다. 즉 사용자가 직접 볼륨을 할당 하는게, 아니라, pvc를 두어 좀더 쉽게 volume을 생성할수 있게 도와주는게 pvc이다.
이외에도 다른 용어들이 있다. 더 궁금한게 있다면, 쿠버네티스 공홈 여기 들어가서 살펴보길 바란다.
사용자나 쿠버네틱이(오케이스트레이션) 서버를 사용하겠다고 등록하면, 새로운 서버를 사용하는 프록시 서버에 자동으로 설정해주는 기능''
이외에도 오케이스트레이션에는 컨테이너를 관리하는 다양한 기능들이 있다.
쿠버네티스 == 어렵다.
위 사진은 44BITS강의를 캡쳐한 사진입니다.
Kubernetes를 사용해 서비스를 배포 해봅시다.
지난시간까지 쿠버네티스의 개념에 대해 알아보았습니다. 이번시간에는 특정 조건들이 주어지는 서비스를 구현해보도록 하겠습니다.
제한된 하드웨어 리소스로도 여러 클라이언트 요청을 동시에 효율적 처리
경량 아키텍처와 높은 동시성이 있습니다.
클라이언트 요청을 이벤트 중심의 접근 방식 사용, 단일 쓰레드를 통해 여러 연결을 처리할수 있습니다.
세부 정리는 오른쪽 글을 참고해주세요. nginx개념과 nginx와 아파치 차이점에 대해 정리한 글이 있습니다.
사용에 필요한 경우 : 로드밸런싱은 여러 대의 서버를 두고 서비스를 제공하는 분산 처리 시스템에서 필요한 기술입니다. 서비스 규모가 작다면 하나의 서버로 모두 해결하겠지만, 규모가 커지게 되고, 클라이언트수가 늘어나면 기존 서버로는 문제가 생깁니다. 이러한 문제를 해결하기 위해 로드벨런서를 사용합니다. 하지만 부하가 많이 생긴다고 꼭 로드벨런서를 사용하셔야 하는건 아닙니다. 부하의 대처방법은 두가지가 있는데, scale-out의 경우 앞서 설명했던 서버의 개수를 늘려 부하를 분산하는 방법이고, 하나의 서버의 성능을 향상 시켜 해결하는 방법도 있습니다. 이 방법은 scale-up이라고 합니다. 이 글에서는 scale-out으로 부하를 분산할것입니다.
워드프레스란 PHP로 작성된 온라인 오픈 소스 웹사이트 저작 도구입니다.
mysql을 실행창에서 관리하는거 생각보다 힘든데, phpmyadmin을 사용하면 좀더 쉽게 관리할 수 있다.
export MINIKUBE_HOME=~/goinfre
아래 미니쿠베 설치.(만약 brew없으면 brew도 설치하세요.)
brew install minikube
main()
{
introduce
minikube_setup
make_images
yaml_services
}
메인문은 4가지로 구성되어있다.
1. introduce : sh 파일의 만든이 정보를 넣어줍니다.
2. minikube_setup : 미니쿠베를 시작하고 설정을 해줍니다.
3. make_images : 이미지파일을 만들어 줍니다.
4. yaml_services : yaml파일로 생성한 이미지파일로 pod를 생성해주고, 파드의 오브젝트를 설정합니다.
introduce()
{
echo -e $GREEN
echo "by. hoylee, 21-04-21"
echo "FT_services,start!"
echo -e $WHITE
echo -e $CYAN
echo "=============================================================================================="
echo -e $WHITE
echo " 8888888888 88888888888 88 d88888b 8b d8 88 88888888 8888888"
echo " 888 888 88 88 88 88 88 88 88 88"
echo " 888 888 88 88 88 88 88 88 88 88"
echo " 8888888 888 8888888h 88 88 88 88 88 88888888 8888888"
echo " 888 888 88888888 88 88 \"888888 88 88 88"
echo " 888 888 88 88 88 88 8b 88 88 88"
echo " 888 888 88 88 88 88 8b 8888888b 88 88"
echo " 888 888 88888888 88 88 d88888b 8888b 88888888 88888888 8888888"
echo -e $CYAN
echo "=============================================================================================="
echo -e $BLUE
echo -e $CYAN
echo -e $WHITE
}
minikube_setup()
{
minikube delete
minikube start --driver=virtualbox --cpus=2
minikube addons enable dashboard
minikube addons list
more_addons
echo 😻- complete addons..!
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
kubectl apply -f srcs/yaml_metallb/metallb_complete.yaml
eval $(minikube docker-env)
echo $DOCKER_HOST
echo -en $GREEN
echo "Minikube is ready !"
echo
}
more_addons()
{
echo -e "addons 더 필요한게 있으면 입력하세요, 그냥 진행하려면 enter"
echo -e "ex) ambassador or auto-pause "
read word
while [[ $word != '' ]];
do
flag1=1
for value in "${addons_list[@]}"; do
if [ $word == $value ] ; then
minikube addons enable $word
minikube addons list
flag1=2
echo "add complete $word"
fi
done
if [ $flag1 -eq 1 ] ; then
echo "==================================================================="
echo -e $RED"$word is not inside addons. addons list,"
echo -e $WHITE
echo "Please input addons name or if you dont need addons just put enter"
echo "==================================================================="
fi
if [ $flag1 -eq 2 ] ; then
echo -e "addons 더 필요한게 있으면 입력하세요, 그냥 진행하려면 enter"
echo -e "ex) ambassador or auto-pause "
fi
read word
done
}
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.98.100.92-192.98.100.92
make_images()
{
images_kind=("nginx" "wordpress" "mysql" "phpmyadmin" "ftps" "grafana" "influxdb")
for kind in "${images_kind[@]}"
do
echo -en $WHITE
echo "📲 Building $kind image..."
echo -en $YELLOW
docker build -t $kind srcs/$kind/
echo "$kind === "
echo -en $GREEN
echo "📱 success built $kind image !"
echo
done
echo -en $WHITE
}
색 넣는거 해두면 좋아요. 나중에 sh파일 돌릴 때 빌드마다 노란색으로 구분되서 보여서 실행 상황 보기 편했어요.
yaml_services()
{
kubectl apply -f srcs/yaml_services/nginx.yaml
kubectl apply -f srcs/yaml_services/wordpress.yaml
kubectl apply -f srcs/yaml_services/mysql.yaml
kubectl apply -f srcs/yaml_services/phpmyadmin.yaml
kubectl apply -f srcs/yaml_services/ftps.yaml
kubectl apply -f srcs/yaml_services/grafana.yaml
kubectl apply -f srcs/yaml_services/influxdb.yaml
}
minikube addons list
dashboard : 클러스터의 웹 UI 툴
efk : 로그분석 툴(Elasticsearch, Fluentd 및 Kibana)
freshpod : 이미지 리빌드시 pod 재시작
gvisor : 컨테이너 런타임을 대체하여 안전하게 pod 실행
heapster : 컴퓨터 리소스 분석 및 클러스터 모니터링
ingress : 쿠버네티스 Ingress 리소스를 기반으로 구축된 NGINX 컨트롤러
logviewer : 경량 로그 툴
metrics-server : 클러스터 자원 사용률 및 활용도를 수집
** addons의 툴은 각자 기능이 있는데, 구글에 검색하면 설명이나옴. 궁금하면 검색 해볼것 **
참고 : https://www.oops4u.com/2372
> addons : 부가 기능은 Kubernetes의 기능을 확장합니다
docker build -t nginx-alpine srcs/nginx/
-t옵션은 tag임, 이름을 정해줄수 있음.
FROM alpine:3.12
LABEL maintainer="hoylee@student.42seoul.kr"
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk update && apk add --no-cache nginx openssl telegraf
COPY ft_server.sh default.conf telegraf.conf ./
COPY telegraf.conf /etc/telegraf/
COPY ./healthy.sh /tmp/healthy.sh
EXPOSE 80 443
ENTRYPOINT sh ft_server.sh
알파인 리눅스의 가장 큰 특징은 바로 이 '가볍다'이다. 커널을 제외한 용량이 8MB 라고 하는데, 확실히 우분투 등의 다른 리눅스 배포판과 비교했을 때 상대적으로 가벼운 것을 알 수 있다. 알파인 리눅스는 가볍게 만들기 위해서 다른 배포판들 대비 아래와 같은 차이점이 있다.
etc특징 : /etc와 /usr/etc 디렉토리는 시스템의 부팅, 셧다운 시에 필요한 파일들과 시스템의 전반에 걸친 설정 파일들 및 초기 스크립트 파일들이 있다. 시스템에 어떠한 문제가 발생한다거나, 시스템 전체 환경에 관한 설정을 바꾸기 위해서는 이들 디렉토리내에 포함되어 있는 파일들에 대하여 잘 알아야 한다. etc 폴더란?
livenessProbe: 컨테이너 프로브중 하나이다. 실습에선, 해당 컨테이너의 prosses가 정상적으로 작동중인지 확인한다. 만약 활성 프로세스가 정상 작동하지 않는다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다. 만약 컨테이너가 활성 프로브를 제공하지 않는 경우, 기본 상태는 Success이다.
Success: 컨테이너가 진단을 통과함.
Failure: 컨테이너가 진단에 실패함.
Unknown: 진단 자체가 실패하였으므로 아무런 액션도 수행되면 안됨.
컨테이너 프로브 : 프로브는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)이다. livenessProbe, readinessProbe, startupProbe 3가지 종류가 있다.
livenessProbe: 컨테이너가 동작 중인지 여부를 나타낸다. 만약 활성 프로브(liveness probe)에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다.
startupProbe: 컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다. 스타트업 프로브(startup probe)가 주어진 경우, 성공할 때까지 다른 나머지 프로브는 활성화되지 않는다.
readinessProbe: 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다. 만약 준비성 프로브(readiness probe)가 실패한다면, 엔드포인트 컨트롤러는 파드에 연관된 모든 서비스들의 엔드포인트에서 파드의 IP주소를 제거한다.
livenessProbe를 사용한 이유 : 실습인 서비스를 운영하면서 프로세스 작동이 정상적으로 동작하고 있지않으면, 서비스중 하나에 문제가 생긴경우다. 일정 간격마다 프로세스 동작여부를 확인하고 문제가 생겼을때 해당 파드를 끈다면 livenessprobe에서도 재시작을 시켜주고 만약 잘못 켜진다고 해도, yaml파일로 설정을 해두었기떄문에 마스터 노드에서 안전하게 재시작을 해줄거라 livenessprobe를 사용햇따.
#!/bin/bash
mkdir -p /run/nginx
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=AITEAM/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
mv localhost.dev.crt etc/ssl/certs/
mv localhost.dev.key etc/ssl/private/
chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key
echo "hellow word" >> index.html
mv index.html /var/www/localhost/htdocs
cp -rp ./default.conf /etc/nginx/conf.d
telegraf & nginx -g 'daemon off;'
damon off를 해주는 이유는, 쿠버네티스에서 컨테이너를 실행할 때, sudo docker run -d -p 외부포트:내부포트 이미지파일명 처럼 -d 옵션을 줘서 해당 컨테이너가 백그라운드로 돌아가게 만든다. -d옵션으로 백그라운드 하게 되면, 해당 클러스터를 데몬으로 프로세스를 관리하게 되는데, 이떄 데몬의 자식프로세스로 nginx가 생성이 된다. 문제는 이 nginx가 백그라운드로 돌아가게되는 특성이 잇는데, 이렇게 되면 데몬이 자식 프로세스인 nginx를 탐색할수 없게 되고, 추적을 못하게 되므로 해당 nginx가 exit되게 된다. 그렇기에 nginx를 nginx -g "daemon off; 명령어로 forground시켜준다.
데몬이란? : 멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl ;
listen [::]:443 ssl ;
ssl on;
ssl_certificate /etc/ssl/certs/localhost.dev.crt;
ssl_certificate_key /etc/ssl/private/localhost.dev.key;
root /var/www/localhost/htdocs;
index index.html;
location /wordpress {
return 307 http://192.168.99.10:5050;
}
location /phpmyadmin/ {
proxy_pass https://192.168.99.10:5000/;
}
location / {
try_files $uri $uri/ =400;
}
}
포워드 프록시와 리버스 프록시 차이 : Forward Proxy 는 클라이언트가 요청하는 End Point 가 실제 서버 도메인이고 프록시는 둘 사이의 통신을 담당해준다.
HELLOW WORD
[global_tags]
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = ""
omit_hostname = false
[[outputs.influxdb]]
urls = ["http://influxdb-service:8086"]
database = "nginx"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
kubectl apply -f srcs/yaml_services/nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: http
- containerPort: 443
name: https
livenessProbe:
exec:
command:
- sh
- /tmp/healthy.sh
initialDelaySeconds: 14
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
annotations:
metallb.universe.tf/allow-shared-ip: wp
name: service-nginx
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
type: LoadBalancer
loadBalancerIP: 192.168.99.10
alpine linux 공홈위키 - wordpress 설치방법
FROM alpine:3.12
RUN apk update && apk upgrade && \
apk add --no-cache nginx php7 php7-fpm php7-opcache php7-gd php7-mysqli \
php7-zlib php7-curl php7-mbstring php7-json php7-session
COPY ft_wordpress.sh default.conf wp-config.php ./
RUN adduser -D -g 'www' www && mkdir -p /www \
&& chown -R www:www /var/lib/nginx && chown -R www:www /www
RUN mkdir -p /run/nginx
ADD https://wordpress.org/latest.tar.gz .
RUN tar -xvf latest.tar.gz && \
mv wordpress /www && \
mv wp-config.php /www/ && \
rm -f latest.tar.gz
ADD https://dl.influxdata.com/telegraf/releases/telegraf-1.6.3-static_linux_amd64.tar.gz ./
RUN tar -C . -xzf telegraf-1.6.3-static_linux_amd64.tar.gz && \
chmod +x telegraf/* && \
cp telegraf/telegraf /usr/bin/ && \
rm -rf *.tar.gz* telegraf/
COPY telegraf.conf /etc/telegraf/
COPY ./healthy.sh /tmp/healthy.sh
RUN mv ./default.conf /etc/nginx/conf.d/default.conf
EXPOSE 5050
ENTRYPOINT sh ft_wordpress.sh
apk add --no-cache php7 php7-fpm php7-opcache php7-gd php7-mysqli \
php7-zlib php7-curl php7-mbstring php7-json php7-session
cgi란? : CGI란 공통 게이트웨이 인터페이스(Common Gateway Interface)의 약어로, 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약들을 말한다.
우리가 사용하는 nginx, apach 등 서버들은 클라이언트에서 요청이 들어오면 해당 요청에 맞는 정보를 제공하는게 일반적인 서버(정적인 작업만 가능)의 기능이다.
문제는 이러한 정적인 작업만 가능하면, 회원가입을 할 떄 사용자가 입력한 데이터들이나 인터넷 주문을 할떄 필요한 사용자 정보들을 db에 저장할수 없다. 이러한 문제점을 해결하기 위해서는, 외부 프로그램과 정보를 주고받을 규약이 필요했고, 이것을 cgi라고 한다.
참고자료 - cgi란 무엇인가?, 웹서버와 웹 어플리케이션 서버 차이, 위키 cgi란?
server {
listen 5050;
listen [::]:5050;
root /www/wordpress;
index index.html index.htm index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location / {
try_files $uri $uri/ =404;
}
}
php란? : 원래는 동적 웹 페이지를 만들기 위해 설계되었으며 이를 구현하기 위해 PHP로 작성된 코드를 HTML 소스 문서 안에 넣으면 PHP 처리 기능이 있는 웹 서버에서 해당 코드를 인식하여 작성자가 원하는 웹 페이지를 생성한다.
fastcgi란? : CGI는 데이터 처리요청이 있을 때마다 매번 프로세서를 실행해야만 했다. FastCGI는 매번 프로세스를 만들지 않고, 미리 만들어 놓은 프로세스와 데이터를 주고 받음으로서 CGI 보다 더 효츌적으로 작동한다. 이러한 해결책으로 CGI를 진화시킨 기술로 FastCGI 입니다 20년 넘는 기간 동안 표준이 되었고 대부분의 웹서버(Nginx, IIS, Apache)가 FastCGI 기능을 제공합니다
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don't have to use the web site, you can
* copy this file to "wp-config.php" and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB_USER', 'hoylee' );
/** MySQL database password */
define( 'DB_PASSWORD', 'hoylee' );
/** MySQL hostname */
define( 'DB_HOST', 'cip-mariadb' );
define('WP_HOME', 'http://192.168.99.10:5050' );
define('WP_SITEURL', 'http://192.168.99.10:5050' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
apiVersion: v1
kind: Service
metadata:
name: service-wordpress
labels:
app: wordpress
annotations:
metallb.universe.tf/allow-shared-ip: wp
spec:
externalTrafficPolicy: Cluster
type: LoadBalancer
loadBalancerIP: 192.168.99.10
ports:
- port: 5050
name: http
protocol: TCP
targetPort: 5050
# 셀렉터에 해당하는 라벨로트래픽을 보내준다.
# targetport는 특정포드로 접근하기 위핸 포트 넘버, (deployment 에서 설정한 pod의 포트 넘버)
selector:
app: wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
selector:
matchLabels:
app: wordpress
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress
imagePullPolicy: Never
ports:
- containerPort: 5050
livenessProbe:
exec:
command:
- sh
- /tmp/healthy.sh
initialDelaySeconds: 8
periodSeconds: 5
alpine linux 공식위키 - phpmyadmin 설치방법
FROM alpine:3.12
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN mkdir -p /run/nginx
RUN apk update && apk upgrade
RUN apk add nginx openrc openssl telegraf \
php7 php7-fpm php7-mysqli php7-xml php7-simplexml php7-json \
php7-iconv php7-tokenizer php7-xmlwriter php7-session php7-mbstring
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY telegraf.conf /etc/telegraf/
COPY ./healthy.sh /tmp/healthy.sh
RUN wget http://files.directadmin.com/services/all/phpMyAdmin/phpMyAdmin-5.0.2-all-languages.tar.gz
RUN tar -zxvf phpMyAdmin-5.0.2-all-languages.tar.gz
RUN rm phpMyAdmin-5.0.2-all-languages.tar.gz
RUN mv phpMyAdmin-5.0.2-all-languages phpmyadmin
COPY config.inc.php phpmyadmin/config.inc.php
RUN chmod 644 phpmyadmin/config.inc.php
COPY ./start_php.sh .
EXPOSE 5000
CMD sh start_php.sh
#!/bin/sh
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=AITEAM/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
mv localhost.dev.crt etc/ssl/certs/
mv localhost.dev.key etc/ssl/private/
chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key
telegraf & /usr/sbin/php-fpm7 --nodaemonize & nginx -g 'daemon off;'
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* This is needed for cookie based authentication to encrypt password in
* cookie. Needs to be 32 chars long.
*/
$cfg['blowfish_secret'] = 'hello world'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
/**
* Servers configuration
*/
$i = 0;
/**
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'service-mariadb';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['user'] = 'admin';
$cfg['Servers'][$i]['password'] = 'password';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
/**
* Directories for saving/loading files from server
*/
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
- 워드프레스는 MySQL 데이터베이스랑 같이 작동
저는 mysql대신 mariadb를 사용했습니다. 제 글에선 mysql을 mariadb로 생각하시면 될거 같습니다.
과제는 mysql을 사용하는것이였지만, 저는 몰래 mariaDB를 사용햇습니다. ㅠ..ㅠ
docker build -t MySQL srcs/MySQL/
FROM alpine:3.12
RUN apk update && apk upgrade \
&& apk add mariadb mariadb-client curl \
&& apk add openrc \
&& rm -rf /var/cache/apk/*
ADD https://dl.influxdata.com/telegraf/releases/telegraf-1.6.3-static_linux_amd64.tar.gz ./
RUN tar -C . -xzf telegraf-1.6.3-static_linux_amd64.tar.gz && \
chmod +x telegraf/* && \
cp telegraf/telegraf /usr/bin/ && \
rm -rf *.tar.gz* telegraf/
COPY telegraf.conf /etc/telegraf/
COPY my.cnf /etc/
COPY start_mariadb.sh .
COPY hoylee_db.sql .
COPY create_db .
COPY ./healthy.sh /tmp/healthy.sh
VOLUME ["/var/lib/mysql"]
EXPOSE 3306
ENTRYPOINT sh start_mariadb.sh
추가적으로 my.cnf 에서도 datadir 경로를 설저합니다.
[mysqld]
socket=/run/mysqld/mysqld.sock
port=3306
datadir=/var/lib/mysql
user=root
bind-address=0.0.0.0
skip-networking=false
mysql.sock은 Unix Domain Socket 입니다.
unix domain soket은 컴퓨터가 다른 프로세스와는 통신할수 없고, 같은 컴퓨터에 있는 프로세스끼리 통신이 가능함. (tcp/ip보다 속도가 빠르다., 여기서는 mariadb서버와 mariadb클라이언트 사이를 연결하는데 사용한다., 아무래도 DB데이터 이다보니 소켓중에서도 tcp/ip를 쓰는 통신이 아닌 내부망끼리 연결하는 통신을 사용한거 같다. 추측입니다.)
tcp/ip연결는 4계의 계층으로 연결되어 있다. 그림참조 7계층 설명
우리가 만든 워드프레스와 mysql은 응용계층에 해당하고, 이 두개의 응용 개층끼리 통신을 하기 위해서는 아래와 같이 캡슐화 되는 작업이 필요하다.캡슐화그림참조
만약 wordpress에서 marieaDB로 tcp/ip통신을 한다면 wordpress의 http 정보 -> 전송계층형태로 캠슐화 -> 네트워크 계층형태 캡슐화 -> 데이터링크 계층형태 캡슐화 -> 라우터 -> mariadb 데이터링크 -> mariadb 네트워크 계층 -> 전송계층 -> mariadb 응용계층 순으로 정보를 전달하게 된다. osi 7 계층 설명
datadir=/var/lib/mysql : 데이터 디렉토리 경로 지정
데이터 디렉토리란? : 데이터 디렉토리는 시스템 카탈로그에 수록된 데이터를 접근하기 위한 정보를 유지하는 시스템데이터디렉토리란? 참고
시스템 디렉토리란? : 시스템 카탈로그는 데이터베이스 관리자의 도구로, 데이터베이스에 저장되어 있는 모든 데이터 개체들에 대한 정의나 명세에 대한 정보가 수록되어 있는 시스템 테이블이다.시스템 디렉토리?
var/lib 폴더 = 해당 계층은 어플리케이션이나 시스템에 관련된 상태 정보를 수행한다. 상태 정보라 함은 프로그램이 실행되는 동한 수정하고 특정 호스트의 호출과 관련된 데이터를 말한다.var 폴더 정리 사이트 good!
bind-address=0.0.0.0 : bind-address는 mysql server의 listen ip로 맞추어 주면된다. (sudo net stat -ntlp |grep mysqld) 라고 입력해서 나오는 아이피로 입력해도 되고, 지금처럼 0.0.0.0으로 입력해줘도 된다. 클라이언트랑 서버사이에 연결을 위해 입력함.
skip-networking=false : skip-networking 이 지시가 활성화 되면, 오로지 sock 파일로만 통신 됨(우린 포트로 클라이언트랑 통신함.)
rc default
/usr/bin/telegraf &
/etc/init.d/mariadb setup
rc-service mariadb start
mysql -u root mysql < create_db
mysql -u root my_db < hoylee_db.sql
rc-service mariadb stop
/usr/bin/mysqld_safe & telegraf & /usr/bin/mysqld_safe
mariadb를 설치 해주고, rc를 통해 시작함. (debian os에서는 service mariadb start 이렇게 바로 실행햇는데 alpine에서는 바로 실행할수가 없어서 openrc를 이용함)
앞에도 있는 내용이지만 한번더..
실행한 mysql의 아이디와 설정들을 진행해주고, 설정한 계정을 적용시키기 위해,rc-service mariadb stop를통해 중지시키고 /usr/bin/mysqld_safe로 재시작해준다.
/usr/bin/mysqld_safe 명령어는 mariadb를 실행하는 명령어
CREATE DATABASE my_db;
CREATE USER 'admin'@'%' IDENTIFIED BY 'password';
GRANT ALL ON my_db.* TO 'admin'@'%' WITH GRANT OPTION;
The WordPress website will have several users and an administrator.
과제에서 워드프레스에 접속했을때 유저와 관리자가 있어야한다고 했다.
mysql과 wordpress가 연결된 상태에서 wordpress에 접속하면, sql파일이 생성되는데 이 파일에 관리자 사용자를 추가한 생태로 저장해서 marieadb 이미지를 구울때 업로드 해주는 원리다.(아래와 같이 유저를 추가한 상태로, phpmyadmin 접속)
phpmyadmin 에서 내보내기를 통해 파일을 다운받고, 원하이름으로 파일 명을 변경하면 된다. 나는 hoylee_db.sql로 변경했다.
mysql -u root my_db < hoylee_db.sql 그후 파일을 이렇게 절대 권한으로 들어가서 써주면 적용이된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-volume-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-deploy
spec:
selector:
matchLabels:
app: mariadb
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb-container
image: mysql
imagePullPolicy: Never
ports:
- containerPort: 3306
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mariadb-volume
volumes:
- name: mariadb-volume
persistentVolumeClaim:
claimName: mariadb-volume-claim
---
apiVersion: v1
kind: Service
metadata:
name: cip-mariadb
spec:
type: ClusterIP
ports:
- port: 3306
name: mariadb
targetPort: 3306
selector:
app: mariadb
PersistentVolumeClaim 이란? 일반적으로 디스크 볼륨을 설정하려면 물리적 디스크를 생성해야한다. 쿠버네티스는 물리적 디스크를 생성하는 복잡한 과정을 추상화를 통해서 간단하게 개발자가 볼륨을 생성하는 기능을 제공하는데 그건 바로 PersistentVolumeClaim와 PersistentVolume 을 이용하는 방법이다.
시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록한다.
개발자는 Pod를 생성할때, 볼륨을 정의하고, 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여, 관리자가 생성한 PV와 연결한다.
조대협님의 persistentvolume참고
HTTP 프로토콜(데이터 전송 규약)을 통해 접속되는 WWW는 일반 문자를 비롯, 사진, 음악/동영상 콘텐츠까지 간편하게 사용할 수 있다는 장점이 있지만, 많은 양의 파일을 일괄적으로 주고 받기에는 결정적으로 속도도 느리고 파일 제어도 번거롭다. 이렇게 대용량 파일을 네트워크로 주고 받을떄는 파일 전송 전용 서비스인 ftp를 이용하는것이 유리하다.
ssl :(ftp에 tls 또는 ssl프로토콜이 적용된게 ftps이고, ssh프로토콜 기반으로 만들어진게 sftp이다. sftp에도 ftp라는 이름이 들어가지만 ftps와 기술적인 연관겅은 없는 완전히 다른 프로토콜이다.)
ssl은 대칭키를 사용하는데, 대칭키는 2개의 키를 만든다. (공개키, 비공개키) 대칭키의 특징은 공개키로 암호화 해한 데이터는 공개키로 복호화 시키지 못하고 비공개키로 복호화 가능하다. 반대로 비공개키로 암호화 한 데이터는 공개키로 복호화 가능하다. 이러한 비공개키는 server에 저장하고 클라이언트에 공개키를 제공한다. 문제는 이러한 대칭키도 결국엔 키를 전송해야 사용이 가능하기 떄문에 키를 전송할떄 키를 탈취 당할수 있다. 하지만 이러한 키로 악용을 하더라도 이 키는 대칭하는 퍼블릭키를 차단하면 된다. 이러한 개념을 전자서명이라고 한다. 또한 문제점은 사람이 증가 할수록 따로따로 킹교환을 해주어야해서 교환할 키가 방대해진다.
ssl공개키 비공개키
vsftpd란? "UNIX 계열 시스템을위한 가장 안전하고 빠른 FTP 서버"라고 주장합니다. NimbleX, Slackware 등의 기본 FTP 서버입니다. 또한 상대적으로 쉽게 구성 할 수 있으므로 권장됩니다.
FROM alpine:3.12
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk update && apk add vsftpd openssl supervisor telegraf \
&& mkdir -p /var/ftp \
&& rm -rf /var/cache/apk/*
COPY ./telegraf.conf /etc/telegraf/
RUN adduser -D -g 'hoylee' hoylee
RUN echo "hoylee:password" | chpasswd
COPY ./supervisord.conf /etc/
COPY ./start.sh /
COPY ./vsftpd.conf /etc/vsftpd/
EXPOSE 21 21000
CMD sh start.sh
pam_service_name=vsftpd
write_enable=YES
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
ssl_enable=YES
rsa_cert_file=/etc/vsftpd/ftps.crt
rsa_private_key_file=/etc/vsftpd/ftps.key
xferlog_enable=YES
seccomp_sandbox=NO
pasv_address=192.168.99.10
pasv_min_port=21000
pasv_max_port=21000
#!/bin/sh
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=AITEAM/CN=localhost" -keyout /etc/vsftpd/ftps.key -out /etc/vsftpd/ftps.crt
chmod 600 etc/vsftpd/ftps.crt etc/vsftpd/ftps.key
supervisord -c /etc/supervisord.conf
[supervisord]
nodaemon=true
[program:vsftpd]
command= sh -c "vsftpd /etc/vsftpd/vsftpd.conf && kill -s SIGTERM $(cat supervisord.pid)"
apiVersion: apps/v1
kind: Deployment
metadata:
name: ftps-deployment
labels:
app : ftps
spec:
replicas: 1
selector:
matchLabels:
project: ftps
template:
metadata:
labels:
project: ftps
spec:
containers:
- name: ftps
image: ftps
imagePullPolicy: Never
ports:
- containerPort: 21
- containerPort: 21000
---
apiVersion: v1
kind: Service
metadata:
name: ftps-service
annotations:
metallb.universe.tf/allow-shared-ip: wp
labels:
app: ftps
env: ft_services
spec:
selector:
project: ftps
ports:
- name: ftps
port: 21
- name: ftpsd0
port: 21000
type: LoadBalancer
loadBalancerIP: 192.168.99.10
쿠베틱을 확인 하면 위와같이 나온다.
참고 코드 사이트
$ curl -v --ftp-ssl --insecure -T test.jpg ftp://server.com/folder/ --user user:password
업로드 코드
curl --ftp-ssl --insecure -T test.c ftp://192.168.99.10/ --user hoylee:password
다운로드 코드
curl --ftp-ssl --insecure -o check.c ftp://192.168.99.10/test.c --user hoylee:password
- Time-series DB: 시계열 데이터를 저장하고 활용하는데에 특화된 database
FROM alpine:3.12
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk update && apk add curl influxdb libc6-compat telegraf \
&& rm -rf /var/cache/apk/*
RUN wget https://dl.influxdata.com/telegraf/releases/telegraf-1.17.0_linux_amd64.tar.gz \
&& tar -xf telegraf-1.17.0_linux_amd64.tar.gz --strip-components=2 -C / \
&& rm telegraf-1.17.0_linux_amd64.tar.gz
COPY telegraf.conf /etc/telegraf/
COPY start.sh /
COPY ./healthy.sh /tmp/healthy.sh
EXPOSE 8086
ENTRYPOINT sh start.sh
[global_tags]
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = ""
omit_hostname = false
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "influxdb"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
여기 grafana + telegraf + influxdb 설명 잘되어있음!!!!!!!!!!
시계열 데이터에 대한 대시보드를 제공해주는 Data Visualization Tool인 Grafana에 대해 알아보자.
오픈소스로 공개된 influxdata의 tsdb(time series database)인 influxdb와 데이터를 모아주는 telegraf를 통해 시계열 데이터를 적재하고, 오픈소스 대시보드인 grafana를 통해 대시보드 구성 및 알림 통보를 구성하여, 특정 상황에서 사용자가 정의한 동작을 수행하도록 해야한다.
과제에서는 따로 알림통보를 요청하라고는 안했기에, 대시보드를 띄우는걸 목표로한다.
이 그림 너무 좋아서 가져왔다.. 다시 그려서 업로들하자.
그라파나 공식홈페이지 에 가면 리눅스일떄 그라파나 설치 방법이 나온다.
FROM alpine:3.12
RUN apk update && apk add libc6-compat supervisor \
&& rm -rf /var/cache/apk/*
RUN wget https://dl.grafana.com/enterprise/release/grafana-enterprise-7.3.6.linux-amd64.tar.gz \
&& tar -xf grafana-enterprise-7.3.6.linux-amd64.tar.gz --strip-components=1 -C / \
&& rm grafana-enterprise-7.3.6.linux-amd64.tar.gz
COPY srcs/supervisord.conf /etc/
COPY srcs/start.sh /
EXPOSE 3000
CMD /start.sh
알파인 os를 설치하고, 그라파나를 설치했다.
설치는 그라파나 공홈 - 다운로드 링크 사이트를 이용해서 설치했는데, 우리는 alpine os에서 설치하는데, lib64가 alpine에서는 없다.
libc6-compat 통해 추가 해주었다.
그라파나 설정파일, 데이터 파일을 넣어주고, sh파일을 실행했다. 그라파나 공홈 - 설치링크
#!/bin/sh
telegraf & grafana-server
kubectl delete pod/ftps-deployment-78fdb56cd4-5vcls
kubectl exec pod/nginx-deployment-59c7cb748b-98h5w -- ps
kubectl exec pod/nginx-deployment-59c7cb748b-98h5w -- pkill nginx
모든 데쉬보드를 불러왔고,
다 눌러보진 못했지만 확인해본 모든 파드는 연동되었다.