소개
이 문서에서는 SMI(Subscriber Microservices Infrastructure) CEE(Common Execution Environment) POD(pgpool) 재시작 문제에 대한 해결 방법을 구현하는 방법에 대해 설명합니다.
사전 요구 사항
요구 사항
다음 주제에 대한 지식을 보유하고 있으면 유용합니다.
- Cisco SMI CEE(Ultra Cloud Core CEE)
- 5G CNDP(Cloud Native Deployment Platform) 또는 SMI BM(Bare Metal) 아키텍처
- 도커 및 쿠버네테스
사용되는 구성 요소
이 문서의 정보는 다음 소프트웨어 및 하드웨어 버전을 기반으로 합니다.
- SMI 2020.02.2.35
- Kubernetes v1.21.0
이 문서의 정보는 특정 랩 환경의 디바이스를 토대로 작성되었습니다. 이 문서에 사용된 모든 디바이스는 초기화된(기본) 컨피그레이션으로 시작되었습니다. 네트워크가 작동 중인 경우 모든 명령의 잠재적인 영향을 이해해야 합니다.
배경 정보
SMI란 무엇입니까?
Cisco SMI는 Cisco Mobility, Cable, BNG(Broadband Network Gateway) 비즈니스 유닛에서 마이크로서비스 기반 애플리케이션을 지원하는 클라우드 기술 및 표준의 계층적 스택으로, 모두 유사한 가입자 관리 기능과 유사한 데이터 저장소 요구 사항을 가지고 있습니다.
특성은 다음과 같습니다.
- 레이어 클라우드 스택(기술 및 표준)을 통해 위에서 아래로 구축하며 현재 고객 클라우드 인프라를 수용합니다.
- CEE는 비애플리케이션 기능(데이터 스토리지, 구축, 컨피그레이션, 텔레메트리, 경보)을 위해 모든 애플리케이션에서 공유합니다. 따라서 모든 고객 접점과 통합 지점에 일관된 상호 작용 및 환경이 제공됩니다.
- 애플리케이션 및 CEE는 마이크로서비스 컨테이너에 구축되고 Intelligent Service Mesh와 연결됩니다.
- 자동화를 활성화하기 위해 구축, 구성 및 관리를 위한 노출된 API입니다.
SMI CEE란 무엇입니까?
CEE는 SMI에 구축된 모바일 및 케이블 애플리케이션을 모니터링하기 위해 개발된 소프트웨어 솔루션입니다. CEE는 엔지니어가 디버깅하고 문제를 해결할 수 있는 중앙 집중식 방법으로 애플리케이션에서 정보(주요 메트릭)를 캡처합니다.
CEE는 모든 애플리케이션에 대해 설치되는 공통 툴 집합입니다. 전용 Ops Center를 갖추고 있으며, 이 Ops Center는 모니터 툴을 관리하는 CLI(User Interface) 및 API를 제공합니다. 각 클러스터에 대해 하나의 CEE만 사용할 수 있습니다.
CEE POD란?
POD는 Kubernetes 클러스터에서 실행되는 프로세스입니다. POD는 컨테이너라고 하는 세분화된 단위를 캡슐화합니다. POD에는 하나 이상의 컨테이너가 포함되어 있습니다.
Kubernets는 물리적 또는 가상 머신일 수 있는 단일 노드에 하나 또는 여러 개의 POD를 구축합니다. 각 POD에는 내부 IP 주소 및 포트 공간이 있는 개별 ID가 있습니다. 그러나 POD 내의 컨테이너는 스토리지 및 네트워크 리소스를 공유할 수 있습니다. CEE에는 고유한 기능이 있는 여러 POD가 있습니다. Pgpool 및 Postgres는 여러 CEE POD에 포함되어 있습니다.
pgpool POD란 무엇입니까?
Pgpool은 연결, 복제, 로드 밸런싱 등을 위해 Postgres 리소스 풀을 관리합니다. Pgpool은 PostgreSQL 서버와 PostgreSQL 데이터베이스 간에 작동하는 미들웨어입니다.
Postgres POD란 무엇입니까?
Postgres는 알림과 Grafana 대시보드를 저장하기 위한 이중화와 함께 SQL(Structured Query Language) 데이터베이스를 지원합니다.
문제
pgpool POD는 문제 없이 postgresql POD가 실행되는 동안 정기적으로 재시작됩니다.
알림을 표시하려면 다음 명령을 입력합니다.
show alerts active summary | include "POD_|k8s-pod-"
CEE의 샘플 알림이 여기에 표시됩니다.
[pod-name-smf-data/podname] cee# show alerts active summary | include "POD_|k8s-pod-"
k8s-pod-crashing-loop 1d9d2b113073 critical 12-15T21:47:39 pod-name-smf-data-mas
Pod cee-podname/grafana-65cbdb9846-krgfq (grafana) is restarting 1.03 times / 5 minutes.
POD_Restarted 04d42efb81de major 12-15T21:45:44 pgpool-67f48f6565-vjt Container=
k8s_pgpool_pgpool-67f48f6565-vjttd_cee-podname_a9f68607-eac4-40a9-86ef-db8176e0a22a_1474 of pod= pgpool-...
POD_Restarted f7657a0505c2 major 12-15T21:45:44 postgres-0 Container=
k8s_postgres_postgres-0_cee-podname_59e0a768-6870-4550-8db3-32e2ab047ce2_1385 of pod= postgres-0 in name...
POD_Restarted 6e57ae945677 major 12-15T21:45:44 alert-logger-d96644d4 Container=
k8s_alert-logger_alert-logger-d96644d4-dsc8h_cee-podname_2143c464-068a-418e-b5dd-ce1075b9360e_2421 of po...
k8s-pod-crashing-loop 5b8e6a207aad critical 12-15T21:45:09 pod-name-smf-data-mas Pod
cee-podname/pgpool-67f48f6565-vjttd (pgpool) is restarting 1.03 times / 5 minutes.
POD_Down 45a6b9bf73dc major 12-15T20:30:44 pgpool-67f48f6565-qbw Pod= pgpool-67f48f6565-qbw52 in namespace=
cee-podname is DOWN for more than 15min
POD_Down 4857f398a0ca major 12-15T16:40:44 pgpool-67f48f6565-vjt Pod= pgpool-67f48f6565-vjttd in namespace=
cee-podname is DOWN for more than 15min
k8s-pod-not-ready fc65254c2639 critical 12-11T21:07:29 pgpool-67f48f6565-qbw Pod
cee-podname/pgpool-67f48f6565-qbw52 has been in a non-ready state for longer than 1 minute.
k8s-pod-not-ready 008b859e7333 critical 12-11T16:35:49 pgpool-67f48f6565-vjt Pod
cee-podname/pgpool-67f48f6565-vjttd has been in a non-ready state for longer than 1 minute.
문제 해결
Kubernetes 마스터에서 다음 명령을 입력합니다.
kubectl describe pods -n
postgres-0"
POD 설명의 샘플 출력이 여기에 나와 있습니다. 출력이 잘립니다.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 14m default-scheduler Successfully assigned cee-pod-name-l1/postgres-2
to pod-name-master-3
Normal Pulling 14m kubelet Pulling image "docker.10.192.x.x.nip.io/cee-2020.02.2.i38/
smi-libraries/postgresql/2020.02.2/postgres:1.3.0-946d87d"
Normal Pulled 13m kubelet Successfully pulled image "docker.10.192.x.x.nip.io/cee-2020.02.2.i38/
smi-libraries/postgresql/2020.02.2/postgres:1.3.0-946d87d" in 29.048094722s
Warning Unhealthy 12m kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:09:48]
pod is not ready
Warning Unhealthy 10m kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:11:18]
pod is not ready
Warning Unhealthy 10m kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:11:48]
pod is not ready
Warning Unhealthy 9m49s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:12:18]
pod is not ready
Warning Unhealthy 9m19s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:12:48]
pod is not ready
Warning Unhealthy 8m49s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:13:18]
pod is not ready
Warning Unhealthy 8m19s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:13:48]
pod is not ready
Warning Unhealthy 7m49s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:14:18]
pod is not ready
Warning Unhealthy 7m19s kubelet Readiness probe failed: [bin][h][ir] >>> [2021-10-11 18:14:48]
pod is not ready
Warning BackOff 6m44s kubelet Back-off restarting failed container
또는
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 13m default-scheduler 0/5 nodes are available: 2 node(s)
didn't match Pod's node affinity/selector, 3 node(s) didn't find available persistent
volumes to bind.
Normal Scheduled 13m default-scheduler Successfully assigned cee-pod-name-l1/postgres-0
to pod-name-master-1
Warning FailedScheduling 13m default-scheduler 0/5 nodes are available: 2 node(s)
didn't match Pod's node affinity/selector, 3 node(s) didn't find available
persistent volumes to bind.
Normal Pulling 13m kubelet Pulling image "docker.10.192.x.x.nip.io/cee-2020.02.2.i38/
smi-libraries/postgresql/2020.02.2/postgres:1.3.0-946d87d"
Normal Pulled 12m kubelet Successfully pulled image "docker.10.192.x.x.nip.io/
cee-2020.02.2.i38/smi-libraries/postgresql/2020.02.2/postgres:1.3.0-946d87d"
in 43.011763302s
Warning Unhealthy 7m20s kubelet Liveness probe failed: [bin][h][imm] >>>
[2021-10-11 18:09:16] My name is pg-postgres-0
해결 방법
참고: 이 절차에서는 애플리케이션의 다운타임을 발생시키지 않습니다.
CEE 종료
CEE를 종료하려면 CEE에서 다음 명령을 입력합니다.
[pod-name-smf-data/podname] cee#
[pod-name-smf-data/podname] cee# config terminal
Entering configuration mode terminal
[pod-name-smf-data/podname] cee(config)# system mode shutdown
[pod-name-smf-data/podname] cee(config)# commit
Commit complete.
시스템이 100%로 이동할 때까지 기다립니다.
폴더에서 콘텐츠 삭제
마스터 VIP에서 각 마스터 VM에 SSH를 연결하고 다음 폴더의 내용을 제거합니다. /data/cee-podname/data-postgres-[0-2].
Master 1
cloud-user@pod-name-smf-data-master-1:~$ sudo rm -rf /data/cee-podname/data-postgres-0
Master 2
cloud-user@pod-name-smf-data-master-2:~$ sudo rm -rf /data/cee-podname/data-postgres-1
Master 3
cloud-user@pod-name-smf-data-master-3:~$ sudo rm -rf /data/cee-podname/data-postgres-2
CEE 복원
CEE를 복원하려면 CEE에서 다음 명령을 입력합니다.
[pod-name-smf-data/podname] cee#
[pod-name-smf-data/podname] cee# config terminal
Entering configuration mode terminal
[pod-name-smf-data/podname] cee(config)# system mode running
[pod-name-smf-data/podname] cee(config)# commit
Commit complete.
시스템이 100%로 이동할 때까지 기다립니다.
사후 확인
마스터에서 Kubernetes를 확인합니다.
cloud-user@pod-name-smf-data-master-1:~$ kubectl get pods -A -o wide | egrep 'postgres|pgpool'
All pods should display up and running without any restarts
CEE에서 알림이 지워졌는지 확인합니다.
CEE에서 알림이 지워졌는지 확인하려면 다음 명령을 입력합니다.
show alerts active summary | include "POD_|k8s-pod-"
또한 하나의 마스터 및 2개의 대기 DB가 있는지 확인하기 위해 이 명령을 입력할 수 있습니다.
echo "0----------------------------------";kubectl
exec -it postgres-0 -n $(kubectl get pods -A | grep postgres | awk '{print $1}' | head -1)
-- /usr/local/bin/cluster/healthcheck/is_major_master.sh;echo "1--------------------------
--------";kubectl exec -it postgres-1 -n $(kubectl get pods -A | grep postgres | awk '{print $1}'
| head -1) -- /usr/local/bin/cluster/healthcheck/is_major_master.sh;echo "2---------------
-------------------"; kubectl exec -it postgres-2 -n $(kubectl get pods -A | grep postgres |
awk '{print $1}' | head -1) -- /usr/local/bin/cluster/healthcheck/is_major_master.sh;
예상 출력은 다음과 같습니다.
cloud-user@pod-name-smf-data-master-1:~$ echo "0----------------------------------";kubectl
exec -it postgres-0 -n $(kubectl get pods -A | grep postgres | awk '{print $1}' | head -1)
-- /usr/local/bin/cluster/healthcheck/is_major_master.sh;echo "1--------------------------
--------";kubectl exec -it postgres-1 -n $(kubectl get pods -A | grep postgres | awk '{print $1}'
| head -1) -- /usr/local/bin/cluster/healthcheck/is_major_master.sh;echo "2---------------
-------------------"; kubectl exec -it postgres-2 -n $(kubectl get pods -A | grep postgres |
awk '{print $1}' | head -1) -- /usr/local/bin/cluster/healthcheck/is_major_master.sh;
0----------------------------------
[bin][h][imm] >>> [2021-12-15 22:05:18] My name is pg-postgres-0
[bin][h][imm] >>> My state is good.
[bin][h][imm] >>> I'm not a master, nothing else to do!
1----------------------------------
[bin][h][imm] >>> [2021-12-15 22:05:19] My name is pg-postgres-1
[bin][h][imm] >>> My state is good.
[bin][h][imm] >>> I think I'm master. Will ask my neighbors if they agree.
[bin][h][imm] >>> Will ask nodes from PARTNER_NODES list
[bin][h][imm] >>> Checking node pg-postgres-0
[bin][h][imm] >>>>>>>>> Count of references to potential master pg-postgres-1 is 1 now
[bin][h][imm] >>> Checking node pg-postgres-1
[bin][h][imm] >>> Checking node pg-postgres-2
[bin][h][imm] >>>>>>>>> Count of references to potential master pg-postgres-1 is 2 now
[bin][h][imm] >>> Potential masters got references:
[bin][h][imm] >>>>>> Node: pg-postgres-1, references: 2
[bin][h][imm] >>> I have 2/2 incoming reference[s]!
[bin][h][imm] >>>> 2 - Does anyone have more?
[bin][h][imm] >>> Yahoo! I'm real master...so I think!
2----------------------------------
[bin][h][imm] >>> [2021-12-15 22:05:21] My name is pg-postgres-2
[bin][h][imm] >>> My state is good.
[bin][h][imm] >>> I'm not a master, nothing else to do!