728x90
반응형

 


턴제 퍼즐 알피지 게임인데, 상대 몬스터의 특성, 나의 영웅 특성

상대 몬스터의 움직이는 칸 수, 공격 방향을 보고 생각해서 나의 영웅을 움직여서 적을 격파하여 클리어 하는 게임이구요

마치 체스나 장기 같이 한 수 한 수 생각 하게 만드는 게임입니다.

출시된지는 2020년 8월 13일에 했으니 이제 만 3년이 넘었네요.

저도 이 게임 시작한지 이제 500시간 정도 밖에 되지 않았어요

모바일 게임을 이렇게 오래 해본 적이 손에 꼽을 정도로 플레이 하고 있는 게임 입니다.

게임사는 Playsome. 핀란드 헬싱키에 있는 회사이구요

일단 중국 게임사가 아니라 뭔가 안심...?ㅋㅋㅋ


 

728x90


마음 조급하게 먹지말고 무과금도 오래 플레이 하면 금방 영웅 모을수 있습니다

저도 드래곤 패스나 간간히 오픈 되는 이벤트 패스 정도만 지르는데요 10만원 미만 한거 같습니다 ㅋ


15렙 미만은 불의 시련이라고 이벤트를 할 수 있는데요

15렙 이상 넘어가면 다신 못하고 보석포함 초반 물품을 못 받고 시작하기 때문에 손해 입니다

아래 단체 카톡방에 가서 초대 코드 달라고 해보세요~

초대코대 입력하면 같이 협동 플레이로 던전 하나 플레이 같이 할수있는데 이거 깨면 초반에 도움되는 보상을 받습니다

저도 보상 받았어요~
 



한번 플레이 해보세요 강추 드립니다.

참고로 PC버전도 있습니다. 웹 브라우저로 설치 없이도 플레이 할 수 있습니다.

최근에 런칭 한거 같더라구요. PC에서 보석 구매하면 모바일 스토어에서 산 것보다 보석을 좀 더 줍니다 ㅋㅋ

카카오톡 오픈채팅에 한국 길드 유저들이 모여 있습니다
들어가서 많은 도움과 정보 얻으시길 바라겠습니다~
https://open.kakao.com/o/g44KH6be
 
그리고 게임 내 쿠폰은 없습니다 찾는 수고를 들이지 마세요
 
과금은 소과금러라면 드래곤패스, 이벤트시에 나오는 이벤트패스, 월정액이라고 불리는 한달짜리 보석 패키지 정도만 하시면 될듯합니다. 
 
소과금러의 보석 사용처로는 금요일마다 나오는 금요 포션팩이 있는데 거의 이것으로만 사용하세요.
쌩보석으로 뽑기는 안 하시는걸 추천드립니다.
 
스크롤을 10개 모아서 한번에 뽑으면 4성 영웅 확정적으로 1개 줍니다.
 
5성 로그, 메이지, 엘리멘탈 리스트에 대해 나오면 무조건 키우는게 좋을거 같습니다.
 
그럼 즐겜 하세요~^^

728x90
300x250
728x90
반응형

자!

장사하는데 엄청난 능력이 필요한 것이 아니다.

손님이 오면 즐거워지는 매장을 만들고 새로운 시도에 두려워하지 마라.

장서처럼 돈벌기 쉬운 것도 없다.

 

제가 읽은 책은 바로

도서 : 장사의 신 - 우노 다카시  입니다.

 

기본적으로 임하는 자세

천원짜리 맥주를 3천원에 팔 수 있고, 천원짜리 토마토를 3천원에 팔 수 있다

기본적으로 손님의 이름도 외우고 서로 안부나 이야기도 나눌 줄 알아야 하며, 가게에 자주 오게끔 하고, 그 손님을 통해 또 다른 손님을 불러들일 수 있도록 관리

수익은 접객에서 나온다.

요리 잡지나 TV에서 방영된 요리들도 시도 해보고 나만의 요리로 만들어서 팔자

상황별 맞는 서비스를 아끼지 말자 - 메뉴에 없는 요리도 그 손님만을 위한 특별한 요리 처럼 서비스로 내줘라

 

사례로 보면

위와 같은 자세로 했더니 라쿠 코퍼레이션이라는 회사를 경영 할 정도로 성장 시킨 기업가로 발전

 

핵심은..?

손님이 재밌어 하는 가게를 만드는게 중요하기 때문에 생각하고 또 생각하는게 일이다

가령 언제 고기가 들어오는날 이나 오늘 소 잡은 날 처럼 팻말을 해놓고

실제 고기를 보는 앞에서 해체 한다던가 그런 쇼 같은 요소도 가미 되면 좋다.

 

728x90

마지막으로

읽다보면 장사를 하고싶어지는 책이고 나도 창업하면 잘 할 수 있겠다 라는 생각이 들게 만들어 준다. 약 40년간의 요식업 경험을 통해서 한가지 메시지를 전달하고 있다. 그건 ‘손님이 즐거워지는 가게를 만든다’ 이다. 뛰어난 요리 실력보다 손님의 이름을 불러주며 손님이 즐거워 할 수 있는 가게를 만드는 것 인거 같다.

728x90
300x250
728x90
반응형

두뇌 단련 방법을 소개한다.
 
도서 : 당신의 뇌는 최적화를 원한다.
 
이 책에서는 뇌를 최적화 시켜서 업무, 삶 모든 곳에서 활용하기 좋게 뇌를 단련시키는 방법에 대해 소개한다.
우리는 근육을 단련하기 위해 웨이트 트레이닝을 하는 것 처럼, 뇌 또한 트레이닝을 통해 단련 시킬 수 있다.
 
인간의 감정, 기억, 역량은 신경전달물질로 만들어진다.
인간의 뇌에는 수백억개의 신경세포가 존재하고, 그것은 서로 복잡한 네트워크로 형성되어 있다.
이 신경세포와 신경세포끼리의 통신은 '시냅스' 라고 하는 좁은 틈이 있고 거기로 '신경전달물질'이 분비 되고,
시냅스 후막에는 신경전달물질을 받아들이는 '수용체'가 있다.
 
뇌 속 흐름
즉 신경전달물질이 시냅스를 통해 통신해서 반대편 목적지에 수용체를 만남으로 써 자극이 전달 되는 형태
 
이제까지 뇌 내 신경전달물질은 50여가지에 달한다고 밝혀졌고,
그 중 대표적인 7가지 기적의 물질에 대해 소개 해준다.
 
 

1. 의욕과 열정의 행복물질 도파민

- 도파민은 매너리즘을 싫어 함
- 무슨 일을 할 때도 긍정적으로 생각하고 하기 싫다기 보다 재밌겠다나 하고싶다 또는 할수 있겠지? 가 아니라 할수있다 라는 마음가짐으로 접근
- 그래서 늘 목표를 세우고 달성 시키고 반복
- 목표를 달성한 자신의 모습을 상상해라. 주기적으로 상상 할수록 실현 확률은 올라간다.
- 적당한 난이도의 작은 목표를 설정하다보면 큰 목표를 이룰 수 있음.
- 목표 달성 후 자신에게 상 줘라, 맛난 음식 먹으러 가든, 갖고 싶은 물건을 사든 그리고 다시 목표 설정
 

2. 집중력과 기억력을 끌어올리기 위한 노르아드레날린

- 투쟁 혹은 도피라는 상황에서 분비 됨.
- 즉 공포나 불안하면 노르아드레날린이 분비되면서 주의집중력과 각성도가 오름
- 도파민형 동기부여는 칭찬하는 것이고, 노르아드레날린형 동기부여는 꾸짖는 형태
- 적당한 스트레스와 데드라인을 설정해서 긴장감을 높여 효율적인 업무 수행
- 스트레스가 지속되면 안좋기 때문에 적절한 휴식과 운동과 영양 섭취를 하자

3. 신체 능력과 몰입 에너지의 아드레날린

