[쿠버네티스] Stateful Set, CronJob, DaemonSet

gununoo·2022년 9월 14일
1

Kuberbetes

목록 보기
8/10

Stateful Set

  • stateful set 생성
root@manager:~/k8slab/etc# vi sfs.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 3
  serviceName: nginx # 연결하고자 하는 headless service 지정. clusterip는 없어야 한다. 
  selector:
    matchLabels:
      app: nginx # label 
  template:   
    metadata:
      labels:
        app: nginx # label 
    spec:
      containers:
      - name: nginx # container 이름 
        image: nginx
        volumeMounts:
        - name: nfs-vol # volume 이름 같아야 함 
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol # volume 이름 같아야 함 
        persistentVolumeClaim:
          claimName: nfs-pvc # nfs-pvc에 해당하는 pvc가 있어야 함 
  • pvc 생성
root@manager:~/k8slab/etc# vi nfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi
  • pv 생성
root@manager:~/k8slab/etc# vi 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 생성
root@manager:~/k8slab/etc# vi svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx # label 
  ports:
    - port: 80
  clusterIP: None # clusterIP는 없어야 함. 

  • 배포 순서
    • pv 배포
    • pvc 배포
    • stateful set 배포
    • service 배포
  • pv, pvc 바운드 확인
root@manager:~/k8slab/etc# k get pv,pvc
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
persistentvolume/nfs-pv   100Mi      RWX            Retain           Bound    default/nfs-pvc                           11s

NAME                            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nfs-pvc   Bound    nfs-pv   100Mi      RWX                           8s

STATUS: Bound

  • pod 생성 확인
root@manager:~/k8slab/etc# k get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP                NODE      NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          20s   192.168.235.166   worker1   <none>           <none>
web-1   1/1     Running   0          15s   192.168.189.105   worker2   <none>           <none>
web-2   1/1     Running   0          9s    192.168.182.35    worker3   <none>           <none>
  • web-0
  • web-1
  • web-2
  • nginx 서비스 확인
root@manager:~/k8slab/etc# k describe svc nginx | grep IP
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None

clusterIP가 없음

root@manager:~/k8slab/etc# k describe svc nginx | grep Endpoints
Endpoints:         192.168.182.35:80,192.168.189.105:80,192.168.235.166:80

Endpoint가 3개 있음 (Pod)

  • kubernetes 서비스와 비교
root@manager:~/k8slab/etc# k describe svc kubernetes | grep IP
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.0.1
IPs:               10.96.0.1

clusterIP: 10.96.0.1

root@manager:~/k8slab/etc# k describe svc kubernetes | grep Endpoints
Endpoints:         211.183.3.100:6443

Endpoint는 manager의 api서버


  • 테스트용 busybox 생성
root@manager:~/k8slab/etc# k run -it \
> --image busybox \
> testdns \
> --restart Never \
> --rm \
> /bin/sh
  • -it: 대화 창구를 열고 인터렉티브하게 통신하겠다.
  • testdns: pod의 이름
  • --restart Never: 생성하다가 실패하면 재시도하지 않음
  • --rm: 사용 다 하고 빠져나오면 pod 삭제 ㅇ
  • /bin/sh: -it를 통해 상호 통신을 하기 위하여 shell을 열어 둠
  • hosts 확인
/ # cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
192.168.235.171 testdns

192.168.235.171 testdns
-> 자기 자신의 ip 주소를 testdns로 지정함


  • coredns의 주소 확인
root@manager:~/k8slab/etc# k run net \
> --image=sysnet4admin/net-tools \
> --restart Never \
> --rm \
> -it \
> -- nslookup web-1.nginx

Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   web-1.nginx.default.svc.cluster.local
Address: 192.168.189.105

pod "net" deleted
  • net : pod 이름
  • nslookup web1.nginx: web1.nginx의 IP를 찾아달라

coredns의 주소: 10.96.0.10


  • pod의 ip 확인
