<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ybchoi</title>
    <link>https://ybchoi.tistory.com/</link>
    <description>인프라 엔지니어로 시작하여 현재는 클라우드 엔지니어/Devops 업무를 하고 있습니다

글도 잘 못쓰고 개인적으로 정리하는 블로그라 친절한 설명이 없습니다

이해가 잘 안되거나 궁금한 부분이 있으면 댓글 달아주시면 답변 드리겠습니다
 
</description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 10:46:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ybchoi</managingEditor>
    <image>
      <title>ybchoi</title>
      <url>https://tistory1.daumcdn.net/tistory/4556575/attach/bbae0129b00f46c5a95118ee0e02ad0a</url>
      <link>https://ybchoi.tistory.com</link>
    </image>
    <item>
      <title>그라파나+로키를 이용하여 얼럿 설정하기</title>
      <link>https://ybchoi.tistory.com/38</link>
      <description>&lt;p data-renderer-start-pos=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;메트릭등을 카운트 하여 얼럿을 생성해도 되겠지만 간단하게 로그를 카운팅 하여 얼럿을 설정 할수도 있다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;그라파나에서 loki 로그 카운터로 얼럿을 생성하는 방법 테스트&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;131&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;먼저 로그를 찍기 위해 pod를 한개 배포함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704367863309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;% k get pod --show-labels
NAME     READY   STATUS    RESTARTS   AGE     LABELS
worker   1/1     Running   0          6d18h   run=worker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;300&quot; data-ke-size=&quot;size16&quot;&gt;해당 파드의 로그 테스트 (얼럿에 추가할 로그는 임의로 trigger_alert_xxxapi_error라고 정함) 앱에서 특정 로그를 찍으면 그것을 카운팅 하는 형태&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;394&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;396&quot; data-ke-size=&quot;size16&quot;&gt;파드에서 STD 출력을 통해 로깅 수행&lt;/p&gt;
&lt;pre id=&quot;code_1704367919419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-renderer-start-pos=&quot;742&quot; data-ke-size=&quot;size16&quot;&gt;파드안에서 echo 로 std출력 시킴&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;765&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;767&quot; data-ke-size=&quot;size16&quot;&gt;loki에서 해당 로그 잘 찍혔는지 확인&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;767&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9wdj1/btsCX5RrQWd/4Ogcz59IT329DcPKewZZQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9wdj1/btsCX5RrQWd/4Ogcz59IT329DcPKewZZQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9wdj1/btsCX5RrQWd/4Ogcz59IT329DcPKewZZQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9wdj1%2FbtsCX5RrQWd%2F4Ogcz59IT329DcPKewZZQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;1350&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;794&quot; data-ke-size=&quot;size16&quot;&gt;정상적으로 로그가 찍힌다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;809&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;811&quot; data-ke-size=&quot;size16&quot;&gt;이제 저 로그를 카운팅 할 대상으로 얼럿을 생성하여 테스트&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;845&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;847&quot; data-ke-size=&quot;size16&quot;&gt;쿼리문은 아래와 같음&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;847&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704367954992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;count_over_time({pod=&quot;worker&quot;}[5m] |= &quot;trigger_alert_xxxapi_error&quot;) &amp;gt; 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;937&quot; data-ke-size=&quot;size16&quot;&gt;5분간 해당 로그의 카운트가 5개가 넘으면 얼럿&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;965&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;967&quot; data-ke-size=&quot;size16&quot;&gt;쿼리 테스트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV9ILq/btsC50nA32p/6rJLa2GRCLMQ8JWjGDtLz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV9ILq/btsC50nA32p/6rJLa2GRCLMQ8JWjGDtLz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV9ILq/btsC50nA32p/6rJLa2GRCLMQ8JWjGDtLz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV9ILq%2FbtsC50nA32p%2F6rJLa2GRCLMQ8JWjGDtLz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1423&quot; height=&quot;369&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이것을 이용하여 얼럿을 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceOfiD/btsCZ54IkbP/HKSnEzTWdBPg0zlsKXudAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceOfiD/btsCZ54IkbP/HKSnEzTWdBPg0zlsKXudAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceOfiD/btsCZ54IkbP/HKSnEzTWdBPg0zlsKXudAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceOfiD%2FbtsCZ54IkbP%2FHKSnEzTWdBPg0zlsKXudAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1423&quot; height=&quot;827&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파드내 에러 생성(6개)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704368012501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1
[root@worker /]# echo &quot;trigger_alert_xxxapi_error&quot; &amp;gt;&amp;gt; /proc/1/fd/1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정한대로(슬랙으로 보내기) 알람 정상 작동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdOP9/btsC4uCs8Jc/2EiZeVyhKxPFJ3guQMzWB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdOP9/btsC4uCs8Jc/2EiZeVyhKxPFJ3guQMzWB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdOP9/btsC4uCs8Jc/2EiZeVyhKxPFJ3guQMzWB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtdOP9%2FbtsC4uCs8Jc%2F2EiZeVyhKxPFJ3guQMzWB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;292&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/38</guid>
      <comments>https://ybchoi.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:34:45 +0900</pubDate>
    </item>
    <item>
      <title>쿠버네티스 이벤트로그 loki 로 수집</title>
      <link>https://ybchoi.tistory.com/37</link>
      <description>&lt;p data-renderer-start-pos=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 이벤트에는 클러스터 동작관련된 중요한 로그가 남는다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;이 로그는 휘발성이며 1시간만 보유됨, 컨테이너 로깅이 아니기때문에 기본 로그수집기로는 수집 불가&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;97&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://artifacthub.io/packages/helm/deliveryhero/k8s-event-logger&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://artifacthub.io/packages/helm/deliveryhero/k8s-event-logger&lt;/a&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;97&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;위 툴은 컨테이너를 하나 띄워 주기적으로 k8s api에 event를 콜하고 STD출력함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;STG출력은 기본 로그 수집기인 fluentd 가 수집하여 로키로 보냄&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boUNQW/btsCWM5JWk9/TJELaxzLO9jK1g8YEO1acK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boUNQW/btsCWM5JWk9/TJELaxzLO9jK1g8YEO1acK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boUNQW/btsCWM5JWk9/TJELaxzLO9jK1g8YEO1acK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboUNQW%2FbtsCWM5JWk9%2FTJELaxzLO9jK1g8YEO1acK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;990&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;232&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;232&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;183&quot; data-ke-size=&quot;size16&quot;&gt;위와같이 쿼리하면 json형식으로 쿠버네티스 이벤트 로그를 수집하고 확인할수 있다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;230&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;232&quot; data-ke-size=&quot;size16&quot;&gt;prettify json을 활성화하면 좀더 보기 좋게 나옴&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;232&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;2112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDY6j/btsC1nqv7d1/y8XDBDVd0LmJhOOPlt8Ze0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDY6j/btsC1nqv7d1/y8XDBDVd0LmJhOOPlt8Ze0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDY6j/btsC1nqv7d1/y8XDBDVd0LmJhOOPlt8Ze0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDY6j%2FbtsC1nqv7d1%2Fy8XDBDVd0LmJhOOPlt8Ze0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1538&quot; height=&quot;2112&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;2112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/37</guid>
      <comments>https://ybchoi.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:29:44 +0900</pubDate>
    </item>
    <item>
      <title>1개의 ALB-Ingress로 여러개의 타켓 사용시 타켓별 설정 하는법</title>
      <link>https://ybchoi.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일 도메인을 path별로 공유할때는 1개의 Ingress를 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 여러가지 타겟을 한개의 ingress가 바라보는 형태인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 타겟별로 속성이 다르다면(헬스체크,attributes 등) ingress 어노테이션이 아닌 서비스 어노테이션을 이용하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헬스체크 패스가 /가 아니라면 아래와 같이 ingress 어노테이션을 설정하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704367521496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /api/health&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 어노테이션을 인그레스가 아닌 대상이 바라보는 서비스에 달면 각각의 타겟별로 설정을 다르게 가져갈수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/36</guid>
      <comments>https://ybchoi.tistory.com/36#entry36comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:26:04 +0900</pubDate>
    </item>
    <item>
      <title>Cluster Autoscaler에서 0개짜리인 ASG를 스케일아웃 하는법</title>
      <link>https://ybchoi.tistory.com/35</link>
      <description>&lt;p data-renderer-start-pos=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;min 이 0 인 ASG를 CA가 scaling 하지 못하는 문제 발생&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md#auto-discovery-setup&quot;&gt;https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md#auto-discovery-setup&lt;/a&gt;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;168&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;170&quot; data-ke-size=&quot;size16&quot;&gt;문서 확인결과 아래 태그가 ASG에 필요함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;196&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;198&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1704366616657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k8s.io/cluster-autoscaler/node-template/label/value

