[클라우드/K8S 기본(13) - StatefulSet]

SooYeon Yeon·2022년 9월 14일
0

클라우드 K8S

목록 보기
15/18

스테이트풀셋(StatefulSet)

  • volumeClaimTemplates 기능을 사용해 PVC를 자동으로 생성할 수 있고, 각 파드가 순서대로 생성되기 때문에 고정된 이름, 볼륨, 설정 등을 가질 수 있다.
  • 서비스가 독립적인 IP를 갖지 않아 외부 노출이 되지 않는다.
  • Deployment와 비교하면, Deployment는 목장의 소처럼 번호를 매기고 이름이 바뀌기도 하고 저장되지 않는데, StatefulSet은 집에서 키우는 강아지 이름을 매기는 것처럼 상태가 저장된다고 볼 수 있다.
  • Cluster IP는 None으로 처리해 headless로 하면, Direct로 들어가게 함(순서 번호에 맞게 이름이 있어야 함)
  • 실제로는 잘 사용하지 않는다. 관리가 어렵고, 볼륨도 따로 삭제 해야 함
  • yaml에서 serviceName : 연결하고자 하는 headless 서비스를 지정해야 한다.

스테이트풀셋 실습

  • sfs.yaml
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
  • nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

nfs-server 켜져있는 지 확인하고, showmount -e localhost 로 export list 확인

  • nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 211.183.3.100
    path: /shared
  • svc.yaml
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으로 이름을 통해 들어가도록 테스트 해보기

  • 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에서 명령어를 수행할 수 있다.

  • 서비스 nginx의 IP는 보이지 않는다.(None)
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을 잘 쓰진 않는다.

0개의 댓글