- 흥분과 분노와 함께 분비 됨
- 신체의 기능을 순간적으로 높인다.
- 기합 소리를 매우 크게 지르면 아드레날린이 분비된다. 가령 시작하기전에 엄청 크게 '화이팅!'
- 궁지에 물려도 포기하지 말라
- 발표전 긴장과 흥분된다면, 성공할 것이다.
- 과도한 흥분 및 긴장에는 심호흡을 해라
주의사항 (저녁에 분비 되지 않기 위해 해야 할 일)
- 저녁에 오락은 적당히 특히 폭력성 짖은 게임
- 목욕은 40도 이하 온도로
- 저녁에 격렬한 운동 보다 요가 같은 이완 시켜주는 운동
- 느긋하게 업무와 연관 없는 가족 및 친구 만나기
- 심호흡
 

4. 스트레스 줄이고 공감능력을 키우는 치유 물질 세로토닌

- 각성, 기분, 마음의 안정과 깊은 연관
- 세로토닌이 활성화 되면 활동모드므로 업무 효율이 좋아진다.
- 일어나면 아침해가 들어오도록 커텐 쳐놓자
- 아침에 깼을 때 5분간 침대에서 햇볕을 쬐자
- 목 돌리면서 리듬감있게 스트레칭 하기
- 무조건 아침 식사를 하자
- 기상 후 2~3시간이 뇌의 골든 타임 (제일 머리가 잘 돌아감 = 즉 지의 흡수율이 높음)
- 점심은 나가서 외식
- 걸으면서 생각하기
- 낭독
- 감동적인 영화나 책 보면서 눈물 흘리기, 공감력을 키우면 세로토닌이 단련됨

 

5. 완벽하게 재충전 시켜주는 수면 물질 멜라토닌

- 멜라토닌은 숙면을 유도하는 물질
- 잘 때 빛 차단
- 자기 1시간 전에는 조명을 낮추고 긴장을 푼다 (백색등 안됨)
- 자기 전에 티비, 스마트폰, 게임, 인터넷 금지
- 격렬한 운동 안되며, 요가나 명상으로 이완 시켜주자
- 낮에 세로토닌을 충분히 활성화 시킨다.
- 아침에 햇빛을 쬔다.
- 침실을 깔끔하게 한다.
 

728x90

6. 영감과 아이디어가 필요할 땐 아세틸콜린

- 인지와 영감에 깊은 관련
- 의욕이 나지 않을 땐 일단 시작해보면 작업흥분에 의해 의욕이 생긴다.
- 영감이 잘 떠오르는 장소 4B (Bar, Bathroom, Bus, BedRoom)
- 오전 중에는 논리적 업무, 저녁에는 창조적인 업무 수행
- 30분 낮잠은 안 좋고 26분 낮잠이 뇌 휴율 34% 증진 시킴
- 함부로 감기약 복용 금지 -> 아세틸콜린을 죽인다. 멍해지거나 졸린 이유
- 시터파를 내면 영감이 솟는다 (외출, 낮잠, 앉은 채로 손발 움직이기, 호기심 자극)
 

7. 효율을 2배 높이는 뇌 마약 엔도르핀

- 모르핀보다 6.5배 효과가 있는 뇌의 마약성분 (모르핀은 마약의 일종, 말기 암환자에게 심한 통증을 완화시켜주는 진통제)
- 모든 괴로움을 행복으로 바꿔주는 물질 하지만 과하면 안됨
- 행복감, 마음을 쉬게하는 효과, 면연력 강화, 멜라토닌과 함께 최상의 치유물질(멜라토닌은 수면, 엔도르핀은 긴장이완)
- 알파파가 나오면 치유물질 엔도르핀이 촉진된다.
- 알파파 나오는 경우 : 클래식, 좋아하는 음악, 흐르는 냇물소리, 아름다운 풍경, 맛있는 음식, 상쾌한 바람, 아로마향, 눈을 감고 안정 취할 때, 1가지일에 집중할 때, 명상, 요가, 좌선 할 때
- 도파민은 쾌감자극, 노르아드레날린은 불쾌자극 도파민과 함께하면 증감 효과가 곱셈 - 성행위 하면 동시에 분비
- 물리적 엔도르핀 활성화하는 6가지 방법 운동, 맵고, 기름진 음식, 초콜렛, 뜨거운 물 목욕, 침 치료
- 한가지 일에 몰입하면 엔도리핀이 나오는데 이때 나온 엔도르핀이 질적으로 우수. 집중할 수 있는 무언가를 하자
- 타인에게 감사하거나 감사의 말을 들으면 분비
- 일을 부탁 받으면 기꺼이 하는 버릇을 들이자,  마지 못하면 노르아드레날린이 나오고 기꺼이 하면 엔도르핀이나 도파민이 나온다.
 
 
이렇게 7가지의 대표적인 기적의 물질을 확인 해 보았는데,
앞으로 대표적인 물질에 대해 나의 뇌를 단련 시켜서 언제든지 위기나 어려움이 닥칠 때 그것을 받아드릴 수 있도록 준비를 해야 겠다고 생각이 든다.
또한 뇌를 단련함으로 써 건강도 챙길 수 있다는 점에서, 근육만 단련 시킬 것이 아니라 뇌를 단련하는 것은 필수적인 요건이라고 생각이 든다.

728x90
300x250
728x90
반응형

Overview

Istio를 통해 Traffic을 제어 할 수 있다.

다음은 Istio를 통해서도 Canary를 구현 할 수 있다. Canary 또한 Traffic을 통제하여 신버전으로 Traffic을 적게 가져가는 식으로 하면 된다.

