안녕하세요, 쯀리입니다. 10강 Troubleshooting을 들어가게되었습니다!
오늘은 Application Failure에 관해 다뤄보겠습니다.
https://kubernetes.io/docs/tasks/debug/debug-application/
Application Failure
"Application Failure"에 대한 학습은 애플리케이션이 실패하거나 비정상적으로 동작할 때, 그 원인을 분석하고 이를 방지하거나 복구하는 방법을 배우는 중요한 과정입니다. 이 주제를 학습할 때 다루게 될 주요 개념은 다음과 같습니다:
1. Failure Types (실패 유형)
- Crash Failures: 애플리케이션이 예기치 않게 종료되거나 충돌하는 상황.
- Performance Failures: 애플리케이션이 예상보다 느리게 동작하거나 응답 시간이 길어지는 경우.
- Resource Exhaustion: 메모리, CPU, 디스크 공간 등 시스템 리소스가 부족하여 애플리케이션이 정상적으로 동작하지 않는 경우.
- Dependency Failures: 외부 서비스, 데이터베이스, API 등의 의존성 문제로 인해 발생하는 실패.
2. Root Cause Analysis (원인 분석)
- 로그 분석: 로그 파일을 통해 애플리케이션 실패의 원인을 추적하고 분석하는 방법.
- 메트릭 및 모니터링 도구: Prometheus, Grafana 등 모니터링 도구를 사용하여 애플리케이션의 성능 지표를 분석하고, 실패의 원인을 파악하는 방법.
- 분산 트레이싱: Jaeger, Zipkin 같은 도구를 사용하여 애플리케이션의 분산 환경에서 발생한 문제를 추적하는 방법.
3. Failure Detection (실패 감지)
- 헬스 체크: Kubernetes에서 liveness와 readiness 프로브를 사용하여 애플리케이션의 상태를 모니터링하고, 비정상적인 동작을 감지하는 방법.
- 알림 시스템: 실패가 발생했을 때, 이메일, SMS, Slack 등을 통해 경고 알림을 설정하는 방법.
- 자동 복구: Kubernetes의 ReplicaSet 또는 Deployment를 통해 실패한 파드를 자동으로 재시작하거나 대체하는 방법.
4. Failure Mitigation (실패 완화)
- 회복력 있는 아키텍처: 애플리케이션이 실패하더라도 빠르게 복구할 수 있도록 설계하는 방법 (예: Circuit Breaker 패턴, Retry 패턴).
- 캡슐화 및 격리: 문제가 있는 애플리케이션 컴포넌트를 격리하여 전체 시스템에 영향을 미치지 않도록 하는 방법.
- 부하 분산 및 이중화: 하나의 인스턴스 실패 시에도 서비스가 지속될 수 있도록 부하 분산과 이중화를 설정하는 방법.
5. Failure Recovery (실패 복구)
- 백업 및 복원: 데이터를 손실 없이 복구하기 위한 백업 및 복원 절차.
- 롤백 전략: 실패한 배포를 이전 버전으로 롤백하는 방법.
- 애플리케이션 리스타트: 실패한 애플리케이션을 자동으로 다시 시작하여 복구하는 방법.
6. Best Practices (최선의 방법)
- 테스트 및 검증: 애플리케이션이 예상치 못한 실패에 대해 얼마나 잘 대응하는지 확인하기 위한 스트레스 테스트 및 장애 시나리오 테스트.
- Documentation (문서화): 실패 대응 및 복구 절차를 문서화하여 팀 내에서 공유하고 일관된 대응이 가능하도록 하는 방법.
- Continuous Improvement (지속적인 개선): 실패에서 교훈을 얻고, 시스템과 프로세스를 지속적으로 개선하여 미래의 실패를 예방하는 방법.
Quiz.
1. Troubleshooting Test 1: A simple 2 tier application is deployed in the alpha namespace. It must display a green web page on success. Click on the App tab at the top of your terminal to view your application. It is currently failed. Troubleshoot and fix the issue.
Stick to the given architecture. Use the same names and port numbers as given in the below architecture diagram. Feel free to edit, delete or recreate objects as necessary.
APP 실행:
controlplane ~ ✖ k describe deploy webapp-mysql -n alpha
Name: webapp-mysql
...
Environment:
DB_Host: mysql-service
DB_User: root
DB_Password: paswrd
## webapp-mysql을 변경했더니 안되길래 mysql service를 변경하라고 합니다ㅜ
controlplane ~ ➜ k edit svc -n alpha mysql
'''
# 이름을 mysql-service로 변경
Name: mysql-service
...
'''
A copy of your changes has been stored to "/tmp/kubectl-edit-2304416562.yaml"
error: At least one of apiVersion, kind and name was changed
controlplane ~ ✖
controlplane ~ ✖ k delete -n alpha svc mysql
service "mysql" deleted
controlplane ~ ➜ k apply -f /tmp/kubectl-edit-2304416562.yaml
service/mysql-service created
2. Troubleshooting Test 2: The same 2 tier application is deployed in the beta namespace. It must display a green web page on success. Click on the App tab at the top of your terminal to view your application. It is currently failed. Troubleshoot and fix the issue.
Stick to the given architecture. Use the same names and port numbers as given in the below architecture diagram. Feel free to edit, delete or recreate objects as necessary.
controlplane ~ ➜ k describe svc -n beta mysql-service
Name: mysql-service
Namespace: beta
Labels: <none>
Annotations: <none>
Selector: name=mysql
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.43.37.208
IPs: 10.43.37.208
Port: <unset> 3306/TCP
### TargetPort: 3306/TCP 으로 수정해줍니다!
TargetPort: 8080/TCP
Endpoints: 10.42.0.14:8080
Session Affinity: None
Events: <none>
Target port가 잘못지정되어있습니다
3. Troubleshooting Test 3: The same 2 tier application is deployed in the gamma namespace. It must display a green web page on success. Click on the App tab at the top of your terminal to view your application. It is currently failed or unresponsive. Troubleshoot and fix the issue.
Stick to the given architecture. Use the same names and port numbers as given in the below architecture diagram. Feel free to edit, delete or recreate objects as necessary.
controlplane ~ ➜ k describe svc -n gamma mysql-service
Name: mysql-service
Namespace: gamma
Labels: <none>
Annotations: <none>
Selector: name=sql00001
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.43.175.57
IPs: 10.43.175.57
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
이번엔 selector가 전혀 다른게 설정되어있네요
controlplane ~ ➜ k describe po -n gamma mysql | grep Label
Labels: name=mysql
controlplane ~ ➜ k edit svc -n gamma mysql-service
'''
## Selector를 변경해줍니다
Selector: name=mysql
'''
service/mysql-service edited
4. Troubleshooting Test 4: The same 2 tier application is deployed in the delta namespace. It must display a green web page on success. Click on theApptab at the top of your terminal to view your application. It is currently failed. Troubleshoot and fix the issue.
이번 에러는 다른 에러이네요:
Environment Variables: DB_Host=mysql-service; DB_Database=Not Set; DB_User=sql-user; DB_Password=paswrd; 1045 (28000): Access denied for user 'sql-user'@'10.42.0.19' (using password: YES)
Authorization문제이네요
controlplane ~ ➜ k describe po -n delta mysql
Name: mysql
Namespace: delta
...
Environment:
MYSQL_ROOT_PASSWORD: paswrd
## User를 root로 변경
controlplane ~ ➜ k edit deploy -n delta
'''
Environment:
DB_Host: mysql-service
DB_User: root
DB_Password: paswrd
'''
deployment.apps/webapp-mysql edited
5. Troubleshooting Test 5: The same 2 tier application is deployed in the epsilon namespace. It must display a green web page on success. Click on theApptab at the top of your terminal to view your application. It is currently failed.
controlplane ~ ➜ k describe po -n epsilon mysql
Name: mysql
Namespace: epsilon
..
Environment:
MYSQL_ROOT_PASSWORD: passwooooorrddd
Root Password가 잘못 설정되어있습니다. paswrd로 변경해줄게요
controlplane ~ ➜ k edit po -n epsilon mysql
error: pods "mysql" is invalid
A copy of your changes has been stored to "/tmp/kubectl-edit-988296295.yaml"
error: Edit cancelled, no valid changes were saved.
controlplane ~ ✖
controlplane ~ ✖ k delete po -n epsilon mysql
pod "mysql" deleted
controlplane ~ ➜ k get po -n epsilon
NAME READY STATUS RESTARTS AGE
webapp-mysql-57dc5df9f9-dg7pd 1/1 Running 0 3m
controlplane ~ ➜ k apply -f /tmp/kubectl-edit-988296295.yaml
pod/mysql created
4번과 동일하게 DB_User도 root로 설정해주어야합니다
controlplane ~ ➜ k describe deploy -n epsilon
Name: webapp-mysql
Namespace: epsilon
...
Environment:
DB_Host: mysql-service
DB_User: sql-user
DB_Password: paswrd
6. Troubleshooting Test 6:The same 2 tier application is deployed in thezetanamespace. It must display a green web page on success. Click on theApptab at the top of your terminal to view your application. It is currently failed. Troubleshoot and fix the issue.
이번엔 3가지 이슈가 있네요
1. 해당 서버로 못들어오네요. 서비스가 문제겠죠?
controlplane ~ ➜ k get svc -n zeta
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-service ClusterIP 10.43.201.73 <none> 3306/TCP 78s
web-service NodePort 10.43.82.94 <none> 8080:30088/TCP 78s
controlplane ~ ➜ k edit svc -n zeta web-service
'''
# nodePort 수정
nodePort: 30081
'''
service/web-service edited
controlplane ~ ➜ k get svc -n zeta
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-service ClusterIP 10.43.201.73 <none> 3306/TCP 2m52s
web-service NodePort 10.43.82.94 <none> 8080:30081/TCP 2m52s
web-service 서비스의 NodePort는 30081로 수정해주셔야합니다.
2. 5번과 동일 문제 : mysql pod의 비밀번호를 paswrd로 변경
3. 5번과 동일 문제 : web-app의 DB_USER를 root로 변경
Environment Variables: DB_Host=mysql-service; DB_Database=Not Set; DB_User=sql-user; DB_Password=paswrd; 1045 (28000): Access denied for user 'sql-user'@'10.42.0.26' (using password: YES)
오늘 Application 단에서의 트러블슈팅을 해보았습니다.
다음시간에는 Control Plane Failure에 대해 알아보겠습니다
참조
※ Udemy Labs - Certified Kubernetes Administrator with Practice Tests
'IT 잡지식 > DevOps' 카테고리의 다른 글
[CKA] KodeKloud - Worker Node Failure (0) | 2024.08.23 |
---|---|
[CKA] KodeKloud - Control Plane Failure (0) | 2024.08.23 |
[CKA] KodeKloud - Cluster Installation using Kubeadm (0) | 2024.08.15 |
[CKA] KodeKloud - Ingress Networking - 2 (0) | 2024.08.15 |
[CKA] KodeKloud - Ingress Networking - 1 (0) | 2024.08.15 |