apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
replicas: 3
serviceName: nginx # cluster-ip: none
selector:
matchLabels:
app: nginx
template: # Pod
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nfs-vol
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
nfs-server 켜져있는 지 확인하고, showmount -e localhost 로 export list 확인
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
nfs:
server: 211.183.3.100
path: /shared
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 80
clusterIP: None
배포 순서 : PV → PVC (pv pool과 연결) → sfs(statefulset 배포) → svc(서비스와 연결)
kubectl apply -f nfs-pv.yaml
kubectl apply -f nfs-pvc.yaml
kubectl apply -f sfs.yaml
kubectl apply -f svc.yaml
root@manager:~/k8slab/etc# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d22h
service/nginx ClusterIP None <none> 80/TCP 81s
root@manager:~/k8slab/etc# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GAT
web-0 1/1 Running 0 2m 192.168.182.9 worker3 <none> <none>
web-1 1/1 Running 0 115s 192.168.189.81 worker2 <none> <none>
web-2 1/1 Running 0 110s 192.168.235.135 worker1 <none> <none>
root@manager:~/k8slab/etc# kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: None
IPs: None
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 192.168.182.9:80,192.168.189.81:80,192.168.235.135:80 + 1 more...
Session Affinity: None
Events: <none>
EndPoints는 각각 80번 포트로 넘기는 것을 알 수 있고, IP가 할당 되어있지 않다.
test pod로 들어가 nslookup으로 이름을 통해 들어가도록 테스트 해보기
root@manager:~/k8slab/etc# kubectl run net --image=sysnet4admin/net-tools --restart Never --rm -it -- nslookup web-1.nginx
Server: 10.96.0.10 # CoreDNS
Address: 10.96.0.10#53
Name: web-1.nginx.default.svc.cluster.local
Address: 192.168.189.81 # web1 pod의 IP
pod "net" deleted
net : pod 이름
-it : 대화 창구를 열고 인터렉티브 하게 통신
—restart Never : 생성하면서 실패하면 더이상 시도하지 말기
—rm : 사용 다 하고 나오면 삭제하기
다른 pod에서 web-1.nginx를 찾기(nslookup으로)
Server 주소는 CoreDNS 주소
또한
root@manager:~/k8slab/etc# kubectl run -it --image busybox testdns --restart Never --rm /bin/sh
이를 통해 bash에서 명령어를 수행할 수 있다.
root@manager:~/k8slab/etc# kubectl run net --image=sysnet4admin/net-tools --restart Never --rm -it -- nslookup nginx
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: nginx.default.svc.cluster.local
Address: 192.168.235.135
Name: nginx.default.svc.cluster.local
Address: 192.168.182.9
Name: nginx.default.svc.cluster.local
Address: 192.168.189.81
Name: nginx.default.svc.cluster.local
Address: 192.168.235.184
pod "net" deleted
Pod 3개의 IP만 보일 뿐, 서비스는 없다.
LoadBalancer를 쓰면 RR로 지정할 수 없이 pod로 들어가게 하지만, headless를 쓰게 되면 지정된 pod로 들어가도록 할 순 있지만 외부로 노출시킬 수 없다. 이 경우 다른 pod를
만들어 외부에서는 이 pod를 통해 들어오고, 인증을 거쳐 stateful pod로 가는 방법을 고안할 수 있다.
하지만 일반적인 경우 statefulset을 잘 쓰진 않는다.