```shell
root@manager:~/k8slab/etc# k 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.166
Name:   nginx.default.svc.cluster.local
Address: 192.168.182.35
Name:   nginx.default.svc.cluster.local
Address: 192.168.189.105

pod "net" deleted
  • 192.168.235.166
  • 192.168.182.35
  • 192.168.189.105

CronJob

주기적으로 실행하는 쿠버네티스 오브젝트이고, 특정 시간 간격으로 job(지정된 업무)을 반복적으로 실행할 수 있다.

분 시 일 월 요일

ex) 1분마다 date의 결과값을 출력하라.

*/1 * * * *

ex) 2분마다 date의 결과값을 출력하라.

*/2 * * * *

ex) 매 시 1분에 date를 출력하고 싶다면?

1  * * * *

  • cronjob 생성
root@manager:~/k8slab/etc# vi cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: testcron
spec:
  schedule: "*/1 * * * *" #  # 1분 마다 
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: testcronctn
            image: busybox
            args: ["sh", "-c", "date"] # shell로 date 명령을 실행. -c: 뒤의 명령을 실행 
  • cronjob 배포
root@manager:~/k8slab/etc# k apply -f cronjob.yaml 
cronjob.batch/testcron created
  • job 배포 확인
root@manager:~# k get jobs 
NAME                COMPLETIONS   DURATION   AGE
testcron-27718753   1/1           5s         2m19s
testcron-27718754   1/1           5s         79s
testcron-27718755   1/1           9s         19s

-> 3개 까지 표시가 된다.

cronjob은 모든 히스토리를 기록하지는 않는다. 성공한 job 3개, 실패한 job 1개만 기본적으로 기록한다.


DaemonSet

  • daemonset 확인
root@manager:~/k8slab/etc# k get daemonset 
No resources found in default namespace.

-> default ns에는 없다.

root@manager:~/k8slab/etc# k get daemonset -n kube-system
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   4         4         4       4            4           kubernetes.io/os=linux   7d
kube-proxy    4         4         4       4            4           kubernetes.io/os=linux   7d

-> kube-system ns에 있다.
-> calico-node, kube-proxy가 4개씩 있다.

  • pod 확인
root@manager:~/k8slab/etc# k get pod -n kube-system | grep calico-node
calico-node-2sz4c                          1/1     Running   4          7d
calico-node-m2h6w                          1/1     Running   4          7d
calico-node-rt277                          1/1     Running   4          7d
calico-node-v7fmd                          1/1     Running   5          7d

root@manager:~/k8slab/etc# k get pod -n kube-system | grep kube-proxy
kube-proxy-6qrbn                           1/1     Running   4          7d
kube-proxy-gsz29                           1/1     Running   5          7d
kube-proxy-hfn5f                           1/1     Running   4          7d
kube-proxy-vrm66                           1/1     Running   4          7d

daemonset의 실체는 pod이다.
단, daemonset으로 생성된 pod는 모든 노드에 일괄적으로 하나씩 자동 배포가 된다.
주로 로그 확인, 모니터링, 노드 간 네트워킹(overlay) 등을 위한 에이전트로 활용된다.
대표적으로 calico, kube-proxy 등의 네트워크 플러그인이 있다.
각 노드에 백업을 위한 볼륨 pod를 하나씩 배포하고 싶은 경우에도 활용한다.

  • daemonset 생성
root@manager:~/k8slab/etc# vi daemon.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: test
spec:
  selector:
    matchLabels:
      name: test
  template:
    metadata:
     labels:
       name: test
    spec:
      tolerations: # taints가 무시되고 이하에 적용한 부분에 따라 pod가 배포된다. 즉, 마스터에도 배포한다. 
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: test
        image: busybox
        args: ["tail", "-f", "/dev/null"] # pod기 중지되지 않도록 하기 위한 설정 
        resources:
          limits:
            cpu: 100m
            memory: 200Mi
spec:
      tolerations: 
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

tolerations: taints가 무시되고 이하에 적용한 부분에 따라 pod가 배포된다. 즉, 마스터에도 배포한다.


  • master의 taint 확인
root@manager:~/k8slab/etc# k describe node manager | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule

taint: pod 배포에 대한 스케쥴을 관리한다. 현재는 NoSchedule이므로 pod가 배포되지 않는다.

  • worker의 taint 확인
root@manager:~/k8slab/etc# k describe node worker1 | grep Taints
Taints:             <none>

worker는 taint가 없으므로 무조건 pod가 배포된다.


  • daemon 배포
root@manager:~/k8slab/etc# k apply -f daemon.yaml 
daemonset.apps/test created
  • pod 확인
root@manager:~/k8slab/etc# k get pod -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP                NODE      NOMINATED NODE   READINESS GATES
test-6j9nh   1/1     Running   0          10s   192.168.182.40    worker3   <none>           <none>
test-cc6rf   1/1     Running   0          10s   192.168.235.177   worker1   <none>           <none>
test-g5qbw   1/1     Running   0          10s   192.168.189.66    worker2   <none>           <none>
test-n4gkq   1/1     Running   0          10s   192.168.102.80    manager   <none>           <none>

manager에도 생성되었기 때문에 pod가 4개임

profile
take a look

0개의 댓글