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가 있어야 함
root@manager:~/k8slab/etc# vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
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
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는 없어야 함.
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
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
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)
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서버
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을 열어 둠
/ # 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로 지정함
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
```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
주기적으로 실행하는 쿠버네티스 오브젝트이고, 특정 시간 간격으로 job(지정된 업무)을 반복적으로 실행할 수 있다.
분 시 일 월 요일
ex) 1분마다 date의 결과값을 출력하라.
*/1 * * * *
ex) 2분마다 date의 결과값을 출력하라.
*/2 * * * *
ex) 매 시 1분에 date를 출력하고 싶다면?
1 * * * *
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: 뒤의 명령을 실행
root@manager:~/k8slab/etc# k apply -f cronjob.yaml
cronjob.batch/testcron created
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개만 기본적으로 기록한다.
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개씩 있다.
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를 하나씩 배포하고 싶은 경우에도 활용한다.
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가 배포된다. 즉, 마스터에도 배포한다.
root@manager:~/k8slab/etc# k describe node manager | grep Taints
Taints: node-role.kubernetes.io/master:NoSchedule
taint: pod 배포에 대한 스케쥴을 관리한다. 현재는 NoSchedule이므로 pod가 배포되지 않는다.
root@manager:~/k8slab/etc# k describe node worker1 | grep Taints
Taints: <none>
worker는 taint가 없으므로 무조건 pod가 배포된다.
root@manager:~/k8slab/etc# k apply -f daemon.yaml
daemonset.apps/test created
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개임