검색결과 리스트
IT에 해당되는 글 86건
- 2022.03.11 ALB 인그레스 컨트롤러 SSL 인증서 적용 규칙 / 동작 원리
- 2022.03.08 Nginx Ingress E.N 서비스 오류 후 동적 컨피그 불가 현상 버그
- 2022.03.08 쿠버벌레 이벤트 시간대 정렬해서 보기
- 2022.01.21 쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드
- 2022.01.06 쿠버네티스 nginx ingress 카나리 적용
- 2021.12.23 Nginx Access Log 엘라스틱서치 조회 / S3 백업 람다
글
ALB 인그레스 컨트롤러 SSL 인증서 적용 규칙 / 동작 원리
'IT > EKS' 카테고리의 다른 글
Nginx 업스트림 Retry 관련 깃허브 QnA (0) | 2022.05.17 |
---|---|
매우 쉬운 차트 설치법 (0) | 2022.03.17 |
Nginx Ingress E.N 서비스 오류 후 동적 컨피그 불가 현상 버그 (0) | 2022.03.08 |
쿠버벌레 이벤트 시간대 정렬해서 보기 (0) | 2022.03.08 |
쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드 (0) | 2022.01.21 |
글
Nginx Ingress E.N 서비스 오류 후 동적 컨피그 불가 현상 버그
https://github.com/kubernetes/ingress-nginx/issues/4168
nginx ingress 버그로 추정시켜줘야겠음 ㅇㅇ.. 정상 > 비정상 EN 서비스는 동적 설정 되었는데
비정상 > 정상 EN 서비스로는 동적 설정 안됨. 구 버전꺼를 계속 가짐
해결 방법 : Nginx WAS 파드를 모두 물갈이 하니 다 정상 동작했음
이거 어디선가 lua 밸런서 모듈이 내부 캐싱한다는건가? 자세히 코드 뜯기까진 귀찮...
'IT > EKS' 카테고리의 다른 글
매우 쉬운 차트 설치법 (0) | 2022.03.17 |
---|---|
ALB 인그레스 컨트롤러 SSL 인증서 적용 규칙 / 동작 원리 (0) | 2022.03.11 |
쿠버벌레 이벤트 시간대 정렬해서 보기 (0) | 2022.03.08 |
쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드 (0) | 2022.01.21 |
쿠버네티스 nginx ingress 카나리 적용 (0) | 2022.01.06 |
글
쿠버벌레 이벤트 시간대 정렬해서 보기
k get events -n 네임스페이스 --sort-by='.metadata.creationTimestamp'
'IT > EKS' 카테고리의 다른 글
ALB 인그레스 컨트롤러 SSL 인증서 적용 규칙 / 동작 원리 (0) | 2022.03.11 |
---|---|
Nginx Ingress E.N 서비스 오류 후 동적 컨피그 불가 현상 버그 (0) | 2022.03.08 |
쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드 (0) | 2022.01.21 |
쿠버네티스 nginx ingress 카나리 적용 (0) | 2022.01.06 |
AWS APIGW -> EKS Nginx Ingress (NLB) 포워딩 실패 (504 타임아웃) (0) | 2021.11.29 |
글
쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드
(1) k cordon 비정상노드명 : 노드 scheduling disable. 이 노드로 앞으로 파드가 들어가지 않게 처리
(2) k delete pod 파드명 -n 네임스페이스 --grade-period=0 -- force : 파드 강제 삭제처리. 노드에 들어간, 데몬을 포함한 모든 파드들을 삭제함. kube-system 시스템 요소까지 싹 다.
(3) kubectl drain 비정상노드명 --ignore-daemonsets --delete-local-data : 노드 드레인. 안의 내부 데이터는 이미 2번 과정에서 파드를 모두 종료했을 때 다 날아가게 되므로, 이를 무시하는 절차이다. PVC 볼륨 데이터를 삭제하는 것이 아니므로, 신경쓰지 않아도 된다.
(4) kubectl delete node 비정상노드명 : 노드를 삭제
(5) aws eks 콘솔 가서, 노드가 축출되었는지, 그리고 개수가 내가 원하는 개수와 맞는지 살펴본다.
> 일반적으로는 새 노드를 생성한다.
> 새 노드를 생성하지 않을경우, min / MAX / desire 중, min 을 desire와 동일하게 셋팅하여 이를 맞춘다.
노드 드레이닝 시, 로컬 데이터를 날리는건 pvc 볼륨을 삭제하는게 아닌것을 꼭 기억해야 한댜
이게 만약 인스턴스 볼륨에 뭔가 중요한걸 쌓고있는데, 저 옵션으로 드레인 시키면 데이터 날아가므로 주의하쟈
'IT > EKS' 카테고리의 다른 글
Nginx Ingress E.N 서비스 오류 후 동적 컨피그 불가 현상 버그 (0) | 2022.03.08 |
---|---|
쿠버벌레 이벤트 시간대 정렬해서 보기 (0) | 2022.03.08 |
쿠버네티스 nginx ingress 카나리 적용 (0) | 2022.01.06 |
AWS APIGW -> EKS Nginx Ingress (NLB) 포워딩 실패 (504 타임아웃) (0) | 2021.11.29 |
파드 스테이터스 종류 (그라파나 alert용 잠깐 정리) (0) | 2021.11.26 |
글
쿠버네티스 nginx ingress 카나리 적용
쿠버네티스 상에서 카나리를 적용하는 (트래픽 제어) 형태는 서비스메시를 쓰는것이 공론화 되어있다.
대표적으로 이스티오 서비스메시.
현재 해외에서 서비스메시 대표격은 링커d를 CNCF가 밀어주는 모양.
회사에 자금이 좀 넉넉하다면 아예 nginx 서비스메시를 유료로 도입하는 것도 나쁘진 않을 것.
(SRE 요소로서, nginx LB랑 WAS에서 모든 트래픽적 SLI 를 집계하고 뽑아주니 차라리 이게 더 가성비가 좋을 수 있다.)
------------------
서비스 메시 단점으로, 바닐라 쿠버네티스 레이어를 덮게 되기에, 컨트롤패널 2군데를 관리해야 한다.
데브옵스 엔지니어의 관리 범위가 늘어난다는 단점, 에코 확장하면 그것도 봐야한다는 단점.
업무 가중이 심하므로 서비스메시는 가급적 안하고, nginx 인그레스에 카나리 도입 방법을 찾아본다.
1. https://intl.cloud.tencent.com/document/product/457/38413
https://v2-1.docs.kubesphere.io/docs/quick-start/ingress-canary/
- 여러개가 있다. nginx 인그레스로 카나리 추가하는거.
-그런데 어떻게 전부 예시들이 인그레스에 백엔드 포워딩 룰을 하나만 한건지.. 전부 하나씩만 테스트 했다.
- 이 테스트 표본으로는 실제 라이브/운영 환경의 인그레스 파일을 감당하고 도입하기엔 무리가 있다.
(일반적으로 인그레스 파일 하나에 로드밸런서 및 WAS 백엔드/포워드/업스트림 룰 여러개를 결정한다)
2. nginx 카나리 제약
- nginx 공홈에도 있듯, 카나리 룰 하나만 된다고 적혀있다
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
- 내용 중 제약사항 발췌
Known Limitations
Currently a maximum of one canary ingress can be applied per Ingress rule.
- 인그레스 룰 당 최대 1개의 카나리 인그레스 적용이 가능하다고 한다.
(예시)
원본 인그레스.yaml
ㄴ/a -> a_서비스
ㄴ/b -> b_서비스
ㄴ/c -> c_서비스
카나리 인그레스.yaml
(요청 퍼센트 독립시행 확률 0~100. 지금은 10으로 가정)
ㄴ/a -> a'_서비스
ㄴ/b -> b'_서비스
위와 같이 yaml 구성해서 만들었을 때, /c 는 카나리가 없기에, 무조건 원본 룰만 적용.
카나리 인그레스는 테스트 결과, /a에 대해서만 카나리 룰이 적용됨.
/b는 최대 1개 적용 규칙에 의거해서, 원본 인그레스 룰에만 영향을 받음.
즉 카나리 룰당 최대 1개의 인그레스가 적용된다는 의미를, 다음과 같이 받아들이면
서비스메시가 없는 바닐라 쿠버네티스와 에코 조합으로 카나리 적용이 가능하다는 이론이 만들어진다.
(원본 ingress yaml, 카나리 a ingress yaml, 카나리 b ingress yaml, ......)
-------------------------------
(최신업뎃 7/1)
nginx 버전 최신. 카나리가 인그레스 오브젝트 단위가 아니라, 리스닝 룰 하나만 먹음. 실사용화 불가로 판단.
사유가 명확치는 않으나 nginx 버그 혹은 기능이 예상한 것과 같이 만들어지진 않은 것.
리스너 룰 하나로는 먹히니 부하테스트 환경 혹은 유입 채널을 격리시키고 싶을 때 사용하면 좋을 듯 하다 ㅇㅇㅇ
'IT > EKS' 카테고리의 다른 글
쿠버벌레 이벤트 시간대 정렬해서 보기 (0) | 2022.03.08 |
---|---|
쿠버네티스 비정상 워커 노드 강제 축출/배제/제거 가이드 (0) | 2022.01.21 |
AWS APIGW -> EKS Nginx Ingress (NLB) 포워딩 실패 (504 타임아웃) (0) | 2021.11.29 |
파드 스테이터스 종류 (그라파나 alert용 잠깐 정리) (0) | 2021.11.26 |
쿠버네티스 nginx 인그레스 삭제 시 주의점 (0) | 2021.05.27 |
글
Nginx Access Log 엘라스틱서치 조회 / S3 백업 람다
API : https://elasticsearch-py.readthedocs.io/en/7.x/
Nginx Access Log가 들어있는 ES 데이터를 1분단위 (혹은 시간 범위) + 매칭쿼리.
AWS S3로 파일적재. (코드 최적화는 아직 안된 상태며 기능 구현에 초점)
Nginx 로그 1만줄을 S3 파일로 (비동기로) 옮기는데 대략 10초가 안될 정도로 소요됨.
람다 스펙은 10G 최대로 테스트해본 상태였댜.
현재 단순 산술식으로 하면, 특정 필터랑 쿼리로 걸러진 Nginx 로그들을 6만줄 (분당 6만건 요청. 6만 TPM) 까지는 처리가 가능하다는 얘기가 나온댜
이건 1분마다 도는 그 시간인, 1분안에 끝내야 한다는 조건이 굳이 없다면
크론을 1분마다 돌리고 타임아웃 5분정도로 설정하면 충분히 Nginx Access Log를 정제해서 SRE 요소로 뽑을 수 있다는 얘기가 성립될 수 있댜 ㅇㅇ
즉 실제로 데이터 보여주는 기간에 시간 차를 두어서 1~5분 딜레이 정도면 SLI/SLO 를 준.실시간으로 (semi-realtime) 보여줄 수 있댜
조합해서 가져오는 파이썬 런타임 람다 업로드한댜.
람다 레이어와 환경 설정은 본 항목에선 배제한댜.
- 람다레이어 : 서버리스 런타임 중 필요로 하는 라이브러리 / 디펜던시를 가져오는 기능. 리눅스 기반에서 돌아가기에, 경로가 아마 /opt 이하로 라이브러리들이 떨궈짐
import json, os
import pprint as ppr
from elasticsearch import Elasticsearch
from dateutil import tz
from datetime import timedelta, datetime
import boto3
"""
"""
def lambda_handler(event, context):
# (0) 환경설정
환경 = os.environ.get('env')
서비스명 = os.environ.get('servicename')
서비스_path명 = f"/{서비스명}/"
seoul_tz = tz.gettz('Asia/Seoul')
호스트 = ""
포트 = 80
if 환경 == 'dev' :
호스트 = "(개발환경_엘사_호스트)"
elif 환경 == 'prd' :
호스트 = "(운영.라이브.상용 환경 엘사_호스트)"
es = Elasticsearch(hosts=호스트, port=포트)
# (1) 시간 설정 및 조회
지금시간 = datetime.now(tz=seoul_tz)
기준시간 = datetime(지금시간.year, 지금시간.month, 지금시간.day, 지금시간.hour, 지금시간.minute, 00, tzinfo=seoul_tz)
기준시간2 = 기준시간 - timedelta(minutes=1)
기준시간1 = 기준시간 - timedelta(minutes=2)
results = es.search(
index="k8s-gateway*",
body={
"size" : 10000,
"_source": {"includes": [ "log" ],},
"query": {
"bool": {
"must":
[
{
"range": {
"time": {
"from" : 기준시간1,
"to" : 기준시간2
}}},
# "range": {
# "time": {
# "from" : datetime(2021, 12, 22, 9, 00, 00 , tzinfo=seoul_tz),
# "to" : datetime(2021, 12, 22, 9, 30, 00 , tzinfo=seoul_tz)
# }}},
{
"match": {"log": f"{서비스_path명}"} , }
] }} })
리스트_nginx로그 = []
for result in results['hits']['hits']:
리스트_nginx로그.append(result['_source'])
#print('score:', result['_score'], 'source:', result['_source'])
print("----------------")
#for i in 리스트_nginx로그: print(i)
#print(len(리스트_nginx로그))
#print(리스트_nginx로그)
# (2) s3 파일 생성한다
s3 = boto3.Session().resource('s3')
s3 = boto3.client('s3')
버킷명 = "앙몬드가_넣을_버킷명"
키파일 = 서비스명 + "/" + str(기준시간).replace("+09:00", "").replace(" ","_")
# 안에 내용물이 딕셔너리다보니, join이 안되는거 같음 ㅇㅇ..
# 페이로드 = "\n".join(리스트_nginx로그)
페이로드 = []
print(f"지금 로그 개수 {len(리스트_nginx로그)}" )
for 로그한줄 in 리스트_nginx로그 :
버퍼 = str(로그한줄).split(" ")
시간 = 버퍼[4] + 버퍼[5]
URL = 버퍼[6] + " " + 버퍼[7] + " " + 버퍼[8]
리퀘스트코드 = 버퍼[9]
리퀘스트레이턴시 = ""
for index, value in enumerate(버퍼):
if "[gateway-to-" in value:
리퀘스트레이턴시 = 버퍼[index-1]
break
리스판스코드 = 버퍼[-2]
리스판스레이턴시 = 버퍼[-3]
#print(f"{시간} | {URL} | {리퀘스트코드} | {리퀘스트레이턴시} | {리스판스코드} | {리스판스레이턴시}")
변환한_한줄 = "|".join([시간,URL,리퀘스트코드,리퀘스트레이턴시,리스판스코드,리스판스레이턴시])
페이로드.append( 변환한_한줄 )
페이로드 = '\n'.join(페이로드) + "\n"
response = s3.put_object(
Bucket=버킷명,
Body=페이로드,
Key=키파일
)
'IT > AWS Lambda & Resources Trouble Shooting' 카테고리의 다른 글
람다 콜드스타트 단계 유의점 (0) | 2022.10.13 |
---|---|
CloudFront + 람다@ 리디렉션 (0) | 2022.07.05 |
AWS NLB -> ALB IP기반 타겟그룹 포워딩 람다 (0) | 2021.05.17 |
AWS EKS PLEG이슈 (0) | 2020.10.28 |
AWS 엘라스틱서치 스냅샷/특정인덱스 를 복원하는 람다 (0) | 2020.10.26 |