티스토리 뷰
7탄!! 쿠버네티스에 pod 올리자! pod? 뭐에요?
9탄!! 쿠버네티스 오토스케일링(kubernetes autoscaling)
# 부록!! 쿠버네티스 장애 처리5탄부록!! 쿠버네티스 장애 처리
#기타 참고하기
헬름챠트로 올리기[샘플]11) 쿠버네티스 가상스토리지(Ceph) 설치
아래 용어들 한번 체크해보자!
namespace api server etcd node controller replicaset deployment-controller namespace-controller endpoint-control cronjob job-controller pv-protection-controller service-ccount-controller |
stateful-set
-Statefulset과 배포의 차이점
Statefulset은 하나 이상의 포드를 관리하고 유지하는 데 사용되는 Kubernetes 컨트롤러입니다. 그러나 ReplicaSets 및보다 강력한 Deployments 와 같은 다른 컨트롤러도 마찬가지 입니다. Kubernetes는 StatefulSets를 무엇에 사용합니까?
이 질문에 대답하려면 상태 비 저장 응용 프로그램과 상태 비 저장 응용 프로그램에 대해 논의해야합니다.
상태 비 저장 응용 프로그램은 사용중인 네트워크를 신경 쓰지 않으며 영구 저장소가 필요하지 않은 응용 프로그램입니다. 상태 비 저장 앱의 예로는 웹 서버 (Apache, Nginx 또는 Tomcat)가 있습니다.
반면에 상태 저장 앱이 있습니다. 여러 Zookeeper 인스턴스가 관리하는 Solr 데이터베이스 클러스터가 있다고 가정하십시오. 이러한 응용 프로그램이 올바르게 작동하려면 각 Solr 인스턴스가이를 제어하는 Zookeeper 인스턴스를 알고 있어야합니다. 마찬가지로 Zookeeper 인스턴스 자체가 서로 연결하여 마스터 노드를 선택합니다. 이러한 설계로 인해 Solr 클러스터는 상태 저장 애플리케이션의 예입니다. Kubernetes에 Zookeeper를 배포하는 경우 변경되지 않는 고유 한 ID (호스트 이름, IP 등)를 통해 포드가 서로 연결할 수 있는지 확인해야합니다. 상태 저장 애플리케이션의 다른 예로는 MySQL 클러스터, Redis, Kafka, MongoDB 등이 있습니다.
이러한 차이점을 고려할 때 배포는 상태 비 저장 응용 프로그램과 함께 작동하기에 더 적합합니다. 지금까지 A와 배포가 우려, 포드 교환 할 수있다. StatefulSet은 관리하는 각 포드에 대해 고유 한 ID를 유지합니다. 해당 포드를 다시 예약해야 할 때마다 동일한 ID를 사용합니다.
StatefulSet 노출
는 Kubernetes 서비스를 추상화 층으로서 작용한다. Nginx 웹 서버와 같은 상태 비 저장 응용 프로그램에서 클라이언트는 어떤 포드가 요청에 대한 응답을 받는지 신경 쓰지 않아야합니다. 연결이 서비스에 도달하여 백엔드 포드로 라우팅합니다. 상태 저장 앱에서는 그렇지 않습니다. 위 다이어그램에서 Solr 포드는 포드가 아닌 Zookeeper 마스터에 도달해야 할 수도 있습니다. 이러한 이유로 Statefulset 정의의 일부에는 헤드리스 서비스가 수반 됩니다. 헤드리스 서비스에는 ClusterIP가 없습니다. 대신 DNS 레코드를 생성하는 데 사용되는 여러 끝점을 만듭니다. 각 DNS 레코드는 포드에 바인딩됩니다. 이 모든 것은 Kubernetes에 의해 내부적으로 이루어 지지만 어떻게 작동하는지에 대한 아이디어를 갖는 것이 좋습니다.
Kubernetes Statefulset을 사용하여 상태 저장 응용 프로그램을 배포하는 방법?
아래 코드 스 니펫에서 상태 저장 응용 프로그램을 배포합니다. 간단하게하기 위해 포드 이미지로 Apache를 사용하고 있습니다. 배포는 3 개의 Apache 웹 서버로 구성됩니다. 그들 모두는 영구 볼륨에 연결되어 있습니다. 새 파일을 작성하고 이름을 apache_stateful.yaml로 지정하십시오. 여기에 다음을 추가하십시오.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: www-disk
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
zone: us-central1-a
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: webapp
spec:
selector:
matchLabels:
app: web
serviceName: web-svc
replicas: 3
template:
metadata:
labels:
app: web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: web
image: httpd:2.4
ports:
- containerPort: 80
name: http
volumeMounts:
- name: www
mountPath: /var/www/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: www-disk
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
이 정의에 대한 세부 사항을 논의하기 전에 파일에 실제로 두 개의 정의, 즉 StatefulSet이 사용하는 스토리지 클래스와 StatefulSet 자체가 포함되어 있음을 확인하십시오.
저장 등급
저장소 클래스는 사용자가 클라우드 공급자로부터 필요한 저장소 유형을 지정할 수있는 Kubernetes 개체입니다. 서로 다른 스토리지 클래스는 디스크 대기 시간 및 처리량과 같은 다양한 서비스 품질을 나타내며, 사용되는 시나리오 및 클라우드 제공자의 지원에 따라 선택됩니다. 영구 볼륨 및 영구 볼륨 클레임은 스토리지 클래스를 사용합니다.
영구 볼륨 및 영구 볼륨 클레임
영구 볼륨은 사용자가 각 클라우드 공급자 (이 예에서는 Google GCE를 사용함)가 스토리지를 관리하고 프로비저닝하는 방법에 대한 세부 정보로 이동하지 못하게하는 추상화 계층 역할을합니다. 정의에 따르면 StatefulSet은 포드에 영구 저장 장치가 필요하므로 영구 볼륨을 가장 많이 사용하는 사용자입니다.
영구 볼륨 클레임은 영구 볼륨 사용 요청입니다. 포드 및 노드 유추를 사용하려면 영구 볼륨을 "노드"로, 영구 볼륨 클레임을 노드 리소스를 사용하는 "포드"로 간주하십시오. 여기서 논의 할 리소스는 스토리지 크기, 대기 시간, 처리량 등과 같은 스토리지 속성입니다.
StatefulSet 프로비저닝
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: webapp
정의는 StatefulSets, 리소스 종류 및 메타 데이터를 인식하는 API 버전으로 시작합니다. 이 예에서는 리소스 이름 만 메타 데이터에 추가했지만 레이블을 추가하여 추가로 식별 할 수도 있습니다.
spec: selector: matchLabels: app: web serviceName: web-svc
부
다음으로 사양은 사양이며 사양에는 포드 선택기가 포함되어 있습니다. 다른 Kubernetes 컨트롤러 (예 : Deployments 및 ReplicaSets ) 와 마찬가지로 StatefulSets는 matchLabels를 사용하여 관리해야하는 포드를 선택하고 획득합니다.
또한 아직 만들지 않은 서비스, 포드에 대한 액세스를 제공하는 헤드리스 서비스에 대한 참조가 있습니다.
replicas: 3
replicas 객체는이 StatefulSet이 몇 개의 포드를 만들지 정의합니다.
포드 템플릿은 포드 생성 방법을 정의합니다. 포드에있는 레이블이 포함되어 있습니다 (포드 선택기와 일치해야 함).
template:
metadata:
labels:
app: web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: web
image: httpd:2.4
ports:
- containerPort: 80
name: http
volumeMounts:
- name: www
mountPath: /var/www/html
포드 템플릿 스펙 부분은 terminationGracePeriodSeconds가 포함되어 있습니다. 이 설정은 Kubernetes가 종료 신호를 포드에 전송 한 후 삭제하기 전에 대기해야하는 시간을 정의합니다. Kubernetes는 StatefulSet의 포드가 일반적으로 클러스터의 일부이므로 완전히 종료하기에 충분한 시간이 필요하므로이 값을 0 (비활성화)으로 설정하지 않는 것이 좋습니다.
컨테이너 부분은이 컨테이너가 사용하는 이미지 (이 경우 Apache httpd : 2.4)와 컨테이너가 수신 할 포트 (80)를 정의합니다.
volumeMounts 부분은 영구 볼륨 클레임을 정의하는 곳입니다. 여기에서 볼륨 클레임 이름은 필수이며 VolumeClaimTemplate과 일치해야합니다. 또한 영구 디스크 (/var/www/html)에 액세스하기 위해 포드 내부에서 사용될 마운트 지점을 나타냅니다.
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: www-disk
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
StatefulSet 만들기
이제 정의 파일이 준비되었으므로 kubectl을 사용하여 다음과 같이 적용 할 수 있습니다.
kubectl apply -f apache-stateful.yaml
kubectl apply -f apache-stateful.yaml
정의 파일에는 StorageClass 및 StatefulSet 자원이 포함되므로 다음 출력이 표시됩니다.
storageclass.storage.k8s.io/www-disk created statefulset.apps/webapp created
storageclass.storage.k8s.io/www-disk created statefulset.apps/webapp created
우리의 자원을 사용할 수 있습니다. 포드가 있는지 여부를 봅시다 :
kubectl get pods NAME READY STATUS RESTARTS AGE webapp-0 0/1 ContainerCreating 0 8s
kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-0 0/1 ContainerCreating 0 8s
여기서 두 가지를 확인할 수 있습니다. (1) 세 개를 요청하는 동안 하나의 포드 만 만들어졌으며 (2) 포드 이름에는 StatefulSet 이름이 포함되어 있습니다.
이것은 예상 된 동작입니다. StatefulSet은 배포와 같이 모든 포드를 한 번에 만들지 않습니다. 포드를 시작 및 중지 할 때 순서를 유지합니다. StatefulSet은 포드 ID를 유지하므로 포드 이름은 StatefulSet 이름과 증분 숫자입니다.
몇 초 기다렸다가 kubectl get pods를 다시 발행하면 다음과 유사한 출력이 표시됩니다.
NAME READY STATUS RESTARTS AGE
webapp-0 1/1 Running 0 43s
webapp-1 0/1 ContainerCreating 0 11s
나중에 출력은 다음과 같습니다.
NAME READY STATUS RESTARTS AGE
webapp-0 1/1 Running 0 112m
webapp-1 1/1 Running 0 111m
webapp-2 1/1 Running 0 111m
이제 모든 포드가 시작되었습니다.
StatefulSet을위한 헤드리스 서비스 생성
지금 포드가 실행 중입니다. 그러나 웹 서버가 다른 서버에 어떻게 액세스 할 수 있습니까? 이것은 서비스를 통해 이루어 지므로 서비스를 만들어야합니다. apache_statefulset_service.yaml이라는 새 YAML 파일을 열고 다음을 추가하십시오.
apiVersion: v1
kind: Service
metadata:
name: web-svc
labels:
app: web
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: web
StatefulSet 정의 파일에서 정의한 것과 일치하도록 서비스 이름과 포드 선택기 레이블을 지정해야합니다.
kubectl을 사용하여 서비스를 작성하십시오.
kubectl apply -f apache_statefulset_service.yamlservice/web-access-svc created
작성된 구성 요소 나열
생성 된 구성 요소를 살펴 보겠습니다.
$ kubectl get statefulset
NAME READY AGE
webapp 3/3 21h
우리는 지속적인 볼륨을 가지고
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-077a1891-a25b-11e9-9ecf-42010a800184 1Gi RWO Delete Bound default/www-webapp-2 www-disk 21h
pvc-e79d8843-a25a-11e9-9ecf-42010a800184 1Gi RWO Delete Bound default/www-webapp-0 www-disk 21h
pvc-fa398e2a-a25a-11e9-9ecf-42010a800184 1Gi RWO Delete Bound default/www-webapp-1 www-disk 21h
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-webapp-0 Bound pvc-e79d8843-a25a-11e9-9ecf-42010a800184 1Gi RWO www-disk 21h
www-webapp-1 Bound pvc-fa398e2a-a25a-11e9-9ecf-42010a800184 1Gi RWO www-disk 21h
www-webapp-2 Bound pvc-077a1891-a25b-11e9-9ecf-42010a800184 1Gi RWO www-disk 21h
헤드리스 서비스를 통해 한 포드를 다른 포드에 연결
설정을 테스트해야합니다. 포드 중 하나에 bash 쉘을 열어 봅시다.
kubectl exec -it webapp-0 bash
kubectl exec -it webapp-0 bash
부
httpd 이미지는 기본적으로 curl과 함께 제공되지 않으므로 설치해야합니다.
apt update && apt install curl
부
설치되면 서비스에 연결할 수 있습니다.
root@webapp-0:/usr/local/apache2# curl web-svc<html><body><h1>It works!</h1></body></html>>
부
이것은 Apache가 표시하는 기본 페이지입니다. 서비스가 요청을 백엔드 포드로 라우팅하고 있습니다.
StatefulSet은 포드를 고유하게 식별하는 것입니다. 특정 포드에 연결해 보겠습니다.
root@webapp-0:/usr/local/apache2# curl webapp-1.web-svc<html><body><h1>It works!</h1></body></html>
부
서비스 이름 앞에 포드 이름을 붙여 특정 포드에 연결할 수 있습니다.
StatefulSet 삭제
헤드리스 서비스를 삭제하는 것으로 시작합니다 :
kubectl delete -f apache_stateful_service.yamlservice "web-svc" deleted
부
kubectl delete service web-svc를 실행하여 동일한 결과를 얻을 수 있습니다.
영구 볼륨 및 영구 볼륨 클레임을 사용하여 StatefulSet을 삭제하려면 정의 파일을 사용합니다.
kubectl delete -f apache_stateful.yamlstorageclass.storage.k8s.io "www-disk" deletedstatefulset.apps "webapp" deleted
부
컨트롤러는 10 초의 유예 시간을 유지하고 포드에 정리 시간을 제공합니다. 이 예에서 Apache는 종료하는 데 몇 밀리 초 이상 걸리지 않아야합니다. 그러나 수천 건의 요청을 처리하는 경우 종료하는 데 시간이 더 걸립니다.
TL; DR
- StatefulSet은 배포와 마찬가지로 포드를 관리하는 또 다른 Kubernetes 컨트롤러입니다. 그러나 상태 저장 앱에 더 적합하다는 점에서 배포와 다릅니다.
- 상태 저장 애플리케이션에는 고유 한 ID (예 : 호스트 이름)가있는 포드가 필요합니다. 하나의 포드는 잘 정의 된 이름을 가진 다른 포드에 도달 할 수 있어야합니다.
- StatefulSet가 작동하려면 헤드리스 서비스가 필요합니다. 헤드리스 서비스에는 IP 주소가 없습니다. 내부적으로는 DNS 이름으로 포드를 노출하는 데 필요한 엔드 포인트를 생성합니다. StatefulSet 정의에는 헤드리스 서비스에 대한 참조가 포함되지만 별도로 작성해야합니다.
- 기본적으로 StatefulSet에는 영구 저장소가 필요하므로 호스트 된 응용 프로그램은 재시작시 상태와 데이터를 저장합니다. Kubernetes는 클라우드 공급자의 스토리지 제공 메커니즘 위에 추상화 계층을 제공하기 위해 스토리지 클래스, 영구 볼륨 및 영구 볼륨 클레임을 제공합니다.
- StatefulSet 및 헤드리스 서비스가 생성되면 포드는 서비스 이름이 접두사로 다른 하나에 액세스 할 수 있습니다.
pv-binder-controller
replicaton-controller
kube-controller-manager
kube schedule..
'3. 쿠버네티스의 모든것' 카테고리의 다른 글
10탄!! K8S Namespace 생성방법 (1) | 2020.06.24 |
---|---|
1) 마이크로 쿠버네티스 설치 해보기 (0) | 2020.04.16 |
nosql VS NEW sql 차이 (0) | 2020.04.06 |
9탄!! 쿠버네티스 오토스케일링(kubernetes autoscaling) (0) | 2020.04.02 |
Kubernetes의 이해 (0) | 2020.03.23 |
- Total
- Today
- Yesterday
- [오라클 튜닝] sql 튜닝
- 오라클 트러블 슈팅(성능 고도화 원리와 해법!)
- 트리이스
- 버쳐박스
- 커널
- [오라클 튜닝] instance 튜닝2
- ubuntu
- 오라클
- directory copy 후 startup 에러
- 5.4.0.1072
- ORACLE 트러블 슈팅(성능 고도화 원리와 해법!)
- 앤시블
- startup 에러
- 키알리
- 테라폼
- 쿠버네티스
- 오라클 인스턴트클라이언트(InstantClient) 설치하기(HP-UX)
- (InstantClient) 설치하기(HP-UX)
- K8s
- MSA
- 스토리지 클레스
- 튜닝
- CVE 취약점 점검
- 설치하기(HP-UX)
- pod 상태
- Oracle
- 코로나19
- 여러서버 컨트롤
- 오라클 홈디렉토리 copy 후 startup 에러
- 우분투
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |