토큰
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oaGdsZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU5Mjg5M2UzLWQzMzgtNDk4My1hNzJmLWFhZTMxZjc1ZTM3MyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.zslE1__FJVOyg4k4du9zL_g92p28U9y9X7-gRqX5c6-f5LtS7dufrgjv3U714QQYpLEasDAHLBmFfwLgaiJiYd3iMYJItCTRyq5fz2J-ysvbu5KC4ty60gMWXFmHTT6kvqC3wY4kfyPKihjj3PGnwEIvKMwslFD6yv2fkJy2wz9qsDpH6fxZGlMA9c9rU5a-OlT-_K3raoEUvT2Y3c-MG1IMHemwy3-qrI6yjTuflkvH2UovtOUcSF3OGKDX12vE2My-gVLEo2DghvJWn4Jc84Yl2-ii1T2neEPP5yuIsQx3uCGxJ7ZILPQHqxrP4W1gfnqkme4-yyOrkiRXJdrtZQ
StatefulSet - 실습
1. StatefulSet Controller
- ReplicaSet과 StatefulSet을 만들어서 이론에 설명한 내용이 잘 작동하는지 확인할 예정
ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-web
spec:
replicas: 1
selector:
matchLabels:
type: web
template:
metadata:
labels:
type: web
spec:
containers:
- name: container
image: kubetm/app
terminationGracePeriodSeconds: 10
terminationGracePeriodSeconds: 10
: 삭제될 때 10초 후에 삭제
StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stateful-db
spec:
replicas: 1
selector:
matchLabels:
type: db
template:
metadata:
labels:
type: db
spec:
containers:
- name: container
image: kubetm/app
terminationGracePeriodSeconds: 10
실습 과정
- ReplicaSet 생성
- StatefulSet 생성
- ReplicaSet과 StatefulSet이 생성한 파드 이름 비교
- 각각 replicas를 3으로 올리기
- 다시 두 컨트롤러의 파드 이름 비교
ReplicaSet은 한 번에 만들고, StatefulSet은 하나하나씩 만듦 - ReplicaSet의 파드 삭제 --> 삭제와 동시에 새로운 파드를 만듦
- StatefulSet의 파드 삭제 --> 삭제를 하고, 삭제가 다 되면 똑같은 이름의 파드 생성
- ReplicaSet의 replicas를 0으로 줄이기 --> 10초 후 전부 다 삭제
- StatefulSet의 replicas를 0으로 줄이기 --> 10초마다 인덱스가 높은 순으로 삭제
2. PersistentVolumeClaim
- PVC와 PV를 만들고 ReplicaSet으로 만든 파드와 연결하고 replicas를 늘릴 예정
PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: replica-pvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
storageClassName: "fast"
storageClassName
을 사용해서 동적으로 PV를 만듦
ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-pvc
spec:
replicas: 1
selector:
matchLabels:
type: web2
template:
metadata:
labels:
type: web2
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: storageos
mountPath: /applog
volumes:
- name: storageos
persistentVolumeClaim:
claimName: replica-pvc1
terminationGracePeriodSeconds: 10
- 컨테이너에 volume mount를 함
/applog
에 서비스 로그파일을 생성persistentVolumeClaim
의claimName
에 PVC replica-pvc1가 지정되어 있음nodeSelector
로 PV나 파드가 node1에 생김- replicas를 5로 하고,
nodeSelector
를 빼고 만들면 파드가 서로 다른 노드에 지정되어 오류 발생
StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stateful-pvc
spec:
replicas: 1
selector:
matchLabels:
type: db2
serviceName: "stateful-headless"
template:
metadata:
labels:
type: db2
spec:
containers:
- name: container
image: kubetm/app
volumeMounts:
- name: volume
mountPath: /applog
terminationGracePeriodSeconds: 10
volumeClaimTemplates:
- metadata:
name: volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
storageClassName: "fast"
volumeClaimTemplates
: PersistentVolumeClaim 생성 시 이대로 만들어짐- metadata의 name은 template의 volumeMounts의 name과 같아야함
serviceName
이 stateful-headless임 --> 이따가 headless 서비스 만들 때 이 이름과 맞춰야 함- 라벨이
type: db2
임
실습 과정
- PersistentVolumeClaim 생성
- ReplicaSet 생성
- ReplicaSet으로 만든 파드의 쉘에 들어가서 다음 명령어로 파일 생성
touch /applog/server.log
- ReplicaSet의 replicas를 3으로 늘리기 --> 파드들이 한 PVC에 연결됨
- 4에서 생성한 파드 하나의 쉘에 들어가서 다음 명령어 실행
cd /applog/ ls
server.log가 조회됨 - StatefulSet 생성
- StatefulSet이 생성한 파드의 쉘로 들어가 다음 명령어 실행
cd /applog touch server.log
- StatefulSet이 생성한 Persistent Volume Claim 이름 살펴보기
volume-stateful-pvc-0:volume 이름
+-
+pod 이름
- StatefulSet의 replicas 3으로 늘리기
노드가 자원 상황에 맞춰서 할당됨 - StatefulSet으로 만든 volume-stateful-pvc-1의 쉘에 들어가서 파일 확인
없음cd /applog ls
각각의 App에 맞는 PVC가 연결됨 - volume-stateful-pvc-1의 쉘에서 다음 명령어로 파일 만들기
cd /applog touch db1.txt
- volume-stateful-pvc-1 삭제 후 재생성된 파드에서
db1.txt
존재하는지 확인 --> 존재함 - StatefulSet의 replicas를 0으로 줄이기 --> 순차적으로 하나씩 삭제됨
PVC는 삭제되지 않음
3. Headless Service
Service (Headless)
- Headless 서비스를 만들고 파드와 연결하고
- 새로운 파드 request-pod에서 원하는 파드로 도메인 이름을 사용하여 연결할 예정
apiVersion: v1
kind: Service
metadata:
name: stateful-headless
spec:
selector:
type: db2
ports:
- port: 80
targetPort: 8080
clusterIP: None
- StatefulSet의 정의에 맞춰 name, selector 설정
clusterIP: None
으로 해서 headless 서비스 만들기
Pod
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name: container
image: kubetm/init
실습 과정
- 이전에 만든 StatefulSet의 replicas를 3으로 바꿔놓기
- headless Service 생성
- request-pod 생성
- request-pod의 쉘에 들어가서 다음 명령어 입력
nslookup stateful-headless
쿠버네티스 내부 DNS를 통해서 headless에 연결된 pod의 아이피 주소를 알 수 있음 - request-pod의 쉘에 들어가서 다음 명령어 입력하여 파드와 직접 연결
curl stateful-pvc-0.stateful-headless:8080/hostname
도메인 이름으로 원하는 파드에 연결할 수 있음
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 38. Ingress - 실습 (0) | 2021.02.25 |
---|---|
[k8s] 37. Ingress - Nginx (0) | 2021.02.25 |
[k8s] 35. StatefulSet (0) | 2021.02.25 |
[k8s] 34. Kubernetes Dashboard - 실습 (0) | 2021.02.24 |
[k8s] 33. Kubernetes Dashboard (0) | 2021.02.24 |