Weighted 기반 라우팅

  1. Demo Application 구성

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-simulator
     spec:
       selector:
         matchLabels:
           app: position-simulator
       replicas: 1
       template:
         metadata:
           labels:
             app: position-simulator
         spec:
           containers:
           - name: position-simulator
             image: richardchesterwood/istio-fleetman-position-simulator:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-tracker
     spec:
       selector:
         matchLabels:
           app: position-tracker
       replicas: 1
       template:
         metadata:
           labels:
             app: position-tracker
         spec:
           containers:
           - name: position-tracker
             image: richardchesterwood/istio-fleetman-position-tracker:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: api-gateway
     spec:
       selector:
         matchLabels:
           app: api-gateway
       replicas: 1
       template:
         metadata:
           labels:
             app: api-gateway
         spec:
           containers:
           - name: api-gateway
             image: richardchesterwood/istio-fleetman-api-gateway:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: webapp
     spec:
       selector:
         matchLabels:
           app: webapp
       replicas: 1
       template:
         metadata:
           labels:
             app: webapp
         spec:
           containers:
           - name: webapp
             image: richardchesterwood/istio-fleetman-webapp-angular:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: vehicle-telemetry
     spec:
       selector:
         matchLabels:
           app: vehicle-telemetry
       replicas: 1
       template:
         metadata:
           labels:
             app: vehicle-telemetry
         spec:
           containers:
           - name: vehicle-telemtry
             image: richardchesterwood/istio-fleetman-vehicle-telemetry:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 1
       template:
         metadata:
           labels:
             app: staff-service
             version: safe      # 구버전에 대한 Application Label이다. Safe가 기존 운영하던 Stable한 버전이라고 친다.
         spec:
           containers:
           - image: richardchesterwood/istio-fleetman-staff-service:6-placeholder
             name: staff-service
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service-risky-version
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 1
       template:
         metadata:
           labels:
             app: staff-service
             version: risky       # 신버전에 대한 Application에 대한 Deploy이다. 신버전에 대해서 version: risky 라는 Label로 지정하였다.
         spec:
           containers:
           - name: staff-service
             image: richardchesterwood/istio-fleetman-staff-service:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-webapp
     spec:
       selector:
         app: webapp
       ports:
         - appProtocol: http
           name: http
           port: 80
           protocol: TCP
           targetPort: 80
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-position-tracker
     spec:
       selector:
         app: position-tracker
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-api-gateway
     spec:
       selector:
         app: api-gateway
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-vehicle-telemetry
     spec:
       selector:
         app: vehicle-telemetry
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-staff-service
     spec:
       selector:
         app: staff-service
       ports:
         - name: http
           port: 8080
       type: ClusterIP
    

    1. Demo Application 웹 접속을 위한 GW, VS 구성

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
      name: fleetman-gw
      spec:
      selector:
       istio: ingressgateway
      servers:
      - hosts:
       - "kiali-mng-dev.test.co.kr"
       port:
         number: 80
         name: http
         protocol: HTTP

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
    name: fleetman-vs
    spec:
    hosts:

    • "kiali-mng-dev.test.co.kr"
      gateways:

    • fleetman-gw
      http:

    • match:

      • port: 80
        route:
      • destination:
        host: fleetman-webapp
        port:
        number: 80

      Kiali 에서보면 구조는 아래와 같다.

      staff-service에 보면 Risky 버전과 Safe 버전 2가지가 공존하는 것을 볼 수 있다.

      1. Demo Web 접속
      • 해당 웹어플리케이션은 배송 추적 시스템이다.
  2. 신버전과 구버전간의 트래픽 비율 조정

     kind: VirtualService
     apiVersion: networking.istio.io/v1alpha3
     metadata:
       name: canary-vs  # 이 부분은 그냥 이름 넣어주면 된다.
       namespace: default
     spec:
       hosts:
         - fleetman-staff-service.default.svc.cluster.local  # 라우팅 규칙을 적용할 서비스 DNS 이름 입니다. (내부 용 FQDN으로 처리)
       http:
         - route:
             - destination:
                 host: fleetman-staff-service.default.svc.cluster.local # 타겟 DNS 이름
                 subset: safe-group  # Destination Rule의 이름
               weight: 90   # 비율 지정
             - destination:
                 host: fleetman-staff-service.default.svc.cluster.local # 타겟 DNS 이름
                 subset: risky-group  # Destination Rule의 이름
               weight: 10
     ---
     kind: DestinationRule       # 각 Subset에 포함될 파드 정의
     apiVersion: networking.istio.io/v1alpha3
     metadata:
       name: canary-dr
       namespace: default
     spec:
       host: fleetman-staff-service # 서비스
       subsets:
         - labels:   # Selector
             version: safe # 파드를 Label과 함께 찾는다.
           name: safe-group
         - labels:
             version: risky
           name: risky-group

  3. 확인

  4. 실제 City Truck의 운전자 사진이 Risk 버전에서는 제대로 표시가 안되는 것을 확인

  5. 브라우저에서는 Caching 때문에 제대로 확인이 안될 수 있는데 curl로 확인 해보자

     root # while true; do curl http://kiali-mng-dev.test.co.kr/api/vehicles/driver/City%20Truck; echo; sleep 0.5; done
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
     {"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}

    "1.jpg" 가 10% 확율 치고는 자주 나온거 같긴하지만 얼추 그래도 맞는 것 같다.

Session Affinity

Istio에서 Consistent Hash 라는 것을 이용하여 Session을 유지 해주는 기능을 제공한다.

LB에서 Hash 알고리즘을 이용하여 Client로부터 받은 데이터를 Hashing 한 후 데이터를 파드에 전송하는데 Hash 값을 이용하여 Sticky Session을 유지한다

Session 관리로 여러가지 방식을 지원한다. Header, Cookie, SourceIP 등

여기서는 SourceIP를 통해 테스트 진행 해 보았다.

위에 테스트한 데모 어플리케이션이 Version에 따라 safe와 risky 버전을 나눠서 90:10 비율로 처리 했는데, Consistent Hash를 사용하여 처음 접근 했던 세션이 그대로 유지 되는지 테스트

kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: session-vs
  namespace: default
spec:
  hosts:
    - fleetman-staff-service.default.svc.cluster.local
  http:
    - route:
        - destination:
            host: fleetman-staff-service.default.svc.cluster.local
            subset: all-staff-service-pods
          # weight: weight 옵션을 같이 사용 할 수 없다.
---
kind: DestinationRule
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: session-dr
  namespace: default
spec:
  host: fleetman-staff-service
  trafficPolicy:
    loadBalancer:
      consistentHash:
        useSourceIp: true   # useSourceIp: true로 설정하면 접속한 SourceIP으로 세션을 유지 해준다.
  subsets:
    - labels:
        app: staff-service
      name: all-staff-service-pods

처음 접속 했을 때 Stable 버전으로 접속되서 다른 Truck들도 사진이 잘 나온다. 반면에 Risky 버전으로 접속이 됐으면 계속 사진이 없는 Truck만 조회 된다.

Prefix기반 라우팅

  1. Demo Application 구성

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-simulator
     spec:
       selector:
         matchLabels:
           app: position-simulator
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: position-simulator
         spec:
           containers:
           - name: position-simulator
             image: richardchesterwood/istio-fleetman-position-simulator:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-tracker
     spec:
       selector:
         matchLabels:
           app: position-tracker
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: position-tracker
         spec:
           containers:
           - name: position-tracker
             image: richardchesterwood/istio-fleetman-position-tracker:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: api-gateway
     spec:
       selector:
         matchLabels:
           app: api-gateway
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: api-gateway
         spec:
           containers:
           - name: api-gateway
             image: richardchesterwood/istio-fleetman-api-gateway:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: webapp
     spec:
       selector:
         matchLabels:
           app: webapp
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: webapp
             version: original
         spec:
           containers:
           - name: webapp
             image: richardchesterwood/istio-fleetman-webapp-angular:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: webapp-experimental
     spec:
       selector:
         matchLabels:
           app: webapp
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: webapp
             version: experimental     # labels로 version: experimental 이름으로 canary와 동일한 신규버전을 만들었다.
         spec:
           containers:
           - name: webapp
             image: richardchesterwood/istio-fleetman-webapp-angular:6-experimental
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: vehicle-telemetry
     spec:
       selector:
         matchLabels:
           app: vehicle-telemetry
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: vehicle-telemetry
         spec:
           containers:
           - name: vehicle-telemtry
             image: richardchesterwood/istio-fleetman-vehicle-telemetry:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 0
       template: # template for the pods
         metadata:
           labels:
             app: staff-service
             version: safe               # version: safe로 기존 stable 버전이다.
         spec:
           containers:
           - name: staff-service
             image: richardchesterwood/istio-fleetman-staff-service:6-placeholder
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service-risky-version
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: staff-service
             version: risky              # version: risky가 신규 버전의 Canry 이다.
         spec:
           containers:
           - name: staff-service
             image: richardchesterwood/istio-fleetman-staff-service:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-webapp
     spec:
       # This defines which pods are going to be represented by this Service
       # The service becomes a network endpoint for either other services
       # or maybe external users to connect to (eg browser)
       selector:
         app: webapp
       ports:
         - name: http
           port: 80
           nodePort: 30080
       type: NodePort
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-position-tracker
     spec:
       # This defines which pods are going to be represented by this Service
       # The service becomes a network endpoint for either other services
       # or maybe external users to connect to (eg browser)
       selector:
         app: position-tracker
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-api-gateway
     spec:
       selector:
         app: api-gateway
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-vehicle-telemetry
     spec:
       selector:
         app: vehicle-telemetry
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-staff-service
     spec:
       selector:
         app: staff-service
       ports:
         - name: http
           port: 8080
       type: ClusterIP

  2. Virtaul Service, Gateway, Destination Rule

     apiVersion: networking.istio.io/v1alpha3
     kind: Gateway
     metadata:
       name: ingress-gateway-configuration
     spec:
       selector:
         istio: ingressgateway
       servers:
       - port:
           number: 80
           name: http
           protocol: HTTP
         hosts:
         - "*"
     ---
     kind: VirtualService
     apiVersion: networking.istio.io/v1alpha3
     metadata:
       name: fleetman-webapp
       namespace: default
     spec:
       hosts:
         - "*"
       gateways:
         - ingress-gateway-configuration
       http:
         - match:  # Prefix에 대한 설정
           - uri:  # IF /experimental 이거나
               prefix: "/experimental"
           - uri:  # OR /canary 이면
               prefix: "/canary"
           route: # THEN destination rule의 experimental로 라우팅 해라.
           - destination:
               host: fleetman-webapp
               subset: experimental
         - match:  # / Prefix면 DR의 original로 기존 버전으로 라우팅
           - uri :
               prefix: "/"
           route:
           - destination:
               host: fleetman-webapp
               subset: original
     ---
     kind: DestinationRule
     apiVersion: networking.istio.io/v1alpha3
     metadata:
       name: fleetman-webapp
       namespace: default
     spec:
       host: fleetman-webapp
       subsets:
         - labels:
             version: original # labels.version: original로 라우팅
           name: original     # Subset Name이 Original이면
         - labels:
             version: experimental # labels.version: experimental로 라우팅
           name: experimental # Subset Name이 experimental이면

  3. 테스트

     root # while true; do curl -s http://kiali-mng-dev.test.co.kr/experimental | grep title; sleep 0.5; done
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>

    /experimental로 하면 신규버전으로 "Fleet Management Istio Premium Enterprise Edition" 만 표시되어야 하는데 라운드로빈으로 왔다갔다 호출 되는거 같다.

    이 부분은 Istio-Ingressgateway로 트래픽을 제대로 타지 못했거나 K8s 서비스 오브젝트를 통해 접근 했을 경우 또는 다른 이슈가 있는 듯하다.

    Haproxy와 Ingressgateway service의 설정은 딱히 문제가 없는 듯 하다.

    확인 해보니 기존에 테스트로 생성해둔 GW, VS가 동일한 호스트와 포트로 사용중인게 있어서 문제였다 (관련해서 kiali를 통해 발견했다. 스크린샷은 찍지못함)

    관련해서 제거 한 후 다시 테스트

     root # while true; do curl -s http://kiali-mng-dev.test.co.kr/experimental | grep title; sleep 0.5; done
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>
       <title>Fleet Management Istio Premium Enterprise Edition</title>

     root # while true; do curl -s http://kiali-mng-dev.test.co.kr/ | grep title; sleep 0.5; done
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
       <title>Fleet Management</title>
    

    신규 버전과 구 버전의 Prefix로 라우팅이 잘 되는듯 하다.

SubDomain으로 라우팅

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ingress-gateway-configuration
spec:
  selector:
    istio: ingressgateway #
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "kiali-mng-dev.test.co.kr"
    - "prometheus-mng-dev.test.co.kr"
    #- "*.kiali-mng-dev.test.co.kr"  이런식으로 와일드카드로도 설정 가능
    #- "*.test.co.kr"
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: fleetman-webapp
  namespace: default
spec:
  hosts:
    - "kiali-mng-dev.test.co.kr"
  gateways:
    - ingress-gateway-configuration
  http:
    - route:
      - destination:
          host: fleetman-webapp
          subset: original
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: fleetman-webapp-experiment
  namespace: default
spec:
  hosts:
    - "prometheus-mng-dev.test.co.kr"
  gateways:
    - ingress-gateway-configuration
  http:
      - route:
        - destination:
            host: fleetman-webapp
            subset: experimental
---
kind: DestinationRule
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: fleetman-webapp
  namespace: default
spec:
  host: fleetman-webapp
  subsets:
    - labels:
        version: original
      name: original
    - labels:
        version: experimental
      name: experimental

JWT 기반 라우팅은 아직 알파단계 조만간 나올 것으로 보인다.

728x90
300x250

'IT > Istio' 카테고리의 다른 글

Mutual TLS(mTLS) with Istio  (1) 2024.01.02
서킷 브레이킹  (0) 2023.11.10
728x90
반응형

Overview

Circuit break를 해결하는 방식은 기존에도 있었으며, 그 중 대표적으로 hystirx라는 라이브러리를 통해서 해결할 수 있었다. (넷플릭스가 개발하였으나 현재는 더 이상 업데이트가 없으며, 기존 기능에 대한 운영만 지원)

그러나 hystrix는 개별 마이크로서비스의 내부 코드에 이를(circuit break 함수) 반영해야만 하는 번거로움이 있으며, JVM기반의 어플리케이션만 지원하므로 go/python 등으로 개발된 마이크로서비스에는 적용할 수 없는 문제가 있다.

Istio는 마이크로서비스 외부의 proxy(envoy)를 이용하여 모든 네트워크를 제어하하는데, curcuit breker도 적용 가능하다. 즉, 마이크로서비스의 코드 변경없이 어떤 마이크로서비스에도 적용할 수 있는 장점이 있다

  1. Demo Applications 배포

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-simulator
     spec:
       selector:
         matchLabels:
           app: position-simulator
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: position-simulator
         spec:
           containers:
           - name: position-simulator
             image: richardchesterwood/istio-fleetman-position-simulator:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: position-tracker
     spec:
       selector:
         matchLabels:
           app: position-tracker
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: position-tracker
         spec:
           containers:
           - name: position-tracker
             image: richardchesterwood/istio-fleetman-position-tracker:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: api-gateway
     spec:
       selector:
         matchLabels:
           app: api-gateway
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: api-gateway
         spec:
           containers:
           - name: api-gateway
             image: richardchesterwood/istio-fleetman-api-gateway:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             command: ["java","-Xmx50m","-jar","webapp.jar"]
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: webapp
     spec:
       selector:
         matchLabels:
           app: webapp
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: webapp
             version: original
         spec:
           containers:
           - name: webapp
             image: richardchesterwood/istio-fleetman-webapp-angular:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: vehicle-telemetry
     spec:
       selector:
         matchLabels:
           app: vehicle-telemetry
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: vehicle-telemetry
         spec:
           containers:
           - name: vehicle-telemtry
             image: richardchesterwood/istio-fleetman-vehicle-telemetry:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: staff-service
             version: safe
         spec:
           containers:
           - name: staff-service
             image: richardchesterwood/istio-fleetman-staff-service:6
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: staff-service-risky-version
     spec:
       selector:
         matchLabels:
           app: staff-service
       replicas: 1
       template: # template for the pods
         metadata:
           labels:
             app: staff-service
             version: risky
         spec:
           containers:
           - name: staff-service
             image: richardchesterwood/istio-fleetman-staff-service:6-bad    # 해당 소스가 장애가 가지고 있는 소스이고 Risky로 배포 될 예정이다.
             env:
             - name: SPRING_PROFILES_ACTIVE
               value: production-microservice
             imagePullPolicy: Always
             ports:
             - containerPort: 8080
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-webapp
     spec:
       # This defines which pods are going to be represented by this Service
       # The service becomes a network endpoint for either other services
       # or maybe external users to connect to (eg browser)
       selector:
         app: webapp
       ports:
         - name: http
           port: 80
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-position-tracker
     spec:
       # This defines which pods are going to be represented by this Service
       # The service becomes a network endpoint for either other services
       # or maybe external users to connect to (eg browser)
       selector:
         app: position-tracker
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-api-gateway
     spec:
       selector:
         app: api-gateway
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-vehicle-telemetry
     spec:
       selector:
         app: vehicle-telemetry
       ports:
         - name: http
           port: 8080
       type: ClusterIP
     ---
     apiVersion: v1
     kind: Service
     metadata:
       name: fleetman-staff-service
     spec:
       selector:
         app: staff-service
       ports:
         - name: http
           port: 8080
       type: ClusterIP

  2. Gw, Vs 구성

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ingress-gateway-configuration
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "kiali-mng-dev.saraminhr.co.kr"   # Domain name of the external website
---
# All traffic routed to the fleetman-webapp service
# No DestinationRule needed as we aren't doing any subsets, load balancing or outlier detection.
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: fleetman-webapp
  namespace: default
spec:
  hosts:      # which incoming host are we applying the proxy rules to???
    - "kiali-mng-dev.saraminhr.co.kr"
  gateways:
    - ingress-gateway-configuration
  http:
    - route:
      - destination:
          host: fleetman-webapp

  1. 확인

문제가 있는 Risky와 같이 배포를 했더니 브라우저에서 확인 해보면 한번씩 500에러가 발생한다.

  1. curl로 확인
root # curl -w @curl.txt http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}namelookup:    0.001459
connect:       0.002182
appconnect:    0.000000
pretransfer:   0.002226
redirect:      0.000000
starttransfer: 0.019133
--------------------------------------
total:         0.019139
[SARAMIN] root@sri-mng-kube-dev1:/usr/local/src/istio
04:49 오후
root # curl -w @curl.txt http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}namelookup:    0.001552
connect:       0.002251
appconnect:    0.000000
pretransfer:   0.002260
redirect:      0.000000
starttransfer: 0.019725
--------------------------------------
total:         0.019842
[SARAMIN] root@sri-mng-kube-dev1:/usr/local/src/istio
04:49 오후
root # curl -w @curl.txt http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}namelookup:    0.001496
connect:       0.002103
appconnect:    0.000000
pretransfer:   0.002477
redirect:      0.000000
starttransfer: 0.022399
--------------------------------------
total:         0.022466
[SARAMIN] root@sri-mng-kube-dev1:/usr/local/src/istio
04:49 오후
root # curl -w @curl.txt http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}namelookup:    0.001412
connect:       0.002050
appconnect:    0.000000
pretransfer:   0.002138
redirect:      0.000000
starttransfer: 1.285805
--------------------------------------
total:         1.285837
[SARAMIN] root@sri-mng-kube-dev1:/usr/local/src/istio
04:49 오후
root # curl -w @curl.txt http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck
{"timestamp":"2023-11-07T07:49:21.555+0000","status":500,"error":"Internal Server Error","message":"status 502 reading RemoteStaffMicroserviceCalls#getDriverFor(String)","path":"//vehicles/driver/City%20Truck"}namelookup:    0.001339
connect:       0.001931
appconnect:    0.000000
pretransfer:   0.001974
redirect:      0.000000
starttransfer: 5.003001
--------------------------------------
total:         5.003088

  • 한번씩 실패나기도 하면서 지연도 있는것 같다.
  • 예거에서도 보면 다른 서비스에서도 4초 이상 지연이 발생했다.
  • kiali에서 확인 해보면 Risky 하나로 전체적으로 지연 발생하는 것으로 보인다.
  1. Circuit Breaker 설정
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: circuit-breaker-for-the-entire-default-namespace
spec:
  host: "fleetman-staff-service.default.svc.cluster.local"
  trafficPolicy:
    outlierDetection: # Circuit Breakers가 작동하는 기준 설정
      consecutive5xxErrors: 2
      interval: 10s
      baseEjectionTime: 30s
      maxEjectionPercent: 100

[consecutiveErrors]
연속적인 에러가 몇번까지 발생해야 circuit breaker를 동작시킬 것인지 결정
여기서는 연속 2번 오류가 발생하면 circuit breaker 동작 (테스트 환경으로 횟수를 낮췄다.)

[interval]
interval에서 지정한 시간 내에 consecutiveError 횟수 만큼 에러가 발생하는 경우 circuit breaker 동작
즉, 10초 내에 2번의 연속적인 오류가 발생하면 circuit breaker 동작

[baseEjectionTime]
차단한 호스트를 얼마 동안 로드밸런서 pool에서 제외할 것인가?
즉, 얼마나 오래 circuit breaker를 해당 호스트에게 적용할지 시간을 결정

[maxEjectionPercent]
네트워크를 차단할 최대 host의 비율. 즉, 최대 몇 %까지 차단할 것인지 설정
현재 구성은 2개의 pod가 있으므로, 100%인 경우 2개 모두 차단이 가능하다
10%인 경우 차단이 불가능해 보이는데(1개가 50%이므로),
envoy에서는 circuit breaker가 발동되었으나,
10%에 해당하지 않아서 차단할 호스트가 없으면
강제적으로 해당 호스트를 차단하도록 설정한다

  1. 확인

서킷 브레이커가 동작 중이면 번개 표시로 나타남

  • curl로 동작 확인
while true; do curl http://kiali-mng-dev.saraminhr.co.kr/api/vehicles/driver/City%20Truck; echo; sleep 0.5; done
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/placeholder.png"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"timestamp":"2023-11-07T08:39:50.949+0000","status":500,"error":"Internal Server Error","message":"status 502 reading RemoteStaffMicroserviceCalls#getDriverFor(String)","path":"//vehicles/driver/City%20Truck"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"timestamp":"2023-11-07T08:39:53.483+0000","status":500,"error":"Internal Server Error","message":"status 502 reading RemoteStaffMicroserviceCalls#getDriverFor(String)","path":"//vehicles/driver/City%20Truck"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
{"name":"Pam Parry","photo":"https://rac-istio-course-images.s3.amazonaws.com/1.jpg"}
^C

처음에 2번 에러가 나면서 서킷 브레이커가 동작하게 되면서 더이상 에러가 발생 안하는 모습을 볼수 있었다.

  • 웹브라우저에서도 지연없이 사진도 잘 불러와지는 것을 확인 할 수 있었다.
  • 전체 서비스에 서킷브레이커를 동작 시키고 싶다면 전역 설정이 있다.
728x90
300x250

'IT > Istio' 카테고리의 다른 글

Mutual TLS(mTLS) with Istio  (1) 2024.01.02
Istio Traffic Management 트래픽 통제하기  (0) 2023.11.10
728x90
반응형

결론부터 말하면

Istio와 Cilium 서비스 메시 중 어떤 것을 선택할지는 애플리케이션 아키텍처의 특정 요구 사항, 성능 고려 사항, 보안 요구 사항에 따라 달라집니다. 각 서비스 메시에서는 마이크로서비스 통신을 관리하고, 상호 작용을 보호하고, 통합 가시성을 보장하는 데 필수적인 도구를 제공합니다. Istio의 사이드카 프록시 기반 아키텍처는 풍부한 트래픽 관리와 고급 라우팅이 필요한 시나리오에 적합합니다. 반면, Cilium의 eBPF 기반 접근 방식은 커널에 직접 통합된 효율적인 네트워킹 및 보안 기능을 제공하므로 엄격한 보안 요구 사항이 있는 고성능 애플리케이션에 적합한 선택이 될 수 있습니다. 이 서비스 메시 간의 유사점과 차이점을 이해하면 프로젝트의 목표와 제약 조건에 맞는 정보에 입각한 결정을 내릴 수 있습니다.

 

소개

빠르게 발전하는 클라우드 네이티브 기술 환경에서 서비스 메시는 마이크로서비스 기반 애플리케이션을 관리하고 보호하기 위한 필수 도구로 등장했습니다. 이 분야에서 두 가지 주요 경쟁자는 Istio와 Cilium 서비스 메시입니다. 두 가지 모두 마이크로서비스 간의 통신을 간소화하는 것을 목표로 하지만 서로 다른 기능과 접근 방식을 가지고 있습니다. 이 기사에서는 Istio와 Cilium의 유사점과 차이점을 자세히 살펴보고 이들의 기능을 조명하고 애플리케이션 아키텍처에 가장 적합한 것을 선택하는 데 도움을 줄 것입니다.

 

비슷한 점

1. 마이크로서비스 커뮤니케이션

Istio와 Cilium은 모두 컨테이너화된 환경 내에서 마이크로서비스 간의 원활한 통신을 촉진하도록 설계되었습니다. 네트워크 트래픽 및 상호 작용을 관리하기 위한 플랫폼 독립적인 계층을 제공하여 마이크로서비스 애플리케이션을 보다 쉽게 ​​개발하고 배포할 수 있습니다.

2. 교통관리

각 서비스 메시는 트래픽 라우팅, 로드 밸런싱, 트래픽 분할 기능을 제공합니다. 이를 통해 개발자는 다양한 서비스 간의 요청 흐름을 제어 및 관리할 수 있어 유연성이 향상되고 A/B 테스트 및 점진적 출시가 가능해집니다.

3. 보안 및 권한 부여

Istio와 Cilium은 모두 상호 TLS(mTLS) 암호화 및 인증과 같은 보안 기능을 제공하여 마이크로서비스 간의 통신을 안전하게 유지합니다. 또한 세분화된 액세스 제어 정책을 시행하여 무단 액세스 및 잠재적인 보안 침해로부터 보호하는 메커니즘도 제공합니다.

4. 관찰 가능성 및 모니터링

각 서비스 메시는 원격 측정 데이터 수집, 서비스 상태 모니터링 및 요청 추적을 위한 도구를 제공합니다. 이러한 기능은 성능 병목 현상을 식별하고, 문제를 진단하고, 전체 애플리케이션을 최적화하는 데 도움이 됩니다.

5. 서비스 발견

Istio와 Cilium은 모두 서비스 검색을 위한 메커니즘을 제공하므로 마이크로서비스가 하드 코딩된 IP 주소가 아닌 논리적 서비스 이름을 사용하여 서로 찾고 통신할 수 있습니다.

6. 재시도 및 서킷 브레이커

Istio와 Cilium은 재시도 및 회로 차단을 처리하는 기능을 제공합니다. 이러한 메커니즘은 실패한 요청을 지능적으로 다시 시도하고 비정상 서비스를 격리함으로써 서비스 복원력을 관리하는 데 도움이 됩니다.

7. 분산 추적

각 서비스 메시는 분산 추적을 지원하므로 개발자는 다양한 마이크로서비스를 탐색하면서 요청을 추적할 수 있습니다. 이는 병목 현상을 진단하고 요청의 엔드 투 엔드 흐름을 이해하는 데 중요합니다.

8. 카나리아 배포

Istio와 Cilium은 모두 작은 트래픽 하위 집합이 서비스의 새 버전으로 전달되는 카나리아 배포를 허용합니다. 이를 통해 새 릴리스를 전체 사용자 기반에 출시하기 전에 테스트하고 검증할 수 있습니다.

차이점

1. 아키텍처 및 프록시

Istio는 사이드카 프록시 아키텍처(Envoy)를 활용하여 서비스 간 통신을 관리합니다. 반면 Cilium은 Linux 커널과 통합되고 eBPF(확장 버클리 패킷 필터) 기술을 사용하여 네트워크 가시성과 보안을 향상시킵니다.

2. 데이터 플레인 및 제어 플레인

Istio는 데이터 플레인(네트워크 트래픽이 흐르는 곳)과 제어 플레인(구성 및 정책 결정을 관리하는 곳)을 분리합니다. 반면 Cilium은 eBPF를 사용하여 데이터 플레인과 제어 플레인 기능을 결합하여 잠재적으로 성능을 향상하고 복잡성을 줄입니다.

3. 성능 및 확장성

Cilium의 eBPF 기반 접근 방식은 낮은 수준의 커널 통합을 제공하므로 잠재적으로 오버헤드가 줄어들고 성능이 향상됩니다. Istio의 프록시 기반 아키텍처에서는 사이드카 프록시를 통한 추가 홉으로 인해 약간의 대기 시간이 발생할 수 있습니다.

4. 네트워크 정책

Cilium은 eBPF를 사용하여 강력한 네트워크 분할 및 보안 기능을 제공하므로 커널 수준에서 시행되는 고급 네트워크 정책이 가능합니다. Istio는 제어 플레인을 통해 네트워크 정책을 제공하지만 Cilium과 동일한 수준의 세분성을 갖지 않을 수 있습니다.

5. 통합과 생태계

Istio는 서비스 메시 공간에서 더 오랫동안 존재하기 때문에 더 넓은 생태계와 통합을 갖추고 있습니다. Kubernetes와 잘 통합되며 관찰 가능성, 보안 및 트래픽 관리를 위한 다른 도구와 쉽게 결합할 수 있습니다. Cilium은 네트워킹과 보안에 중점을 두지만 통합 범위가 더 좁을 수 있습니다.

6. Policy

Cilium의 eBPF 기반 접근 방식은 네트워크 트래픽에 대한 심층적인 가시성을 제공하여 보다 세밀한 정책 시행을 가능하게 합니다. 이는 복잡한 보안 정책을 구현하고 잠재적인 위협을 완화하는 데 특히 유용할 수 있습니다.

7. 복잡성과 학습 곡선

사이드카 프록시와 별도의 제어 플레인을 포함하는 Istio의 아키텍처는 개발자와 운영자에게 추가적인 복잡성과 학습 곡선을 도입할 수 있습니다. 커널에 직접 통합된 Cilium의 아키텍처는 일부 사용자의 경우 이해하고 관리하기가 더 간단할 수 있습니다.

8. 자원 소비

Cilium과 커널 및 eBPF 기술의 통합은 특정 시나리오에서 리소스 소비를 낮추고 성능을 향상시킬 수 있습니다. Istio의 프록시 기반 접근 방식은 추가 사이드카 프록시로 인해 리소스 오버헤드가 약간 더 높아질 수 있습니다.

9. 커뮤니티 및 개발 속도

Istio는 더 큰 커뮤니티와 더 긴 개발 기록의 이점을 활용하여 더 성숙하고 기능이 풍부한 플랫폼을 제공합니다. Cilium은 빠르게 성장하고 있지만 더 집중된 기능 세트와 더 작은 커뮤니티를 가질 수 있습니다.

10. 사용자 정의 및 확장성

– Istio는 여러 확장 지점을 갖춘 유연한 플랫폼을 제공하므로 사용자는 서비스 메시의 다양한 측면을 맞춤 설정할 수 있습니다. 이는 고급 사용 사례에 유용할 수 있지만 복잡성이 발생할 수도 있습니다.
– Cilium의 eBPF 기반 아키텍처는 다른 형태의 확장성을 제공합니다. 이를 통해 사용자는 Linux 커널 내에서 직접 맞춤형 네트워킹 및 보안 정책을 정의할 수 있어 잠재적으로 효율적이고 고도로 맞춤화된 솔루션을 얻을 수 있습니다.

728x90

11. 레거시 시스템과의 통합

– 추상적인 통신 및 관리에 초점을 맞춘 Istio는 새로운 마이크로서비스를 기존 레거시 시스템과 통합하는 데 더 적합할 수 있습니다. 이는 이들 사이의 트래픽을 관리하는 통일된 방법을 제공하기 때문입니다.
– Cilium은 네트워킹 및 보안에 중점을 두고 있기 때문에 마이크로서비스 생태계가 기존 네트워크 인프라와 공존하는 환경에 더 적합할 수 있습니다.

12. 트래픽 리디렉션 및 섀도우 트래픽

– Istio는 들어오는 요청의 일부를 미러링하여 프로덕션 트래픽에 영향을 주지 않고 새로운 구성을 테스트하는 카나리아 배포 및 섀도우 트래픽과 같은 고급 트래픽 관리 기능을 제공합니다.
– Cilium은 트래픽 관리 기능을 제공하지만 주요 강점은 보안 및 하위 수준 네트워킹에 있으므로 고급 트래픽 관리보다 이러한 측면을 우선시하는 환경에 더 적합합니다.

13. 다중 클러스터 및 하이브리드 클라우드 시나리오

– Istio에는 여러 Kubernetes 클러스터 및 하이브리드 클라우드 환경 전반에 걸쳐 통신을 연결하고 관리하는 기능이 있습니다. 클러스터 간에 트래픽을 라우팅하는 Istio 게이트웨이와 같은 도구를 제공합니다.
– Cilium의 eBPF 접근 방식은 복잡한 네트워킹 시나리오에서 이점을 가질 수 있지만 다중 클러스터 배포의 경우 더 많은 수동 설정 및 구성이 필요할 수 있습니다.

14. 복잡성 및 학습 곡선

– Istio의 폭넓은 채택과 시장에서의 오랜 존재는 학습 및 문제 해결에 사용할 수 있는 리소스, 튜토리얼 및 커뮤니티 지원이 더 많다는 것을 의미합니다.
– Cilium의 보다 전문적인 초점은 eBPF의 복잡성과 커널과의 통합을 이해해야 하기 때문에 학습 곡선이 더 가파르게 될 수 있습니다.

15. 사용 사례 및 시나리오

– Istio는 풍부한 트래픽 관리, 요청 라우팅 및 고급 정책 시행이 우선순위인 시나리오에 선택되는 경우가 많습니다.
– Cilium은 강력한 보안, 고성능 네트워킹 및 네트워크 트래픽에 대한 심층적인 가시성이 필요한 환경에 일반적으로 선택됩니다.

728x90
300x250
728x90
반응형

개요

Kubernetes API 서버를 KUBECONIFG를 통한 접근을 하기 위해 단일 서버로 설정해서 접근 할 수도 있지만,

API 서버를 LB로 묶어서 접근 관리 할수있도록 하기 위한 설정이다. 이렇게 묶어서 설정 및 관리하면, 여러 관리 도구와의 결합 구성시 고가용성 유지할 수 있도록 해준다.

  • HAproxy서버에서 Kubernetes Master Node에 대해 tcp LB 설정을 해준다.

      #----------------------------------------------
      # test kube-apiserver Settings
      #----------------------------------------------
      defaults kube-tcp
          log global
          mode tcp
          maxconn 65535
          timeout connect  4s
          timeout server  15s
          timeout client  15s
          #timeout tunnel    2m
    
      # ---------------- ea-kube-master-front frontend --------------------
      frontend ea-kube-master-front
          bind 192.168.0.101:6443 name kube-tcp
          description test Kube Apiserver Front
          option tcplog
          default_backend ea-kube-dev-master-backend
      # ---------------- ea-kube-master-backend --------------------
      backend ea-kube-dev-master-backend
      mode tcp
      balance roundrobin
      option tcp-check
      option tcplog
      server sri-ea-kube-dev1 192.168.0.74:6443 check
      server sri-ea-kube-dev2 192.168.0.75:6443 check
      server sri-ea-kube-dev3 192.168.0.76:6443 check

  • bind :6443 포트, Backend 또한 6443 포트로 진행

  • Kubernetes를 컨트롤 할 서버(중앙 관리하는 MNG 서버나, ArgoCD 서버 등등) 에서 KUBECONFIG 설정 진행

      apiVersion: v1
      clusters:
      - cluster:
          certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EZ3hNVEEzTURBek5sb1hEVE16TURnd09EQTNNREF6Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUV6CnJkTE01Qk10RFI1UXhjUXZ3M0RvVjlHdHRYY3duM2xla0JiaDY1QmdpVUdoa05RajJRa0FNdS9BeWZGZTVPMWoKMUo2STZ3dkl1WUhralJTS040bitoU09ReVlRZ1dBSjFLOWRsZzZpZ3hFS0NhaUpqZm9XUjlpKytheDhFTUNHVQpUM2sxVy8xVmhNOVFWY2JMaWtoSHgyVndUaXlOMWJGRzVGVjlISWNVa0daV3laS2NuRDRrU0RhajU4bkRqNVhTCktqUnprMVlkbnhYSzRuNmQxVVpvS3pyYjFsYmtmdk5sR29PSjRTS2RqcmVvMlpKc1J4dE9YR1o0aHR3dm5ndG0KMFo3VzhoWHMrcmRwOEFXQnYvY2wzMEk0OFVnZzA1U2dKbXN2ZEE1cklkdjJZc01nU2FUTnBnekwwZTgvUEE0UgpxNnZ5SWlRTnk4V2ZpY3NpZytzQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZLeXJ5dHFua2l5Uytqc09YK1AvSFRlemhBZGVNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQ0Y2VjZNczRJSGhieTFuNHp0cgpEcVJZODBjWlBRcjdsVWszUHNMaW5QSlRIT1dwTFdGVkMzYU1TYndpdWNGaUttenVOcUNLWHpwR3g1RzRwLzlhCnM3YVZNbUV3Vjl4NFp0RkNmMkVDUVhXeHkvWVppeFFrdDNpNTBrMU5wT0hmTU5NZ1BXMHhoamt1QS9DMzRXKzUKdUN0RnZUT3NyQ014ZGtuak13bElGWnZ4OHlXTjZLbUsxUWFMRGFtUVBRQk1IQVEvM2l0S2d4Y0ZNQldKQWcxUApmd2ZGZHpQWUVvOVZEbW1LQkI4RnlEYk1wNmd0MDRsVlNJbnFXUDdFcjR3MkZpNnhWYkJadHpJYVNkWFFHNkZRCkl2NTFNc2c4QVFmQ05DSkxkV1c3M3N2dTNGNklZMkVETmUxWVlvOXAvN2Z1ZDRxckNLbGZBdnBTcThFdkRjVzMKL1BjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
          server: https://ea-kube-dev.test.co.kr:6443
        name: ea.cluster.local
      contexts:
      - context:
          cluster: ea.cluster.local
          user: default
        name: ea-kube
      current-context: ea-kube
      kind: Config
      preferences: {}
      users:
      - name: default
        user:
          token: eyJhbGciOiJSUzI1NiIsImtpZCI6IktxOERHZHdCMFFKSmkxTW9USzBGTndWalZJX2h2NDhVSTI5MEZNdDZPREkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImE4MjE0YWJmLTA0NDctNDhlMC05MjEzLTdkMjFhZDFhOTM0YSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.hOT7Q-lMb_2bV11YQ895DOde2TuWDRnjJOv1H2QYy65tfEdVjZGZmjWzOefVnihxjjhYYP5VKl4G7OfX6GQrDoR0ZW_bB1ABikePblJmCbaf4kL2GlQtrUHQeDwg9BFCXwzUzIPFBzn-6gst_cPJF3XMPMVqbjixrCUe5fJYmouDiKckLjxINNCvUB5wlAon1F20QFeiCU8X5rteJl-GYZApRbPYpuacl3Tea9tmdESBbG17kBjquTSTvwbB6GeTwgPrs4ek8Q_Hs3bIUlGEtCHXeyja8so-kKb7bWr_LThFLxVhqoIuvpi2TACOvAmdLrM-RSknD6HN6ghGCPdVUg

  • Kubernetes Context Swiching 진행 후 kubectl 명령어 수행

      kubectl get pod

  • 하지만 아래와 같이 에러가 발생한다.

      Unable to connect to the server: x509: certificate is valid for ea-kube-dev.test.co.kr

    이 경우는 보통 인증서가 잘못되었거나 아니면 해당 인증서에 대해 유효한 서버가 아니기 때문에 에러가 발생한다.

    우리는 haproxy에서 tcp로 접근하기 때문에 별도 인증서를 세팅 하지 않았기 때문에 서버에 대해 추가해야 한다.

  • 먼저 현재 인증서에 접근하는 서버가 리스트에 있는지 확인

      openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text
    

  • output에서 Alternative Name을 살펴보면 접근 하고자 하는 ea-kube-dev.test.co.kr 서버가 없는 것을 확인 할 수 있다.

       X509v3 Subject Alternative Name:
                      DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.ea-dev.cluster.local, DNS:lb-apiserver.kubernetes.local, DNS:localhost, DNS:sri-ea-kube-dev1, DNS:sri-ea-kube-dev2, DNS:sri-ea-kube-dev3, IP Address:10.233.0.1, IP Address:192.168.0.74, IP Address:127.0.0.1, IP Address:192.168.0.75, IP Address:192.168.0.76

  • 서버를 추가한 후 인증서를 재생성 해야 한다.

      # 인증서 백업
      # 별도 서비스를 내리지 않고 진행한다. 기존 파일이 있으면 반영 되지 않는다.
      mv /etc/kubernetes/pki/apiserver.key /home/hkpark/.
      mv /etc/kubernetes/pki/apiserver.crt /home/hkpark/.
    
      # Config Map 수정
      kubectl -n kube-system edit configmap kubeadm-config
    
      data:
        ClusterConfiguration: |
          apiServer:
            certSANs:
            - kubernetes
            - kubernetes.default
            - kubernetes.default.svc
            - kubernetes.default.svc.ea-dev.cluster.local
            - 10.233.0.1
            - localhost
            - 127.0.0.1
            - sri-ea-kube-dev1
            - sri-ea-kube-dev2
            - sri-ea-kube-dev3
            - lb-apiserver.kubernetes.local
            - 192.168.0.74
            - 192.168.0.75
            - 192.168.0.76
            - ea-kube-dev.test.co.kr
            - 192.168.0.101
    
      # certSANs 리스트에 서버를 추가한다. (도메인 이름 ea-kube-dev.test.co.kr, IP주소까지 해주면 좋을듯)

  • 인증서 재생성

      # 추가 하고자 하는 서버만 파라미터에 추가해서 수행하면 안되고, 현재 등록된 서버 모두 함께 --apiserver-cert-extra-sans 파라미터에 추가하자
    
      kubeadm init phase certs apiserver --apiserver-cert-extra-sans=kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.ea.cluster.local,10.233.0.1,localhost,127.0.0.1,sri-ea-kube-master1,sri-ea-kube-master2,sri-ea-kube-master3,lb-apiserver.kubernetes.local,10.0.2.64,10.0.2.65,10.0.2.66,sri-ea-kube-master1.test.co.kr,sri-ea-kube-master2.test.co.kr,sri-ea-kube-master3.test.co.kr,ea-kube.test.co.kr,10.0.2.190
    
      # 해당 인증서 생성은 Master Node 전체에서 수행 (ex: kube-master1, kube-master2, kube-master3)

  • apiserver pod 리스타트

      kubectl delete pod kube-apiserver-sri-ea-kube-dev1 kube-apiserver-sri-ea-kube-dev2 kube-apiserver-sri-ea-kube-dev3 -n kube-system

  • 정상 확인

      root # kubectl get ns
      NAME                                                STATUS   AGE
      akhq                                                Active   44d
      apigateway-893-review-develop-3zknud                Active   42d
      apigateway-893-review-feature-bl-ltxs10             Active   42d
      apigateway-893-review-v1-x-sdiidw                   Active   42d
      apigateway-893-staging                              Active   41d
      authorization-server-886-review-authorizat-fl7x7y   Active   55d
      authorization-server-886-review-develop-3zknud      Active   42d
      authorization-server-886-review-v1-x-sdiidw         Active   44d
      authorization-server-886-staging                    Active   41d
      bootadmin-server-912-staging                        Active   28d
      cattle-fleet-clusters-system                        Active   56d
      cattle-fleet-local-system                           Active   56d
      cattle-fleet-system                                 Active   56d
      cattle-global-data                                  Active   56d
      cattle-global-nt                                    Active   56d

  • Cert Renew 작업에서 다시 원복 되지 않는 것으로 확인하였다.

      /usr/local/bin/kubeadm certs renew all

728x90
300x250
728x90
반응형

kubeconfig를 통해 다른서버 접근

개요

Kubernetes를 다른 서버에서 관리해야 할 수도 있고, 다른 서드파티 관리도구에서 자기 클러스터에 올라간 컨테이너가 아니라면 다른서버에서 해당 클러스터에 접근 해야 할 수도 있다.

과거 버전에서는 Authorized Bearer Token이 기본적으로 확인 할 수 있는데, 최근 버전에서는 원하면 생성 해줘야 하는 방식으로 변경 되었다.

  1. k8s Master Node 한 곳에서 Token 생성

     kubectl apply -f - <<EOF
     apiVersion: v1
     kind: Secret
     metadata:
       name: default-token
       annotations:
         kubernetes.io/service-account.name: default
     type: kubernetes.io/service-account-token
     EOF
    

  2. Token 확인

     kubectl describe secret default-token | grep -E '^token'

  3. 접근하기 위한 SA 추가

     kubectl create clusterrolebinding default-cluster-admin --clusterrole cluster-admin --serviceaccount default:default

  4. Other Server에서 KUBECONFIG 생성

     apiVersion: v1
     clusters:
     - cluster:
         certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EY3hPVEE0TURBd01Wb1hEVE16TURjeE5qQTRNREF3TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT08vCmJhQXh3ZEJXVXZqaFBRbjVxTFh4RTZaTmdPWHlXSE8zbUR3OXdRYzRjQkMxaVoveVUrKzAxU2tBOTBSVXpuVEoKYlVGOXBVajdVblBVUEprVTYvY3g4dnBLa2VwSCtPOTJMZXgrTEU0UWNFWnlLTEl1MEREdDY0YmJsejI5NVBVZwp4THRqQml2OFJoeDFXM2dRaWRERURxdXpSMnBBd0lkbnhvMFZ1TWF1c1IvamloZkcxVWw1akYzWFpQTW5KaEt0CnZNR0s1NWVabDhlVlRNR3RCMDc1M1BoU3FBRTVWZ1JDWm96eVBPcllHRVdIV01MNlhXUzhtSmJQaGpaTW5OMDUKQ3dQMEh1TDF5eVRnZlpaaHNoYWowTDRYUi9zT1YwQWsyWUptcGZJLzVuUW9KV2JpSUJ5N0JkUEhUS2RYbFNEeApidVNPYmk2RjZWYVhYS3hMSzIwQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIMHVTMlM3dWE3RVVVNzVrWXA3azVmRWRmb2pNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3MzbWhTNGg5TmN5SEU5Yzd3aQpBOC9qajJMRGl5c2FzcmFNRW9wSjhVOWNreklZSDBNU1JFZGl3WlhhQzc5NDBPd1dBNmltU2JpYi8ydThiSFJBCnhtcE5yWWpFdWE0MGZscmMweU9NRkpWT1dVR2pGd2RkRnlTVmRkYXhrVFZ4RGM3ZWQ2dDdvSm1KWUVHWUlJeEcKeHNLdFZHLzNoeEtwOGlOS2VpbkdXQnNBSWM5RlkyUXN3ellqcjJ5OUY3OUQxWWxOWTZ0RFdjcUFLWFZrOGQ4awp4UUdsTmpZbzI3NVVSblBKZlpOMERMSVBhZW00TEV6RzIzaGx2TjdrK1pOaWlQM3Vabzc3UVZ6b091bitncU9OCjlGRjNQdmlFdXYwRnE3ZmdKYmx6bUJyMG04dzN6cVdwT2RqQWMyK2JhTEpHWld5c0M3ODM2TUFYQlRGaTZsWWEKS2FjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
         server: https://ea-kube-dev.test.co.kr:6443
       name: ea-dev.cluster.local
     contexts:
     - context:
         cluster: ea-dev.cluster.local
         user: system:serviceaccount:default:default
       name: ea-kube-dev
     current-context: ea-kube-dev
     kind: Config
     preferences: {}
     users:
     - name: system:serviceaccount:default:default
       user:
         token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5RRmZPQUlqRWFvaGtkM0JCRmw4RHVIY2tpbXJDWUoyd3ZlS2ZZT3RCOWMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImRlM2RjNzg4LWRiMmUtNGM1Zi1hMTg3LTZkMWNiNWMwMjM3ZSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.fJ0ixcu6z0LfYTb6IDFyB31CX5bBxWfroAlQWIZelEXAzedTUmjS3Y1eySU-y69513FM-gXZzW67UjgO3-K5VCedkKr2mrMEy6UyqUjnYlRpPFPkaFsJRxQjHATpiGRUNxo9ztKXx2oEX1P3pzQVJmo1ZMe8Ck7eqOWAj278pSGuwfih5dDAw54Znagq_T-v1Ag_8uPT59bUglMPIlMSgjvsYkIicg3BnG-d5lVJA_7Ofzyu2ns8LbewXyLEGWQphQMxP7qPnhX52gDRzArFJWYJ6wweZY9Tj4y8cREWlnRYD_XSg8fXf9OY8clzT5hqg95w1728xIu_VSVgiw1ySg

  5. user부분에 cert 부분은 삭제하고 token을 등록 한 후 user 부분에 sa 계정을 추가한다.

  6. Other Server에서 KUBECONFIG 적용

728x90
300x250

+ Recent posts