<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>지니박박구리</title>
        <link>https://velog.io/</link>
        <description>킹왕짱 Cloud Engineer 지니박박구리 블로그</description>
        <lastBuildDate>Tue, 16 Jul 2024 06:33:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>지니박박구리</title>
            <url>https://velog.velcdn.com/images/ginee_park/profile/d74b5120-129b-4834-b667-3f35cccb8288/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 지니박박구리. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ginee_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ECS 무중단 배포하기 - Rolling update 배포 설정]]></title>
            <link>https://velog.io/@ginee_park/ECS-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-Rolling-update-%EB%B0%B0%ED%8F%AC-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@ginee_park/ECS-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-Rolling-update-%EB%B0%B0%ED%8F%AC-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Tue, 16 Jul 2024 06:33:52 GMT</pubDate>
            <description><![CDATA[<h1 id="intro">Intro</h1>
<p>먼저 ECS Service는 다음 3가지 배포가 가능합니다. (<a href="https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeploymentController.html">공식문서</a>)</p>
<ol>
<li><strong>ECS</strong> (Rolling Update)<ul>
<li>ECS에서 기본적으로 서비스 생성시 사용</li>
</ul>
</li>
<li><strong>CODE_DEPLOY</strong> (Blue/Green Update)<ul>
<li>AWS CodeDeploy 서비스를 통해 배포시 사용</li>
</ul>
</li>
<li>EXTERNAL<ul>
<li>third-party deployment controller 로 배포시 사용</li>
</ul>
</li>
</ol>
<br>

<p>이중 기본 Rolling Update 배포하면</p>
<ul>
<li>새로운 Deployment를 생성하고,</li>
<li>해당 Deployment 파라미터 설정에 따라 <strong>새로운 Task가 상이하게</strong> 배포됩니다.</li>
</ul>
<br>

<p>따라서 각 파라미터를 정확하게 이해해야 ECS에서 효과적인 인프라 운영이 가능합니다.</p>
<p>크게 Deployment 파라미터 3개가 존재합니다.</p>
<ol>
<li><strong>deploymentCircuitBreaker</strong>: &quot;너 만약에 배포 실패하면 어떻게 할래?&quot;</li>
<li><strong>maximumPercent</strong>: &quot;배포할 때 task 얼마나 늘릴까?&quot;</li>
<li><strong>minimumHealthyPercent</strong>: &quot;아니 적어도 task가 이정도는 있어야지&quot;</li>
</ol>
<p>각 파라미터의 자세한 설명과, 설정 방법에 대해서는 아래에 순차적으로 작성했습니다.</p>
<p><br><br><br><br></p>
<h1 id="deploymentcircuitbreaker">deploymentCircuitBreaker</h1>
<blockquote>
<p>&quot;너 만약에 배포 실패하면 어떻게 할래?&quot;</p>
</blockquote>
<ul>
<li>배포가 정상적으로 이뤄지지 않고 있을 때, <code>신규 배포를 중단</code>하고, 선택적으로 <code>롤백</code>할 수 있는 기능입니다.</li>
</ul>
<br>

<h2 id="역할">역할</h2>
<ol>
<li><p>다음 리소스에 대한 <strong>health check</strong>를 수행합니다.</p>
<ul>
<li>Elastic Load Balancing load balancers</li>
<li>AWS Cloud Map service</li>
<li>Amazon ECS container health checks</li>
</ul>
</li>
<li><p><strong>실패시 threshold 동안 재시작하고, Deployment 를 <code>FAILED</code> 상태로 전환합니다.</strong></p>
<ul>
<li>ECS Service에 정의된 <code>desired-count</code> 에 따라 <code>Failure threshold</code> 을 자동으로 계산 (<a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-circuit-breaker.html#failure-threshold">문서</a>)<ul>
<li>최소 3 - 최대 200</li>
</ul>
</li>
<li>만약 CircuitBreaker 가 설정되어 있지 않다면 Failure threshold 설정되지 않아 계속 배포를 진행할 수 있습니다.</li>
</ul>
</li>
<li><p><strong>Rollback</strong></p>
<ul>
<li>Deployment 가 <code>FAILED</code> 일 때 가장 최근 성공한 Deployment로 롤백 가능</li>
<li>하지만 최근에 성공한 배포가 없다면 배포가 중단됩니다.</li>
</ul>
</li>
</ol>
<br>


<h2 id="설정-방법">설정 방법</h2>
<p>ECS 서비스 생성 시, &quot;Deployment failure detection&quot; 란에서 설정이 가능합니다.
<img src="https://velog.velcdn.com/images/ginee_park/post/30107356-0b9f-4a6f-a823-5fc08fe31f03/image.png" alt=""></p>
<br>


<p>또한 기존 서비스는 다음과 같은 CLI 명령어를 통해 설정 정보를 확인할 수 있습니다.</p>
<pre><code>$ aws ecs describe-services --cluster &lt;CLUSTER NAME&gt; --services &lt;SERVICE NAME&gt;

&quot;DeploymentConfiguration&quot;: { 
    &quot;DeploymentCircuitBreaker&quot;: { 
        &quot;Enable&quot;: &quot;true&quot;,   ### !!!
        &quot;Rollback&quot;: &quot;false&quot;  ### !!!
         }, 
    ...
 }, </code></pre><br>

<p>설정이 완료된 후, CircuitBreaker 에 의해 배포가 차단되면 다음과 같은 오류가 발생됩니다.</p>
<blockquote>
<p>Error occurred during operation &#39;ECS Deployment Circuit Breaker was triggered ...</p>
</blockquote>
<p><br><br><br><br><br><br></p>
<h1 id="maximumpercent-minimumhealthypercent">maximumPercent, minimumHealthyPercent</h1>
<blockquote>
<p><strong>maximumPercent</strong>: &quot;배포할 때 task 얼마나 늘릴까?&quot;
<strong>minimumHealthyPercent</strong>: &quot;아니 적어도 task가 이정도는 있어야지&quot;</p>
</blockquote>
<p><a href="https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/service_definition_parameters.html">공식문서</a>를 확인해 보면 더욱 정확한 정의를 확인할 수 있다.</p>
<ul>
<li><strong>maximumPercent</strong> <ul>
<li>배포 중 <code>RUNNING</code> , <code>PENDING</code> or <code>STOPPING</code> 상태 최대 task 개수 (반내림, default는 200%)</li>
</ul>
</li>
<li><strong>minimumHealthyPercent</strong><ul>
<li>배포 중 <code>RUNNING</code> 상태로 남아 있어야 하는 최소 task 개수 (반올림, default는 200%)</li>
</ul>
</li>
</ul>
<p><br><br><br></p>
<h2 id="적용-예시-1-무중단-배포-성공">적용 예시 1 (무중단 배포 성공)</h2>
<ul>
<li>desiredCount: <strong>4</strong></li>
<li>maximumPercent: <strong>200%</strong><ul>
<li>최대 8개의 task 가 허용됨</li>
</ul>
</li>
<li>minimumHealthyPercent: <strong>100%</strong><ul>
<li>최소 4개의 task는 running 중이여야 함</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ginee_park/post/0e2c5ed7-dc25-498f-833f-5413279a3292/image.png" alt=""></p>
<p><br><br><br></p>
<h2 id="적용-예시-2-무중단-배포-성공">적용 예시 2 (무중단 배포 성공)</h2>
<ul>
<li>desiredCount: <strong>4</strong></li>
<li>maximumPercent: <strong>100%</strong><ul>
<li>최대 4개의 task 가 허용됨</li>
</ul>
</li>
<li>minimumHealthyPercent: <strong>50%</strong><ul>
<li>최소 2개의 task는 running 중이여야 함
<img src="https://velog.velcdn.com/images/ginee_park/post/379125a2-4abb-4204-bbec-36c2c8eb9644/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><br><br><br></p>
<h2 id="적용-예시-3-무중단-배포-실패">적용 예시 3 (무중단 배포 실패!)</h2>
<ul>
<li>desiredCount: <strong>1</strong></li>
<li>maximumPercent: <strong>100%</strong><ul>
<li>최대 1개의 task 가 허용됨</li>
</ul>
</li>
<li>minimumHealthyPercent: <strong>50%</strong><ul>
<li>최소 1개의 task는 running 중이여야 함 (반올림 적용)
<img src="https://velog.velcdn.com/images/ginee_park/post/9a088bf8-8eb5-4bf7-b927-f369df69a136/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><strong>=&gt; 배포중 최대 task 수가 1개이기 때문에, 무중단 배포가 불가능한 것을 확인할 수 있습니다.</strong></p>
<p><br><br><br>
<br></p>
<h2 id="설정-방법-1">설정 방법</h2>
<p>ECS 생성 시 &quot;Deployment options&quot; 에서 설정합니다. 
(Rolling update 만 커스텀 설정 가능, Blue/Green는 기본설정으로 적용됨)
<img src="https://velog.velcdn.com/images/ginee_park/post/eb658fcb-8e3a-4385-a2c9-c5e1b71ae3b0/image.png" alt=""></p>
<p>또한 기존 서비스는 다음과 같은 CLI 명령어를 통해 설정 정보를 확인할 수 있습니다.</p>
<pre><code>$ aws ecs describe-services --cluster &lt;CLUSTER NAME&gt; --services &lt;SERVICE NAME&gt;

... 
&quot;DeploymentConfiguration&quot;: { 
    &quot;MaximumPercent&quot;: &quot;200&quot;, 
    &quot;MinimumHealthyPercent&quot;: &quot;100&quot;, 
    ...
 }, 
...</code></pre><p><br><br><br>
<br><br><br></p>
<h1 id="결론">결론</h1>
<p>ECS 무중단 배포를 위한 배포 설정에 대하여 알아보았습니다.</p>
<ol>
<li>CircuitBreaker 을 설정하여 <strong>운영상의 이슈가 있는 리소스를 처리하는 로직</strong>을 추가합니다.</li>
<li>서비스의 desired count 을 고려하여 <strong>배포중 서비스 중단이 일어나지 않도록 적절한 maximumPercent, minimumHealthyPercent 를 설정</strong>합니다.</li>
</ol>
<p><br><br><br></p>
<blockquote>
<p><strong>Reference</strong></p>
</blockquote>
<ol>
<li>ECS | Amazon ECS 서비스 정의 파라미터
 <a href="https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/service_definition_parameters.html">https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/service_definition_parameters.html</a></li>
<li>ECS | DeploymentConfiguration
 <a href="https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/APIReference/API_DeploymentConfiguration.html">https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/APIReference/API_DeploymentConfiguration.html</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[EKS PodEvictionFailure Issue- PDB]]></title>
            <link>https://velog.io/@ginee_park/EKS-PodEvictionFailure-Issue-PDB</link>
            <guid>https://velog.io/@ginee_park/EKS-PodEvictionFailure-Issue-PDB</guid>
            <pubDate>Wed, 29 May 2024 05:24:29 GMT</pubDate>
            <description><![CDATA[<p>관리형 노드 그룹 업데이트를 시작하면 Amazon EKS가 노드를 자동으로 업데이트합니다. </p>
<p>업데이트 시, 노드에서 Pods를 드레이닝합니다. 
Pods가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 <code>PodEvictionFailure</code> 오류와 함께 업그레이드 단계가 실패합니다.</p>
<p>이때 PDB 설정이 과도하게 잡혀있을 경우 pod가 노드에 evict되지 못하는 경우가 발생합니다.
따라서 이러한 문제를 해결하는 방법에 대해서 알아보겠습니다.</p>
<h1 id="과도한-pdb">과도한 PDB</h1>
<p>다음 오류는 <strong>PodEvictionFailure</strong>로 인해 업그레이드가 차단됨을 나타냅니다.
<code>&quot;Error message : Reached max retries while trying to evict pods from nodes in node group.&quot;</code></p>
<h2 id="disruptions">Disruptions</h2>
<ul>
<li>PDB에 대해 이해하기 전에 Pod의 Disruptions에 대한 이해가 선수되어야 합니다.</li>
<li>Pod는 기본적으로는 누군가(사람 Or 컨트롤러)가 파기하거나 불가피한 오류가 발생할 때까지 disappear되지 않습니다.</li>
<li>어떻게 종료되었느냐에 따라 Disruptions 종류가 나뉘게 됩니다.<ul>
<li>Voluntary disruptions -&gt; 의도적 종료<ul>
<li>Draining a node - 수리 또는 업그레이드를 위해 </li>
<li>Draining a node - 클러스터 Autoscaler에 의한 동작</li>
<li><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/">Using PriorityClasses</a><ul>
<li>Involuntary disruptions -&gt; 불가피한 오류</li>
<li>노드를 지원하는 물리적 시스템의 하드웨어 오류</li>
<li>클러스터 관리자가 실수로 VM(인스턴스)을 삭제</li>
<li>노드의 리소스 부족</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="pdb-pod-disruption-budgets">PDB (Pod disruption budgets)</h2>
<h3 id="pdb란"><a href="https://kubernetes.io/docs/tasks/run-application/configure-pdb/">PDB란</a>?</h3>
<ul>
<li><strong>PDB는 Voluntary disruptions으로 인해 동시에 다운 가능한 포드의 replica 수를 제한하는 기능입니다</strong><ul>
<li>Voluntary disruptions이 빈번하게 일어나는 경우 고가용성 애플리케이션을 실행하는 데 도움을 줄 수 있습니다.</li>
<li>Involuntary disruptions은 PDB로 방지할 수 없습니다.</li>
<li>예시<ul>
<li><code>.spec.replicas: 5</code>가 있는 배포에는 언제든지 5개의 Pod가 있어야 합니다. </li>
<li>PDB가 최소 4개의 파드를 유지하도록 설정되어 있는 경우, Eviction API는 한 번에 하나 포드의 Voluntary disruptions을 허용합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="pdb-설정"><a href="https://kubernetes.io/docs/tasks/run-application/configure-pdb/">PDB 설정</a></h3>
<ul>
<li><p><strong>minAvailable</strong> : </p>
<ul>
<li>Integer로 입력하면 파드 수를 의미합니다.</li>
<li>예를 들어 minAvailable을 10으로 설정하면 중단 중에도 항상 10개의 Pod를 사용할 수 있어야 합니다.</li>
<li>Percentage의 문자열 표현으로(&quot;50%&quot;) 입력하면 전체 Pod의 백분율을 의미합니다.</li>
<li>예를 들어 minAvailable을 &quot;50%&quot;로 설정하면 중단 중에도 Pod의 50% 이상이 계속 사용 가능한 상태로 유지됩니다.</li>
<li>또한 pod가 7개라면 Kubernetes는 가장 가까운 정수로 반올림하므로 이 경우 4개의 Pod를 사용할 수 있어야 합니다. </li>
</ul>
</li>
<li><p><strong>maxUnavailable</strong> : </p>
<ul>
<li>maxUnavailable 값을 백분율로 지정하면 Kubernetes는 <strong>중단될 수 있는 Pod 수를</strong> 반올림합니다. </li>
</ul>
</li>
<li><p><strong>예시 yaml</strong>
```
apiVersion: v1
items:</p>
</li>
<li><p>apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  creationTimestamp: &quot;2024-05-22T00:12:07Z&quot;
  generation: 1
  labels:</p>
<pre><code>eks.amazonaws.com/component: coredns
k8s-app: kube-dns</code></pre><p>  name: coredns
  namespace: kube-system
spec:
  maxUnavailable: 1
  selector:</p>
<pre><code>matchLabels:
  eks.amazonaws.com/component: coredns
  k8s-app: kube-dns</code></pre><pre><code></code></pre></li>
</ul>
<h3 id="control-plane-log-확인">Control Plane Log 확인</h3>
<ul>
<li>EKS를 사용하는 경우 감사 로깅이 활성화 되었다면 아래 쿼리를 통해 로그를 확인할 수 있다.</li>
</ul>
<pre><code>    fields @timestamp, @message| filter @logStream like &quot;kube-apiserver-audit&quot;
    | filter ispresent(requestURI)
    | filter objectRef.subresource = &quot;eviction&quot;
    | display @logStream, requestURI, responseObject.message
    | stats count(*) as retry by requestURI, responseObject.message</code></pre><h1 id="pdb-이슈-해결-방법">PDB 이슈 해결 방법</h1>
<h2 id="1-pod-강제종료">1. pod 강제종료</h2>
<p>PDB는 Node Drain 시 Pod Eviction에 영향을 미칠 뿐 Pod의 강제 종료를 방지하지는 못한다.
따라서 Pod를 강제 종료하여 스케쥴링이 가능한 다른 Node에 배치하고, eviction이 완료되지 않았던 Node를 다시 Drain을 시도할 수 있다.</p>
<h2 id="2-pdb-동작-변경">2. PDB 동작 변경</h2>
<p>PDB 조회시 Allowed Disruptions이라는 요소가 있는데 수치가 &quot;0&quot;일 경우 eviction 가능한 pod가 없음을 의미한다.
따라서 Min Available 혹은 Max Unavailable의 차이를 계산하여 Allowed Disruptions을 조절하여 eviction이 가능한 상태로 만들고, Drain을 시도하면 파드가 정상적으로 evict될 것이다.</p>
<blockquote>
<p>References:</p>
</blockquote>
<ul>
<li><a href="https://repost.aws/ko/knowledge-center/eks-node-group-update-failures">https://repost.aws/ko/knowledge-center/eks-node-group-update-failures</a></li>
<li><a href="https://kubernetes.io/docs/concepts/workloads/pods/disruptions/">https://kubernetes.io/docs/concepts/workloads/pods/disruptions/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[카프카] 용어 정리🔍]]></title>
            <link>https://velog.io/@ginee_park/%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC-nrn2jjr0</link>
            <guid>https://velog.io/@ginee_park/%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC-nrn2jjr0</guid>
            <pubDate>Sun, 02 Apr 2023 15:08:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>회사에서 IOT 데이터를 스트리밍하기 위하여 Kafka를 사용하고 있다.
DevOps Engineer로서 운영 관점에서 Kafka를 잘 사용하는 방법을 공부하고자 카프카 시리즈를 시작한다!</p>
</blockquote>
<br>

<p>첫 게시물이니
카프카의 아주 아주 기본적인 개념들을 정리해 보고자 한다!🙂</p>
<br>

<h2 id="프로듀서-컨슈머-브로커-주키퍼">프로듀서, 컨슈머, 브로커, 주키퍼</h2>
<p><img src="https://velog.velcdn.com/images/ginee_park/post/3339db64-f2d9-4986-92f6-5c2ebf0dc605/image.png" alt=""></p>
<ul>
<li><strong>프로듀서 :</strong><ul>
<li>카프카에서 메세지를 생성하고, 해당 메세지를 카프카 클러스터에 전송하는 클라이언트</li>
<li><strong>한 개, 혹은 여러개의 토픽으로 메세지를 보낼 수 있다.</strong></li>
</ul>
</li>
<li><strong>컨슈머 :</strong><ul>
<li>카프카에서 메세지를 읽는 클라이언트</li>
<li><strong>한 개, 혹은 여러개의 토픽에서 메세지를 가져올 수 있다.</strong></li>
<li>파티션마다 <strong>한 컨슈머만 데이터를 가져갈 수 있다.</strong></li>
</ul>
</li>
<li><strong>브로커 :</strong><ul>
<li>카프카 애플리케이션이 설치된 서버를 의미한다.</li>
</ul>
</li>
<li><strong>주키퍼 :</strong><ul>
<li>브로커 health check 등 카프카 클러스터의 상태를 관리한다.</li>
</ul>
</li>
</ul>
<br>

<h2 id="토픽-파티션-오프셋">토픽, 파티션, 오프셋</h2>
<ul>
<li><strong>토픽</strong> :<ul>
<li>카프카는 <strong>토픽</strong>(topic)이라는 곳에 데이터를 저장한다.</li>
<li>비유하자면 이메일 주소와 비슷함</li>
<li>토픽의 이름은 카프카 내에서 고유하다.</li>
</ul>
</li>
<li><strong>파티션</strong> :<ul>
<li>토픽의 병렬처리를 위해 여러개의 <strong>파티션</strong>(partition)이라는 단위로 나뉜다.</li>
<li>카프카에서는 파티셔닝을 통해 단 하나의 토픽이라도 높은 처리량을 수행할 수 있다.</li>
<li>파티션 번호는 0부터 시작</li>
</ul>
</li>
</ul>
<blockquote>
<p>토픽을 생성할 때 파티션 수를 설정하는데, 초기 생성 후 얼마든지 늘릴 수 있지만 <strong>절대로 줄일 수 없다.</strong></p>
<p>따라서 생성할 때 최대한 작게 생성한 후, 메세지 처리량이나 컨슈머의 LAG 등을 모니터링하면서 조금씩 늘려가는 방법이 가장 좋다.</p>
<p>컨슈머의 LAG : <code>프로듀서가 보낸 메세지 수(카프카에 남아 있는 메세지 수) - 컨슈머가 가져간 메세지 수</code></p>
<p>따라서 LAG이라는 지표를 통해 컨슈머에 지연이 없는지 확인할 수 있다.</p>
</blockquote>
<ul>
<li><strong>오프셋</strong> :<ul>
<li>파티션의 메세지가 저장되는 위치</li>
<li>순차적으로 증가하는 숫자(64비트의 정수)형태이다.
<img src="https://velog.velcdn.com/images/ginee_park/post/491da67c-909e-4d77-b623-96df77f44029/image.png" alt=""></li>
</ul>
</li>
<li>위 그림에서 1개의 토픽이 3개의 파티션에 나눠져있다.</li>
<li>프로듀서로부터 전송되는 메세지들의 쓰기 동작이 각 파티션별로 이뤄진다.</li>
<li>파티션마다 순차적으로 증가하는 숫자들이 바로 오프셋이다.</li>
<li>카프카에서는 오프셋을 통하여 메세지의 순서를 보장하고 컨슈머에서는 마지막으로 읽은 위치도 기억할 수 있다.</li>
</ul>
<h2 id="세그먼트">세그먼트</h2>
<ul>
<li><p><strong>세그먼트 :</strong></p>
<ul>
<li>프로듀서에 의해 브로커로 전송된 메세지는 토픽의 파티션에 저장되며, 각 메세지는 <strong>세그먼트(segment)라는 로그 파일의 형태</strong>로 브로커의 로컬 디스크에 저장된다.</li>
<li>카프카에 모든 메세지를 단일 파일로 저장하는 것이 아니라, <strong>세그먼트라는 단위</strong>로 나뉘어서 저장된다.</li>
</ul>
</li>
<li><p>프로듀서는 항상 <strong>활성 세그먼트</strong>(active segment)에 write를 한다.</p>
</li>
<li><p>세그먼트 사이즈 limit에 도달하면 새로운 세그먼트 파일이 활성화된다.</p>
</li>
<li><p>세그먼트 파일의 이름은 <strong>첫번째 메세지의 파일 이름</strong>을 사용하여 생성된다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ginee_park/post/59a01a04-01df-4bd8-943d-32794dd015d6/image.png" alt=""></p>
<ul>
<li>위 그림을 살펴보면 세그먼트0에는 오프셋 0~2의 메세지가 있고,</li>
<li>현재 활성 세그먼트는 6으로, 첫번째 메세지의 오프셋이 6이다.</li>
</ul>
<br>

<h2 id="리플리케이션">리플리케이션</h2>
<ul>
<li><strong>리플리케이션 :</strong><ul>
<li>카프카에서는 가용성을 위해 리플리케이션(Replication)이라는 기능을 제공한다.</li>
<li>각 메세지들을 여러 개로 복제해서 카프카 클러스터 내 브로커들에게 분산시키는 동작을 의미한다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ginee_park/post/884eacde-f3e0-4ee9-8e37-bd4d4f9595ac/image.png" alt=""></p>
<ul>
<li>위 그림은 test라는 토픽에 파티션이 3개고 리플리케이션이 1개일 때의 예시이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ginee_park/post/9693c973-b891-445f-9087-3d2dd9c31bbe/image.png" alt=""></p>
<ul>
<li>위 그림은 <strong>리플리케이션을 3</strong>으로 설정했을 때의 그림이다.</li>
<li>파티션이 3개씩 리플리케이션 되었다.</li>
</ul>
<p>리플리케이션을 설정할 때 아래와 같은 trade-offs를 고려해야 한다.</p>
<ul>
<li>장점 : 데이터 가용성이 훨씬 증가한다.</li>
<li>단점 : 각 복제본마다 추가 저장 용량이 필요하므로 네트워크 트래픽과 데이터 디스크 사용량이 증가될 수 있다.</li>
</ul>
<blockquote>
<p>상황에 따라서 복제에 대한 오버헤드를 줄여 <strong>최대한 브로커를 효율적으로 사용하는 것이 권장</strong>된다.</p>
<ul>
<li>테스트 환경 : 리플리케이션 팩터의 수 1로 설정</li>
<li>운영 환경(로그성 메세지, 약간의 유실 허용) : 리플리케이션 팩터의 수 2로 설정</li>
<li>운영 환경(유실을 허용하지 않음) : 리플리케이션 팩터의 수 3로 설정</li>
</ul>
</blockquote>
<p><br><br><br><br><br></p>
<h4 id="출처-">출처 :</h4>
<ul>
<li>책 : 실전 카프카 개발부터 운영까지</li>
<li><a href="https://www.cloudkarafka.com/blog/part1-kafka-for-beginners-what-is-apache-kafka.html">https://www.cloudkarafka.com/blog/part1-kafka-for-beginners-what-is-apache-kafka.html</a></li>
<li><a href="https://dattell.com/data-architecture-blog/what-is-a-kafka-topic/">https://dattell.com/data-architecture-blog/what-is-a-kafka-topic/</a></li>
<li><a href="https://www.freblogg.com/kafka-storage-internals">https://www.freblogg.com/kafka-storage-internals</a></li>
<li><a href="https://damdam-kim.tistory.com/17">https://damdam-kim.tistory.com/17</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Helm으로 MongoDB 설치하고, 접속하기]]></title>
            <link>https://velog.io/@ginee_park/Helm%EC%9C%BC%EB%A1%9C-MongoDB-Install</link>
            <guid>https://velog.io/@ginee_park/Helm%EC%9C%BC%EB%A1%9C-MongoDB-Install</guid>
            <pubDate>Tue, 26 Apr 2022 17:56:08 GMT</pubDate>
            <description><![CDATA[<p>쿠버네티스 환경에서 Helm으로 mongoDB를 손쉽게 배포하는 방법을 알아보겠습니다!</p>
<blockquote>
<p>*<em>MongoDB Helm Repo : *</em>
<a href="https://github.com/bitnami/charts/tree/master/bitnami/mongodb">https://github.com/bitnami/charts/tree/master/bitnami/mongodb</a></p>
</blockquote>
<blockquote>
<p><strong>실습 환경 :</strong></p>
</blockquote>
<ul>
<li>AWS CentOS 인스턴스</li>
<li>minikube 클러스터</li>
</ul>
<br>


<h1 id="⭐️-mongodb-설치">⭐️ MongoDB 설치</h1>
<h3 id="1-namespace-생성">1. Namespace 생성</h3>
<pre><code class="language-bash">kubectl create ns mongo</code></pre>
<br>


<h3 id="2-mongo-repo-추가">2. mongo Repo 추가</h3>
<pre><code class="language-bash">helm repo add bitnami https://charts.bitnami.com/bitnami</code></pre>
<br>


<h3 id="3-value-파일-작성">3. value 파일 작성</h3>
<p><strong>values-mongo.yaml</strong></p>
<pre><code class="language-yaml">mage:
  registry: docker.io
  repository: bitnami/mongodb
  tag: 4.4.4-debian-10-r41
  pullPolicy: IfNotPresent

architecture: standalone

useStatefulSet: true

## MongoDB(R) Authentication parameters
auth:
  enabled: true
  rootPassword: &quot;yourpasswd&quot;
  username: admin
  password: yourpasswd
  database: sample

##
persistence:
  enabled: true
  storageClass: &quot;nfs-standard&quot;
  accessModes:
    - ReadWriteOnce
  size: 2Gi

service:
  type: NodePort
  port: 27017
  portName: mongodb</code></pre>
<p>저는 <strong>인증 정보, 볼륨, 서비스(노드포트)</strong>에 대해 정의해주었습니다.
자세한 파라미터 정보는 <a href="https://github.com/bitnami/charts/tree/master/bitnami/mongodb#parameters">파라미터 정리 표</a>, <a href="https://github.com/bitnami/charts/blob/master/bitnami/mongodb/values.yaml">values.yaml</a>을 참고해주세요.</p>
<br>

<h3 id="4-helm-install">4. Helm install</h3>
<pre><code class="language-bash">helm install mongodb-tset bitnami/mongodb-sharded --namespace mongo --values values-mongo.yaml

NAME: mongodb-tset
LAST DEPLOYED: Tue Apr 26 15:58:06 2022
NAMESPACE: mongo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mongodb-sharded
CHART VERSION: 4.0.21
APP VERSION: 4.4.13

** Please be patient while the chart is being deployed **

The MongoDB&amp;reg; Sharded cluster can be accessed via the Mongos instances in port 27017 on the following DNS name from within your cluster:

    mongodb-tset-mongodb-sharded.mongo.svc.cluster.local

To get the root password run:

    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace mongo mongodb-tset-mongodb-sharded -o jsonpath=&quot;{.data.mongodb-root-password}&quot; | base64 --decode)

To connect to your database run the following command:

    kubectl run --namespace mongo mongodb-tset-mongodb-sharded-client --rm --tty -i --restart=&#39;Never&#39; --image docker.io/bitnami/mongodb-sharded:4.4.13-debian-10-r50 --command -- mongo admin --host mongodb-tset-mongodb-sharded

To connect to your database from outside the cluster execute the following commands:

    export NODE_IP=$(kubectl get nodes --namespace mongo -o jsonpath=&quot;{.items[0].status.addresses[0].address}&quot;)
    export NODE_PORT=$(kubectl get --namespace mongo -o jsonpath=&quot;{.spec.ports[0].nodePort}&quot; services mongodb-tset-mongodb-sharded)
    mongo --host $NODE_IP --port $NODE_PORT --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD</code></pre>
<p>kubernetes에 배포가 완료되면
mongoDB 접속과 관련된 몇가지 명령어를 알려준다.</p>
<ul>
<li><p>** To get the root password run:**
secret에 저장되어 있는 root password를 복호한 값을 가져온다</p>
</li>
<li><p><strong>To connect to your database run the following command:</strong>
kubectl로 데이터베이스에 직접 접속한다.</p>
</li>
<li><p><strong>To connect to your database from outside the cluster execute the following commands:</strong>
쿠버네티스 클러스터 외부에서 접속할 수 있는 IP주소와 포트 번호를 알려준다.</p>
</li>
</ul>
<br>

<h3 id="5-배포된-리소스-확인">5. 배포된 리소스 확인</h3>
<pre><code>kubectl get all -n mongo

NAME                                                       READY   STATUS    RESTARTS      AGE
pod/mongodb-tset-mongodb-sharded-configsvr-0               1/1     Running   0             95m
pod/mongodb-tset-mongodb-sharded-mongos-6cccfd844b-7dd7l   1/1     Running   0             95m
pod/mongodb-tset-mongodb-sharded-shard0-data-0             1/1     Running   1 (92m ago)   95m
pod/mongodb-tset-mongodb-sharded-shard1-data-0             1/1     Running   0             95m

NAME                                            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)           AGE
service/mongodb-tset-mongodb-sharded            NodePort    10.96.8.157   &lt;none&gt;        27017:30631/TCP   95m
service/mongodb-tset-mongodb-sharded-headless   ClusterIP   None          &lt;none&gt;        27017/TCP         95m

NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mongodb-tset-mongodb-sharded-mongos   1/1     1            1           95m

NAME                                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/mongodb-tset-mongodb-sharded-mongos-6cccfd844b   1         1         1       95m

NAME                                                        READY   AGE
statefulset.apps/mongodb-tset-mongodb-sharded-configsvr     1/1     95m
statefulset.apps/mongodb-tset-mongodb-sharded-shard0-data   1/1     95m
statefulset.apps/mongodb-tset-mongodb-sharded-shard1-data   1/1     95m</code></pre><p>파드도 정상적으로 배포되었고, 서비스도 NodePort로 배포되었다~!</p>
<p><br><br></p>
<h1 id="⭐️-mongo-db-접속">⭐️ Mongo DB 접속</h1>
<p>  이제 DB에 접속해보자!</p>
<h3 id="방법1-kubectl로-mongodb-접속">[방법1] kubectl로 MongoDB 접속</h3>
<pre><code>kubectl run --namespace mongo mongodb-tset-mongodb-sharded-client --rm --tty -i --restart=&#39;Never&#39; --image docker.io/bitnami/mongodb-sharded:4.4.13-debian-10-r50 --command -- mongo admin --host mongodb-tset-mongodb-sharded

If you don&#39;t see a command prompt, try pressing enter.
mongos&gt;</code></pre><br>

<h3 id="방법2-클러스터-외부에서-mongodb-접속">[방법2] 클러스터 외부에서 MongoDB 접속</h3>
<p>다음 명령을 사용하여 Node application의 URL을 가져온다.</p>
<pre><code class="language-bash">    export NODE_IP=$(kubectl get nodes --namespace mongo -o jsonpath=&quot;{.items[0].status.addresses[0].address}&quot;)
    export NODE_PORT=$(kubectl get --namespace mongo -o jsonpath=&quot;{.spec.ports[0].nodePort}&quot; services mongodb-tset-mongodb-sharded)
    mongo --host $NODE_IP --port $NODE_PORT --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD</code></pre>
<p>따라서 minikube가 설치된 호스트에서 mongoDB에 접속할 수 있다.</p>
<pre><code class="language-bash">mongo --host $NODE_IP --port $NODE_PORT --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

MongoDB shell version v5.0.8
connecting to: mongodb://192.168.49.2:30631/?authSource=admin&amp;compressors=disabled&amp;gssapiServiceName=mongodb
Implicit session: session { &quot;id&quot; : UUID(&quot;a808d91d-18f1-472f-8717-824c3f190b40&quot;) }
MongoDB server version: 4.4.13
WARNING: shell and server versions do not match
================
Warning: the &quot;mongo&quot; shell has been superseded by &quot;mongosh&quot;,
which delivers improved usability and compatibility.The &quot;mongo&quot; shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
mongos&gt;</code></pre>
  <br>

<h3 id="방법3-public-ip로-접속하기">[방법3] Public IP로 접속하기</h3>
<p>현재 실습환경이 minikube이기 때문에 서비스에 로드밸런서를 붙일 수 없다. 
따라서 Public IP로 접속이 불가하다💦</p>
<p>하지만 EKS, GKE와 같은 환경에서 서비스 타입을 로드밸런서로 지정하면 외부에서 접속할 수 있는 퍼블릭한(External) IP를 얻을 수 있다.</p>
<pre><code class="language-bash">export SERVICE_IP=$(kubectl get svc --namespace default my-todo-app-mean -o jsonpath=&#39;{.status.loadBalancer.ingress[0].ip}&#39;)
echo http://$SERVICE_IP/</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[리눅스] Terminal 개념과 명령어]]></title>
            <link>https://velog.io/@ginee_park/%EB%A6%AC%EB%88%85%EC%8A%A4-Terminal-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%AA%85%EB%A0%B9%EC%96%B4-tty</link>
            <guid>https://velog.io/@ginee_park/%EB%A6%AC%EB%88%85%EC%8A%A4-Terminal-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%AA%85%EB%A0%B9%EC%96%B4-tty</guid>
            <pubDate>Wed, 12 Jan 2022 11:37:13 GMT</pubDate>
            <description><![CDATA[<h2 id="터미널-개념-이해하기">터미널 개념 이해하기</h2>
<blockquote>
<p>터미널? 정확하게 터미널이 의미하는 것이 무엇이지? 하는 의문이 들었다.
터미널 명령에 대해 알아보기 전 &#39;터미널&#39;에 대한 정확한 개념을 정리해보자!</p>
</blockquote>
<h3 id="리눅스-터미널의-유래">리눅스 터미널의 유래</h3>
<p>과거 컴퓨터는 대학과 기업이 소유한 거대한 다중 사용자 시스템이였다. 
기계 자체는 일반 사용자가 방문하지 않는 안전한 방에 있었다. 
<img src="https://images.velog.io/images/ginee_park/post/630fd7b0-c3a8-44c3-9dd4-b418f38989db/image.png" alt="">
<strong>대신 위 사진과 같이 저렴한 텔레타이프(TTY)를 터미널로 사용했다.</strong></p>
<p> 텔레타이프(TTY)는 주로 전신에서 타이핑된 메시지를 주고받는 데 사용되었지만, <strong>정보를 컴퓨터에 입력하고 컴퓨터에서 정보를 가져오는 데</strong>에도 사용할 수 있다. </p>
<p><strong>많은 텔레타이프가 하나의 Unix 컴퓨터에 연결</strong>됐다.
모든 사용자는 자신의 텔레타이프 앞에 앉아 자신의 사용자 이름과 비밀번호로 Unix에 로그인했다.</p>
<p>따라서 <strong>Unix는 최초의 다중 사용자 운영 체제</strong>가 되었고 ASR33은 최초의 Unix 터미널이 되었다. 
이러한 유래로 <strong>TTY</strong>라는 약어는 일반적으로 <strong>Unix/Linux에서 터미널을 나타내는 데 사용</strong>된다고 한다.
<br></p>
<h3 id="현재-터미널의-의미는">현재 터미널의 의미는?</h3>
<p>오늘날의 <strong>터미널은 GUI에서 실행되는 이전 물리적 터미널의 소프트웨어 표현</strong>이다.
사용자가 명령을 입력하고 텍스트를 인쇄할 수 있는 <strong>인터페이스를 제공</strong>한다.</p>
<p><strong>Linux 서버에 SSH로 연결할 때 로컬 컴퓨터에서 실행하고 명령을 입력하는 프로그램은 터미널이다.</strong></p>
<br>

<h3 id="쉘이란">쉘이란?</h3>
<p><strong>터미널은 정보를 전송하는 메커니즘</strong>일 뿐이다.
운영 체제가 정보를 이해하기 위해 터미널은 shell을 기본적으로 사용하고 있다. </p>
<p> <strong>정리하자면 Linux의 셸은 터미널 창에 입력한 명령을 해석하여 운영 체제에서 사용자가 원하는 작업을 이해할 수 있도록 하는 프로그램</strong>입니다.</p>
<p>hell은 기본적으로 bash, tcsh등이 사용되며 window에서는 cmd를 기반으로 사용되고있다.</p>
<br>

<h3 id="커맨드라인-인터페이스란cli">커맨드라인 인터페이스란(CLI)?</h3>
<p>사용자가 텍스트로 명령어를 입력하고 다시 텍스트로 결과를 화면에 출력해주는 인터페이스를 가진 컴퓨팅 인터페이스를 의미합니다. 
<img src="https://images.velog.io/images/ginee_park/post/69fabfc3-2a56-43e9-90eb-368c8b682dd2/image.png" alt=""></p>
<p>커맨드라인 인터페이스는 구체적인 프로그램을 가리키는 단어는 아니며, 특정 방식의 애플리케이션 인터페이스에 대한 통칭이다.</p>
<h2 id="터미널-관련-명령어">터미널 관련 명령어</h2>
<h3 id="tty">tty</h3>
<p>터미널에서 <strong>tty</strong>라는 명령어를 실행해보면 <strong>현재 커널과 연결된 가상 터미널 장치 이름을 확인</strong>할 수 있다.</p>
<p><em>w 명령어로 로그인한 유저의 모든 유저에 대한 TTY 정보를 확인할 수도 있다.</em>
<img src="https://images.velog.io/images/ginee_park/post/8b0ac808-b025-479b-9ef3-ec4f83bdb262/Screen%20Shot%202022-01-12%20at%208.28.12%20PM.png" alt=""></p>
<br>

<h3 id="stty">stty</h3>
<p>stty 명령어로 터미널 설정을 출력, 변경할수 있다.
<img src="https://images.velog.io/images/ginee_park/post/9ff30b13-684f-4604-9731-adb07af6ca69/Screen%20Shot%202022-01-12%20at%208.30.33%20PM.png" alt=""></p>
<p>a 옵션을 이용하면 각 키값들에 대한 설정을 볼 수 있다.
<img src="https://images.velog.io/images/ginee_park/post/7795662a-6f52-47fc-8b8b-a61912efdc36/Screen%20Shot%202022-01-12%20at%208.32.18%20PM.png" alt=""></p>
<br>

<h3 id="setterm">setterm</h3>
<p>터미널의 설정값을 변경할 때 사용하는 명령이다.</p>
<p>다음을 입력하면 터미널에서 커서 모양이 보이지 않고, on으로 다시 설정하면 커서 모양이 나타난다.</p>
<pre><code>setterm -cursor off</code></pre><h3 id="tset">tset</h3>
<p>터미널 설정을 초기화 하고, 터미널 타입을 출력하는 명령어이다.
<img src="https://images.velog.io/images/ginee_park/post/b0282d50-6d57-4241-8533-ebfca1c86663/Screen%20Shot%202022-01-12%20at%208.35.24%20PM.png" alt=""></p>
<p>이 외에도
setserial, getty, agetty, mesg, wall, write와 같은 다양한 명령어가 있다.</p>
<p>더 궁금한 명령어는 <strong>man 명령어를 사용하여 맨페이지</strong>를 읽어보면서 공부해보자!</p>
<br>
<br>
<br>

<blockquote>
<p>참고</p>
</blockquote>
<ul>
<li><a href="https://www.linuxbabe.com/command-line/linux-terminal">https://www.linuxbabe.com/command-line/linux-terminal</a></li>
<li><a href="https://www.linuxbabe.com/command-line/linux-terminal">https://www.linuxbabe.com/command-line/linux-terminal</a></li>
<li><a href="https://www.44bits.io/ko/keyword/command-line-interface-cli-shell-and-terminal#%ED%84%B0%EB%AF%B8%EB%84%90terminal%EC%9D%B4%EB%9E%80">https://www.44bits.io/ko/keyword/command-line-interface-cli-shell-and-terminal#%ED%84%B0%EB%AF%B8%EB%84%90terminal%EC%9D%B4%EB%9E%80</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿠버네티스 개요]]></title>
            <link>https://velog.io/@ginee_park/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@ginee_park/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Tue, 11 Jan 2022 05:59:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ginee_park/post/12a82e8e-58d0-43f8-971f-9b5505cb8b55/001.png" alt=""></p>
<h1 id="쿠버네티스-왜-필요할까-🤔">쿠버네티스, 왜 필요할까 🤔</h1>
<hr>
<h3 id="모놀리스-애플리케이션에서-마이크로-서비스로-전환">모놀리스 애플리케이션에서 마이크로 서비스로 전환</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/03e815d0-b51e-44c5-99f3-8825d0522341/image.png" alt=""></p>
<ul>
<li><strong>모놀리스 애플리케이션</strong><ul>
<li>전체가 <strong>하나의 운영체제 프로세스로 실행</strong>되기 때문에 하나의 개체로 개발, 배포, 관리된다.</li>
<li>하나의 변경 사항을 적용하기 위해 전체를 다시 빌드/테스트/배포 해야한다.</li>
<li>애플리케이션 확장이 어렵다.</li>
</ul>
</li>
</ul>
<p>이러한 문제로
모놀리스 애플리케이션을 마이크로 서비스라는 <strong>독립적으로 배포할 수 있는 작은 구성 요소로 분할</strong>했다.</p>
<ul>
<li>*<em>마이크로 서비스 *</em><ul>
<li>각 마이크로 서비스는 <strong>독립적인 프로세스로 실행</strong>되며 api로 또 다른 마이크로 서비스와 통신한다.</li>
<li>새로 추가되거나 변경 사항이 있는 서비스만 빠르게 빌드/테스트/배포가 가능하다.</li>
<li>리소스가 더 필요한 서비스만 별도로 확장 가능하다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="문제-상황-1-마이크로-서비스의-단점--종속성의-충돌">[문제 상황 1] 마이크로 서비스의 단점 : 종속성의 충돌</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/026d9340-c906-4608-b26a-e3c50d3f47a5/Screen%20Shot%202022-01-11%20at%2012.03.27%20PM.png" alt="">
마이크로 서비스 아키텍쳐의 구성 요소는 <strong>독립적인 방식으로 개발</strong>된다.</p>
<p>각 구성 요소를 개발하는 <strong>별도의 팀</strong>이 있는 것이 일반적인데
각각의 <strong>개발자가 자신의 노트북으로 애플리케이션은 개발</strong> 중인 상황을 떠올려보자.</p>
<p>각각의 어플리케이션은 서로 다른 라이브러리, 종속성 및 파일에 의존하고 있으며,
동시에 <strong>회사는</strong> 자체 설정과 지원 파일 세트에 준하여 <strong>표준화된 개발 및 프로덕션 환경</strong>을 갖추고 있다.</p>
<p>이때, 서버 환경을 재구축하는 부가적인 작업 없이 가능한 한 로컬에서 이러한 환경을 에뮬레이션하려고 한다. 그렇다면 이러한 환경 전체에서 애플리케이션이 작동되게 하고, 품질 검사를 통과하고, 큰 문제나 수정 없이 애플리케이션을 배포할 수 있을까? </p>
<p><strong>동일한 호스트에 배포해야하는 구성 요소 수가 많을 수록 모든 종속성을 관리하기 매우 어려워진다.</strong></p>
<br>

<h3 id="문제-상황-2-일관된-환경의-중요성--개발-프로덕션-환경">[문제 상황 2] 일관된 환경의 중요성 : 개발, 프로덕션 환경</h3>
<p>개발, 배포하는 구성 요소의 수에 상관없이, 개발팀과 운영팀이 해결해야 하는 큰 문제가 있다.
<strong>애플리케이션을 실행하는 환경이 매번 다르다</strong>는 것이다.</p>
<p>개발자의 로컬 환경에서는 잘 운영되던 코드가
운영팀이 운영하는 프로덕션 환경에서는 오류가 생길 수도 있다.</p>
<p>프로덕션 환경에서만 나타나는 문제를 줄이기 위해
<strong>애플리케이션 개발과 프로덕션이 정확히 동일한 환경에서 실행</strong>돼
운영체제, 라이브러리, 시스템 구성, 네트워킹 환경 등 모든 것이 동일한 환경으로 만들어야 한다.</p>
<br>

<h3 id="문제-상황-3-개발자와-시스템-관리자의-동상이몽">[문제 상황 3] 개발자와 시스템 관리자의 동상이몽</h3>
<ul>
<li><p>개발자와 시스템 관리자의 <strong>공통 목표</strong>
고객이 성공적으로 실행할 수 있는 애플리케이션을 제공하는 것</p>
</li>
<li><p>개발자는
새로운 <strong>기능</strong>을 만들고 <strong>사용자 경험 향상</strong>에 중요도를 둔다.</p>
</li>
<li><p>시스템 운영자는
개발자에게 우선순위가 낮은 <strong>시스템 보안, 사용률</strong>과 같은 측면에 중요도를 둔다.</p>
</li>
</ul>
<br>

<h3 id="해답은-쿠버네티스">해답은 쿠버네티스</h3>
<p>앞서 언급한 문제 상황을
쿠버네티스가 어떻게 해결해주는지 살펴보자!🔍</p>
<br> 
<br>
<br>



<h1 id="컨테이너-소개-📦">컨테이너 소개 📦</h1>
<hr>
<h3 id="컨테이너의-개요">컨테이너의 개요</h3>
<p><strong>[문제 상황 1] 마이크로 서비스의 단점!</strong> 에서
    한 호스트에 마이크로 서비스 애플리케이션을 개발한다고 가정할 때, 
    구성 요소의 구성(라이브러리 버전 등)은 다를 수 있다는 <strong>종속성 차이</strong>에 대해 언급했다.</p>
<p>이에 대한 <strong>답</strong>은 바로 <strong>&#39;컨테이너&#39;를 사용</strong>하는 것이다.</p>
<p>   애플리케이션을 실행하는 <strong>컨테이너는 각각의 필수 라이브러리, 종속 요소와 파일을 사용</strong>하므로
   문제없이 원활하게 애플리케이션을 프로덕션으로 진행할 수 있다. </p>
<p>   뿐만 아니라 이식성, 구성 가능성, 격리가 필요한 경우 리눅스 컨테이너를 다양한 문제에 적용할 수 있다. </p>
<p>   컨테이너는** 동일한 호스트 시스템에서
   동시에 서로 다른 환경<strong>을 만들어주어 가상머신과 유사하게</strong> 격리<strong>한다.
   하지만 가상머신보다 **오버헤드가 훨씬 적은 기술</strong>이다.</p>
<br> 


<h3 id="컨테이너와-가상머신-비교">컨테이너와 가상머신 비교</h3>
<p>   <img src="https://images.velog.io/images/ginee_park/post/a3d633a5-9232-4e48-9dcd-04d1bc2151a9/image.png" alt=""></p>
<table>
<thead>
<tr>
<th></th>
<th>가상머신</th>
<th>컨테이너</th>
</tr>
</thead>
<tbody><tr>
<td>주요 차이점</td>
<td><strong>단일 하드웨어 시스템</strong>에서 <strong>여러 운영 체제가 동시에 실행</strong>될 수 있도록 한다.</td>
<td><strong>호스트 OS에서 실행되는 커널을 공유</strong>하고, 동일한 커널에서 시스템 콜을 수행한다.</td>
</tr>
<tr>
<td>동일한 하드웨어에서 실행할 수 있는 구성요소 양 비교</td>
<td>*<em>적다. *</em>구성요소 프로세스 뿐만 아니라 시스템 프로세스를 실행하기 때문에 추가 컴퓨팅 리소스가 필요하기 때문이다.</td>
<td>*<em>많다. *</em>컨테이너는 모두 동일한 OS에서 실행되기 때문에 오버헤드가 낮기 때문이다.</td>
</tr>
<tr>
<td>격리 수준 비교</td>
<td>가상머신은 <strong>자체 리눅스 커널을 실행하기 때문에  호스트와 완전한 격리를 제공</strong>한다.</td>
<td>컨테이너는 <strong>동일한 OS의 커널을 호출함으로 완전한 격리를 제공하지 않는다.</strong> 따라서 보안 위험이 발생할 가능성이 있다.</td>
</tr>
</tbody></table>
<br> 
<br> 


<h3 id="컨테이너-격리를-가능하게-하는-매커니즘">컨테이너 격리를 가능하게 하는 매커니즘</h3>
<p>   컨테이너는 동일한 호스트의 OS를 공유하고 있는데, 어떤 매커니즘으로 격리를 제공하고 있을까?</p>
<h4 id="⑴-namespace">⑴ namespace</h4>
<p>   <strong>각 프로세스</strong>가 <strong>시스템</strong>(파일, 프로세스, 네트워크 인터페이스, 호스트 이름 등)<strong>에 대한 독립적인 뷰</strong>만 볼 수 있도록 한다.
   현재 리눅스 커널에서는 다음 <strong>6가지 namespace를 지원</strong>하고 있다:    </p>
<ul>
<li>mnt (파일시스템 마운트): 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능</li>
<li>pid (프로세스): 독립적인 프로세스 공간을 할당</li>
<li>net (네트워크): namespace간에 network 충돌 방지 (중복 포트 바인딩 등)</li>
<li>ipc (SystemV IPC): 프로세스간의 독립적인 통신통로 할당</li>
<li>uts (hostname): 독립적인 hostname 할당</li>
<li>user (UID): 독립적인 사용자 할당</li>
</ul>
<p>기본적으로 리눅스 시스템에 하나의 네임스페이스가 있다.
그러나 추가 네임 스페이스를 생성하고 구성할 수 있다. </p>
<p>프로세스를 실행할 때 네임스페이스 중 하나에서 프로세스를 실행한다.
(프로세스는 하나의 네임스페이스에만 속하는 것이 아니라 여러 네임스페이스에 속할 수도 있다.)</p>
<h4 id="⑵-cgroups">⑵ cgroups</h4>
<p><strong>프로세스가 사용할 수 있는 리소스의 양을 제한</strong>하게 해주는 리눅스의 기능이다.
<strong>cgroups는 다음 리소스를 제어</strong>할 수 있다:</p>
<ul>
<li>메모리</li>
<li>CPU</li>
<li>I/O</li>
<li>네트워크</li>
<li>device 노드(<code>/dev/</code>)</li>
</ul>
<p>프로세스는 <strong>설정된 양 이상의 리소스를 사용할 수 없다.</strong>
    이런 방식으로 프로세스는 다른 프로세스 용으로 설정된(예약해 놓은) 리소스를 사용할 수 없으며 
    이는 프로세스가 별도의 시스템에서 실행될 때와 비슷하다.</p>
<br> 
<br> 

<h3 id="docker">Docker</h3>
<p>도커는 애플리케이션을 패키징, 배포, 실행하기 위한 <strong>플랫폼</strong>이다.</p>
<p>애플리케이션에 필요한 <strong>전체 환경을 패키지화</strong> 하여,
중앙 <strong>저장소로 전송</strong>할 수 있으며,
도커를 실행하는 모든 컴퓨터에서 <strong>사용</strong>할 수 있다.</p>
<p>이러한 도커의 세가지 주요 개념은 다음과 같다.</p>
<ul>
<li><strong>이미지</strong> : 애플리케이션과 해당 환경을 패키지화 한 것이다.</li>
<li><strong>레지스트리</strong> : 이미지를 저장하고, 공유할 수 있는 저장소이다.</li>
<li><strong>컨테이너</strong> : 도커 기반 컨테이너 이미지에서 생성된 리눅스 컨테이너로, 호스트에서 실행되는 프로세스이지만 격리돼 있다. 프로세스는 cgroups로 리소스 양이 제한되어 있으므로 할당된 양만 사용 가능하다.</li>
</ul>
<br> 
<br> 

<br> 
<br> 


<h1 id="쿠버네티스-소개-⚙️">쿠버네티스 소개 ⚙️</h1>
<hr>
<h3 id="결론적으로-쿠버네티스가-해결해주는것은-무엇일까">결론적으로 쿠버네티스가 해결해주는것은 무엇일까?</h3>
<ul>
<li><strong>[문제 상황 3] 개발자와 시스템 관리자의 동상이몽</strong>
개발자는 기능 개발을,
시스템 관리자는 보안과 같은사용률과 같은 측면에 중요도를 둔다고 했었다.</li>
</ul>
<ul>
<li><p>쿠버네티스를 이용하면
개발자는 특정 인프라 관련 서비스를 애플리케이션에 구현하지 않아도 된다.
따라서 실제 기능을 개발하는 것에만 집중할 수 있다.</p>
</li>
<li><p>또한 시스템 관리자는 쿠버네티스가 애플리케이션을 재배치하고 조합함으로 리소스를 훨씬 더 효율적으로 이용할 수 있게 된다. 
뿐만아니라 고장 난 노드를 자동으로 처리하도록 함으로써 따라서 운영팀은 더 편하게 잠을 잘 수 있다...ㅎ</p>
<br> 
<br> 
### 쿠버네티스 핵심
우선 쿠버네티스의 핵심적인 구조와 워크 플로우에 대해서만 정리했다.

</li>
</ul>
<p>쿠버네티스는 <strong>컨테이너화된 애플리케이션</strong>을 <strong>쉽게 배포하고 관리</strong>할 수 있게 해주는 소프트웨어 시스템이다.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/f8e0cf46-57b1-4a39-8071-0c6073d7ec66/image.png" alt=""></p>
<p>다음 그림은 쿠버네티스의 구조이다.
크게 <strong>마스터 노드와 워커노드로 구성</strong>된다.</p>
<ul>
<li><strong>마스터 노드</strong> : 전체 쿠버네티스 시스템을** 제어<strong>하고 **관리</strong>하는 <strong>쿠버네티스 컨트롤 플레인을 실행</strong></li>
<li>** 워커 노드** : 실제 배포되는 <strong>컨테이너 애플리케이션을 실행</strong></li>
</ul>
<p><strong>큰 워크 플로우</strong>는
개발자가 애플리케이션 <strong>매니페스트를 작성</strong>
➡️ 매니페스트를 <strong>마스터 노드에 배포</strong>
➡️ 쿠버네티는 해당 애플리케이션을 <strong>워커 노드 클러스터에 배포</strong>한다.</p>
<br> 

<p>구조를 더 자세히 살펴 보자.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/54f4ecc5-7ab3-42f0-94a2-27c3c247b588/image.png" alt=""></p>
<h4 id="컨트롤-플레인">컨트롤 플레인</h4>
<ul>
<li>마스터 노드가 실행시킨다.</li>
<li>클러스터를 제어하고 작동시킨다.</li>
<li>구성요소<ul>
<li><strong>kube-apiserver</strong> : K8S API를 노출하는 컨트롤 플레인의 프론트엔드<ul>
<li><strong>etcd</strong> : 클러스터의 모든 데이터를 보관하는 일관성, 고가용성을 보장하는 키-값 저장소
어떤 노드가 존재하고 클러스터에 어떤 리소스가 존재하는지와 같은 정보</li>
</ul>
</li>
<li><strong>kube-scheduler</strong> : 새로운 POD 생성을 감지하고, 실행시킬 워커 노드를 선택하는 역할</li>
<li><strong>kube-controller-manager</strong> : 디플로이먼트 같은 리소스 컨트롤러를 관리. API 서버를 통해 클러스터의 공유된 상태를 감지하고, 현재 상태를 원하는 상태로 이행하는 컨트롤 루프를 관리</li>
<li><strong>cloud-controller-manager</strong> : 클라우드 업체와 연동하여 로드 밸런서나 디스크 볼륨 같은 자원을 관리</li>
</ul>
</li>
</ul>
<p>이 컨트롤 플레인의 구성요소는 클러 스터 상태를 유지하고 제어하지만 애플리케이션을 실행시키지는 않는다.</p>
<br> 


<h3 id="노드">노드</h3>
<p><strong>워커 노드는</strong> 컨테이너화 된 <strong>애플리케이션을 실행</strong>하는 시스템이다.</p>
<ul>
<li><strong>kubelet</strong> : 각 노드에서 실행되는 에이전트, 컨테이너 런타임을 관리하고 상태를 모니터링, POD에서 컨테이너가 확실하게 동작하도록 관리</li>
<li>** kube-proxy** : 각 노드에서 실행되는 네트워크 프록시. Service 개념의 구현부. 서로 다른 노드에 있는 POD 간 통신이나 POD와 인터넷 사이의 네트워크 트래픽을 라우팅</li>
<li><strong>컨테이너 런타임</strong> : 테이너를 시작하고, 중지. 대표적으로 Docker</li>
</ul>
<br> 
<br> 
<br> 




<br> 
<br> 

<blockquote>
<p>출처</p>
</blockquote>
<ul>
<li><a href="http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&amp;mallGb=KOR&amp;barcode=9791161752242">책 - Kubernetes in action</a></li>
<li><a href="https://velog.io/@cclare/%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9D-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4">https://velog.io/@cclare/%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9D-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4</a></li>
<li><a href="https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/">https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/</a></li>
<li><a href="https://www.redhat.com/ko/topics/containers/whats-a-linux-container">https://www.redhat.com/ko/topics/containers/whats-a-linux-container</a></li>
<li><a href="https://tech.ssut.me/what-even-is-a-container/">https://tech.ssut.me/what-even-is-a-container/</a></li>
<li><a href="https://bcho.tistory.com/1256">https://bcho.tistory.com/1256</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSAP 절차]]></title>
            <link>https://velog.io/@ginee_park/CSAP-%EC%A0%88%EC%B0%A8</link>
            <guid>https://velog.io/@ginee_park/CSAP-%EC%A0%88%EC%B0%A8</guid>
            <pubDate>Sat, 20 Nov 2021 22:04:12 GMT</pubDate>
            <description><![CDATA[<h1 id="평가-종류">평가 종류</h1>
<hr>
<p>CSAP의 평가 종류는 다음과 같다.</p>
<ol>
<li><strong>최초평가</strong></li>
<li><strong>사후평가</strong></li>
<li><strong>갱신평가</strong></li>
</ol>
<p>사후 평가는 SaaS 간편은 2회, 나머지는 4회를 수행해야 한다.</p>
<p><strong>why? **
인증 종류마다 **유효기간이 상이</strong>하기 때문이다.
aaS, SaaS 표준(5년) &gt;&gt;&gt;&gt;&gt;&gt; SaaS 간편(3년)</p>
<p><img src="https://images.velog.io/images/ginee_park/post/fe8c7502-1249-41b1-9fa9-e9bf06fd3816/image.png" alt=""></p>
<p><br><br><br></p>
<h1 id="전반적인-절차">전반적인 절차</h1>
<hr>
<ul>
<li><strong>최초 평가</strong>를 기준으로한 절차이다.
1년 단위로 실시하는 사후 절차에서는 준비단계 없이 평가 단계로 넘어간다.</li>
<li>크게** 준비단계, 평가단계, 인증단계**로 구성되어 있다.
<img src="https://images.velog.io/images/ginee_park/post/6664c748-a791-4385-a93e-96950b677f89/Screen%20Shot%202021-11-21%20at%206.35.52%20AM.png" alt=""></li>
</ul>
<p><br><br><br></p>
<h1 id="세부-절차">세부 절차</h1>
<hr>
<h3 id="①-준비단계">① 준비단계</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/a76bde75-b17e-4eec-a6b7-c16259022cbc/Screen%20Shot%202021-11-21%20at%206.42.28%20AM.png" alt=""></p>
<ul>
<li>시스템 및 서비스 구축<ul>
<li>신청기관은 <strong>서비스 유형을 고려</strong>하여 클라우드 시스템 구축해야 한다.<ul>
<li>IaaS: 인프라 제공과 관련하여 구축</li>
<li>SaaS/PaaS: 보안인증을 받은 IaaS 사업자가 제공하는 가상환경 위에 구축 + 데이터 논리적으로 분리하여 구축</li>
<li>DaaS: 인프라 영역에 DaaS 필수 요소(가상PC OS, 가상화 관리 솔루션 등) 추가하여 구축</li>
<li>DaaS 필수 보안 sw인 백신, 망연계 솔루션, 유해사이트 차단 솔루션 등도 추가<br></li>
</ul>
</li>
</ul>
</li>
<li>사전 컨설팅<ul>
<li>원활한 평가 진행을 위해 평가, <strong>인증에 필요한 자료 구비 유무, 시스템 구축 및 운영 형태를 확인하여 컨설팅을 제공</strong>하는 것이다.<br></li>
</ul>
</li>
<li>평가/인증 신청 및 접수<ul>
<li>다음 서류를 준비하여 평가, 인증기관에 제출한다.
<img src="https://images.velog.io/images/ginee_park/post/fd4d4570-aa6f-4d01-9a51-435a653f9157/Screen%20Shot%202021-11-21%20at%206.50.45%20AM.png" alt=""></li>
</ul>
</li>
<li>평가/인증 계약 체결<ul>
<li>평가/인증 진행이 결정된 이후 <strong>평가 / 인증기간을 평가,  평가/인증 수수료 등을 협의</strong>하고 계약 체결한다.<br>

</li>
</ul>
</li>
</ul>
<h3 id="②-평가단계">② 평가단계</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/3a3c605c-b4f1-4e42-8330-6ea8d8c66b3a/image.png" alt=""></p>
<ul>
<li><p>서면 / 현장평가</p>
<ul>
<li>클라우드서비스가 보안 평가, 인증기준에 맞게 적절하게 구축, 운영되고 있는지 확인한다.</li>
</ul>
</li>
<li><p>취약점 점검</p>
<ul>
<li>평가팀은 평가, 인증 범위에 포함된 자산에 대해 <strong>점검도구, 수동점검, 인터뷰 등을 통해 취약점 점검</strong> 수행한다.</li>
</ul>
</li>
<li><p>모의침투테스트</p>
<ul>
<li><strong>신청기관 / 클라우드서비스 모델, 구축 유형 등을 고려</strong>하여 모의침투 계획 및 시나리오 수립 후 모의침투 수행한다.</li>
</ul>
</li>
<li><p>보완조치 요청</p>
<ul>
<li>평가팀은 종료회의를 통해 신청기관 담당자에게 결과 설명한다.</li>
<li><strong>보완조치요청서</strong>를 통해 부적합 사항 및 취약점에 대한 보완조치를 요청한다.</li>
</ul>
</li>
<li><p>보완조치 및 조치결과 제출</p>
<ul>
<li>신청기관은 보완조치 요청을 받은 날로부터 30일 이내 보완조치 완료하고 <strong>보완조치 내역서</strong>를 작성하여 제출한다.</li>
</ul>
</li>
<li><p>보완조치 확인(이행점검)</p>
<ul>
<li>평가팀장은 <strong>보완조치 내역서의 적절성</strong>을 판단한다.</li>
<li>이행 점검을 통해 <strong>실제 이행 여부를 현장에서 확인</strong>하여 보완조치 여부 판단한다.</li>
</ul>
</li>
</ul>
<h3 id="③-인증단계">③ 인증단계</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/46fb885f-c821-4b60-a711-02a18395225e/Screen%20Shot%202021-11-21%20at%206.43.16%20AM.png" alt=""></p>
<ul>
<li>인증위원회 개최<ul>
<li><strong>위원장</strong>은 인증위원회 심의의견을 취합하여 <strong>클라우드서비스 보안 평가 / 인증 심의 결과서</strong>를 작성한다.</li>
<li>인증위원회에서는 심의 결과에 따라 추가 보완조치를 요구할 수 있다.</li>
</ul>
</li>
<li>인증서 발급 및 취득<ul>
<li><strong>인증기관의 장</strong>은 인증위원회 <strong>심의 / 의결 결과를 신청기관에 통보</strong>한다.   </li>
<li><strong>인증기관의 장</strong>은 평가 / 인증기준에 적합한 경우 <strong>인증서 발급</strong>한다.</li>
<li>인증서 수령 후 보안인증 표시 사용할 수 있다.
<br><br><br></li>
</ul>
</li>
</ul>
<h1 id="사후관리-절차">사후관리 절차</h1>
<hr>
<h3 id="①-사후-평가">① 사후 평가</h3>
<ul>
<li>인증취득기관이 지속적으로 클라우드서비스 보안 평가 / 인증기준의 준수 여부를 확인하기 위해 <strong>인증 유효기관 중 매년 1회 이상 시행하는 평가 / 인증</strong>을 말한다.</li>
</ul>
<h3 id="②-갱신-평가">② 갱신 평가</h3>
<ul>
<li><strong>클라우드서비스 보안인증의 유효기간은 3~5년</strong>이며, 갱신평가는 인증 유효기관이 만료될 때 <strong>유효기간 연장을 목적</strong>으로 시행하는 평가 / 인증을 말한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSAP 란?
]]></title>
            <link>https://velog.io/@ginee_park/CSAP-%EB%9E%80</link>
            <guid>https://velog.io/@ginee_park/CSAP-%EB%9E%80</guid>
            <pubDate>Sat, 20 Nov 2021 20:51:23 GMT</pubDate>
            <description><![CDATA[<p>기업들은 법에 저촉되지 않기 위해, 기업 보안을 강화하기 위해(자발적 의지)등의 이유로
다양한 정보보호 컴플라이언스를 준수한다.</p>
<p>아래와 같이 인증제도는 각기 다양한 목적과 범위가 있고,
이번 시간은 <strong>한국의 클라우드 보안인증제인 CSAP</strong>에 대해서 알아보려고 한다!✨</p>
<p><img src="https://images.velog.io/images/gineepark/post/92b39e45-19a6-44bb-a55d-12bbe558a546/Screen%20Shot%202021-11-21%20at%204.41.20%20AM.png" alt=""><img src="https://images.velog.io/images/gineepark/post/b9e1ba42-65cb-447e-9f78-b23118320e01/Screen%20Shot%202021-11-21%20at%204.41.30%20AM.png" alt=""><img src="https://images.velog.io/images/gineepark/post/3baab383-c72b-4c0d-913d-c2ecf268da09/Screen%20Shot%202021-11-21%20at%204.41.42%20AM.png" alt=""></p>
<blockquote>
<p>출처 : <a href="https://www.nhn.com/ko/company/secureCertification.nhn">NHN</a></p>
</blockquote>
<p><br><br><br></p>
<h1 id="소개">소개</h1>
<hr>
<p>CSAP는 『클라우드컴퓨팅 발전 및 이용자 보호에 관한 법률』 제23조 2항에 따라</p>
<blockquote>
<ul>
<li>『클라우드컴퓨팅 법』 제23조 2항
과학기술정보통신부장관은 <strong>클라우드컴퓨팅서비스의 품질ㆍ성능에 관한 기준 및 정보보호에 관한 기준</strong>(관리적ㆍ물리적ㆍ기술적 보호조치를 포함한다)을 정하여 고시하고, 클라우드컴퓨팅서비스 제공자에게** 그 기준을 지킬 것을 권고**할 수 있다. </li>
</ul>
</blockquote>
<p>CSP의 정보보호 기준 준수여부 확인을 인증 기관에 요청하는 경우,
인증 기관이 이용자들이 안심하고 클라우드 서비스를 이용할 수 있도록 지원하는 제도입니다.</p>
<p>또한
⭐️** 공공기관에** 안전성 및 신뢰성이** 검증된 민간 클라우드 서비스 공급**을 하기 위한 목적을 갖고 있고,
⭐️ 객관적이고 공정한 클라우드 서비스 보안인증을 실시하여 이용자의 보안 우려를 해소하고,
⭐️ 클라우드 서비스 경쟁력 확보할 수 있습니다.</p>
<p><br><br><br></p>
<h1 id="인증-종류">인증 종류</h1>
<hr>
<p>CSAP의 인증 종류 (총 4가지)</p>
<ul>
<li>IaaS</li>
<li>DaaS</li>
<li>SaaS 표준등급</li>
<li>SaaS 간편등급</li>
</ul>
<br>

<p>아래 표와 같이 각 인증마다 <strong>인증항목 개수</strong>, <strong>유효기간</strong>이 상이하다.
<img src="https://images.velog.io/images/gineepark/post/4168b8e8-4e24-44e7-be15-e4140851a567/Screen%20Shot%202021-11-21%20at%205.14.49%20AM.png" alt="">
정리해보면</p>
<ul>
<li>인증항목 개수
IaaS(117개) &gt; DaaS(110개) &gt;&gt;&gt; SaaS 표준(78개) &gt;&gt;&gt; SaaS 간편(30개)</li>
<li>유효기간
IaaS, DaaS, SaaS 표준(5년) &gt;&gt;&gt;&gt;&gt;&gt; SaaS 간편(3년)</li>
</ul>
<p>한눈에도 IaaS 인증이 항목이 제일 많아서 빡세다는 것을 파악할 수 있다.
또한 SaaS 간편 인증 같은 경우 유효기간이 3년으로 짧다는 특징이 있다.</p>
<br>

<p>아래 표는 인증 종류별로 준수해야할 통제항목이다.
<img src="https://images.velog.io/images/gineepark/post/3fa3ab2f-0c45-444b-bdf6-6b45dbc5a7d5/Screen%20Shot%202021-11-21%20at%205.22.49%20AM.png" alt=""><img src="https://images.velog.io/images/gineepark/post/820f4da7-c644-48ca-bb80-6d7588af2438/Screen%20Shot%202021-11-21%20at%205.23.25%20AM.png" alt=""></p>
<p><br><br><br></p>
<h1 id="tip">Tip</h1>
<hr>
<p>어려운 써져있는 법령과 공식 문서를 읽으며 인증제도를 이해하는 것은 쉽지 않다.
입문자들은 어려운 문서를 읽기 전
기업에서 제공하고 있는 정보보호 인증 설명 문서를 읽어보는 것을 추천한다.
이 문서들은 기업들이 어떻게 인증제도를 준수하고 있는지 &quot;클라우드 서비스 이용자&quot;를 대상으로 설명하고 있기 때문에 읽기 편하다!</p>
<ul>
<li>네이버 클라우드
<a href="https://www.ncloud.com/certificate">https://www.ncloud.com/certificate</a></li>
<li>NHN
<a href="https://www.nhn.com/ko/company/secureCertification.nhn">https://www.nhn.com/ko/company/secureCertification.nhn</a></li>
<li>가비아
<a href="https://library.gabia.com/contents/infrahosting/7944/">https://library.gabia.com/contents/infrahosting/7944/</a></li>
</ul>
<p>CSP 3사(AWS, Azure, GCP)는 CSAP를 준수하고 있지 않기 때문에 위 목록에서 제외했다.
3사 또한 자신들이 준수하고 있는 컴플라이언스에 대해서 굉장히 자세하게 설명하고 있다.
개인적인 의견이지만 난 Azure 문서가 좋더라!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS VPC] 보안 그룹, 네트워크 ACL 비교]]></title>
            <link>https://velog.io/@ginee_park/AWS-VPC-%EB%B3%B4%EC%95%88-%EA%B7%B8%EB%A3%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-ACL-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@ginee_park/AWS-VPC-%EB%B3%B4%EC%95%88-%EA%B7%B8%EB%A3%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-ACL-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Wed, 10 Nov 2021 13:00:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>VPC로 네트워크를 구성하고 EC2를 띄웠다.</p>
<p>그런데 갑자기 <strong>SSH 연결이 안되는 이슈</strong>가 발생됐다.
인바운드 규칙을 봐야하는데
보안그룹..? NACL...? 어떤걸 봐야지?</p>
</blockquote>
<p>보안그룹과 NACL은 항상 헷갈렸던 개념이였다.
이번 기회로 2개의 VPC 방화벽 서비스에 대해서 정리해보려고 한다!
<br>
<br></p>
<h1 id="보안-그룹">보안 그룹</h1>
<hr>
<h3 id="보안-그룹-생성">보안 그룹 생성</h3>
<p>보안그룹은 <strong>인스턴스 레벨</strong>에서 운영한다. 
따라서 <strong>EC2</strong> &gt; 보안그룹
메뉴에서 보안그룹을 생성할 수 있다.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/a1cee40c-72a9-4f4d-9527-e48534569e89/image.png" alt="">
<img src="https://images.velog.io/images/ginee_park/post/8f266de9-5bf0-48c3-b800-acac41663e84/image.png" alt=""></p>
<ul>
<li>이름, 설명</li>
<li>VPC</li>
<li>인바운드, 아웃바운드 규칙</li>
</ul>
<p>를 입력하여 보안그룹을 생성할 수 있다.</p>
<h3 id="보안-그룹-규칙">보안 그룹 규칙</h3>
<ul>
<li><strong>기본적으로 보안 그룹은 모든 아웃바운드 트래픽(송신)을 허용</strong>한다.</li>
<li>보안그룹 규칙은 <strong>허용 규칙만 생성 가능</strong>하다.</li>
<li>거부 규칙은 생성 불가능하다.</li>
</ul>
<h3 id="예시">예시</h3>
<p>소스, 프로토콜, 포트 범위를 설정하여 구체적으로 트래픽 허용 규칙을 설정할 수 있다.
DB 서버의 보안그룹 ID를 주소로 입력하면 해당 DB에 대한 액세스 허용도 가능하다.
<img src="https://images.velog.io/images/ginee_park/post/683cf54e-3398-47c0-8303-97250dd4d84a/Screen%20Shot%202021-11-08%20at%202.02.59%20AM.png" alt=""></p>
<br>
<br><br>
<br>

<h1 id="네트워크-acl">네트워크 ACL</h1>
<hr>
<h3 id="네트워크-acl-생성">네트워크 ACL 생성</h3>
<p>네트워크 ACL은 <strong>서브넷 레벨</strong>에서 운영한다.
따라서 <strong>VPC</strong> &gt; 네트워크 ACL
메뉴에서 생성할 수 있다.
<img src="https://images.velog.io/images/ginee_park/post/2010514e-0518-4e4a-9706-f4e29a863944/image.png" alt="">
<img src="https://images.velog.io/images/ginee_park/post/f48a9b1d-ebf4-42b6-9b15-2cd25c8af9d7/image.png" alt=""></p>
<ul>
<li>이름</li>
<li>VPC</li>
</ul>
<p>을 입력하여 네트워크 ACL을 생성할 수 있다.</p>
<p>생성한 네트워크 ACL을 <strong>VPC에 있는 서브넷과 연결</strong>해야 한다.
만약 서브넷이 네트워크 ACL을 명시적으로 연결하지 않을 경우, <strong>기본 네트워크 ACL에 자동적으로 연결</strong>된다.</p>
<br>

<h3 id="네트워크-acl-규칙">네트워크 ACL 규칙</h3>
<ul>
<li>기본적으로 사용자가 생성한 네트워크 ACL은
규칙을 추가하기 전에는 <strong>모든 인바운드 및 아웃바운드 트래픽을 거부</strong>한다.</li>
<li>각 규칙에는 <strong>규칙 번호</strong>가 매겨지고,
가장 <strong>낮은 번호가 지정된 규칙부터 시작</strong>하여 <strong>트래픽이</strong> 네트워크 ACL과 연결된 <strong>서브넷의 내부 또는 외부로 전달</strong>되도록 허용되는지 결정된다. </li>
<li>규칙에 사용할 수 있는 가장 높은 번호는 32766이다. 
나중에 필요한 곳에 새 규칙을 삽입할 수 있도록, <strong>처음 시작할 때는 증분 방식으로</strong>(예: 10 또는 100 단위씩 증분) 규칙을 생성하는 것을 추천한다.</li>
<li>보안 그룹과와 달리 <strong>허용/거부 여부를 설정</strong>할 수 있다.</li>
</ul>
<h3 id="예시-1">예시</h3>
<p>다음 규칙</p>
<ul>
<li>인바운드 규칙
<img src="https://images.velog.io/images/ginee_park/post/4c503d54-c479-40e9-98ee-8b33bbed9431/image.png" alt=""></li>
<li>아웃바운드 규칙
<img src="https://images.velog.io/images/ginee_park/post/fbd99896-ea0e-4dc5-b4a2-3ca598dc2125/image.png" alt=""></li>
</ul>
<br>
<br>

<blockquote>
<p>참고 레퍼런스
<a href="https://www.youtube.com/watch?v=uZssEvTg79s">https://www.youtube.com/watch?v=uZssEvTg79s</a>
<a href="https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup">https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup</a>
<a href="https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/vpc-network-acls.html">https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/vpc-network-acls.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS : Glue란]]></title>
            <link>https://velog.io/@ginee_park/AWS-Glue%EB%9E%80</link>
            <guid>https://velog.io/@ginee_park/AWS-Glue%EB%9E%80</guid>
            <pubDate>Tue, 06 Jul 2021 11:59:37 GMT</pubDate>
            <description><![CDATA[<h1 id="glue-개념">Glue 개념</h1>
<p><img src="https://images.velog.io/images/ginee_park/post/1ab42d49-1772-41f8-a35f-4b62b8426bf0/image.png" alt=""></p>
<ul>
<li><strong>Data Store</strong>의 경우</li>
<li><em>크롤러를 정의하여 메타데이터 테이블 정의로 AWS Glue Data Catalog*</em>를 채운다.
크롤러를 데이터 스토어로 지정하면 <strong>크롤러는 데이터 카탈로그에 테이블 정의를 생성</strong>한다. 
테이블 정의에 관련해
AWS Glue Data Catalog는 다른 필수 메타데이터를 포함하여 ETL 작업을 정의한다.</li>
<li><strong>스크립트를 생성하여 데이터를 변환</strong>(Transform)할 수 있다.
스크립트를 AWS Glue 콘솔이나 API에 제공한다.</li>
</ul>
<p><strong>AWS Glue는 완전 관리형 ETL(추출, 변환 및 로드) 서비스</strong>로, 간단하게 여러 데이터 스토어 및 스트림 간에 원하는 데이터를 분류, 정리, 보강, 이동한다.</p>
<p>AWS Glue는 <strong>서버리스</strong>이므로 설정하거나 관리할 인프라가 없다.
<br> <br> <br> </p>
<h1 id="glue-관련-용어">Glue 관련 용어</h1>
<h4 id="data-store">data store</h4>
<p>데이터를 지속적으로 저장하기 위한 저장소(Amazon S3 버킷 및 관계형 데이터베이스)</p>
<h4 id="data-store-1">data store</h4>
<p>프로세스 또는 변환에 대한 <strong>입력(input)</strong>으로 사용되는 데이터 저장소</p>
<h4 id="data-target">data target</h4>
<p>프로세스 또는 변환이 쓰는(write) 데이터 저장소</p>
<h4 id="크롤러crawle">크롤러(Crawle)</h4>
<p>데이터 스토어(소스 또는 대상)에 연결하는 프로그램은 Classifier의 우선 순위 지정 목록을 통해 데이터의 스키마를 결정한 다음 AWS Glue Data Catalog에 메타데이터 테이블을 생성한다.</p>
<h4 id="분류자classifier">분류자(Classifier)</h4>
<p>데이터 스키마를 결정
일반 파일 형식(CSV, JSON, AVRO, XML 등)에 대한 분류자(Classifier)</p>
<h4 id="glue-data-catalog">Glue Data Catalog</h4>
<p>Glue의 영구적 메타데이터 스토어
테이블 정의, 작업 정의 및 기타 관리 정보를 포함하여 AWS Glue 환경을 관리합니다. </p>
<h4 id="job">Job</h4>
<p>ETL 작업을 수행하는 데 필요한 비즈니스 로직
변환 스크립트(Trasform Script), data sources, and data targets으로 구성</p>
<h4 id="script">Script</h4>
<p>소스에서 데이터를 추출하고 변환하여 대상에 로드하는 코드
PySpark or Scala</p>
<h4 id="table">Table</h4>
<p><Br><Br></p>
<h1 id="glue는-언제-사용하죠">Glue는 언제 사용하죠?</h1>
<p>AWS Glue를 사용하여 <strong>데이터 웨어하우스 또는 데이터 레이크</strong>의 스토리지를 <strong>조직</strong>하고 <strong>정리</strong>하고 <strong>인증</strong>한다.</p>
<ul>
<li>AWS 클라우드 데이터를 데이터 스토어로 변환하고 이동할 수 있다.</li>
<li>정기 보고 및 분석을 위해 데이터를 개별 정적 또는 스트리밍 데이터 원본에서 데이터 웨어하우스 또는 데이터 레이크로 <strong>로드</strong>할 수 있다.</li>
<li>데이터 웨어하우스 또는 데이터 레이크에 데이터를 <strong>저장</strong>하면 비즈니스의 여러 다른 부분에서 비롯된 정보를 통합하고 의사 결정을 위한 일반 소스를 제공할 수 있다.<br>



</li>
</ul>
<h1 id="참고할-자습서">참고할 자습서</h1>
<ol>
<li>aws 공식 홈페이지에 제공하는 Glue 실습
<a href="https://docs.aws.amazon.com/ko_kr/glue/latest/ug/tutorial-create-job.html">https://docs.aws.amazon.com/ko_kr/glue/latest/ug/tutorial-create-job.html</a></li>
</ol>
<p><br> <br> <br> <br> <br> <br> </p>
<blockquote>
<p><strong>참고 자료</strong></p>
</blockquote>
<ul>
<li><a href="https://docs.aws.amazon.com/ko_kr/glue/latest/dg/what-is-glue.html">https://docs.aws.amazon.com/ko_kr/glue/latest/dg/what-is-glue.html</a></li>
<li><a href="https://www.youtube.com/watch?v=LkkgtNtuEoU">https://www.youtube.com/watch?v=LkkgtNtuEoU</a></li>
<li><a href="https://docs.aws.amazon.com/ko_kr/glue/latest/dg/components-key-concepts.html">https://docs.aws.amazon.com/ko_kr/glue/latest/dg/components-key-concepts.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[IaaS: 오픈스택(OpenStack)]]></title>
            <link>https://velog.io/@ginee_park/IaaS-%EC%98%A4%ED%94%88%EC%8A%A4%ED%83%9DOpenStack-0b90mh99</link>
            <guid>https://velog.io/@ginee_park/IaaS-%EC%98%A4%ED%94%88%EC%8A%A4%ED%83%9DOpenStack-0b90mh99</guid>
            <pubDate>Sun, 04 Jul 2021 14:56:42 GMT</pubDate>
            <description><![CDATA[<h1 id="클라우드-os-오픈스택">클라우드 OS, 오픈스택</h1>
<hr>
<h3 id="운영체제-3대-구성-요소">운영체제 3대 구성 요소</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/318e6de3-d24c-4a89-8956-1a906198c961/image.png" alt="">
<strong>1. Scheduler</strong>
프로세스를 실행시키기 위한 모든 자원을 관리</p>
<p><strong>2. API</strong>
어플리케이션 개발할 때 쓰는 함수</p>
<p><strong>3. File System</strong>
디스크에 저장된 실행 파일을 메모리에 올려 실행가능한 프로세스 심볼로 바꿈
<br><br></p>
<h3 id="오픈스택클라우드-os-내부-구조">오픈스택(클라우드 OS) 내부 구조</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/024fe64f-dd0d-4a0c-8cf1-90ea9ec90668/image.png" alt="">오픈스택은 <strong>VM을 실행/관리하기 위한 운영체제</strong>이다.
 <br><br><br></p>
<h1 id="오픈-스택-내부-구조-분석">오픈 스택 내부 구조 분석</h1>
<hr>
<h3 id="주요프로젝트">주요프로젝트</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/43f328e9-1936-48bd-8878-0ac1967f58e7/image.png" alt=""></p>
<ol>
<li>NOVA</li>
<li>NEUTRON</li>
<li>SWIFT</li>
<li>GLANCE</li>
<li>KEYSTONE</li>
<li>CINDER<br>

</li>
</ol>
<h3 id="1-nova">1. NOVA</h3>
<ul>
<li>오픈스택의 전체적인 VM인스턴스를 스케줄링하는 <strong>&quot;스케줄러&quot;</strong>역할을 한다.</li>
<li>컴퓨터 자원의 풀을 관리하고 자동화 하도록 설계되어 있다. </li>
<li>여러 가상화 기술들과 함께 동적할 수 있음.<ul>
<li>하이퍼바이저로 KVM, VMware, Xen 중 선택 가능하다</li>
<li>리눅스 컨테이너 사용가능</li>
</ul>
</li>
<li>기존 레거시 시스템들과 써드파티 기술들과 연동하는 기능을 제공한다.</li>
<li>기업으로 확산되면서 오픈스택의 성능을 모니터링하는 것이 매우 중요해진다.<ul>
<li>특히 Nova 성능을 모니터링하는 것이 매우 중요함<br> 
### 2. Neutron</li>
</ul>
</li>
<li>오픈스택의 <strong>게이트웨이/스위치</strong> 역할을 한다.</li>
<li>네트워크와 IP 주소들을 관리한다.</li>
<li>사용자는 자신의 네트워크를 만들고 트래픽을 통제하며 서버와 장치들을 하나 이상의 네트워크에 연결할 수 있다.</li>
<li>관리자들은 OpenFlowdhk SDN 기술을 이용하여 높은 수준의 멀티 테넌시와 막중한 규모를 지원할 수 있다.</li>
<li>침입탐지시스템, 부하 분산, 방화벽, VPN과 같은 추가 서비스들을 배치, 관리할 수 있는 확장 프레임워크를 제공한다.<br> 
### 3. Cinder</li>
<li>오픈스택의 <strong>하드 디스크(볼륨 스토리지)</strong> 역할을 한다.</li>
<li>오픈스택의 인스턴스에서 사용할 블록 스토리지 장치를 제공한다.</li>
<li>스냅샷 관리를 통해 블록 스토리지 볼륨에 저장된 데이터를 백업하는 기능도 있다.<br> 

</li>
</ul>
<h3 id="4-swift">4. Swift</h3>
<p>각종 스토리지 노드들을 관리한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IaaS: 리눅스 컨테이너 기술 분석]]></title>
            <link>https://velog.io/@ginee_park/IaaS-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B8%B0%EC%88%A0-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@ginee_park/IaaS-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B8%B0%EC%88%A0-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Thu, 01 Jul 2021 06:19:08 GMT</pubDate>
            <description><![CDATA[<h1 id="하이퍼바이저-vs-리눅스-컨테이너">하이퍼바이저 VS 리눅스 컨테이너</h1>
<hr>
<p> <img src="https://images.velog.io/images/ginee_park/post/d7ad1b66-dfeb-4d90-84bf-7aca40843e39/image.png" alt=""></p>
<h3 id="하이퍼바이저">하이퍼바이저</h3>
<ul>
<li><strong>하나의 물리적인 서버</strong>에 여러개의 운영체제를 독립적으로 동시에 실행가능하도록 도와줌</li>
<li><strong>서버 전체</strong>를 가상화할 때 유리</li>
<li>어플리케이션을 실행할때 걸리는 <strong>부담이 큼</strong></li>
</ul>
<h3 id="리눅스-컨테이너">리눅스 컨테이너</h3>
<ul>
<li><strong>하나의 운영체제</strong>에 여러개의 컨테이너를 실행 가능하도록 도와줌</li>
<li>어플리케이션을 실행할때 걸리는 부담이 작음(<strong>가볍고 빠르다</strong>)</li>
<li>하나의 운영체제에 컨테이너 여러대를 두는 것이기 때문에 <strong>컨테이너에 올라가는 어플리케이션은 동일한 운영체제용</strong>(리눅스 기반) 어플리케이션이여야 한다.(종속적이라는 단점)</li>
</ul>
<br>

<p>서비스를 제공하는 입장에서는
하나의 서버가 여러개의 서버가 있는 것 같은 기능이 있는 것이 유리하다!(가용성)
이때 사용되는 기술이 <strong>하이퍼바이저</strong>이다.</p>
<p>이번 시간엔 하나의 운영체제에서 서로 다른 어플리케이션 환경을 격리시킬 수 있는 <strong>리눅스 컨테이너</strong>에 대해 알아본다.
<br><br><br></p>
<h1 id="os-가상화에서-app가상화로">OS 가상화에서 App가상화로</h1>
<hr>
<p><img src="https://images.velog.io/images/ginee_park/post/f2d18ac8-b452-42f7-82d6-347ae4f8d6df/image.png" alt=""></p>
<ul>
<li><p><strong>OS 전체</strong>를 가상화 하면 어플리케이션까지 가는 소프트웨어 스택 레이어가 굉장히 많아져서 <strong>무겁고 느리다</strong>.</p>
</li>
<li><p><strong>OS의 일부</strong>를 가상화하는 KVM, Xen 등이 있다.
이들은 OS일부를 가상화하지만(가벼워짐), 전체를 가상화하는 효과를 주기 때문에 클라우드 컴퓨팅에 기반이되었다.(openstack 등)</p>
</li>
<li><p>여기서 한단계 더 나아가
어짜피 클라우드 컴퓨팅은 거의 리눅스를 쓰니 리눅스 기반에 위에올라가는 App의 커널기술들과 기능들을 직접적으로 지원받을 수 있도록 한 것이 컨테이너이다.
컨테이너는 앱가상화, 즉 프로세스를 격리켜서 더 빠르고 가볍게 운영할 수 있다.</p>
</li>
<li><p>이와같이 최근에는 어플리케이션 가상화로 옮겨가는 중이다.
<br><br><br></p>
</li>
</ul>
<h1 id="리눅스-컨테이너-1">리눅스 컨테이너</h1>
<hr>
<h3 id="왜-요즘-뜨는-기술인가">왜 요즘 뜨는 기술인가?</h3>
<p><strong>리눅스 커널 레벨</strong>에서 컨테이너 기능을 지원하기 시작했기 때문이다.</p>
<p>커널 모드에서 작동한다는건?
운영체제에 <strong>프리빌리지드 모드</strong>라는 것이 있다.</p>
<p>일반 어플리케이션이 실행될 때 : 유저모드
커널이 실행될 때 : 프리빌리지드 모드(특권모드)</p>
<p>프리빌리지 모드로 실행하면 일반 유저모드에서는 접근할 수 없는 특정 메모리에 접근가능하다.</p>
<h3 id="cgroups">Cgroups</h3>
<p>컨테이너에 사용할 자원들이 할당되는 기능</p>
<h3 id="name-spaces">Name Spaces</h3>
<p>컨테이너를 다른 컨테이너와 완전히 분리시키는 isolation 기능</p>
<h3 id="왜-isolation이-중요할까">왜 Isolation이 중요할까?</h3>
<p>시스템 커널에서 문제가 생기면 시스템이 다운된다.
리눅스 컨테이너는 커널 서비스를 제공받기 때문에 컨테이너가 잘못되면 시스템이 영향을 받을 수 있다. 
때문에 해당되는 영역, 자원을 &quot;격리&quot;시켜주는 것이 가장 중요하다.</p>
<p>이 격리를 지원해주는 것이 Name Spaces이다.</p>
<p><br><br><br></p>
<h1 id="lxc--docker">LXC &amp; Docker</h1>
<hr>
<h3 id="lxc">LXC</h3>
<p>컨테이너를 관리하는 명령어 툴</p>
<h3 id="lxd">LXD</h3>
<p>LXC를 보다 더 편리하게 관리하는 일종의 manager</p>
<ul>
<li>LXC는 무조건 프리빌리지 컨테이너만 제공하는데, 보안을 위해 언프리빌리지 모드가 필요할때가 있다. LXD는 언프리빌리지 모드를 제공한다.</li>
<li>각각의 리소스를 보다 더 편리하게 관리한다.</li>
</ul>
<h3 id="docker">Docker</h3>
<ul>
<li>도커는 이미지 기반이다.</li>
<li>이미지는 컨테이너 실행에 필요한 파일과 설정 값등을 고정화 시킨 것(변경할 수 없음)</li>
<li>컨테이너에서 추가되고 변경된 값들은 컨테이너에 저장</li>
<li>컨테이너가 삭제되더라도 이미지는 그대로<br>

</li>
</ul>
<h3 id="lxc-vs-docker">LXC vs Docker</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/6744c824-3b2d-4c81-91d2-3dfcd5ec4473/image.png" alt="">
LXC는 하나의 컨테이너에 여러가지 App을 넣을 수 있지만.
도커는 하나의 컨테이너에 하나의 App만 가능!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IaaS: 가상화 인프라 분석]]></title>
            <link>https://velog.io/@ginee_park/IaaS-%EA%B0%80%EC%83%81%ED%99%94-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@ginee_park/IaaS-%EA%B0%80%EC%83%81%ED%99%94-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Wed, 30 Jun 2021 18:32:22 GMT</pubDate>
            <description><![CDATA[<h1 id="가상화-기술-분석">가상화 기술 분석</h1>
<h3 id="가상화-가능한-분야">가상화 가능한 분야</h3>
<ol>
<li>데이터 가상화</li>
<li>네트워크 기능 가상화 : NFV</li>
<li>서버 가상화 : 하이퍼 바이저</li>
<li>운영체제 가상화 : 컨테이너</li>
</ol>
<br>

<h3 id="가상화-기술">가상화 기술</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/e3f04f01-3ce9-4742-b879-1c34521cb674/image.png" alt=""></p>
<ul>
<li><p><strong>가상머신</strong> : 
물리적 하드웨어 시스템에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 스토리지를 갖추고 가상 컴퓨터 시스템으로 작동하는 가상 환경입니다. </p>
</li>
<li><p><strong>하이퍼 바이저</strong> :  가상 머신(Virtual Machine, VM)을 생성하고 구동하는 소프트웨어 </p>
</li>
</ul>
<p><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[아파치 카프카 - 이론]]></title>
            <link>https://velog.io/@ginee_park/%EC%95%84%ED%8C%8C%EC%B9%98-%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%9D%B4%EB%A1%A0</link>
            <guid>https://velog.io/@ginee_park/%EC%95%84%ED%8C%8C%EC%B9%98-%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%9D%B4%EB%A1%A0</guid>
            <pubDate>Tue, 29 Jun 2021 19:09:41 GMT</pubDate>
            <description><![CDATA[<h1 id="카프카란">카프카란?</h1>
<hr>
<p><img src="https://images.velog.io/images/ginee_park/post/9529ca61-90df-4a02-8465-8136a29137ce/image.png" alt=""></p>
<p>아파치 카프카는 <strong>링크드인</strong>에서 처음 개발되었고, <strong>대용량, 대규모 메시지 데이터를 빠르게 처리하도록 개발된 메시징 플랫폼</strong>이다.
데이터 파이프라인을 구축할 때 가장 많이 고려되는 시스템 중 하나이다.</p>
<p>Netflix, Airbnb, 카카오, 네이버 등의 주요 기업들에서 사용하고 있다.</p>
<p><br><br><br></p>
<h1 id="카프카의-탄생-배경">카프카의 탄생 배경</h1>
<hr>
<p>카프카의 탄생배경을 알면 카프카를 한번에 이해할 수 있다.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/ac2526d9-fe29-4bc2-8d00-7dbc95263b53/image.png" alt="">
위 그림은 카프카가 개발되기 전 링크드인의 과거 데이터 시스템 구성도이다.
자세히 보지 않더라도 복잡해 보인다.</p>
<p>수년간 이러한 구조가 무분별한 확산되어 어려움을 겪은 후
2010년 데이터 스트림 모델링에 초점을 맞춘 시스템 구축을 위해 카프카 프로젝트가 시작된다.
<br></p>
<p><img src="https://images.velog.io/images/ginee_park/post/a2a32d6d-b3d1-4e8d-a552-dec04b54a72b/image.png" alt=""></p>
<p>위 그림은 카프카를 이용한 링크드인의 데이터 처리 시스템이다.</p>
<p>카프카를 적용한 결과, 서비스 아키텍처가 예전과는 비교할 수 없을정도로 깔끔해진 것을 확인할 수 있다.</p>
<p>사내에서 발생하는 <strong>모든 이벤트/데이터 흐름을 중앙에서 관리</strong>하고 있다.</p>
<p>이와같이 새로운 데이터 처리 시스템에서는, 링크드인 사용자가 프로필을 업데이트하면이 정보가 바로 카프카로 전달된다.</p>
<p>카프카의 도입과 함께 링크드인은 놀랄만한 규모로 성장했고, 오늘날 약 1조개 이상의 메세지를 하루에 처리하고 있다.</p>
<p><br><br><br></p>
<h1 id="카프카의-동작-방식">카프카의 동작 방식</h1>
<hr>
<h3 id="메세징-시스템">메세징 시스템</h3>
<p>카프카는 기본적으로 <strong>메세징 서버</strong>로 동작한다.
따라서 카프카의 동작 방식을 알기 위해서는 메세징 시스템에 대한 이해가 필요하다.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/d4c7d4d5-2fec-4cbb-b5f6-a0973664dff9/image.png" alt=""></p>
<p>하나 이상의 데이터 소스로부터 데이터를 받는 애플리케이션을 떠올려보자.
이 경우 <strong>메세징 시스템</strong>은 서로 다른 프로그램끼리 정보를 교환하기 위한 <strong>통합 채널</strong>로 활용이 가능하다.</p>
<p>애플리케이션메세징 시스템을 설계하는 경우 유념해야 할 원칙이 있다.</p>
<ol>
<li><p><strong>느슨한 경계</strong>
어느쪽에서 변경사항이 생기더라도 다른 프로그램에서는 영향을 받지 않아야한다. 상호간에 의존성을 최소화 해야한다는  것이다.</p>
</li>
<li><p><strong>공용 인터페이스 정의</strong>
애플리케이션 간에 데이터 교환을 위해 공용으로 규정된 데이터 형식을 보장한다.</p>
</li>
<li><p><strong>응답 속도</strong>
메세지 전송 -&gt; 수신에 소요되는 시간
심각한 지연은 메세지 손실을 발생시킬 수 있다.</p>
</li>
<li><p><strong>신뢰성</strong>
일시적인 가용성 문제가 발생해도 정보를 교환하는 관련 애플리케이션에 영향을 주지 않는 것을 말한다.</p>
</li>
</ol>
<br>

<h3 id="publishsubscribe-펍섭-시스템">Publish/Subscribe (펍/섭) 시스템</h3>
<p><strong>메세지</strong>라고 불리는 데이터 단위를 <strong>Publisher</strong>(보내는측)에서
카프카에 <strong>토픽</strong>이라고 불리는 데이터 저장소에 저장하면,
<strong>Subscriber</strong>(가져가는 측)이 원하는 토픽에서 데이터를 가져갑니다.</p>
<p><img src="https://images.velog.io/images/ginee_park/post/1973143c-1532-4ae4-8d4a-f4215499f848/image.png" alt="">
<strong>중앙에 메세징 시스템 서버</strong>(카프카)를 두고 <strong>메세지를 보내고(publish) 받는(subscribe) 형태</strong>의 통신을 펍/섭 모델이라고 한다.</p>
<p><a href="https://yongdev.tistory.com/149">펍/섭 시스템을 쉽게 설명한 블로그 게시물! </a></p>
<br>

<h3 id="멀티-프로듀서-멀티-컨슈머">멀티 프로듀서, 멀티 컨슈머</h3>
<p>카프카는 하나의 토픽에 여러 프로듀서 혹은 컨슈머들이 접근 가능한 구조이다.
<img src="https://images.velog.io/images/ginee_park/post/39d6f7fd-f9b4-43e9-becc-6b400588bf79/image.png" alt=""></p>
<p><br><br><br></p>
<h1 id="카프카의-구조">카프카의 구조</h1>
<h3 id="데이터-모델">데이터 모델</h3>
<ul>
<li><strong>토픽</strong> : 메세지를 받을 수 있도록 논리적으로 묶은 개념</li>
<li><strong>파티션</strong> : 토픽을 구성하는 데이터 저장소, 수평 확장이 가능한 단위<br>

</li>
</ul>
<h3 id="카프카-논리적-구조">카프카 논리적 구조</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/17990436-acdf-4ad8-bfaf-19e4df8c7e6a/image.png" alt=""></p>
<ul>
<li><p>토픽의 모든 메세지는 바이트의 집합(배열)이다.</p>
</li>
<li><p><strong>프로듀서는</strong> 
카프카 큐에 정보를 저장, 로그 선행 기입 파일 마지막에 메세지를 추가한다.</p>
</li>
<li><p><strong>컨슈머는</strong>
토픽 파티션에 있는 로그 파일에서 메세지를 가져온다.</p>
</li>
<li><p><strong>카프카 클러스터</strong>는 기본적으로 하나이상의 서버 노드(node)로 구성된다.
<br><br></p>
</li>
</ul>
<h3 id="카프카-물리적-구조">카프카 물리적 구조</h3>
<p><img src="https://images.velog.io/images/ginee_park/post/483c08bb-61f2-45c9-b02c-84fa4975fbc4/image.png" alt=""></p>
<ul>
<li><p>위 그림은 노드로 구성된 카프카 클러스터이다.</p>
</li>
<li><p>카프카 클러스터는 <strong>다중 브로커</strong>로  구성된다.
각 브로커는 stateless하지만 주키퍼를 사용해 상태 정보를 유지한다.</p>
</li>
<li><p>토픽 파티션에는 <strong>리더</strong> 브로커가 하나씩 있고, 0개 이상의 팔로워가 있다.
리더는 해당하는 파티션의 읽기, 쓰기 요청을 관리한다.</p>
</li>
</ul>
<h3 id="참고-링크">참고 링크</h3>
<ul>
<li><a href="https://www.confluent.io/blog/event-streaming-platform-1/">https://www.confluent.io/blog/event-streaming-platform-1/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[IaaS: 하드웨어 인프라 분석]]></title>
            <link>https://velog.io/@ginee_park/IaaS-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@ginee_park/IaaS-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sat, 26 Jun 2021 11:31:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ginee_park/post/e606d636-19f1-42f3-a9b3-5ad35d8d5711/image.png" alt=""></p>
<h1 id="하드웨어-인프라-분석">하드웨어 인프라 분석</h1>
<hr>
<h3 id="하드웨어-인프라-범위">하드웨어 인프라 범위</h3>
<ol>
<li><p>Compute
연산을 하는 서버</p>
</li>
<li><p>Block Storage
스토리지를 제공하는 서버</p>
</li>
<li><p>Network
네트워크 기능을 제공하는 서버</p>
</li>
</ol>
<p>3가지 종류의 서버들을 클라우드 컴퓨팅 인프라라고 한다
<strong>데이터 센터</strong>에서 위 서버를 제공, 관리 한다.
<br></p>
<h3 id="데이터-센터-구성-요소">데이터 센터 구성 요소</h3>
<ol>
<li>데이터 센터(건물)</li>
<li>서버 랙</li>
<li>서버(하드웨어)</li>
</ol>
<blockquote>
<p>데이터 센터의 오픈소스, <strong>OCP</strong>
최근에 facebook부터 시작해 데이터 센터를 오픈소스화 하자는 운동이 일어나고 있다.</p>
</blockquote>
<p><br><br><br></p>
<h1 id="서버-내부-구조">서버 내부 구조</h1>
<hr>
<h3 id="서버-구성요소">서버 구성요소</h3>
<ul>
<li>HDD, SSD</li>
<li>이더넷 포트 (네트워크 단자들)</li>
<li>전원 단자</li>
<li>팬</li>
<li><strong>CPU 2개</strong>
  1) intel cpu
  3) <strong>BMC</strong> (서버 원격 관리)</li>
<li>마더보드 </li>
</ul>
<br>

<h3 id="서버-원격-관리-bmc">서버 원격 관리, BMC</h3>
<p>Baseboard Management Controller
서버에 os가 부팅되기도 전에
<strong>서버의 온도상태, fan상태, 혹은 os자체를 업그레이드</strong>하는 등을 담당한다.</p>
<p>이것을 원격으로 관리하려면 당연히 이더넷 포트가 있어야한다.
서버 뒷편에 <strong>IPMI</strong>(intel이 만든 원격관리를 위한 프로토콜)라는 원격관리 전용 이더넷 포트가 있다.  </p>
<p>이 포트를 통해서 BMC기능을 하고 있는 ARM cpu칩에 접속하여 관리하고, 여기에 올라가는 운영체제도 임베디드 리눅스라고 불리는 리눅스이다.</p>
<p>클라우드 컴퓨팅 시대에는 서버에 컴퓨터가 워낙에 많다.
사람이 수동적으로 관리할 수 있는 범위를 벗어나기 때문에
프로그래밍을 통해서 자동화해야한다.</p>
<p>하지만 안타깝게도 BMC 소프트웨어를 전세계에서 다루는 기업이 몇군데 없기 때문에 10년전과 비교했을 때 크게 바뀐 것이 없다.</p>
<p><br><br><br><br></p>
<blockquote>
<p>CCCR 강의를 참고해 작성한 게시물 입니다.
<a href="https://www.cccr-edu.or.kr/classroom/index.jsp?cuid=1498823">https://www.cccr-edu.or.kr/classroom/index.jsp?cuid=1498823</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 파이프라인 구축 - 이론]]></title>
            <link>https://velog.io/@ginee_park/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95-%EC%9D%B4%EB%A1%A0</link>
            <guid>https://velog.io/@ginee_park/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95-%EC%9D%B4%EB%A1%A0</guid>
            <pubDate>Tue, 22 Jun 2021 10:02:18 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-파이프라인이란">데이터 파이프라인이란?</h2>
<hr>
<p><img src="https://images.velog.io/images/ginee_park/post/f811aacd-a5c1-4f4b-948e-93f190418a2f/image.png" alt=""></p>
<h4 id="한마디로">한마디로</h4>
<p><strong>언제든지 필요한 데이터를 가져와 꺼내 쓸 수 있도록 데이터를 계속 쌓아두는 파이프를 만드는 것</strong>이라고 보면된다.
<br></p>
<h4 id="데이터-파이프라인-사용-예시">데이터 파이프라인 사용 예시</h4>
<p>파이프를 한 번 만들고 나면(배수관 파이프를 생각해보자, 여기서 데이터는 배수관 안으로 흐르는 물이라고 생각하면 된다) 큰 문제가 없는 한 데이터가 계속 들어와 쌓일 것이다.</p>
<p>어떻게 해야 적은 수고를 들이고 효율적으로 필요한 데이터를 모을 수 있을까?
데이터를 가져오는 과정에서 정제나 전처리가 쉽도록, 데이터 형태도 고쳐주고 필요없는 데이터는 제거하고 함께 보는게 좋은 데이터들은 합쳐서 저장하면 좋을 것 같다. </p>
<p>이러한 목적으로 만드는 것이 데이터 파이프라인이라고 보면 된다.</p>
<br>

<h4 id="데이터-파이프라인이-하는-일">데이터 파이프라인이 하는 일</h4>
<p><img src="https://images.velog.io/images/ginee_park/post/af1c2a83-52f2-42d5-acfd-10df8dd07828/image.png" alt=""></p>
<ul>
<li>Data extracting: 데이터 <strong>추출</strong></li>
<li>Data transforming: 데이터 <strong>변경</strong></li>
<li>Data combining: 데이터 <strong>결합</strong></li>
<li>Data validating: 데이터 <strong>검증</strong></li>
<li>Data loading: 데이터 <strong>적재</strong><blockquote>
<p>이 중 <strong>데이터 추출, 변환, 적재를 묶어 ETL</strong>이라고 한다.
ETL은 데이터 파이프라인 하위 개념으로, 하나의 시스템에서 데이터를 추출해 변환하여 데이터 베이스 or 데이터 웨어하우스에 차곡차곡 쌓아둔다.</p>
</blockquote>
</li>
</ul>
<p><br><br><br><br></p>
<h2 id="데이터-파이프라인-구축을-위해서-무엇이-필요한가">데이터 파이프라인 구축을 위해서 무엇이 필요한가?</h2>
<hr>
<h4 id="1-분산-처리-프레임워크">1) 분산 처리 프레임워크</h4>
<ul>
<li>Hadoop, Spark</li>
<li>대규모의 데이터 셋을 효율적으로 처리하기 위해 사용한다.
하나의 대형 컴퓨터를 사용해서 데이터를 처리&amp;저장 하는 대신에,
분산 처리 프레임워크를 사용하면 상용 하드웨어를 함께 클러스터링하여 <strong>대량의 데이터 세트를 병렬로 분석</strong>할 수 있다.<br>

</li>
</ul>
<h4 id="2-데이터-레이크">2) 데이터 레이크</h4>
<ul>
<li>S3, HDFS</li>
<li>모든 데이터를 그대로 저장하고, 나중에 필요한 것만 꺼내서 사용하는 스토리지<br>

</li>
</ul>
<h4 id="3-workflow-관리시스템">3) Workflow 관리시스템</h4>
<ul>
<li>Airflow, Oozie, Dagster, Argo</li>
<li><strong>여러가지 태스크들</strong>(데이터셋 생성, 모델 학습 등)<strong>을 일련의 그래프로 연결하고</strong> 스케줄링, 모니터링 등 <strong>파이프라인을 관리</strong>할 수 있다.<blockquote>
<p>Airflow에서 사용하는 <strong>DAG</strong>이란?
Directed Acyclic Graph, 즉 방향이 있지만 순환하지는 않는 그래프이다. <br>
라면 끓이는 work flow를 생각해보면
물끓이기 -&gt; 스프 넣기 -&gt; 면 넣기 -&gt; 계란 넣기
task마다 방향은 있지만 다시 자기 자신으로는 돌아오지 않는다.
순환하지 않는 이러한 그래프를 코드로 나타낸다.</p>
</blockquote>
</li>
</ul>
<br>

<h4 id="4-데이터-웨어하우스">4) 데이터 웨어하우스</h4>
<ul>
<li>BigQuery etc</li>
<li>대량의 데이터를 <strong>분석하기 좋게 체계적으로 보관</strong>해놓는 데이터 창고이다.</li>
<li>가공되지 않은 데이터를 모아 놓은 창고는 데이터 레이크이다.<blockquote>
<p><strong>데이터 웨어하우스의 주요 특징 4가지</strong><br></p>
<ol>
<li><strong>주체 지향</strong> : 업무 중심이 아니라 주제 중심으로 데이터를 조직화 한다.(고객 거래처, 상품, 활동 등)</li>
<li><strong>통합</strong> : 데이터를 활용하기 좋은 형태로 변환하기 위해 표준화 기준으로 설정, 적용함으로 데이터를 통합해야 한다.</li>
<li><strong>시계열</strong> : 시간 별로 데이터 버전들을 저장한다.(데이터를 시간에 따라 수시로 갱신하거나 변경x)</li>
<li><strong>비휘발성</strong> : 데이터 웨어하우스의 데이터로 수행할 수 있는 작업은 데이터 로딩, 데이터 엑세스 뿐이다.(데이터의 변경, 삭제는 이뤄지지 않는다)</li>
</ol>
</blockquote>
</li>
</ul>
<p><br><br><br><br></p>
<h2 id="데이터-파이프라인-실습">데이터 파이프라인 실습</h2>
<hr>
<p>우선은 데이터 파이프라인을 한번 경험해보는 것이 좋을 것 같아서
정리된 실습 강의를 찾아왔다.</p>
<h4 id="1-t-academy-빅데이터-파이프라인-기술의-이해-및-적정도구의-선정">1) T academy &quot;빅데이터 파이프라인 기술의 이해 및 적정도구의 선정&quot;</h4>
<ul>
<li>빅데이터 파이프라인 기술을 이해하고, 여기에 사용되는 주요 클라우드 플랫폼 및 다양한 도구들의 장단점, 유스케이스에 맞는 도구를 선택하는 방법을 알아봅니다. </li>
<li>220분</li>
<li><a href="https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=116">https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=116</a></li>
</ul>
<br>

<h4 id="2-t-academy-소셜-데이터-분석을-위한-데이터-파이프라인-구성-실습">2) T academy &quot;소셜 데이터 분석을 위한 데이터 파이프라인 구성 실습&quot;</h4>
<ul>
<li>트위터와 같은 소셜 빅데이터 분석을 위한 데이터 파이프라인 구성의 전체 flow를 간단하게 실습하여 경험할 수 있습니다.</li>
<li>200분</li>
<li><a href="https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=117">https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=117</a></li>
</ul>
<p><br><br><br><br></p>
<h4 id="참고-링크">참고 링크</h4>
<ul>
<li><a href="https://st-soul.tistory.com/120">https://st-soul.tistory.com/120</a></li>
<li><a href="https://eehoeskrap.tistory.com/219">https://eehoeskrap.tistory.com/219</a></li>
<li><a href="https://hengbokhan.tistory.com/164">https://hengbokhan.tistory.com/164</a></li>
<li><a href="https://seoyoungh.github.io/data-science/data-pipeline-detail/">https://seoyoungh.github.io/data-science/data-pipeline-detail/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cl☁️udClub] 여덟번째 공지]]></title>
            <link>https://velog.io/@ginee_park/CludClub-%EC%97%AC%EB%8D%9F%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</link>
            <guid>https://velog.io/@ginee_park/CludClub-%EC%97%AC%EB%8D%9F%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</guid>
            <pubDate>Tue, 22 Jun 2021 05:04:14 GMT</pubDate>
            <description><![CDATA[<h1 id="🌧-프로젝트-일정">🌧 프로젝트 일정</h1>
<table>
<thead>
<tr>
<th align="center">기간</th>
<th align="center">활동 내용</th>
<th align="center">비고</th>
</tr>
</thead>
<tbody><tr>
<td align="center">~7/27</td>
<td align="center">팀프로젝트 <strong>기획 완료</strong></td>
<td align="center">7/27 기획 발표, 교수님 참석</td>
</tr>
<tr>
<td align="center">~8/20</td>
<td align="center">프로젝트 <strong>중간점검</strong></td>
<td align="center">8/20 중간 발표</td>
</tr>
<tr>
<td align="center">~10/10</td>
<td align="center">프로젝트 <strong>개발or연구 완료</strong> 및 <strong>논문 작성 시작</strong></td>
<td align="center">10/10 최종 발표, 교수님 참석</td>
</tr>
<tr>
<td align="center">~10/17</td>
<td align="center"><strong>논문 작성 완료</strong></td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">~10/24</td>
<td align="center">학회 논문 제출</td>
<td align="center">-</td>
</tr>
</tbody></table>
<blockquote>
<p>전체 일정은 <a href="https://velog.io/@ginee_park/CludClub-%EB%91%90%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80">2번째 공지</a>를 참고해주세요.</p>
</blockquote>
<blockquote>
<p>모임 시간은
주차별로 조절할 예정입니다</p>
</blockquote>
<br>

<h1 id="🌧-이번주-팀별-회의-내용">🌧 이번주 팀별 회의 내용</h1>
<h3 id="🔍-1팀-박진희-강채희-이지연">🔍 1팀 박진희, 강채희, 이지연</h3>
<ul>
<li>주제: <strong>데이터 파이프라인 구축</strong></li>
<li>자료 조사: <a href="https://velog.io/@ginee_park/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95-%EC%9D%B4%EB%A1%A0#%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%B4%EB%9E%80">박진희(블로그 링크)</a>, <a href="https://velog.io/@ejeon/CloudClub-6%EC%A3%BC%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A4%80%EB%B9%84">이지연(블로그 링크)</a>, 강채희(word)</li>
<li>과제
1) 강의 1편 들어오기
2) 주제 1~2개 생각해오기</li>
</ul>
<br>

<h3 id="🔍-2팀-오송아-정지인-허지호">🔍 2팀 오송아, 정지인, 허지호</h3>
<ul>
<li>주제: 도커와 CI환경구축</li>
<li>과제: 
1) 강의 들으면서 용어 정리 해오기
2) 실습 강의 진행
3) 기획할 주제 생각해오기</li>
<li>참고레퍼런스
<a href="https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci#curriculum">https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci#curriculum</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cl☁️udClub] 일곱번째 공지]]></title>
            <link>https://velog.io/@ginee_park/CludClub-%EC%9D%BC%EA%B3%B1%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</link>
            <guid>https://velog.io/@ginee_park/CludClub-%EC%9D%BC%EA%B3%B1%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</guid>
            <pubDate>Wed, 02 Jun 2021 00:32:19 GMT</pubDate>
            <description><![CDATA[<h1 id="🌧-일정-공지">🌧 일정 공지</h1>
<p>다음 모임은 <strong>6/22(화)</strong> 입니다.</p>
<ul>
<li><strong>주제/기획 정하기</strong>(1/2)</li>
<li>팀별로 <strong>과제(or 실습) 정해서</strong> 2주동안 진행해보기(공부 or 실습)</li>
</ul>
<p> <br><br></p>
<h1 id="🌧-이번주-팀별-회의-내용">🌧 이번주 팀별 회의 내용</h1>
<h3 id="🔍-1팀-박진희-강채희-이지연">🔍 <strong>1팀 박진희, 강채희, 이지연</strong></h3>
<ul>
<li>큰 틀: 빅데이터 관련 주제</li>
<li><a href="https://st-soul.tistory.com/120?category=875717">참고 레퍼런스</a></li>
<li>22일까지 데이터 파이프라인 구축편 읽고 모르는 용어정리 해오기</li>
<li>관련 실습 찾아오기 </li>
</ul>
<h3 id="🔍-2팀-허지호-오송아-정지인">🔍 <strong>2팀 허지호, 오송아, 정지인</strong></h3>
<ul>
<li>큰 틀: 서버리스 기반 웹 어플리케이션 구축 + 도커파일로 웹 호스팅</li>
<li>주제: 송아님 주제랑 지연님이 올려준 주제인 핀테크에 현재 관심이 있음 자세한 주제/기획은 22일날 정하기</li>
<li>22일날 앱 구축 실습 진행해보기 시작(과제)</li>
<li>도커 공부도 함께 할 예정</li>
</ul>
<p><br><br></p>
<h1 id="🌧-todo">🌧 Todo</h1>
<p>시험공부 화이팅!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cl☁️udClub] AWS 강의 노트_5]]></title>
            <link>https://velog.io/@ginee_park/CludClub-AWS-%EA%B0%95%EC%9D%98-%EB%85%B8%ED%8A%B85</link>
            <guid>https://velog.io/@ginee_park/CludClub-AWS-%EA%B0%95%EC%9D%98-%EB%85%B8%ED%8A%B85</guid>
            <pubDate>Mon, 24 May 2021 18:35:24 GMT</pubDate>
            <description><![CDATA[<h1 id="🐤-api-gateway">🐤 API Gateway</h1>
<blockquote>
<p><strong>API</strong> (Application Programming Interface)</p>
</blockquote>
<h3 id="api-gateway란">API Gateway란?</h3>
<ul>
<li>API를 만들고 운영하고 모니터링 가능</li>
<li>Back-end 서비스(웹 어플리케이션, EC2)에 들어있는 데이터 접근 허용</li>
</ul>
<p><br><br></p>
<h1 id="🐤-code-commit--deploy--pipeline">🐤 Code Commit &amp; Deploy &amp; Pipeline</h1>
<h3 id="cicd">CI/CD</h3>
<ul>
<li><p><strong>CI</strong> : Continuous Integration (지속적인 통합)</p>
</li>
<li><p><strong>CD</strong> : Continuous Deployment (지속적인 배포)</p>
</li>
<li><p>CI/CD 장점
자동화 시스템 - 테스트
Incremental Change</p>
</li>
</ul>
<h3 id="code-commit">Code Commit</h3>
<ul>
<li>파일들을 보관하는 저장장소(Repository) - Github과 매우 유사</li>
<li>동시에 많은 사람들이 저장 장소 접근 및 업데이트 가능</li>
<li>버전 컨트롤 기능 제공 (언제 어떻게 누가 저장장소 내용을 변경했는지)</li>
</ul>
<h3 id="code-deploy">Code Deploy</h3>
<ul>
<li><p><strong>Code Deploy 장점</strong>
새로운 기능들의 빠른 배포,
소프트웨어 &amp; 서버 다운 타임 X
Manual 에러 X</p>
</li>
<li><p><strong>Rolling</strong> 배포
이전 버전으로 돌아가기 어렵다, 대신 쉽다
<img src="https://images.velog.io/images/ginee_park/post/862704d8-6e03-44c1-b890-5b4d0f575bb8/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><strong>Blue/Green</strong> 배포
이전, 최신 버전과의 스위치가 편하다
<img src="https://images.velog.io/images/ginee_park/post/f337ae6d-e5aa-4464-81bc-64cfcab56409/image.png" alt=""></li>
</ul>
<br>

<h3 id="cd-실습-순서">CD 실습 순서</h3>
<p>IAM에서 유저 생성
로컬 환경에서 개발
s3 버킷으로 파일을 업로드
code Deploy가 배포를 하게해주는 파이프라인을 구축</p>
<h3 id="code-pipeline">Code Pipeline</h3>
<ul>
<li><strong>Code Pipeline이 하는 일은?</strong>
빌드, 테스트, 배포 과정을 관리
소프트웨어 어플리케이션 출시 <strong>자동화 가능</strong></li>
</ul>
<p><img src="https://images.velog.io/images/ginee_park/post/1a14fe57-77a1-4677-bf60-b41ebc959ac0/image.png" alt=""></p>
<p><br><br></p>
<h1 id="🐤-느낀점">🐤 느낀점</h1>
<ul>
<li><p>AWS에서는 코드 저장장소로 Code Commit을 사용다는 것을 깨달았다.</p>
</li>
<li><p>AWS 입문자 강의를 모두 수강했다는 것이 일단 뿌듯했다.
이번 수업을 통하여 aws 주요 서비스를 하나하나 실습해보며 조금은 친숙해진 것 같다.</p>
</li>
<li><p>이제 곧 1학기가 끝나는데 소학회원들과 AWS 아키텍쳐 자격증도 같이 준비해야겠다는 생각이 들었다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cl☁️udClub] 여섯번째 공지]]></title>
            <link>https://velog.io/@ginee_park/CludClub-%EC%97%AC%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</link>
            <guid>https://velog.io/@ginee_park/CludClub-%EC%97%AC%EB%B2%88%EC%A7%B8-%EA%B3%B5%EC%A7%80</guid>
            <pubDate>Mon, 24 May 2021 18:32:25 GMT</pubDate>
            <description><![CDATA[<h1 id="🌧-일정-공지">🌧 일정 공지</h1>
<ul>
<li>다음 모임은 <strong>6/1(화)</strong> 입니다 </li>
<li><em>줌 모임*</em>이고, 바로 <strong>논문 준비</strong>가 시작됩니다!</li>
</ul>
<p><br><br></p>
<h1 id="🌧-todo">🌧 Todo</h1>
<h3 id="✅-블로그에-피드백-댓글-남기기">✅ 블로그에 피드백 댓글 남기기!</h3>
<p>&lt;클라우드 관련 논문 주제, 레퍼런스 찾아오기 과제&gt; 해오시느라 너무 고생하셨습니다👏</p>
<p>과제로 <strong>블로그에 정리해온 내용을
모두 읽어보고 피드백 댓글을 남기는 것</strong>이 과제입니다!</p>
<p>자신을 제외한 <strong>총 5개의 게시물</strong>에 댓글을 달아주세요.</p>
<p>궁금한 점, 느낀 점, 덧붙이고 싶은 내용 등
부담없이! 편하게! 댓글 남겨주시면 됩니다!</p>
<p>단, 내용은 꼼꼼히 읽어보셨으면 좋겠습니다😊</p>
<p><br><br></p>
<blockquote>
<p>aws입문자 강의를 모두 수강하느라 수고했습니다!
클클 홧팅❤️</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>