<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kkang_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 05 Apr 2023 14:17:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>kkang_.log</title>
            <url>https://images.velog.io/images/kkang_/profile/44fccd4c-5979-4ae1-b71b-646d5b6bb288/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. kkang_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kkang_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CKA] 94-104]]></title>
            <link>https://velog.io/@kkang_/CKA-94-104-swdljrz9</link>
            <guid>https://velog.io/@kkang_/CKA-94-104-swdljrz9</guid>
            <pubDate>Wed, 05 Apr 2023 14:17:06 GMT</pubDate>
            <description><![CDATA[<h1 id="94-solution-rolling-update--optional">94. Solution: Rolling update : (Optional)</h1>
<hr>
<h1 id="95-configure-application">95. Configure Application</h1>
<p>Configuring applications comprises of understanding the following concepts:</p>
<ul>
<li><p>Configuring Command and Arguments on applications</p>
</li>
<li><p>Configuring Environment Variables</p>
</li>
<li><p>Configuring Secrets</p>
</li>
</ul>
<p>We will see these next</p>
<hr>
<h1 id="96-commands">96. Commands</h1>
<h2 id="docker">Docker</h2>
<ul>
<li>컨테이너는 특정 작업을 실행하기 위한 것이기 때문에 작업이 완료되면 컨테이너가 종료된다. 컨테이너에서 실행되는 프로세스는 Dockerfile에 의해 정의되며, CMD는 컨테이너 안에서 실행될 명령이다. <ul>
<li>Mysql Dockerfile -&gt; cmd mysqld</li>
<li>Nginx Dockerfile -&gt; cmd nginx</li>
</ul>
</li>
<li>Dockerfile<ul>
<li>CMD 지정할 때는 공백을 주지 않고 JSON 배열로 관리한다. [&quot;sleep 5&quot;] -&gt; [&quot;sleep&quot;, &quot;5&quot;]<h2 id="docker-에서-컨테이너-실행-방법">Docker 에서 컨테이너 실행 방법</h2>
<h3 id="1-docker-run-명령어에-command를-추가하는-것">1. docker run 명령어에 COMMAND를 추가하는 것</h3>
</li>
</ul>
</li>
<li>이미지에 지정된 기본 명령을 재정의한다.</li>
<li>docker run ubuntu sleep 5를 실행하면 컨테이너가 작동할 때 sleep을 5초 동안 실행하고 종료된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kkang_/post/76ff0740-864a-4b8e-bd29-5e7a6613ddfc/image.png" alt=""></p>
<h3 id="2-cmd를-추가한-dockerfile을-작성해서-이미지를-빌드하는-것">2. CMD를 추가한 Dockerfile을 작성해서 이미지를 빌드하는 것</h3>
<ul>
<li>일시적으로 명령을 실행하는 앞의 방법과 다르게 컨테이너가 영구적으로 명령을 실행하도록 할 수 있다.</li>
<li>명령을 지정하는 방법은 셸 양식, JSON이 있다.</li>
</ul>
<h3 id="entrypoint-vs-cmd">ENTRYPOINT vs CMD</h3>
<ul>
<li>CMD<ul>
<li>오버라이딩이 쉽다.</li>
<li>docker run 시에 다른 실행 명령어가 있으면 CMD 명령어에 써준 내용은 무시된다. -&gt; CMD 명령어는 docker run 명령 내에 명시된 매개변수가 있는 경우 Daemon에서 무시된다.</li>
</ul>
</li>
<li>ENTRYPOINT<ul>
<li>오버라이딩이 어렵다.</li>
<li>다른 명령어가 있어도 ENTRYPOINT 명령어는 무시되지 않고 docker run에 붙여준 실행 명령어를 인자로 받아서 컨테이너를 실행한다. -&gt; ENTRYPOINT 명령어는 무시되지 않고 대신 명령의 인수로 취급하여 매개변수로 추가된다.</li>
<li>둘다 사용하면? ENTPRYPOINT [&quot;python&quot;, &quot;app.py&quot;] ,CMD [&quot;--color&quot;, &quot;red&quot;]</li>
</ul>
</li>
</ul>
<h1 id="97-commands-and-arguments">97. Commands and Arguments</h1>
<p>쿠버네티스에서 이미지를 실행하는 법에 대해 알아봅니다. 
<a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/</a></p>
<h2 id="docker-1">Docker</h2>
<pre><code>docker run --name ubuntu-slepper \ 
  --entrypoint sleep2.0 ubuntu-sleepr 10</code></pre><h2 id="dockerfile---kubernetes-manifest">Dockerfile -&gt; Kubernetes manifest</h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/f3fe9ac0-49d7-4611-9277-70aeb49331f6/image.png" alt=""></p>
<ul>
<li>command<ul>
<li>Dockerfile에 ENTRYPOINT 변경 </li>
</ul>
</li>
<li>args<ul>
<li>Dockerfile의 CMD를 재정의 </li>
<li>docker run 명령에 추가되는 모든 항목은 args배열 형식으로 포드 정의 파일의 속성으로 이동</li>
<li>args필드를 명령보다 우선한다.</li>
</ul>
</li>
</ul>
<hr>
<h1 id="98-practice-test---commands-and-arguments">98. Practice Test - Commands and Arguments</h1>
<hr>
<h1 id="99-solution---commands-and-arguments">99. Solution - Commands and Arguments</h1>
<hr>
<h1 id="100-configure-environment-variables-in-applications">100. Configure Environment Variables in Applications</h1>
<p>파드 정의 파일에서 env 필드를 사용하여 환경변수를 설정할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/kkang_/post/f8d66358-5d2c-49a1-9286-5aa62b414c43/image.png" alt=""></p>
<h3 id="docker의-env-변수">Docker의 ENV 변수</h3>
<p>$ docker run -e APP_COLOR=pink simple-webapp-color</p>
<h3 id="쿠버네티스의-env-변수">쿠버네티스의 ENV 변수</h3>
<pre><code>apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
spec:
 containers:
 - name: simple-webapp-color
   image: simple-webapp-color
   ports:
   - containerPort: 8080
   env:
   - name: APP_COLOR
     value: pink</code></pre><ul>
<li>ENV (키-값 포맷)<ul>
<li>환경 변수를 설정하려면 env포드 정의 파일에서 속성을 설정합니다.</li>
<li>배열이어서 항목으로 적는다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kkang_/post/bfea4421-a3c5-4bca-9a0e-4aefda9e1355/image.png" alt=""></p>
<ul>
<li>이외에도 컨피그맵, 시크릿키 통해 env를 지정할 수 있다.</li>
</ul>
<hr>
<h1 id="101-configuring-configmaps-in-application">101. Configuring ConfigMaps in Application</h1>
<ul>
<li>컨피그 맵은 중앙에서 키 값 쌍의 데이터를 한번에 관리하기 위해 사용된다.</li>
<li>파드 정의 파일의 env 필드에 컨피그맵을 삽입하여 컨피그맵의 키 값 쌍이 환경 변수로 사용될 수 있게 한다.</li>
</ul>
<h2 id="컨피그맵-구성-방법">컨피그맵 구성 방법</h2>
<ol>
<li>Create ConfigMap</li>
<li>Inject into Pod</li>
</ol>
<h2 id="컨피그맵-만드는-방법-2가지">컨피그맵 만드는 방법 2가지</h2>
<h3 id="1-명령적인-방법">1. 명령적인 방법</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/71ff7327-7cef-4a65-baea-3ef152aa32d8/image.png" alt=""></p>
<pre><code>$ kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-literal=APP_MODE=prod
$ kubectl create configmap app-config --from-file=app_config.properties (Another way)</code></pre><h4 id="--from-literal">--from-literal</h4>
<ul>
<li>명령어를 사용할 때 키 값 데이터를 명시하기 위해 &#39;--from-literal&#39; 옵션을 사용할 수 있다. </li>
<li>여러 개의 키 값을 명시하기 위해서는 &#39;--from-literal&#39; 옵션을 여러번 사용해야 한다. -&gt; 복잡하다.</li>
<li>&#39;--from-file&#39; 옵션을 사용하여 파을을 통해 필요한 키 값 데이터를 한번에 전달할 수도 있다.</li>
</ul>
<h3 id="2-선언적인-방법">2. 선언적인 방법</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/79e27583-3e14-4cb2-a2c8-5ca684a6b4c6/image.png" alt=""></p>
<pre><code>Create a config map definition file and run the &#39;kubectl create` command to deploy it.
$ kubectl create -f config-map.yaml</code></pre><ul>
<li>configmap 정의 파일을 작성하고 kubectl create -f 명령어를 실행 configmap 정의 파일을 통해 다음과 같이 configmap을 생성할 수 있다.<ul>
<li>다양한 목적을 위해 같은 방식으로 필요한만큼 configmap을 생성할 수 있다. 그렇기 때문에 configmap에 이름을 적절히 붙이는 것이 중요하다.</li>
<li>컨피그맵을 통해 환경 변수를 전달하기 위해서는 파드 정의 파일의 &#39;envFrom&#39; 필드에 컨피그맵 이름을 명시하면 된다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kkang_/post/3d3c0cb8-b8f0-4f6e-ac80-4bc3aec46153/image.jpeg" alt=""></p>
<ul>
<li>파드 정의 파일에서 configmap을 사용하는 경우는 다음 세 가지이다. env, single env, volume으로 사용될 수 있다.</li>
</ul>
<h2 id="configmap-보기">ConfigMap 보기</h2>
<p>configMaps를 보려면</p>
<pre><code>$ kubectl get configmaps (or)
$ kubectl get cm</code></pre><h1 id="102-practice-test-environment-variables">102. Practice Test: Environment Variables</h1>
<p>Practice Test: <a href="https://uklabs.kodekloud.com/topic/practice-test-env-variables-2/">https://uklabs.kodekloud.com/topic/practice-test-env-variables-2/</a></p>
<hr>
<h1 id="103-solution---environment-variables">103. Solution - Environment Variables</h1>
<hr>
<h1 id="104-configure-secrets-in-applications">104. Configure Secrets in Applications</h1>
<h2 id="configmap의-한계">ConfigMap의 한계</h2>
<ul>
<li>ConfigMap은 일반 텍스트 형식으로 구성 데이터를 저장하기 때문에 암호를 저장하기에는 부적절하다. (DB 정보 등)</li>
<li><blockquote>
<p>암호를 저장하기 위해 Secret이 사용된다.</p>
</blockquote>
</li>
</ul>
<h2 id="sercret">Sercret</h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/6bf904c9-0b38-413d-8bee-8bb1da5dedc7/image.png" alt=""></p>
<ul>
<li>Secret은 비밀번호 등 민감한 정보를 저장하는 데 사용된다. 인코딩된 형식으로 저장된다는 점만 빼면 ConfigMap과 비슷하다.</li>
</ul>
<h2 id="sercret-만드는-2가지-방법">Sercret 만드는 2가지 방법</h2>
<p>Secret 역시 두 가지 방법으로 만들 수 있다.</p>
<h3 id="1-명령적인-방법-1">1. 명령적인 방법</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/746a0f9c-9c5c-4049-9d91-2784e9b76f84/image.png" alt=""></p>
<pre><code>$ kubectl create secret generic app-secret --from-literal=DB_Host=mysql --from-literal=DB_User=root --from-literal=DB_Password=paswrd
$ kubectl create secret generic app-secret --from-file=app_secret.properties</code></pre><ul>
<li>&#39;--from-literal&#39;옵션을 통해 키 값 쌍을 지정</li>
<li>비밀값이 많으면 &#39;--from-file&#39; 옵션을 이용해 파일로 키 값 쌍을 한번에 지정</li>
</ul>
<h3 id="2-선언적-방법">2. 선언적 방법</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/c1e5e927-f5d8-46f8-a58a-d52ea20a5990/image.png" alt=""></p>
<ul>
<li>시크릿 정의 파일을 먼저 작성하고 kubectl apply -f 명령어를 통해 시크릿을 생성</li>
<li>주의할 점은 데이터를 인코딩된 포맷으로 저장해야 한다는 것이다.</li>
</ul>
<h4 id="인코딩하는-법">인코딩하는 법</h4>
<pre><code>Generate a hash value of the password and pass it to secret-data.yaml definition value as a value to DB_Password variable.
$ echo -n &quot;mysql&quot; | base64
$ echo -n &quot;root&quot; | base64
$ echo -n &quot;paswrd&quot;| base64</code></pre><h2 id="secret-보기">Secret 보기</h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/182ed9ac-971e-42a6-9db8-b60842f6d602/image.png" alt=""></p>
<h2 id="암호해독">암호해독</h2>
<pre><code>$ echo -n &quot;bX1zcWw=&quot; | base64 --decode
$ echo -n &quot;cm9vdA==&quot; | base64 --decode
$ echo -n &quot;cGFzd3Jk&quot; | base64 --decode</code></pre><p>인코딩된 값을 해독하기 위해서 &#39;--decode&#39; 옵션을 사용하면 된다.</p>
<h2 id="팟으로-시크릿-구성">팟으로 시크릿 구성</h2>
<pre><code>apiVersion: v1
kind: Secret
metadata:
 name: app-secret
data:
  DB_Host: bX1zcWw=
  DB_User: cm9vdA==
  DB_Password: cGFzd3Jk</code></pre><pre><code>apiVersion: v1
 kind: Pod
 metadata:
   name: simple-webapp-color
 spec:
  containers:
  - name: simple-webapp-color
    image: simple-webapp-color
    ports:
    - containerPort: 8080
    envFrom:
    - secretRef:
        name: app-secret</code></pre><ul>
<li>파드의 env로 시크릿을 사용할 수 있다. 파드 정의 파일에 환경 변수를 삽입하려면 envFrom이라는 필드를 사용하면 된다.</li>
</ul>
<h3 id="주입-다른-방법">주입 다른 방법</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/6e0703f5-728d-4f5b-948e-28b73be2fe2c/image.png" alt=""></p>
<ul>
<li>단일 환경 변수로 넣을 수 있고 볼륨으로 넣을 수도 있다.</li>
<li>파드의 볼륨으로 시크릿을 사용할 경우, 시크릿의 각각의 특성은 파일로 생성된다.</li>
</ul>
<h3 id="시크릿-어디있나">시크릿 어디있나?</h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/a246a253-1ef7-43a1-ad26-e0ab595bb0b1/image.png" alt=""></p>
<ul>
<li>파일에는 암호 값이 담겨 있다. 이 경우에는 3개의 암호가 3개의 파일에 담겨 있다.</li>
</ul>
<h3 id="주의">주의</h3>
<ul>
<li>우선, Secret은 암호화되어 있지 않다. 그래서 누구든 Secret 정의 파일을 볼 수 있고 Secret 개체를 얻을 수 있다. 그리고 기밀 데이터를 볼 수 있다.</li>
<li>따라서 주의해야 하며 RBAC(Role Based Access Control, 역할 기반 접근 제어)나 제 3자의 암호 공급자를 고려하는 것이 좋다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CKA] 76-93]]></title>
            <link>https://velog.io/@kkang_/CKA76-93</link>
            <guid>https://velog.io/@kkang_/CKA76-93</guid>
            <pubDate>Wed, 05 Apr 2023 14:15:08 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[CKA] 62-75 Node Affinity, Taints and Tolerations,  DaemonSets, Static Pod]]></title>
            <link>https://velog.io/@kkang_/CKA-62-75-Node-Affinity-Taints-and-Tolerations-DaemonSets-Static-Pod</link>
            <guid>https://velog.io/@kkang_/CKA-62-75-Node-Affinity-Taints-and-Tolerations-DaemonSets-Static-Pod</guid>
            <pubDate>Mon, 03 Apr 2023 12:35:27 GMT</pubDate>
            <description><![CDATA[<h1 id="62-solution---node-affinity">62. Solution - Node Affinity</h1>
<ul>
<li>주요 목적<ul>
<li><strong>Pod가 특정 노드에서 호스팅되도록 하는 것</strong></li>
</ul>
</li>
</ul>
<pre><code class="language-json">apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: data-processor
   image: data-processor
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In
            values: 
            - Large
            - Medium</code></pre>
<table>
<thead>
<tr>
<th>key 필드 값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>In</td>
<td>values[] 필드에 설정한 값 중 레이블에 있는 값과 일치하는 것이 하나라도 있는지 확인합니다.</td>
</tr>
<tr>
<td>NotIn</td>
<td>In과 반대로 values[]에 있는 값 모두와 맞지 않는 지 확인합니다.</td>
</tr>
<tr>
<td>Exists</td>
<td>key 필드에 설정한 값이 레이블에 있는지만 확인합니다. (values[] 필드가 필요 없습니다.)</td>
</tr>
<tr>
<td>DoseNotExist</td>
<td>Exists와 반대로 노드의 레이블에 key 필드 값이 없는지만 확인합니다.</td>
</tr>
<tr>
<td>Gt</td>
<td>Greater than의 약자로 values[] 필드에 설정된 값이 설정된 값 보다 더 큰 숫자형 데이터 인지 확인합니다. 이 때 values[] 필드에는 값이 하나만 있어야 합니다.</td>
</tr>
<tr>
<td>Lt</td>
<td>Lower than의 약자로 values[] 필드에 설정된 값이 설정된 값 보다 더 작은 숫자형 데이터 인지 확인합니다. 이 때 values[] 필드에는 값이 하나만 있어야 합니다.</td>
</tr>
</tbody></table>
<h2 id="node-affinity-types"><strong>Node Affinity Types</strong></h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/fa4a3129-4b2d-4286-b1c0-60fefe17d7c5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kkang_/post/c707f25a-284a-46bf-9bc2-68c1df871e24/image.png" alt=""></p>
<ul>
<li>Available<ul>
<li>requiredDuringSchedulingIgnoredDuringExecution (강한 규칙)<ul>
<li>스케쥴링하는 동안 <strong>꼭 필요한</strong>&#39; 조건</li>
</ul>
</li>
<li>preferredDuringSchedulingIgnoredDuringExecution (약한 규칙)<ul>
<li>스케쥴링하는 동안 <strong>만족하면 좋은</strong>&#39; 조건입니다. 꼭 이 조건을 만족해야하는 것은 아니라는 의미입니다.</li>
</ul>
</li>
</ul>
</li>
<li>Planned<ul>
<li>requiredDuringSchedulingRequiredDuringExecution</li>
<li>preferredDuringSchedulingRequiredDuringExecution</li>
</ul>
</li>
</ul>
<h3 id="스케줄링-vs-실행-중">스케줄링 vs 실행 중</h3>
<ul>
<li>스케줄링<ul>
<li>팟이 존재하지 않는, 처음 생성되는 상태</li>
</ul>
</li>
<li>실행<ul>
<li>팟이 실행되고 있는 상태</li>
</ul>
</li>
</ul>
<h3 id="preferred-vs-required-vs-ignored">Preferred vs Required vs Ignored</h3>
<ul>
<li>Preferred<ul>
<li>권장</li>
<li>조건에 맞는 노드를 찾지 못하는 경우 선호도 규칙을 무시.</li>
</ul>
</li>
<li>Required<ul>
<li>강제</li>
<li>조건에 맞는 노드를 찾지 못하는 경우 팟 자체가 예약되지 않음.</li>
</ul>
</li>
<li>Ignored: 조건 무시.<ul>
<li>requiredDuringSchedulingIgnoredDuringExecution<ul>
<li>스케줄링에서는 필수, 실행 중에는 조건 무시 → 일단 예약되면 영향을 미치지 않음</li>
</ul>
</li>
</ul>
</li>
<li>참고 <a href="https://minkukjo.github.io/study/docs/kubernetes/node-isolation/">https://minkukjo.github.io/study/docs/kubernetes/node-isolation/</a></li>
</ul>
<hr>
<h1 id="63-practice-test---node-affinity">63. <strong><strong>Practice Test - Node Affinity</strong></strong></h1>
<p>Link to Practice Test: <a href="https://uklabs.kodekloud.com/topic/practice-test-node-affinity-3/">https://uklabs.kodekloud.com/topic/practice-test-node-affinity-3/</a></p>
<hr>
<h1 id="64-solution---node-affinity-optional">64. Solution - Node Affinity (Optional)</h1>
<hr>
<h1 id="65-taints-and-tolerations-vs-node-affinity">65. Taints and Tolerations vs Node Affinity</h1>
<ul>
<li>Taint: 오염, 감염<ul>
<li>노드에 설정하는 것.</li>
<li><strong>노드가 파드 셋을 제외시킬 수 있다.</strong></li>
</ul>
</li>
<li>Toleration: 관용, 묵허<ul>
<li>파드에 적용하는 것</li>
</ul>
</li>
</ul>
<h2 id="예시">예시</h2>
<p><img src="https://velog.velcdn.com/images/2214yj/post/1c4b1c7d-b3f1-4586-af96-4fd4227e31e6/image.png" alt="https://velog.velcdn.com/images/2214yj/post/1c4b1c7d-b3f1-4586-af96-4fd4227e31e6/image.png"></p>
<ul>
<li>요구사항<ul>
<li>위에는 같은 색의 노드만 배치되면 좋겠다.</li>
</ul>
</li>
<li>동작<ul>
<li>파드가 생성되면 노드는 톨로레이션 설정이 된 팟만 스케줄링한다.</li>
</ul>
</li>
</ul>
<h2 id="주의">주의</h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/85fb1b5e-cf39-4963-8170-90e58ed33a64/image.png" alt=""></p>
<ul>
<li>taint, toleration 설정만은 정확히 노드에 배포되는 것을 보장하는 것이 아니다. 허용 비허용만 결정할 뿐</li>
</ul>
<h2 id="taint-toleration-node-affinity-이용해서-노드-전용으로-만들기">taint, toleration, Node Affinity 이용해서 노드 전용으로 만들기</h2>
<h3 id="1-node-affinity">1. Node Affinity</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/ad8d0de5-7994-4317-9b5f-4fa667d1718d/image.png" alt="https://velog.velcdn.com/images/2214yj/post/ad8d0de5-7994-4317-9b5f-4fa667d1718d/image.png"></p>
<ul>
<li>label 에 해당하는 노드에 색깔 팟들이 잘 배치된다.</li>
<li>한계: 아직까지 <strong>기타 색상 팟이 색상 노드에 배치될 가능성이 있다.</strong></li>
</ul>
<h3 id="2-node-affinity--taint-toleration">2. Node Affinity + taint, toleration</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/8c778975-76cc-4ff0-b814-9b0beeb9b499/image.png" alt="https://velog.velcdn.com/images/2214yj/post/8c778975-76cc-4ff0-b814-9b0beeb9b499/image.png"></p>
<ul>
<li><strong>Taint + Toleration: 색이 다른 파드가 노드에 놓이는 것을 막는다.</strong></li>
<li><strong>Node Affinity: 파드가 각 색상 노드에 배치되도록 한다.</strong></li>
</ul>
<hr>
<h1 id="66-resource-requirements-and-limits">66. Resource Requirements and Limits</h1>
<p><img src="https://velog.velcdn.com/images/kkang_/post/ed4c2e39-dfdf-4aa7-aa98-3dbff84fccdb/image.png" alt=""></p>
<ul>
<li>3개의 노드로 이루어진 쿠버네티스 클러스터<ul>
<li>각 노드에 CPU, 메모리, 디스크가 사용 가능한 리소스만큼 할당.</li>
<li>파드가 노드에 놓일 때마다 그 노드에 사용 가능한 리소스를 소비한다.</li>
</ul>
</li>
<li><strong>쿠버네티스 스케줄러</strong><ul>
<li><strong>파드가 어느 노드로 갈지 결정할 때 파드가 요구하는 리소스의 양과 노드에서 사용 가능한 리소스의 양을 고려한다.</strong></li>
</ul>
</li>
</ul>
<h3 id="리소스가-없다면">리소스가 없다면?</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/69340777-ad3a-46b5-b8e6-1ad14a30f432/image.png" alt="https://velog.velcdn.com/images/2214yj/post/69340777-ad3a-46b5-b8e6-1ad14a30f432/image.png"></p>
<ul>
<li>노드에 충분한 리소스가 없으면 스케줄러는  노드에 파드를 놓는 것을 피한다.</li>
<li>만약 사용 가능한 노드가 없으면 파드 배포를 보류한다.</li>
</ul>
<h2 id="resource-requirements-리소스-필요-사양-명시"><strong>Resource Requirements (리소스 필요 사양 명시)</strong></h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/2a5d2434-5385-422a-9c8d-330a6b7bdd93/image.png" alt=""></p>
<ul>
<li>기본적으로 K8은 포드 또는 포드 내의 컨테이너에 <strong><code>0.5</code></strong>CPU와 <strong><code>256Mi</code></strong>메모리가 필요하다고 가정합니다. <strong><code>Resource Request</code>이것은 for a container</strong> 로 알려져 있습니다 .</li>
</ul>
<pre><code class="language-json">apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
  labels:
    name: simple-webapp-color
spec:
 containers:
 - name: simple-webapp-color
   image: simple-webapp-color
   ports:
    - containerPort:  8080
   resources:
     requests:
      memory: &quot;1Gi&quot;
      cpu: &quot;1&quot;</code></pre>
<ul>
<li><strong>파드를 정의할 때 resources 영역을 추가하고 필요한 리소스에 대해 요청할 수 있다.</strong></li>
<li>포드 내의 애플리케이션에 기본 리소스보다 더 많은 리소스가 필요한 경우 포드 정의 파일에서 설정해야 합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2214yj/post/5281551b-b721-4f6a-b5ef-a12bd07c79d3/image.png" alt="https://velog.velcdn.com/images/2214yj/post/5281551b-b721-4f6a-b5ef-a12bd07c79d3/image.png"></p>
<ul>
<li>CPU<ul>
<li>0.1CPU → 100m (밀리) 표현함</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2214yj/post/d83f0aa7-6aa8-4fae-b2f2-5515e38d3e56/image.png" alt="https://velog.velcdn.com/images/2214yj/post/d83f0aa7-6aa8-4fae-b2f2-5515e38d3e56/image.png"></p>
<ul>
<li>Memory<ul>
<li>Gibibyte → 1024 단위</li>
</ul>
</li>
</ul>
<h2 id="resources---limits-리소스-제한-사양-명시"><strong>Resources - Limits (리소스 제한 사양 명시)</strong></h2>
<p><img src="https://velog.velcdn.com/images/2214yj/post/6279b519-faa7-4cc4-9bb3-8b625b8e359c/image.png" alt="https://velog.velcdn.com/images/2214yj/post/6279b519-faa7-4cc4-9bb3-8b625b8e359c/image.png"></p>
<ul>
<li>도커 세계에서 도커 컨테이너는 노드에서 소비할 수 있는 리소스에 한계가 없다. → 하나의 컨테이너에서 다른 컨테이너에 영향을 줄만큼 리소스를 소비할 수 있다.</li>
<li>하지만 파드의 리소스 사용량에는 제한을 둘 수 있다.<ul>
<li>만약 특별히 파드의 리소스 사용량을 제한하지 않으면 하나의 파드는 1 vCPU, 512 Mi의 기본 한도를 갖게 된다.</li>
</ul>
</li>
</ul>
<pre><code class="language-json">apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
  labels:
    name: simple-webapp-color
spec:
 containers:
 - name: simple-webapp-color
   image: simple-webapp-color
   ports:
    - containerPort:  8080
   resources:
     requests:
      memory: &quot;1Gi&quot;
      cpu: &quot;1&quot;
     limits:
       memory: &quot;2Gi&quot;
       cpu: &quot;2&quot;</code></pre>
<ul>
<li>만약 기본 한도를 바꾸고 싶다면 파드 정의 파일의 resources 영역에 한도(limits)를 지정하면 된다.</li>
<li>파드가 지정된 한도를 초과하여 자원을 소비하게 되면 어떻게 될까<ul>
<li>CPU<ul>
<li>쿠버네티스가 CPU를 조절하여 지정 한도를 넘지 않도록 한다. 따라서, 컨테이너는한도를 초과하는 CPU 리소스를 사용할 수 없다.</li>
<li>쓰로틀</li>
</ul>
</li>
<li>메모리<ul>
<li>자신의 한도보다 더 많은 메모리를 소모하려고 하면 그 파드는 즉시 종료된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="67-note-on-default-resource-requirements-and-limits">67. Note on default resource requirements and limits</h1>
<ul>
<li>네임스페이스를 생성해서 다른 리소스들로부터 분리한 다음 LimitRange를 정의하는 manifest file을 작성해서 default limits과 default requests를 정의할 수 있다.</li>
</ul>
<pre><code class="language-json">apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container
</code></pre>
<p><a href="https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/">https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/</a></p>
<pre><code class="language-json">apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container
</code></pre>
<p><a href="https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/">https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/</a></p>
<p><strong>References:</strong></p>
<p><a href="https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource">https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource</a></p>
<h3 id="메모리의-default-limits과-default-requests를-정의하는-limitrange-manifest-file">메모리의 default limits과 default requests를 정의하는 LimitRange manifest file</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/99a55abc-d60c-492c-9178-8c8536ae0c13/image.png" alt="https://velog.velcdn.com/images/2214yj/post/99a55abc-d60c-492c-9178-8c8536ae0c13/image.png"></p>
<h3 id="cpu의-default-limits과-default-requests를-정의하는-limitrange-manifest-file">CPU의 default limits과 default requests를 정의하는 LimitRange manifest file</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/28b734e3-9b1d-4b84-9dcf-be21a7b96b6a/image.png" alt="https://velog.velcdn.com/images/2214yj/post/28b734e3-9b1d-4b84-9dcf-be21a7b96b6a/image.png"></p>
<hr>
<h1 id="68-a-quick-note-on-editing-pods-and-deployments">68. A quick note on editing PODs and Deployments</h1>
<h3 id="아래-이외의-사항들은-edit-pod가-불가능하다"><strong>아래 이외의 사항들은 edit pod가 불가능하다.</strong></h3>
<ul>
<li>spec.containers[*].image</li>
<li>spec.initContainers[*].image</li>
<li>spec.activeDeadlineSeconds</li>
<li>spec.tolerations</li>
<li>이것들은</li>
</ul>
<h2 id="금지-팟도-가능하게-하는-방법">금지 팟도 가능하게 하는 방법</h2>
<h3 id="1-kubectl-edit-pod-할려던-팟-명세를-복사하고-기존-팟-삭제">1. kubectl edit pod 할려던 팟 명세를 복사하고 기존 팟 삭제</h3>
<ul>
<li>kubectl edit 명령어를 실행해서 편집창을 열고 수정한 다음, 파일의 모든 내용을 복사해서 임시 파일에 붙여 넣고 기존의 pod를 삭제하고 임시 파일의 내용을 파드를 재생성하면 된다.</li>
<li>또는 <code>kubectl get pod webapp -o yaml &gt; my-new-pod.yaml</code> 명령어로 파드 정의 파일을 추출하고 변경사항을 수정한 다음, 기존의 파드를 삭제하고 새로운 파드 정의 파일로 파드를 재생성하면 된다.</li>
<li><strong>파드와 달리, Deployments는 정의 파일의 파드 템플릿 영역에서 아무 필드나 수정 가능하다.</strong>따라서, <code>kubectl edit deployment my-deployment</code> 명령어를 사용하면 된다.해당 명령어를 실행하면 자동으로 기존의 파드가 삭제되고 새로운 파드가 재생성된다.</li>
</ul>
<hr>
<h1 id="69-practice-test---resource-requirements-and-limits">69. <strong><strong>Practice Test - Resource Requirements and Limits</strong></strong></h1>
<hr>
<h1 id="70-solution-resource-limits">70. Solution: Resource Limits</h1>
<hr>
<h1 id="71-daemonsets">71. DaemonSets</h1>
<p><img src="https://velog.velcdn.com/images/2214yj/post/5b7c96bd-e461-4a3a-977a-9b45d313e38f/image.png" alt="https://velog.velcdn.com/images/2214yj/post/5b7c96bd-e461-4a3a-977a-9b45d313e38f/image.png"></p>
<ul>
<li>데몬셋은 ReplicaSet 같은 것이다.여러 개의 인스턴스 파드를 배포하도록 도와준다.</li>
<li>ReplicaSet과 달리, 클러스터의 노드마다 최대 1개의 파드를 실행한다.<ul>
<li>클러스터에 새 노드가 추가될 때마다 파드 복제본이 자동으로 해당 노드에 추가된다.</li>
<li>노드가 제거되면 파드는 자동으로 제거된다.</li>
<li><strong>즉, 데몬셋은 파드의 복사본을 클러스터 내 모든 노드에 항상 존재하게 한다</strong></li>
</ul>
</li>
</ul>
<h2 id="daemonsets---usecases"><strong>DaemonSets - UseCases</strong></h2>
<p><img src="https://velog.velcdn.com/images/2214yj/post/d34f4b92-9684-42a5-8f51-c9c1147caa43/image.png" alt="https://velog.velcdn.com/images/2214yj/post/d34f4b92-9684-42a5-8f51-c9c1147caa43/image.png"></p>
<p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d9b6aa46-5c0c-4e40-8fa5-0670d77528e0/Untitled.png" alt="Untitled"></p>
<ul>
<li>Monoitoring Solution이나 Logs Viewer를 파드의 형태로 배포하기에 최적이다.<ul>
<li>클러스터 내 모든 노드에 필요한 kube-proxy와 wave-net과 같은 네트워킹 솔루션은 데몬셋의 좋은 예시이다.</li>
</ul>
</li>
<li><strong>데몬셋이 알아서 동작하기 때문에 클러스터에 변화가 있을 때 노드에서 해당 파드를 추가하거나 제거할 필요가 없다.</strong></li>
<li>셋 정의 파일을 통해 데몬셋을 생성할 수 있다.</li>
</ul>
<h2 id="daemonsets---definition"><strong>DaemonSets - Definition</strong></h2>
<pre><code class="language-json">apiVersion: apps/v1
kind: Replicaset
metadata:
  name: monitoring-daemon
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: monitoring-agent
  template:
    metadata:
     labels:
       app: monitoring-agent
    spec:
      containers:
      - name: monitoring-agent
        image: monitoring-agent</code></pre>
<pre><code class="language-json">apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: monitoring-daemon
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: monitoring-agent
  template:
    metadata:
     labels:
       app: monitoring-agent
    spec:
      containers:
      - name: monitoring-agent
        image: monitoring-agent</code></pre>
<ul>
<li><strong>데몬셋 정의 파일은 레플리카셋 정의 파일과 몹시 흡사하다. 거의 kind만 다름.</strong></li>
<li><code>$ kubectl create -f daemon-set-definition.yaml</code></li>
</ul>
<h2 id="view-daemonsets"><strong>View DaemonSets</strong></h2>
<p><img src="https://velog.velcdn.com/images/2214yj/post/235aa81f-fda9-48a7-a939-3c5372e3d9a6/image.png" alt="https://velog.velcdn.com/images/2214yj/post/235aa81f-fda9-48a7-a939-3c5372e3d9a6/image.png"></p>
<ul>
<li><p>To list daemonsets</p>
<p>  <code>$ kubectl get daemonsets</code></p>
</li>
<li><p>For more details of the daemonsets</p>
<p>  <code>$ kubectl describe daemonsets monitoring-daemon</code></p>
</li>
</ul>
<h2 id="how-daemonsets-works"><strong>How DaemonSets Works</strong></h2>
<p><img src="https://velog.velcdn.com/images/kkang_/post/95fc50ee-4627-4b7a-9509-5eecaeb7c339/image.png" alt=""></p>
<ul>
<li>쿠버네티스 버전 1.2 이전<ul>
<li>각 팟에 <strong>nodeName</strong>을 지정하는 방식으로 데몬셋이 동작했다.</li>
</ul>
</li>
<li>쿠버네티스 버전 1.2 이후<ul>
<li>각 팟에 <strong>nodeAffinity</strong>와 <strong>default scheduler</strong> 를 사용하여 데몬셋을 각 노드에 스케줄링한다.</li>
</ul>
</li>
</ul>
<hr>
<h1 id="72-practice-test---daemonsets">72. <strong><strong>Practice Test - DaemonSets</strong></strong></h1>
<p>Practice Test: <a href="https://uklabs.kodekloud.com/topic/practice-test-daemonsets-2/">https://uklabs.kodekloud.com/topic/practice-test-daemonsets-2/</a></p>
<hr>
<h1 id="73-solution---daemonsets">73. Solution - DaemonSets</h1>
<hr>
<h1 id="74-static-pods">74. Static Pods</h1>
<p><img src="https://velog.velcdn.com/images/2214yj/post/f1501cd2-043a-47af-835d-6861732d6f5e/image.png" alt="https://velog.velcdn.com/images/2214yj/post/f1501cd2-043a-47af-835d-6861732d6f5e/image.png"></p>
<ul>
<li>강의 초반에 이야기했듯이 kubelet은 kubeAPI 서버에 의존해 노드에 파드를 배포한다.<ul>
<li>kubelet이 할 줄 아는 건 컨테이너 엔진에 팟을 생성을 요청하는 것</li>
</ul>
</li>
<li>kube-scheduler의 결정에 기초해 노드에 로드할 팟을 결정하고, 이는 ETCD 클러스터에 저장된 상태에 기반하여 걸정된다.</li>
</ul>
<h2 id="static-pods">Static Pods</h2>
<p><img src="https://velog.velcdn.com/images/2214yj/post/0d53e87a-d32a-451d-8746-30412a3ef552/image.png" alt="https://velog.velcdn.com/images/2214yj/post/0d53e87a-d32a-451d-8746-30412a3ef552/image.png"></p>
<ul>
<li>팟 디렉토리 설정된 예시</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kkang_/post/ee13347f-3c85-4716-a4a2-c40a2204262c/image.png" alt=""></p>
<ul>
<li>API 서버 개입 없이 kubelet이 자체적으로 생성하는 포드</li>
<li>팟만 만들 수 있음. 레플리카 셋, 디플로이먼트는 생성 불가능. → 팟 수준에서만 작동한다</li>
<li>방법<ul>
<li>노드에 포드 정의 파일을 로컬에 배치한다. 그리고 주기적으로 파일을 확인하고 팟을 생성한다.</li>
<li>정의 파일을 삭제하면 자동으로 삭제한다.</li>
</ul>
</li>
</ul>
<h2 id="설정-방법">설정 방법</h2>
<h3 id="1-static-pod를-만들기-위한-지정된-디렉터리-설정">1. Static Pod를 만들기 위한 지정된 디렉터리 설정</h3>
<ul>
<li>kubelet.service의 옵션으로 전달된다.<ul>
<li>kubelet.service execStart 할 떄 —pod-manifest-path</li>
<li>—pod-manifest-path 보면 etc/쿠버네티스 매니페스트 폴더에 설정된 것을 볼 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2214yj/post/411e7dfe-efdc-4d31-8545-eab05ea4f7ae/image.png" alt="https://velog.velcdn.com/images/2214yj/post/411e7dfe-efdc-4d31-8545-eab05ea4f7ae/image.png"></p>
<h3 id="2--kubeletservice의-옵션으로-직접-디렉터리-위치를-지정하는-대신-디렉터리-위치를-저장한-구성-파일을-만들고-구성-파일을-전달하는-것">2.  kubelet.service의 옵션으로 직접 디렉터리 위치를 지정하는 대신 디렉터리 위치를 저장한 구성 파일을 만들고 구성 파일을 전달하는 것</h3>
<ul>
<li>kubeadm 툴은 후자의 방법을 사용한다.</li>
<li>kubelet.service execStart 할 떄 kubeconfig</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2214yj/post/7c4d2d57-3fa6-48e6-8bd4-00d7a81003a9/image.png" alt="https://velog.velcdn.com/images/2214yj/post/7c4d2d57-3fa6-48e6-8bd4-00d7a81003a9/image.png"></p>
<p>커맨드 유틸리티는 kube API 서버와 작동한다.</p>
<p><img src="https://velog.velcdn.com/images/2214yj/post/d0412c08-8bef-43b3-ad58-858892dab8d2/image.png" alt="https://velog.velcdn.com/images/2214yj/post/d0412c08-8bef-43b3-ad58-858892dab8d2/image.png"></p>
<h3 id="the-kubelet-can-create-both-kinds-of-pods"><strong>The kubelet can create both kinds of pods</strong></h3>
<p><img src="https://velog.velcdn.com/images/kkang_/post/832ba67e-3861-4590-9cb0-8cf20aeded10/image.png" alt=""></p>
<h3 id="api-서버-방식-정적-방식-동시에-가능하다">API 서버 방식, 정적 방식 동시에 가능하다</h3>
<ul>
<li><strong>kubelet은 두 종류의 포드(정적 포드와 API 서버의 포드)를 동시에 생성할 수 있습니다.</strong></li>
<li>kubelet은 Static Pod 정의 파일로부터 파드를 생성할 수 있으며 kube-api server로부터 입력값 을 제공받아 파드를 생성할 수 있다.</li>
</ul>
<h3 id="kube-api-server가-정적-팟을-인식하나">kube-api server가 정적 팟을 인식하나?</h3>
<ul>
<li>kube-api server는 kubelet이 만든 static pod를 인식한다. → kubectl 명령어를 통해 파드를 조회하면 다른 파드들과 동일하게 static pod가 조회된다.</li>
<li>가능한 이유<ul>
<li>kubelet이 static pod를 만들 때 쿠버네티스 클러스터에 포함되어 있다면 kube-api server에 <strong>미러 개체</strong> 를 만들도록 요청</li>
</ul>
</li>
<li>kube-api sever에서 보이는 미러 개체는 읽기 전용<ul>
<li>파드에 대한 세부사항은 볼 수 있지만 다른 파드처럼 편집하거나 삭제할 수 없다.</li>
</ul>
</li>
</ul>
<h3 id="static-pods---use-case"><strong>Static Pods - Use Case</strong></h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/8b862192-990e-4250-b8c4-e689be3b8797/image.png" alt="https://velog.velcdn.com/images/2214yj/post/8b862192-990e-4250-b8c4-e689be3b8797/image.png"></p>
<ul>
<li><strong>Static Pod는 쿠버네티스 control plane에 의존하지 않기 때문에 Static Pod를 이용해서 control plane에 구성요소를 배포할 수 있다.</strong></li>
<li>이렇게 하면 서비스를 구성하는 바이너리를 다운로드하거나 서비스 충돌을 걱정할 필요가 없다. 만약 어떤 서비스가 고장나면 kubelet이 자동적으로 재가동해준다.<ul>
<li><strong>이 방법이 kubeadm 툴이 쿠버네티스 클러스터를 설정하는 방법이다.</strong></li>
</ul>
</li>
<li>그래서 kube-system 네임스페이스에 파드를 조회할 때 control plane의 구성요소를 확인할 수 있는 것이다.</li>
</ul>
<h3 id="데몬셋-vs-정적팟">데몬셋 vs 정적팟</h3>
<p><img src="https://velog.velcdn.com/images/2214yj/post/880aaabe-15c5-4980-a142-bc8a721af022/image.png" alt="https://velog.velcdn.com/images/2214yj/post/880aaabe-15c5-4980-a142-bc8a721af022/image.png"></p>
<ul>
<li>데몬셋은 응용 프로그램의 인스턴스 하나가 클러스터 내 모든 노드에서 사용 가능하도록 하는 데 사용된다. 데몬셋은 kube-api server를 통해 설정된다.</li>
<li><strong>반면에 Static Pod는 kube-api server나 control plane의 방해 없이 kubelet이 직접 생성한다. 또한 Static Pod은 control plane의 구성요소 자체를 배포하는데 사용될 수 있다.</strong></li>
<li>kube-scheduler는 데몬셋과 Static Pod 에게 둘 다 무시된다.</li>
</ul>
<hr>
<h1 id="75">75.</h1>
<h1 id="practice-test---static-pods"><strong>Practice Test - Static Pods</strong></h1>
<p>Practice Test Link: <a href="https://uklabs.kodekloud.com/topic/practice-test-static-pods-2/">https://uklabs.kodekloud.com/topic/practice-test-static-pods-2/</a></p>
<p><strong><em>I hear and I forget. I see and I remember. I do and I understand.</em></strong></p>
]]></description>
        </item>
    </channel>
</rss>