k8s.io/cluster-autoscaler/node-template/taint/value&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;306&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;308&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;310&quot; data-ke-size=&quot;size16&quot;&gt;테라폼에서 여러개의 태그를 지정하기 위해 아래 방법 시도&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;385&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704366698779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;locals {
  eks_asg_tag_list_gpu_pv = {
    &quot;k8s.io/cluster-autoscaler/node-template/label/role&quot; : &quot;gpu-pv&quot;
    &quot;k8s.io/cluster-autoscaler/node-template/label/team&quot; : &quot;devops&quot;
    &quot;k8s.io/cluster-autoscaler/node-template/taint/spot&quot; : &quot;true:NoSchedule&quot;
    &quot;k8s.io/cluster-autoscaler/node-template/taint/team&quot; : &quot;data:NoSchedule&quot;
  }
  
  
  resource &quot;aws_autoscaling_group_tag&quot; &quot;gpu_pv&quot; {
  for_each               = local.eks_asg_tag_list_gpu_pv
  autoscaling_group_name = aws_eks_node_group.gpu_pv.resources.0.autoscaling_groups.0.name

  tag {
    key                 = each.key
    value               = each.value
    propagate_at_launch = true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;1101&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1132&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;위와같이 적용하고 from 0에서 스케일링 정상작동 하는것 확인&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1173&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;notranslate&quot; style=&quot;all: initial;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/35</guid>
      <comments>https://ybchoi.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:15:04 +0900</pubDate>
    </item>
    <item>
      <title>cronjob의 타임존 설정</title>
      <link>https://ybchoi.tistory.com/34</link>
      <description>&lt;p data-renderer-start-pos=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 타임존은 기본적으로 UTC로 동작하며 이를 변경할수 없음&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;48&quot; data-ke-size=&quot;size16&quot;&gt;파드 내부의 타임존은 timezone파일을 마운트 하여 맞출수 있지만 크론탭의 경우 불가능함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 사용에는 -9해서 만들면 되니까 큰 문제가 없는데&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;135&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;137&quot; data-ke-size=&quot;size16&quot;&gt;만약 매달 1일 05시에 도는 잡이라면 문제가 발생&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704366323257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;30 8 1 * * /usr/bin/bash test3
0 5 1 * * /usr/bin/bash  test1
0 6 1 * * /usr/bin/bash  test&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;440&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;442&quot; data-ke-size=&quot;size16&quot;&gt;이게 왜 문제냐면 위 시간은 UTC라 KST로 조정하면 1일이 아니고 매달 말일임&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;489&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;매달 말일의 경우 크론탭으로는 설정이 불가능(28일,30일,31일 등 여러가지 조건이 있으므로)&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;546&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;548&quot; data-ke-size=&quot;size16&quot;&gt;해서 일반적으로 크론탭에서는 아래와 같은 방법을 쓰는데&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;580&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1704366413206&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;30 23 28-31 * * [ $(date +\%d -d tomorrow) = 02 ] &amp;amp;&amp;amp; /usr/bin/bash test&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;704&quot; data-ke-size=&quot;size16&quot;&gt;위와같이 설정하면 매달 28~31일날(UTC기준) 실행되는데 다음날이 2일(KST기준)인 경우에만 실행 한다(원래는 1일이나 파드내부는 KST 크론잡 타임은 UTC이므로 위와같이 설정해야함) 외 내부 타임존이 다르기때문에 계산하는것도 두번해야하고 관리도 번거로움&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;852&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 적용을 하려다가 크론잡 doc을 보니 1.25부터 크론잡 타임존이 베타로 승격됨&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;902&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;타임-존&quot; data-renderer-start-pos=&quot;919&quot; data-ke-size=&quot;size26&quot;&gt;타임 존&lt;/h2&gt;
&lt;p data-renderer-start-pos=&quot;925&quot; data-ke-size=&quot;size16&quot;&gt;크론잡에 타임 존이 명시되어 있지 않으면, kube-controller-manager는 로컬 타임 존을 기준으로 스케줄을 해석한다.&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1000&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능 상태:&lt;/b&gt; Kubernetes v1.25 [beta]&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1032&quot; data-ke-size=&quot;size16&quot;&gt;CronJobTimeZone &lt;a href=&quot;https://kubernetes.io/ko/docs/reference/command-line-tools-reference/feature-gates/&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;기능 게이트&lt;/a&gt;를 활성화하면, 크론잡에 대해 타임 존을 명시할 수 있다(기능 게이트를 활성화하지 않거나, 타임 존에 대한 실험적 지원을 제공하지 않는 쿠버네티스 버전을 사용 중인 경우, 클러스터의 모든 크론잡은 타임 존이 명시되지 않은 것으로 동작한다).&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1190&quot; data-ke-size=&quot;size16&quot;&gt;이 기능을 활성화하면, spec.timeZone을 유효한 &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;타임 존&lt;/a&gt;으로 지정할 수 있다. 예를 들어, spec.timeZone: &quot;Etc/UTC&quot;와 같이 설정하면 쿠버네티스는 협정 세계시를 기준으로 스케줄을 해석한다.&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1312&quot; data-ke-size=&quot;size16&quot;&gt;Go 표준 라이브러리의 타임 존 데이터베이스가 바이너리로 인클루드되며, 시스템에서 외부 데이터베이스를 사용할 수 없을 때 폴백(fallback)으로 사용된다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1401&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1403&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 설정&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1414&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704366444261&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spec:
  schedule: &quot;30 8 1 * *&quot;
  successfulJobsHistoryLimit: 1
  timeZone: 'Asia/Seoul'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;1505&quot; data-ke-size=&quot;size16&quot;&gt;굳이 -9 계산안해도 편하게 타임존 설정가능&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1531&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1533&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 기본 기조자체가 UTC를 써라 tz관련된 그 어떤 피쳐도 없다 였는데&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1579&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1581&quot; data-ke-size=&quot;size16&quot;&gt;크론잡의 경우 위같은 문제가 워낙 많아 최근에 생긴듯&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1612&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1614&quot; data-ke-size=&quot;size16&quot;&gt;위와같이 모든 잡에 적용 했으며 매일 6~9시 사이 도는 잡이 있으니 익일 KST기준으로 잘 도는지 체크&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1674&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1676&quot; data-ke-size=&quot;size16&quot;&gt;기존잡에 timezone만 추가해서 그런지 정상적으로 적용이 되지 않았음(09시 도는 잡이 18시에 돔)&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1736&quot; data-ke-size=&quot;size16&quot;&gt;전체 잡을 삭제하고 다시 적용했고&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704366485938&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 26 Jul 2023 09:05:01 +0900
      Finished:     Wed, 26 Jul 2023 09:05:01 +0900&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;2528&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2530&quot; data-ke-size=&quot;size16&quot;&gt;정상적으로 KST 09시에 돔&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;2786&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/34</guid>
      <comments>https://ybchoi.tistory.com/34#entry34comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:08:53 +0900</pubDate>
    </item>
    <item>
      <title>무중단 배포를 위해 필요한 기술들</title>
      <link>https://ybchoi.tistory.com/33</link>
      <description>&lt;p data-renderer-start-pos=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 롤링 업데이트를 하다보면 업데이트 간 간헐적으로 50x 코드가 발생하는데 이러한일이 왜 발생되며 예방하려면 어떠한 기술을 사용해야 하는지에 대한 정리&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;94&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;96&quot; data-ke-size=&quot;size16&quot;&gt;구조상 무조건 발생되는 문제이며 대부분 모르거나 새로고침하면 해결되므로 그냥 두는경우가 있는데 충분히 예방하고 방지할수 있는 부분임&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스만의 문제는 아니고 복합적인 원인과 문제로 인해 발생되는 일&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;213&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;215&quot; data-ke-size=&quot;size16&quot;&gt;먼저 에러가 왜 발생되는지에 대한 부분&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;238&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;240&quot; data-ke-size=&quot;size16&quot;&gt;테스트를 위해 구동하는데 10초가 걸리는 웹서버를 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704365639478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;net/http&quot;
	&quot;time&quot;
)

func main() {
	// 루트 경로 핸들러 등록
	http.HandleFunc(&quot;/&quot;, func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, &quot;Hello, World!&quot;)
	})

	// 시작전 딜레이 10초
	time.Sleep(10 * time.Second)
	// 서버 시작
	fmt.Println(&quot;서버 시작...&quot;)
	err := http.ListenAndServe(&quot;:8080&quot;, nil)
	if err != nil {
		fmt.Println(err)
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-renderer-start-pos=&quot;628&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;630&quot; data-ke-size=&quot;size16&quot;&gt;이를 쿠버네티스에 배포함(프로브 설정없음)&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;655&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365654026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: websvr
  name: websvr
spec:
  replicas: 3
  selector:
    matchLabels:
      app: websvr
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: websvr
    spec:
      containers:
      - image: devops-demo:10001
        name: websvr
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: websvr-service
spec:
  selector:
    app: websvr-server
  ports:
    - protocol: TCP
      port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/group.name: private-group
    alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTP&quot;: 80}, {&quot;HTTPS&quot;:443}]'
    alb.ingress.kubernetes.io/manage-backend-security-group-rules: &quot;true&quot;
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: sg-05ac5cd61c45454
    alb.ingress.kubernetes.io/ssl-redirect: &quot;443&quot;
    alb.ingress.kubernetes.io/target-type: ip
  name: websvr-ing
