분석용 이미지를 준비.컨피그맵에 구성하여 확장 시 동일한 파일을 볼 수 있도록 처리vagrant@slave1:~$ kubectl create deploy nginx --image=nginx
deployment.apps/nginx created
vagrant@slave1:~$ kubectl exec -it $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- nginx -v
nginx version: nginx/1.27.4
vagrant@slave1:~$ kubectl exec -it $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- bash
root@nginx-58bc5fbc45-kpj7r:/# exit
vagrant@slave1:~$ k delete deploy nginx
deployment.apps "nginx" deleted
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
vagrant@slave1:~$ k apply -f nginx-sc.yml
storageclass.storage.k8s.io/local-storage created
vagrant@slave1:~$ k get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 3s
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv1
labels:
type: local
spec:
storageClassName: local-storage
persistentVolumeReclaimPolicy: Delete
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data1"
vagrant@slave1:~$ k apply -f nginx-pv.yml
persistentvolume/mypv1 created
vagrant@slave1:~$ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv1 500Mi RWO Delete Available local-storage 6s
mypv2 500Mi RWO Delete Available local-storage 6s
mypv3 500Mi RWO Delete Available local-storage 6s
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
vagrant@slave1:~$ k apply -f nginx-pvc.yml
persistentvolumeclaim/mypvc created
vagrant@slave1:~$ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Pending local-storage 3s
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx
nginx.cnf 파일을 포함하는 컨피그맵을 생성한다.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx
data:
nginx.conf: |
user nginx;
worker_processes 3;
error_log /var/log/nginx/error.log;
events {
worker_connections 10240;
}
http {
log_format main
'remote_addr:$remote_addr\t'
'time_local:$time_local\t'
'method:$request_method\t'
'uri:$request_uri\t'
'host:$host\t'
'status:$status\t'
'bytes_sent:$body_bytes_sent\t'
'referer:$http_referer\t'
'useragent:$http_user_agent\t'
'forwardedfor:$http_x_forwarded_for\t'
'request_time:$request_time';
access_log /var/log/nginx/access.log main;
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
volumes:
- name: shared-data
persistentVolumeClaim:
claimName: mypvc
- name: nginx-conf
- name: nginx-conf
configMap:
name: nginx
items:
- key: nginx.conf
path: nginx.conf
- name: log
emptyDir: {}
최초 www 화면 띄우기가 종종 힘들때가 있다. 서비스에서 디플로이먼트 연결이 안되던지, www root 위치를 찾으려고 하는 데 curl이 설치되어 있지 않아 불편할 때가 있다. 이럴 때
curl 이 지원되는 디버깅용 이미지를 설치하면 편리하다.최초에는 아래 처럼 이미지 설치와 동시에 프롬프트를 띄울 수 있다.
vagrant@slave1:~$ kubectl run curl --image=radial/busyboxplus:curl -it
If you don't see a command prompt, try pressing enter.
[ root@curl:/ ]$
이후는 일반 pod 에 접속하듯이 사용할 수 있다.
vagrant@master:~$ k get po
NAME READY STATUS RESTARTS AGE
curl 1/1 Running 4 (60m ago) 39h
nginx-865d44cb48-wvd5w 1/1 Running 0 52m
vagrant@master:~$ k exec -it curl -- sh
[ root@curl:/ ]$ cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
[ root@curl:/ ]$ curl nginx.default.svc.cluster.local
<H1>hello</H1>
5000 포트로 접근 시 {"message":"Hello, FastAPI!"} 응답 확인
vagrant@slave1:~$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myfastapi NodePort 10.105.125.216 <none> 5000:31217/TCP 3h23m
vagrant@slave1:~$ k exec -it curl -- sh
[ root@curl:/ ]$ curl myfastapi.default.svc.cluster.local:5000/
{"message":"Hello, FastAPI!"}
localhost/api를 호출했을 경우 backend인 http://myfastapi.default.svc.cluster.local:5000/ 호출하도록 구성
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx
data:
nginx.conf: |
user nginx;
worker_processes 3;
error_log /var/log/nginx/error.log;
events {
worker_connections 10240;
}
http {
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://myfastapi.default.svc.cluster.local:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
}
nginx 의 서비스 주소로 접근하여 /api 엔드포인트를 호출하면 벡엔드 api 호출하는 것을 확인
vagrant@slave1:~$ k exec -it curl -- sh
[ root@curl:/ ]$ curl nginx.default.svc.cluster.local/api
{"message":"Hello, FastAPI!"}