m2(arm)에서의 minikube 설치 및 litmusChaos 설치 과정입니다. Litmus의 버전은 3.91 버전입니다.
minikube 설치
우선 homebrew를 사용하여 minikube를 설치했습니다. minikube를 설치하기 전에 앞서 해당 조건들이 충족되어야 합니다.
- 2개 이상의 CPU
- 20기가 이상의 디스크
- 2기가 이상의 메모리 용량
- 컨테이너 또는 VM
brew를 통해 minikube 설치 후 minikube를 시작해주었습니다. 만일 최신 k8s api-version이 아닌 다른 버전의 api를 사용하기를 원한다면 minikube start --kubernetes-version=v1.29
옵션을 통해 실행할 수 있습니다.
1.brew install minikube
2. minikube start
설치 후 minikube가 작동되는 것을 확인 하기 위해 다음 명령어를 실행시켰습니다. kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 86m v1.30.0
LitmusChaos 설치
LitmusChaos는 2가지 방식으로 설치하실 수 있습니다. helm과 kubectl입니다. helm이 좀 더 간편하다고 생각했고 관리하기 편하다고 생각하여 helm을 선택하게 되었습니다. mac arm의 경우에는 mongodb의 arm 기술적인 지원하지 않기에 다음 방식으로 설치해주었습니다.
1.helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
2. helm repo list
3. kubectl create ns litmus
4. helm install chaos litmuschaos/litmus \
--namespace=litmus \
--set portal.frontend.service.type=NodePort \
--set mongodb.image.registry=ghcr.io/zcube \
--set mongodb.image.repository=bitnami-compat/mongodb \
--set mongodb.image.tag=6.0.5
만일 ARM이 아니라면 다음 명령어로 설치할 수 있습니다. helm install chaos litmuschaos/litmus --namespace=litmus --set portal.frontend.service.type=NodePort
helm으로 설치하는 과정에서 에러가 발생하는 경우 있습니다. auth-server와 server가 init상태에서 변하지 않을 경우 다음 명령어를 실행시켜주세요.
1.helm uninstall -n litmus chaos
2. helm repo remove litmuschaos
3. helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
4. helm install chaos litmuschaos/litmus \
--namespace=litmus \
--set portal.frontend.service.type=NodePort \
--set mongodb.image.registry=ghcr.io/zcube \
--set mongodb.image.repository=bitnami-compat/mongodb \
--set mongodb.image.tag=6.0.5
NAME: chaos
LAST DEPLOYED: Thu Jul 18 19:46:05 2024
NAMESPACE: litmus
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing litmus 😀
Your release is named chaos and it's installed to namespace: litmus.
정상적으로 설치가 잘되었다면 다음 명령어로 확인하실 수 있습니다.
kubectl get pods -n litmus
NAME READY STATUS RESTARTS AGE
chaos-litmus-auth-server-8499fc4cf-6sf6h 1/1 Running 0 10m
chaos-litmus-frontend-6fd8ff8b48-z8pnw 1/1 Running 0 10m
chaos-litmus-server-5484b76bc-79clm 1/1 Running 0 10m
chaos-mongodb-0 1/1 Running 0 10m
chaos-mongodb-1 1/1 Running 1 (5m37s ago) 9m28s
chaos-mongodb-2 1/1 Running 0 9m16s
chaos-mongodb-arbiter-0 1/1 Running 0 10m
kubectl get svc -n litmus
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
chaos-litmus-auth-server-service ClusterIP 10.111.108.221 <none> 9003/TCP,3030/TCP 11m
chaos-litmus-frontend-service NodePort 10.103.249.236 <none> 9091:31495/TCP 11m
chaos-litmus-server-service ClusterIP 10.104.133.180 <none> 9002/TCP,8000/TCP 11m
chaos-mongodb-arbiter-headless ClusterIP None <none> 27017/TCP 11m
chaos-mongodb-headless ClusterIP None <none> 27017/TCP 11m
ChaosCenter에 접속하기 위해서는 chaos-litmus-frontend-service로 접속할 수 있습니다. 클러스터로 구성된 경우 NodeIP:Port로 접속할 수 있습니다.
minikube의 경우 다음 명령어를 실행하여 접근할 수 있습니다.
minikube service -n litmus chaos-litmus-frontend-service
처음 접속할 시에는 아이디와 비밀번호는 다음과 같습니다.
Username: admin
Password: litmus
발생한 문제
1.MongoDB image(arm)kubectl get pods -A
명령어를 수행한 결과 다음과 같이 mongodb가 CrashBackoff가 난 것을 확인할 수 있다. 정확한 원인을 찾기 위해 다음 명령을 수행했다.
kubectl describe pods chaos-mongodb-0 -n litmus
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 11m default-scheduler 0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Normal Scheduled 11m default-scheduler Successfully assigned litmus/chaos-mongodb-0 to minikube
Normal Pulling 11m kubelet Pulling image "docker.io/bitnami/bitnami-shell:10-debian-10-r431"
Normal Pulled 11m kubelet Successfully pulled image "docker.io/bitnami/bitnami-shell:10-debian-10-r431" in 3.387s (44.771s including waiting). Image size: 79507540 bytes.
Normal Created 11m kubelet Created container volume-permissions
Normal Started 11m kubelet Started container volume-permissions
Normal Created 10m (x4 over 11m) kubelet Created container mongodb
Normal Started 10m (x4 over 11m) kubelet Started container mongodb
Normal Pulled 9m26s (x5 over 11m) kubelet Container image "docker.io/bitnami/mongodb:5.0.8-debian-10-r24" already present on machine
Warning BackOff 96s (x46 over 10m) kubelet Back-off restarting failed container mongodb in pod chaos-mongodb-0_litmus(1c61f1eb-5046-4960-9abb-2f79e418ff4f)
해당 문제가 발생한 원인은 litmus helm chart는 bitnami/mongodb를 사용합니다. 그러나 bitnami/mongodb는 arm에 대한 기술적인 지원을 하지 않기에 mongodb 이미지가 작동을 하지 않아 발생하는 문제입니다. 해당 문제의 경우 https://github.com/bitnami/containers/issues/40947#issuecomment-1968364385 에 따라 문제를 해결해주었습니다.
2.auth server 및 server init 문제
공식 문서에 따라 mongodb 파드들이 crashBackoff 문제가 발생하던 것을 해결했으나 다른 문제가 발생했습니다. 이처럼 mongodb는 실행이 잘되었습니다. 그러나 auth server와 server가 init 상태에셔 변하지 않는 것을 확인했습니다
chaos-litmus-auth-server-8499fc4cf-xxlsd 0/1 Init:0/1 0 9m
chaos-litmus-frontend-6fd8ff8b48-gtg5m 1/1 Running 0 9m
chaos-litmus-server-5484b76bc-zhrd4 0/1 Init:0/1 0 9m
chaos-mongodb-0 1/1 Running 0 9m
chaos-mongodb-1 1/1 Running 0 8m39s
chaos-mongodb-2 1/1 Running 0 8m2s
chaos-mongodb-arbiter-0 1/1 Running 0 8m40s
kubectl describe pods chaos-litmus-server-5484b76bc-gfgft --namespace litmus
명령을 통해 로그를 확인했습니다. mongon-db가 실행되었음에도 불과하고 계속해서 실행하기를 기다리는 중이었습니다.
왜 실행이 안되는지 확인하기 위해서 살펴보던 중에 다음 스크립트를 확인할수 있었습니다. 초기화 컨테이너 부분에서 5초마다 mongodb가 연결이 되었는지 지속적으로 확인하는 스크립트를 발견했습니다. 처음에는 configMap에서 DB_SERVER를 가져오지 못하는 줄 알았습니다.
Init Containers:
wait-for-mongodb:
Container ID: docker://329981d4f9c6e818f73858cbaa90c9fac0bb7fb3c263f964816d0c31630df63a
Image: litmuschaos.docker.scarf.sh/litmuschaos/mongo:6
Image ID: docker-pullable://litmuschaos.docker.scarf.sh/litmuschaos/mongo@sha256:8f6a98f913be5227347e2ac66a707635652e8bc6ddbc682ab2b4db568acb9c0c
Port: <none>
Host Port: <none>
Command:
/bin/bash
-c
Args:
until [[ $(mongosh -u ${DB_USER} -p ${DB_PASSWORD} ${DB_SERVER} --eval 'rs.status()' | grep 'ok' | wc -l) -eq 1 ]]; do sleep 5; echo 'Waiting for the MongoDB to be ready...'; done; echo 'Connection with MongoDB established'
Environment:
DB_PASSWORD: 1234
DB_USER: root
DB_SERVER: <set to the key 'DB_SERVER' of config map 'chaos-litmus-admin-config'> Optional: false
Environment Variables from:
chaos-litmus-admin-secret Secret Optional: false
chaos-litmus-admin-config ConfigMap Optional: false
kubectl describe -n litmus cm chaos-litmus-admin-config
으로 DB_SERVER 정보를 확인했습니다. DB_SERVER에 대한 정의는 잘되어있기에 어떤 것이 문제인지 알수 없었습니다.
Data
====
DB_SERVER:
----
mongodb://chaos-mongodb-0.chaos-mongodb-headless:27017,chaos-mongodb-1.chaos-mongodb-headless:27017,chaos-mongodb-2.chaos-mongodb-headless:27017/admin
SKIP_SSL_VERIFY:
----
kubectl logs chaos-litmus-auth-server-8499fc4cf-xtmzj -c wait-for-mongodb -n litmus
으로 로그를 확인했으나 별다른 정보를 얻지 못하였습니다.
MongoServerSelectionError: Server selection timed out after 30000 ms
Waiting for the MongoDB to be ready...
다른 방법으로는 minikube를 다른 버전으로 실행시키는 것이었습니다. 그러나 동일한 문제가 발생되었습니다.
그러던 중 동일한 mongodb init 이슈가 발생하는 글을 발견했습니다. https://github.com/Orange-OpenSource/towards5gs-helm/issues/4. 해당 issue에서는 k8s core-dns의 문제일 가능성에 대해서 이야기를 했고 https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/ 공식문서에 따라 문제 해결을 시도해보았습니다.
1.kubectl logs --namespace=kube-system -l k8s-app=kube-dns
2. core-dns 파드 재시작
3. kubectl -n kube-system rollout restart deployment coredns
kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
명령어 실행 후 kubectl exec -i -t dnsutils -- nslookup kubernetes.default
실행했으나 정상적으로 잘 작동이 됨을 확인했습니다.
Server: 10.0.0.10
Address 1: 10.0.0.10
Name: kubernetes.default
Address 1: 10.0.0.1
kubectl exec -i -t dnsutils -- nslookup chaos-mongodb-headless.litmus
서비스 확인.kubectl exec -i -t dnsutils -- ping chaos-mongodb-headless.litmus.svc.cluster.local
서비스 확인2.kubectl logs --namespace=kube-system -l k8s-app=kube-dns
로그 확인
[INFO] 10.244.0.21:51231 - 48491 "PTR IN 20.0.244.10.in-addr.arpa. udp 42 false 512" NOERROR qr,aa,rd 143 0.000074291s
[INFO] 10.244.0.21:54463 - 20356 "PTR IN 20.0.244.10.in-addr.arpa. udp 42 false 512" NOERROR qr,aa,rd 143 0.00004675s
[INFO] 10.244.0.21:59173 - 60513 "PTR IN 20.0.244.10.in-addr.arpa. udp 42 false 512" NOERROR qr,aa,rd 143 0.000035917s
[INFO] 10.244.0.21:60011 - 63967 "PTR IN 20.0.244.10.in-addr.arpa. udp 42 false 512" NOERROR qr,aa,rd 143 0.000031166s
[INFO] 10.244.0.26:44737 - 37671 "AAAA IN chaos-mongodb-0.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 174 0.000169166s
[INFO] 10.244.0.26:44737 - 41018 "A IN chaos-mongodb-0.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 160 0.000250666s
[INFO] 10.244.0.26:41007 - 28748 "AAAA IN chaos-mongodb-1.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 174 0.000253917s
[INFO] 10.244.0.26:41007 - 37559 "A IN chaos-mongodb-1.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 160 0.000305917s
[INFO] 10.244.0.26:52689 - 47038 "AAAA IN chaos-mongodb-2.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 174 0.000234958s
[INFO] 10.244.0.26:52689 - 56252 "A IN chaos-mongodb-2.chaos-mongodb-headless.litmus.svc.cluster.local. udp 81 false 512" NOERROR qr,aa,rd 160 0.000259958s
별다른 정보를 얻지 못하던 중 하나의 글을 발견했습니다. https://github.com/suyeon-jung-dev/suyeon-jung-dev/blob/main/learning-records/devops/litmus/installing_chaos.md. 글을 따라 ns 삭제 및 helm repo 를 삭제하고 다시 등록한 결과 문제를 해결하게 되었습니다.
1.kubectl delete ns litmus
2. helm repo remove litmuschaos
그리고나서 helm repo를 다시 추가한 결과 litmuschaos가 잘 작동되는 것을 확인했습니다kubectl get pods -n litmus
. 처음 helm repo를 추가할 때 arm 이미지가 아닌 방식으로 추가해서 발생했던 문제인것 같습니다. 3일간의 고생이 끝이 났습니다.
NAME READY STATUS RESTARTS AGE
chaos-litmus-auth-server-8499fc4cf-6sf6h 1/1 Running 0 41m
chaos-litmus-frontend-6fd8ff8b48-z8pnw 1/1 Running 0 41m
chaos-litmus-server-5484b76bc-79clm 1/1 Running 0 41m
chaos-mongodb-0 1/1 Running 0 41m
chaos-mongodb-1 1/1 Running 1 (36m ago) 40m
chaos-mongodb-2 1/1 Running 0 40m
chaos-mongodb-arbiter-0 1/1 Running 0 41m
Ref
minukube
litmusChoas
litmus-helm
동작 중인 컨테이너 접속
mongodb
참조한 github