spec:
  ingressClassName: alb
  rules:
  - host: testapp.devops.test.gg
    http:
      paths:
      - backend:
          service:
            name: websvr-service
            port:
              number: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;2137&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2139&quot; data-ke-size=&quot;size16&quot;&gt;도메인을 연결하고 파드는 3개로 구성&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2181&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2183&quot; data-ke-size=&quot;size16&quot;&gt;배포후 curl을 통해 확인&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1704365761732&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;% curl https://testapp.devops.test.gg
Hello, World!%&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;2255&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2257&quot; data-ke-size=&quot;size16&quot;&gt;장애 상황을 감지할수 있도록 간단한 쉘작성&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2282&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1704365792544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while true; do
  STATUS_CODE=$(curl --output /dev/null --silent --max-time 5 --write-out &quot;%{http_code}&quot; &quot;https://testapp.devops.test.gg&quot;)
  sleep 0.5
  if [ $STATUS_CODE -ne 200 ] ;
  then
   echo $STATUS_CODE &quot;$(date +&quot;%T&quot;)&quot;
  fi
done&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;2526&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2528&quot; data-ke-size=&quot;size16&quot;&gt;0.5초마다 curl을 하고 200외에는 시간과 코드를 출력함, timeout은 5초 설정&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2580&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2584&quot; data-ke-size=&quot;size16&quot;&gt;rollout을 해도 되겠으나 실제 롤링 업데이트를 가정하기 위해 10001 10002 이미지 2개를 번갈아가며 교체하고 테스트&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2657&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;2659&quot; data-ke-size=&quot;size16&quot;&gt;위 상태에서 롤링 업데이트 결과&lt;/p&gt;
&lt;pre id=&quot;code_1704365838883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;% bash curl.sh
000 13:57:05
000 13:57:11
000 13:57:16
502 13:57:17
502 13:57:17
502 13:57:18
502 13:57:18
....
502 13:57:31&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;3228&quot; data-ke-size=&quot;size16&quot;&gt;처음 000 코드는 설정된 5초의 타임아웃때문에 발생&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3259&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3261&quot; data-ke-size=&quot;size16&quot;&gt;그 후 502는 웹서버가 올라오는 약 10초동안 502가 발생함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3294&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3296&quot; data-ke-size=&quot;size16&quot;&gt;실제 컨테이너내 앱은 10초후에 준비가 되지만 쿠버네티스 기본값으로는 PID 1만 구동이면 성공으로 간주하므로 트래픽을 보내기 시작하며 위와같은 일이 벌어짐&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3385&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3387&quot; data-ke-size=&quot;size16&quot;&gt;이러한 근본적인 원인을 해결하려면 프로브를 설정해야함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3418&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3420&quot; data-ke-size=&quot;size16&quot;&gt;현재는 파드구동 &amp;rarr; 컨테이너구동(PID) -&amp;gt;성공(트래픽보내기시작) &amp;rarr; 다음파드 롤링&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3469&quot; data-ke-size=&quot;size16&quot;&gt;이라면 파드구동 &amp;rarr; 컨테이너구동(PID) &amp;rarr; 프로브작동(httpget) &amp;rarr; 프로브성공(트래픽 보내기 시작) &amp;rarr; 다음파드 롤링&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3540&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3542&quot; data-ke-size=&quot;size16&quot;&gt;형태로 바꾸어야 한다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3557&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3587&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3589&quot; data-ke-size=&quot;size16&quot;&gt;위 앱의 경우 웹서버이므로 간단하게 / 를 체크하는 프로브를 설정한다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3629&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365876596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;3925&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3927&quot; data-ke-size=&quot;size16&quot;&gt;적용&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3931&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3933&quot; data-ke-size=&quot;size16&quot;&gt;지금까지는 프로브가 없어서 시작하자마자 모든 파드가 내려가고 올라감&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3972&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3974&quot; data-ke-size=&quot;size16&quot;&gt;지금부터는 이과정에 프로브가 추가된다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;3996&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365898141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;websvr-66cfd8bf4d-44x5c   1/1     Running   0          7m
websvr-66cfd8bf4d-6p95c   1/1     Running   0          6m59s
websvr-66cfd8bf4d-7bmhr   1/1     Running   0          7m1s
websvr-6df6fd758d-d6kp6   0/1     Running   0          12s&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;4237&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4239&quot; data-ke-size=&quot;size16&quot;&gt;위와같이 파드를 생성하고 준비가 될때까지(프로브성공) 성공으로 간주하지 않고 기다림&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4288&quot; data-ke-size=&quot;size16&quot;&gt;프로브 설정 이후에는 위와같은 이유로 전체 롤링 업데이트 시간이 크게 증가됨&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4332&quot; data-ke-size=&quot;size16&quot;&gt;프로브 설정 이후 curl 체크&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4351&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365925805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;000 14:11:17
000 14:11:23
000 14:11:30
000 14:13:13
000 14:13:20
000 14:13:47
502 14:13:50
000 14:13:55
000 14:14:23
000 14:14:31&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;4544&quot; data-ke-size=&quot;size16&quot;&gt;보면 502는 거의 사라지고 타임아웃이 많이 나는걸 확인 할수 있다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4585&quot; data-ke-size=&quot;size16&quot;&gt;502가 나는 원인중 한개는 준비되기전 파드에 트래픽이 흐르기 시작해서이고 해결이 되었다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4636&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4638&quot; data-ke-size=&quot;size16&quot;&gt;타임아웃이 나는 원인은 인입된 트래픽의 처리 이전 파드가 종료되서 이다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4679&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4681&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스가 파드를 종료할때는 sigterm을 내리고 컨테이너는 신호를 받아 pid1번을 종료한다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4737&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4739&quot; data-ke-size=&quot;size16&quot;&gt;잘 개발된 앱이라면 sigterm을 받고 현재 연결된 세션이나 이미 받은 요청에 대한 처리를 하도록 구성이 되어있겠지만 그렇지 못한 경우가 많고 웹서버의 경우에는 거의 이렇게 구성하지 않는다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4847&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4849&quot; data-ke-size=&quot;size16&quot;&gt;이를 대비하기 위한 기능이 쿠버네티스에도 있는데 Lifecyclehook 이다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4894&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4896&quot; data-ke-size=&quot;size16&quot;&gt;파드가 종료될때(롤링으로인해)는 아래의 순서에 따른다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4927&quot; data-ke-size=&quot;size16&quot;&gt;종료 성공이 기본값으로 30초간(기본값 늘릴수 있음) 되지 않으면 sigkill을 보내 강제 종료함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4984&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;4986&quot; data-ke-size=&quot;size16&quot;&gt;종료신호(Sigterm) &amp;rarr; 종료 확인 &amp;rarr; 종료 성공&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5017&quot; data-ke-size=&quot;size16&quot;&gt;종료시작-(EP에서 해당 파드제거)-이미종료&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5043&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5045&quot; data-ke-size=&quot;size16&quot;&gt;파드가 종료되기전에 EP에서 해당 파드가 제거되어 트래픽이 가지 않아야 하는데 sigterm(종료시작)을 받자마자 파드가 죽어버려서 EP에서 빠지기전 트래픽이 도달하고 해당 트래픽처리를 하지 못하고 파드가 죽어버린다 그래서 에러 발생&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5177&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5179&quot; data-ke-size=&quot;size16&quot;&gt;이와같은 앱에 라이프사이클 훅(sleep 10) 을 삽입하면 아래와 같이 종료된다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5226&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5229&quot; data-ke-size=&quot;size16&quot;&gt;종료신호(Sigterm)-&amp;gt; 훅 작동(sleep &amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;..10)&amp;rarr; 종료 확인 &amp;rarr; 종료 성공&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5284&quot; data-ke-size=&quot;size16&quot;&gt;종료시작(EP에서 해당 파드제거)----여기충분한트래픽처리시간이존재------종료&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5331&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5333&quot; data-ke-size=&quot;size16&quot;&gt;라이프사이클은 아래와 같이 설정한다&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365967824&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    lifecycle:
      preStop:
        exec:
          command: [&quot;sleep&quot;, &quot;10&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;5434&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5436&quot; data-ke-size=&quot;size16&quot;&gt;설정후 롤링 업데이트 수행&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5452&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5454&quot; data-ke-size=&quot;size16&quot;&gt;라이프사이클 훅이 삽입됬으므로 각 파드 종료간 10초의 딜레이가 생겨 전체적인 롤링 업데이트시간은 더욱 늘어남&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5517&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5519&quot; data-ke-size=&quot;size16&quot;&gt;여기부터는 상황 설명을 위해 curl을 내부망에서도 수행&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5552&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5554&quot; data-ke-size=&quot;size16&quot;&gt;외부망 curl&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1704365985826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pv -N 000 14:46:38
pv -N 000 14:47:47&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;5603&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5605&quot; data-ke-size=&quot;size16&quot;&gt;전체 과정에서 타임아웃 2번 발생&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5625&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5627&quot; data-ke-size=&quot;size16&quot;&gt;내부망 curl&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-ds--code--code-block=&quot;&quot; data-code-lang=&quot;&quot;&gt;&lt;span&gt;아무런 에러없음&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;5647&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5649&quot; data-ke-size=&quot;size16&quot;&gt;위 2가지 설정만으로 쿠버네티스에서는 파드 롤링 업데이트간 트래픽 제어와 처리를 효과적으로 할수 있다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5707&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5709&quot; data-ke-size=&quot;size16&quot;&gt;그러나 아직도 외부망에서는 에러가 발생되고 있음&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5737&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5739&quot; data-ke-size=&quot;size16&quot;&gt;이러한 이유는 ALB때문이다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5756&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5758&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스 서비스의 ep와는 다르게 ALB가 바라보고 있는 타겟그룹의 추가시간이나 제거시간에 딜레이가 있기때문임&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5822&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5824&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 체크(성공시) &amp;rarr; ep에 넣기 &amp;rarr; 트래픽가기 가 순식간에 일어남&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5868&quot; data-ke-size=&quot;size16&quot;&gt;ALB의 경우 체크(성공시) &amp;rarr; 타겟그룹에 넣기(한참걸림) &amp;rarr; 실제로 트래픽 감&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5914&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;5916&quot; data-ke-size=&quot;size16&quot;&gt;타겟그룹의 타겟 add,delete타임이 쿠버네티스 엔드포인트 제어보다 느리므로 전체 과정에서 타겟그룹에 정상적인 타겟이 없는 경우가 간혹 생기는데 그에 따른 에러다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6010&quot; data-ke-size=&quot;size16&quot;&gt;이를 해소하기위해서는 readinessgate를 이용하면되는데&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6046&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6048&quot; data-ke-size=&quot;size16&quot;&gt;readinessgate를 설정하면 아래의 단계로 업데이트가 수행된다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6088&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6090&quot; data-ke-size=&quot;size16&quot;&gt;파드구동 &amp;rarr; 컨테이너구동(PID) &amp;rarr; 프로브작동(httpget) &amp;rarr; 프로브성공(트래픽 보내기 시작) &amp;rarr; ALB 타겟그룹에 대상추가가 끝나길기다림 &amp;rarr; 다음파드 롤링&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6182&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6184&quot; data-ke-size=&quot;size16&quot;&gt;readinessgate는 네임스페이스에 레이블링 하여 설정한다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6221&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1704366039325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl label namespace default elbv2.k8s.aws/pod-readiness-gate-inject=enabled&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;6304&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6306&quot; data-ke-size=&quot;size16&quot;&gt;설정이후부터는 pod -o wide옵션으로 보면 게이트가 보이며&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6306&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Liuzy/btsC54XOcbO/1x6NWhGrfCAx0c0YDIt7hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Liuzy/btsC54XOcbO/1x6NWhGrfCAx0c0YDIt7hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Liuzy/btsC54XOcbO/1x6NWhGrfCAx0c0YDIt7hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiuzy%2FbtsC54XOcbO%2F1x6NWhGrfCAx0c0YDIt7hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1423&quot; height=&quot;119&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6346&quot; data-ke-size=&quot;size16&quot;&gt;gate까지 성공해야 파드 구동 성공으로 간주함&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6374&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6376&quot; data-ke-size=&quot;size16&quot;&gt;위 설명한 모든 기술들을 적용하고 롤링 업데이트 결과&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6407&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;6409&quot; data-ke-size=&quot;size16&quot;&gt;내부/외부 모두 단 한번의 에러없이 수행됨&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/33</guid>
      <comments>https://ybchoi.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 4 Jan 2024 20:04:27 +0900</pubDate>
    </item>
    <item>
      <title>NPD(Node Problem Detector) 활용</title>
      <link>https://ybchoi.tistory.com/32</link>
      <description>&lt;p data-renderer-start-pos=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;k8s에서 노드 모니터링 하는건 단순히 4가지인데 이는 아래와 같다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-layout=&quot;full-width&quot;&gt;
&lt;div&gt;
&lt;p data-renderer-start-pos=&quot;51&quot; data-ke-size=&quot;size16&quot;&gt;노드 컨디션&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;61&quot; data-ke-size=&quot;size16&quot;&gt;설명&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;Ready&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;노드가 상태 양호하며 파드를 수용할 준비가 되어 있는 경우 True, 노드의 상태가 불량하여 파드를 수용하지 못할 경우 False, 그리고 노드 컨트롤러가 마지막 node-monitor-grace-period (기본값 40 기간 동안 노드로부터 응답을 받지 못한 경우) Unknown&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;DiskPressure&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;디스크 사이즈 상에 압박이 있는 경우, 즉 디스크 용량이 넉넉치 않은 경우 True, 반대의 경우 False&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;MemoryPressure&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;노드 메모리 상에 압박이 있는 경우, 즉 노드 메모리가 넉넉치 않은 경우 True, 반대의 경우 False&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;PIDPressure&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;프로세스 상에 압박이 있는 경우, 즉 노드 상에 많은 프로세스들이 존재하는 경우 True, 반대의 경우 False&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;NetworkUnavailable&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;340&quot;&gt;&lt;span&gt;노드에 대해 네트워크가 올바르게 구성되지 않은 경우 True, 반대의 경우 False&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;565&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;567&quot; data-ke-size=&quot;size16&quot;&gt;위처럼 아주 제한적인 상황에서만 노드의 장애여부를 판단하고 스케쥴을 disable하며 이외의 경우는 아무것도 감지하지 못하고 파드를 스케쥴링 한다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;652&quot; data-ke-size=&quot;size16&quot;&gt;NPD는 노드의 문제감지케이스를 크게 확장 시켜주는데 이는 아래와 같다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;693&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-layout=&quot;full-width&quot;&gt;
&lt;div&gt;
&lt;div data-testid=&quot;sticky-table-fixed&quot;&gt;
&lt;div data-layout=&quot;default&quot;&gt;
&lt;div&gt;
&lt;p data-renderer-start-pos=&quot;698&quot; data-ke-size=&quot;size16&quot;&gt;Problem Daemon Types&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;722&quot; data-ke-size=&quot;size16&quot;&gt;NodeCondition&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;739&quot; data-ke-size=&quot;size16&quot;&gt;Description&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;Configs&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;765&quot; data-ke-size=&quot;size16&quot;&gt;Disabling Build Tag&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p data-renderer-start-pos=&quot;698&quot; data-ke-size=&quot;size16&quot;&gt;Problem Daemon Types&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;722&quot; data-ke-size=&quot;size16&quot;&gt;NodeCondition&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;739&quot; data-ke-size=&quot;size16&quot;&gt;Description&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;Configs&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;765&quot; data-ke-size=&quot;size16&quot;&gt;Disabling Build Tag&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/tree/master/pkg/systemlogmonitor&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;SystemLogMonitor&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;KernelDeadlock ReadonlyFilesystem FrequentKubeletRestart FrequentDockerRestart FrequentContainerdRestart&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;A system log monitor monitors system log and reports problems and metrics according to predefined rules.&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/kernel-monitor-filelog.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;filelog&lt;/a&gt;, &lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/kernel-monitor.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;kmsg&lt;/a&gt;, &lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/kernel-monitor-counter.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;kernel&lt;/a&gt; &lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/abrt-adaptor.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;abrt&lt;/a&gt; &lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/systemd-monitor-counter.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;systemd&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;disable_system_log_monitor&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/tree/master/pkg/systemstatsmonitor&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;SystemStatsMonitor&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;None(Could be added in the future)&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;A system stats monitor for node-problem-detector to collect various health-related system stats as metrics. See the proposal &lt;a href=&quot;https://docs.google.com/document/d/1SeaUz6kBavI283Dq8GBpoEUDrHA2a795xtw0OvjM568/edit&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;disable_system_stats_monitor&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/tree/master/pkg/custompluginmonitor&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;CustomPluginMonitor&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;On-demand(According to users configuration), existing example: NTPProblem&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;A custom plugin monitor for node-problem-detector to invoke and check various node problems with user-defined check scripts. See the proposal &lt;a href=&quot;https://docs.google.com/document/d/1jK_5YloSYtboj-DtfjmYKxfNnUxCAvohLnsH5aGCAYQ/edit#&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/4ad49bbd84b8ced45ac825eac01ec93d9235935e/config/custom-plugin-monitor.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;example&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;disable_custom_plugin_monitor&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/tree/master/pkg/healthchecker&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;HealthChecker&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;KubeletUnhealthy ContainerRuntimeUnhealthy&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;A health checker for node-problem-detector to check kubelet and container runtime health.&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/health-checker-kubelet.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;kubelet&lt;/a&gt; &lt;a href=&quot;https://github.com/kubernetes/node-problem-detector/blob/master/config/health-checker-docker.json&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;docker&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;136&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-renderer-start-pos=&quot;1804&quot; data-ke-size=&quot;size16&quot;&gt;커널의 deadlock감지, filesystem read-only감지(full check) 중요 프로세스의 리스타트 횟수등을 감지하여 노드의 장애 여부 판단할수 있는 케이스종류를 크게 늘려 준다&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1914&quot; data-ke-size=&quot;size16&quot;&gt;장애 상황이 많아지는대신 시스템은 안정되겠으나 관리의 포인트는 늘어날듯&lt;/p&gt;
&lt;p data-renderer-start-pos=&quot;1955&quot; data-ke-size=&quot;size16&quot;&gt;주의사항으로는 node cordon이후 uncordon은 자동으로 되지 않음 한번 cordon되면 운영자가 확인하고 제거나 uncordon 수행해야함&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/32</guid>
      <comments>https://ybchoi.tistory.com/32#entry32comment</comments>
      <pubDate>Thu, 4 Jan 2024 19:52:02 +0900</pubDate>
    </item>
    <item>
      <title>terraform backend s3+dynamodb 사용하기</title>
      <link>https://ybchoi.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;혼자서 terraform사용할때는 사실 크게 필요없음(백업용도 외)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 로컬코드 레포에 테라폼의 상태를 저장하는 tfstate를 두면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 여러사람이 동시에 작업할경우에는 일일히 tfstate를 동기화하여야 하고 동기화를 하지 않았을때 apply를 해버리면 인프라가 날라가는 경우가 생김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 tfstate를 동기화 했더라도 동시에 작업을 해버리면 일관성을 해칠수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해서 terraform backend로 s3(tfstate저장) 와 dynamedb(tfstate Lock관리) 를 사용하는 방법 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 bc-labs 클러스터 내 mainnet,testnet 배포에 적용되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 어렵진 않다 아래와 같이 프로바이더tf에 설정해주면 됨&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 0.12&quot;
    backend s3 {
    bucket         = &quot;testnet&quot; # S3 버킷 이름
    key            = &quot;terraform/testnet/terraform.tfstate&quot; # tfstate 저장 경로
    region         = &quot;ap-northeast-2&quot;
    dynamodb_table = &quot;terraform-testnet-tfstate-lock&quot; # dynamodb table 이름
    profile        = &quot;testnet&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;profile의 경우 아래와 같이 provider에 설정이 되어있는데&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
        profile = &quot;testnet&quot;
  region = var.aws_region
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 설정을 참조하지 않아서 계속 에러가 발생됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해서 backend 부분에 profile을 별도로 명시 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lock용 dynamodb table은 아래와 같이 배포&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;resource &quot;aws_dynamodb_table&quot; &quot;terraform-testnet-tfstate-lock&quot; {
  name           = &quot;terraform-testnet-tfstate-lock&quot;
  hash_key       = &quot;LockID&quot;
  billing_mode   = &quot;PAY_PER_REQUEST&quot;

  attribute {
    name = &quot;LockID&quot;
    type = &quot;S&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamodb 및 s3는 프로비저닝 이전에 배포되야 하므로 console에서 생성하려면 아래와 같이 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2740&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yV1gx/btrPFZwV6Nd/5hvt4EYlgZyTnuh3qp2hN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yV1gx/btrPFZwV6Nd/5hvt4EYlgZyTnuh3qp2hN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yV1gx/btrPFZwV6Nd/5hvt4EYlgZyTnuh3qp2hN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyV1gx%2FbtrPFZwV6Nd%2F5hvt4EYlgZyTnuh3qp2hN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2740&quot; height=&quot;82&quot; data-origin-width=&quot;2740&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새롭게 프로비저닝 하는것이라면 terraform init을 바로 하면 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 이미 로컬로 관리하고 있었다면 .terraform 폴더를 삭제해야함(s3 backend의 경우 설치 되는게 다름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 후 terrafom init 재수행&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;terraform init

Initializing the backend...

Successfully configured the backend &quot;s3&quot;! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Finding latest version of hashicorp/http...
- Installing hashicorp/http v3.1.0...
- Installed hashicorp/http v3.1.0 (signed by HashiCorp)
- Installing hashicorp/aws v4.36.1...
- Installed hashicorp/aws v4.36.1 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run &quot;terraform init&quot; in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running &quot;terraform plan&quot; to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s3 backend 설정 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 테라폼 작업시에는 tfstate가 로컬이 아닌 s3로 저장되어지며 dynamodb로 인해 lock관리도 되므로 여러명이서 작업해도 문제 없음&lt;/p&gt;</description>
      <category>클라우드</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/31</guid>
      <comments>https://ybchoi.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 27 Oct 2022 11:32:07 +0900</pubDate>
    </item>
    <item>
      <title>GitOps를 위한 Jenkins Pipeline 작성</title>
      <link>https://ybchoi.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이프라인 문법은 2가지가 있는데 Declarative 방식을 사용 하였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;젠킨스 설치법,인증생성 방법등 기초적인 내용은 생략 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS ECR 인증과 github인증은 젠킨스내에 이미 있어야 합니다(credential)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙 알람을 사용하려면 슬랙 설정을 해야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 파이프라인중 {{}} 안에 내용은 사용자의 맞게 수정하여야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레포는 빌드할 이미지가 있는 소스레포, ArgoCD에서 사용하는 배포용 manifest레포 2가지가 있다고 가정 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657775871807&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
 environment {
 registry = &quot;{{ECR주소}}/{{레포이름(이미지)}}&quot;
 registryCredential = '{{erc인증용credential}}'
 dockerImage = ''
}
  
  agent any
  stages {
    stage('Cloning Git') {
      steps {
        slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;${env.JOB_NAME}앱의 CI 과정이 시작되었습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        git([url: '{{소스레포지토리의주소}}', branch: '{{브랜치이름}}', credentialsId: '{{깃접속에필요한credential}}'])
          }
            }
    stage('Building Image') {
      steps{
        script {
          dockerImage = docker.build registry + &quot;:$BUILD_NUMBER&quot;
    }
        }
            }
    stage('Testing') {
        steps{
         script {
            dockerImage.inside {
            sh 'node --version'
            }
            }
        }
    }
stage('Push Image') {
    steps{
        script {
        docker.withRegistry( '{{ECR주소}}', registryCredential ) {
        dockerImage.push()
    }
        }
            }
                }
stage('Cleaning Up') {
steps{
sh &quot;docker rmi $registry:$BUILD_NUMBER&quot;
                }
            }
    stage('Deploy') {
    steps{
                    sh 'set +x'
                    sh 'export GIT_SSH_COMMAND=&quot;ssh -oStrictHostKeyChecking=no&quot;'
                    sh '{{아르고CD배포용레포주소}} || true'
                    sh &quot;sed -i 's/{{레포이름(이미지)}}:.*\$/{{레포이름(이미지)}}:${env.BUILD_NUMBER}/g' {{deployment의경로}}/deployment.yaml&quot;
                    dir (&quot;{{레포경로}}&quot;) {
                        sh 'git add {{레포이름(이미지)}}/deployment.yaml'
                        sh &quot;git commit -m 'updated the image tag to ${env.BUILD_NUMBER}'&quot;
                        sh 'git push'
                        deleteDir()
                }
            }
        }
            
  }   
            
    post {
        success {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;빌드 완료 \n ${env.JOB_NAME}앱의 CI 과정이 성공적으로 끝났습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        }
        failure {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;빌드가 실패하였습니다 \n ${env.JOB_NAME}앱의 젠킨스 콘솔을 확인해주세요 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 상세 설명입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 파이프라인의 시작 env 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657776089652&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
 environment {
 registry = &quot;{{ECR주소}}/{{레포이름(이미지)}}&quot;
 registryCredential = '{{erc인증용credential}}'
 dockerImage = ''
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이프라인에서 사용할 변수를 지정하여 줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;registry의 경우 ecr이면 {{계정}}&lt;span&gt;.dkr.ecr.ap-northeast-2.amazonaws.com 이며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이미지는 test-app 식입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 예제라면 registry에는 {{계정}}.dkr.ecr.ap-northeast-2.amazonaws.com/test-app 이라고 적어주시면 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;registryCredential 부분은 ecr인증용 credential 이름을 적어주면 되고 젠킨스 메뉴 credential에서 ecr권한이 있는 계정의 AWS KEY를 이용한 credential을 생성하여 해당 credential이름을 적어주심 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스테이지 시작입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657776262921&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    stage('Cloning Git') {
      steps {
        slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;${env.JOB_NAME}앱의 CI 과정이 시작되었습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        git([url: '{{소스레포지토리의주소}}', branch: '{{브랜치이름}}', credentialsId: '{{깃접속에필요한credential}}'])
          }
            }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 레포지토리의 git clone을 제일 먼저 수행합니다. 수행하면서 slack채널에 CI과정이 시작되었다고 알립니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;slackSend기능을 이용하기 위해서는 젠킨스에 플러그인과 적절한 slack설정이 필요 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙 알람 이후에 소스레포를 내려 받습니다 url에 레포주소를, branch는 사용할브랜치(ex, master,develop 등) 을 적어주시고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;credentialsId에는 github접속시 사용할 credential이름을 적어줍니다 이 cred역시 마찬가지로 사전에 젠킨스에서 생성하여야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드와 테스트 PUSH과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657776416234&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    stage('Building Image') {
      steps{
        script {
          dockerImage = docker.build registry + &quot;:$BUILD_NUMBER&quot;
    }
        }
            }
    stage('Testing') {
        steps{
         script {
            dockerImage.inside {
            sh 'node --version'
            }
            }
        }
    }
    stage('Push Image') {
    steps{
        script {
        docker.withRegistry( '{{ECR주소}}', registryCredential ) {
        dockerImage.push()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내려받은 레포지토리안에 있는 Dockerfile로 docker build를 수행합니다 처음 설정한 registry 이름과 :빌드 넘버로 이미지가 빌드 되어집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스팅 부분은 임의로 넣은것이니 필요하면 수정하여 사용하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트까지 마쳤으면 ECR로 빌드된 이미지를 PUSH 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clean UP과 배포용 Repo의 이미지 태그 변경 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 새로운 버전을 가진 앱이 ECR에 업데이트 되었으므로 배포용 repo에 해당앱의 deployment파일에 이미지 넘버를 수정하는 작업을 수행 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657776673326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stage('Cleaning Up') {
steps{
sh &quot;docker rmi $registry:$BUILD_NUMBER&quot;
                }
            }
    stage('Deploy') {
    steps{
                    sh 'set +x'
                    sh 'export GIT_SSH_COMMAND=&quot;ssh -oStrictHostKeyChecking=no&quot;'
                    sh '{{아르고CD배포용레포주소}} || true'
                    sh &quot;sed -i 's/{{레포이름(이미지)}}:.*\$/{{레포이름(이미지)}}:${env.BUILD_NUMBER}/g' {{deployment의경로}}/deployment.yaml&quot;
                    dir (&quot;{{레포경로}}&quot;) {
                        sh 'git add {{레포이름(이미지)}}/deployment.yaml'
                        sh &quot;git commit -m 'updated the image tag to ${env.BUILD_NUMBER}'&quot;
                        sh 'git push'
                        deleteDir()
                }
            }
        }
            
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cleanup 스테이지는 방금 생성된 이미지를 로컬에서 삭제 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deploy과정에서는 소스레포가 아닌 배포용 레포를 내려받고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포용 레포의 해당앱 deployment.yaml 내 이미지 버전 이름을 빌드넘버로 sed를 이용하여 수정, 이후 git push로 커밋합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋이후에는 ArgoCD를 통해 deploy됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 post(알람) 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657776756811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    post {
        success {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;빌드 완료 \n ${env.JOB_NAME}앱의 CI 과정이 성공적으로 끝났습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        }
        failure {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: &quot;빌드가 실패하였습니다 \n ${env.JOB_NAME}앱의 젠킨스 콘솔을 확인해주세요 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이프라인 성공시 빌드완료 메시지를, 실패시 실패 메시지를 슬랙에 남깁니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <category>ci/cd</category>
      <category>cicd</category>
      <category>Jenkins</category>
      <category>Pipeline</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/30</guid>
      <comments>https://ybchoi.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 14 Jul 2022 14:33:28 +0900</pubDate>
    </item>
    <item>
      <title>Linkerd 배포시 인증서 지정</title>
      <link>https://ybchoi.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;linkerd install 명령어로 링커드 설치시 링커드 인증서는 k8s와 마찬가지로 기본 1년으로 자동으로 생성되어 배포 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만료되면 교체해야 하므로 아래의 방법으로 10년짜리 유효기간을 가진 trust anchor 를 발행하여 해당 인증서를 이용해 설치를 진행한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증서 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657775400246&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ step certificate create root.linkerd.cluster.local ca.crt ca.key \
--profile root-ca --no-password --insecure


$ step certificate create identity.linkerd.cluster.local issuer.crt issuer.key \
--profile intermediate-ca --not-after 87600h --no-password --insecure \
--ca ca.crt --ca-key ca.key&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 인증서를 이용하여 linkerd 설치(ha모드 원하지 않으면 --ha제외)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657775422941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ linkerd install \
  --set proxyInit.runAsRoot=true \
  --ha \
  --identity-trust-anchors-file ca.crt \
  --identity-issuer-certificate-file issuer.crt \
  --identity-issuer-key-file issuer.key \
  | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>클라우드/쿠버네티스</category>
      <category>linkerd</category>
      <author>ybchoi</author>
      <guid isPermaLink="true">https://ybchoi.tistory.com/29</guid>
      <comments>https://ybchoi.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 14 Jul 2022 14:14:03 +0900</pubDate>
    </item>
  </channel>
</rss>