<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>사연있는.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 23 Feb 2024 08:04:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>사연있는.log</title>
            <url>https://velog.velcdn.com/images/mulrung_e/profile/01e2a87f-dc8b-4224-9063-6870ae3b4a75/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 사연있는.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mulrung_e" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Kubernetes Cluster Sec]]></title>
            <link>https://velog.io/@mulrung_e/Kubernetes-Cluster-Sec</link>
            <guid>https://velog.io/@mulrung_e/Kubernetes-Cluster-Sec</guid>
            <pubDate>Fri, 23 Feb 2024 08:04:00 GMT</pubDate>
            <description><![CDATA[<p>자다가 갑자기 궁금해져서 찾아보려고합니다.</p>
<p>대충 아래와 같이 체크리스트를 만들어봤습니다.</p>
<p>물론 지금당장 할건아니고 하나씩 공부해보면서 해볼려고합니다.</p>
<h2 id="체크리스트">체크리스트</h2>
<h3 id="네트워크-보안">네트워크 보안:</h3>
<p>클러스터 내의 모든 네트워크 트래픽이 암호화되어 있나요?
외부에서의 액세스는 허용되지 않도록 네트워크 정책이 적절히 설정되어 있나요?</p>
<h3 id="인증과-권한-부여">인증과 권한 부여:</h3>
<p>클러스터 내에서 사용자와 서비스 계정에 대한 적절한 인증 수단이 구성되어 있나요?
RBAC(Role-Based Access Control)이 활성화되어 있으며, 필요한 권한만을 부여하고 있는지 확인하셨나요?</p>
<h3 id="tlstransport-layer-security-사용">TLS(Transport Layer Security) 사용:</h3>
<p>모든 클러스터 컴포넌트 간의 통신은 TLS를 사용하여 암호화되고 있나요?</p>
<h3 id="etcd-보안">etcd 보안:</h3>
<p>etcd는 안전한 인증 및 통신 방법을 사용하고 있나요?
불필요한 접근을 막기 위한 etcd 접근 제어가 설정되어 있나요?</p>
<h3 id="pod-보안">Pod 보안:</h3>
<p>Pod의 보안 컨텍스트와 리소스 요구 사항이 적절히 설정되어 있나요?
컨테이너 이미지는 안전한 소스에서 가져온 것인가요?</p>
<h3 id="시스템-업데이트">시스템 업데이트:</h3>
<p>클러스터의 모든 컴포넌트 및 운영 체제는 최신 상태인가요?</p>
<h3 id="로그-및-감사">로그 및 감사:</h3>
<p>클러스터에서 발생하는 로그는 적절히 수집되고 분석되고 있나요?
보안 이벤트에 대한 감사가 활성화되어 있나요?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GCP를 활용한 Palworld 데디케이트 서버 운영]]></title>
            <link>https://velog.io/@mulrung_e/GCP%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Palworld-%EB%8D%B0%EB%94%94%EC%BC%80%EC%9D%B4%ED%8A%B8-%EC%84%9C%EB%B2%84-%EC%9A%B4%EC%98%81</link>
            <guid>https://velog.io/@mulrung_e/GCP%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Palworld-%EB%8D%B0%EB%94%94%EC%BC%80%EC%9D%B4%ED%8A%B8-%EC%84%9C%EB%B2%84-%EC%9A%B4%EC%98%81</guid>
            <pubDate>Thu, 01 Feb 2024 12:53:44 GMT</pubDate>
            <description><![CDATA[<h2 id="왜-gcp인가">왜 GCP인가?</h2>
<h4 id="신규-사용자-대상으로-약-3달동안-300의-이용료를-제공해준다">신규 사용자 대상으로 약 3달동안 300$의 이용료를 제공해준다!</h4>
<hr>
<h1 id="서버요구사항">서버요구사항</h1>
<ul>
<li>CPU : 4 Core (권고)</li>
<li>Memory :  16GB (최소) / 32GB(권고)</li>
<li>방화벽 <strong>(필수)</strong> : 27015~27016 (TCP/UDP), 8211 (UDP)</li>
<li>방화벽 (권고) : 25575 (TCP/UDP) ⇒ RCON</li>
</ul>
<hr>
<h1 id="구글-클라우드-vm-배포">구글 클라우드 VM 배포</h1>
<blockquote>
<p>시작전</p>
</blockquote>
<p>💡 Tips : </p>
<ol>
<li>구글 클라우드에 회원가입하면 <strong>3달간 300$</strong>가 충전됩니다. </li>
<li>충전된 금액을 모두 소진하거나, 3달이 지나면 유료 회원 전환 여부를 물어 봅니다.</li>
<li>유료 회원으로 전환하지 않으면 모든 자원은 구글에서 회수하고, 비용이 청구되지 않습니다.</li>
<li>클라우드 구축은 포트포워딩이 필요 없으며, 종료하지 않는이상 IP가 바뀌지 않습니다.</li>
</ol>
<h2 id="1-vm-인스턴스-생성">1. VM 인스턴스 생성</h2>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/fa418f54-66e2-49d1-b475-287925a50e35/image.png" alt=""></p>
<p>먼저 서버를 구동시킬 VM 인스턴스를 생성해보자.</p>
<h3 id="리전과-영역">리전과 영역</h3>
<p>리전과 영역은 사용자의 목적에 따라 설정하시면되는데
대부분 한국에서 사용할것이니 리전은 서울로 영역은 본인의 취향에 맞게 추가하면됩니다.</p>
<h3 id="머신구성">머신구성</h3>
<p>권장사항을 충족하기 위해 N2 시리즈 중 standard-4 이상을 선택하시면됩니다.
(N2는 Intel, N2D는 AMD 입니다)</p>
<h3 id="부팅-디스크">부팅 디스크</h3>
<p>운영체제 -&gt; Ubuntu
버전 -&gt; 22.04 LTS x86 (AMD는 ARM64)
크기 -&gt;  15GB (추후 업데이트 대비)</p>
<p>그 외에 옵션은 기본으로 두고 인스턴스 생성하시면 됩니다.</p>
<hr>
<h2 id="vpc-설정">VPC 설정</h2>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/5b8b0f82-0a5f-4571-b8bd-ce62750ea9ae/image.png" alt=""></p>
<h3 id="default-vpc-방화벽-설정">Default VPC 방화벽 설정</h3>
<p>아래의 포트를 허용시켜줍시다.</p>
<blockquote>
</blockquote>
<p>tcp:27015
tcp:27016
tcp:25575
udp:27015
udp:27016
udp:25575
udp:8211</p>
<p>이후 콘솔에서 SSH 접속을 통해 OS 설정을 진행하자</p>
<h3 id="os-방화벽-개방">OS 방화벽 개방</h3>
<ul>
<li>진행전 OS Update를 하자<blockquote>
</blockquote>
apt update</li>
</ul>
<ul>
<li><p>방화벽 개방 명령어 실행</p>
<pre><code>  sudo iptables -I INPUT -p tcp --dport 27015 -j ACCEPT
  sudo iptables -I INPUT -p tcp --dport 27016 -j ACCEPT
  sudo iptables -I INPUT -p tcp --dport 25575 -j ACCEPT
  sudo iptables -I INPUT -p udp --dport 27015 -j ACCEPT
  sudo iptables -I INPUT -p udp --dport 27016 -j ACCEPT
  sudo iptables -I INPUT -p udp --dport 25575 -j ACCEPT
  sudo iptables -I INPUT -p udp --dport 8211 -j ACCEPT

  sudo iptables -S         &lt;- 설정 저장</code></pre></li>
</ul>
<ul>
<li><p>방화벽 개방 확인</p>
<pre><code>  sudo iptables -nL

  ### 방화벽 개방 확인 ###

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination         
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:8211
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25575
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:27016
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:27015
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:25575
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:27016
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:27015</code></pre></li>
</ul>
<hr>
<h3 id="게임-엔진-설치">게임 엔진 설치</h3>
<ul>
<li>Steam  설치<blockquote>
</blockquote>
Steam CMD install
sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
  sudo apt install steamcmd</li>
</ul>
<ul>
<li><p>GameEngine 설치</p>
<pre><code>  steamcmd +login anonymous +app_update 2394010 validate +quit</code></pre></li>
</ul>
<ul>
<li><p>SDK64 설치</p>
<pre><code>  mkdir -p ~/.steam/sdk64/
  steamcmd +login anonymous +app_update 1007 +quit
  cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/</code></pre></li>
</ul>
<ul>
<li><p>Initial 실행 (최초 1회 실행)</p>
<pre><code class="language-bash">  ## 게임 설치 디렉토리로 이동 ##
  cd ~/Steam/steamapps/common/PalServer

  ## 구동기 실행 ##
  ./PalServer.sh</code></pre>
</li>
</ul>
<ul>
<li><p>서버 설정 파일 수정 (커스터마이징)</p>
</li>
<li><p>상세한 서버 옵션 설정은 개발사 홈페이지 참조 : <a href="https://tech.palworldgame.com/optimize-game-balance">클릭링크이동</a></p>
<pre><code>  vi ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini </code></pre><pre><code>  **## 아래 부분을 사용자의 환경에 맞추어 수정후 PalWorldSetting.ini 파일에 적용합니다 ##**

  [/Script/Pal.PalGameWorldSettings]
  OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=**32**,ServerName=&quot;**Default Palworld Server**&quot;,ServerDescription=&quot;&quot;,AdminPassword=&quot;**12341234**&quot;,ServerPassword=&quot;&quot;,PublicPort=8211,PublicIP=&quot;&quot;,RCONEnabled=False,RCONPort=25575,Region=&quot;&quot;,bUseAuth=True,BanListURL=&quot;https://api.palworldgame.com/api/banlist.txt&quot;)</code></pre></li>
</ul>
<ul>
<li><p>설정파일 적용 확인</p>
<pre><code class="language-bash">  cat ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini </code></pre>
</li>
</ul>
<blockquote>
<p>서버 최종 구동</p>
</blockquote>
<ul>
<li><p>게임 실행 : Screen Utility 실행</p>
<pre><code class="language-bash">  screen</code></pre>
</li>
</ul>
<ul>
<li><p>게임실행 : PALWORLD 실행</p>
<pre><code class="language-bash">  ## 게임 디렉토리로 이동 ##
  cd ~/Steam/steamapps/common/PalServer

  ## 게임 구동기 실행 ##
  ./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS</code></pre>
</li>
</ul>
<ul>
<li><p>screen 유틸리티 백그라운드로 돌려 놓고 나가기</p>
<pre><code class="language-bash">  ctrl + a + d </code></pre>
</li>
</ul>
<h3 id="번외-사항-">번외 사항 :</h3>
<ul>
<li><p>나중에 다시 Screen 화면으로 돌아가고 싶을때</p>
<pre><code>  screen -r </code></pre><ul>
<li>추후 Trial이 만료되면 데이터 마이그레이션을 통해 동일하게 진행하시면됩니다.</li>
</ul>
</li>
</ul>
<h1 id="참고자료">참고자료</h1>
<blockquote>
<p>제작에 참고한 자료들</p>
</blockquote>
<ul>
<li>(공식) Palworldgame docs (영어) : <a href="https://tech.palworldgame.com/dedicated-server-guide">https://tech.palworldgame.com/dedicated-server-guide</a></li>
<li>유튜브 채널 <a href="https://www.youtube.com/channel/UCTKC1JQaVY-QvLKyGt84I5w">테크팀(Tech Tim)
</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Iac를 통한 AWS Infra 프로비저닝 프로젝트 리뷰]]></title>
            <link>https://velog.io/@mulrung_e/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@mulrung_e/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Fri, 26 Jan 2024 09:26:05 GMT</pubDate>
            <description><![CDATA[<p>카카오 클라우드 스쿨 교육과정을 이수하며  진행했던 프로젝트에 대해 리뷰해볼려고 합니다.</p>
<h2 id="1-기술-스택-선정-이유">1. 기술 스택 선정 이유:</h2>
<h3 id="terraform">Terraform</h3>
<p>많은 회사에서 IaC를 통한 인프라 프로비저닝을 하기때문에 경험해 보는것도 도움이 될거라 생각했고
그 중에서도 Terraform을 선정한 이유는 높은 퍼블릭 클라우드 서비스와의 호환성과 교육과정을 진행하며 접해봤던 IaC 스택 중 하나 였기 때문이다.</p>
<h3 id="aws">AWS</h3>
<p>프라이빗 클라우드로 온프레미스 환경에서 인프라를 구축하려고 했지만 교육시설의 공인 IP 할당 한계로 인하여 퍼블릭 클라우드를 사용하게 되었고
그 중 에서도 AWS를 사용한 이유는 현재 전세계에서 가장 많이 사용하는 퍼블릭 클라우드 서비스이며 또한 전파진흥협회에서 AWS 비용을 지원해준다고하여 사용하게 되었다.
그렇다고 AWS의 모든 서비스를 활용하는것이 아닌 최대한 오픈소스를 활용하는 방안으로 프로젝트를 진행하기로했다.</p>
<h3 id="gitops">GitOps</h3>
<p>개발자 관점에서 기존에 사용하고 있던 Git Repository에서 형상 관리하던 방식 그대로 사용하기만 해도 실제 환경에 배포가 가능하며, 배포 결과를 즉시 확인하고 보다 나은 방식을 다시 적용할 수 있어 Jenkins, Argo CD를 활용한 Gitops 방식을 사용하게 되었습니다.</p>
<p>아래는 저희 프로젝트에서 사용한 파이프라인입니다.</p>
<blockquote>
</blockquote>
<p>Gitlab에서의 Push가 이루어졌을때 발생한 Webhook을 Jenkins에 전달하여 이미지를 빌드한뒤 Docker harbor의 Repository에 저장이 되고 성공적으로 빌드가 이루어지면 ArgoCD에 배포 이벤트를 전송하며 Git Repository에 정의된 매니페스트를 통해 클러스터에 배포가 이루어집니다</p>
<h3 id="monitoring">Monitoring</h3>
<p>멀티리전을 통한 가용성 보장한 인프라이므로 Route53 트래픽 전환을 위해 AWS의 CloudWatch을 사용해야 했지만 오픈소스를 최대한 활용하는게 능력을 기르는데에 좋을거같아 클러스터의 모니터링은 Prometheus + Grafana를 이용하여 모니터링 시스템을 구축하였습니다.</p>
<p>추후에 ELK, EFK를 활용한 로그와 이벤트 데이터 시각화도 추가하였습니다.
<a href="https://velog.io/@mulrung_e/Docker-EKS%EB%A5%BC-%ED%86%B5%ED%95%9C-EFK-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95">요기있습니다.</a></p>
<hr>
<h2 id="2-architecture-구성">2. Architecture 구성</h2>
<h3 id="bastion-host">Bastion Host</h3>
<p>개발자들의 입장을 고려하여 기존의 환경과 동일하게 Git Push가 가능하게끔 Bastion Host를 두었습니다.
VPN을 사용하여 더욱 안전한 환경에서 프로젝트를 진행하면 좋았겠지만 비용, 예산상의 문제로 Public Subnet에 Bastion Host를 두었습니다.</p>
<h3 id="eks">EKS</h3>
<p>3개의 AZ에 각각 Master Node가 위치하게끔 클러스터를 구성하였으며
NAT GateWay를 통해 외부로의 접속이 가능하게끔 하였습니다.</p>
<h3 id="rds">RDS</h3>
<p>각 리전별로 1개의 RDS를 두고 클러스터링을 통해 연동을 시켰습니다.</p>
<h3 id="route53">Route53</h3>
<p>사전 구매한 도메인을 활용하여 AWS의 Route53과 연동시킨뒤 Nginx Ingress Controller를 통하여 로드밸런싱을 진행하였습니다.
또한 리전별로 Health Check를 진행하여 트래픽을 분산, 전환하였습니다.</p>
<h3 id="cloud-watch">Cloud Watch</h3>
<p>서비스 중단, 임계값 임박 등 상황에 도달하면 경보를 발생시키며 Route53의 트래픽 전환의 기준이 됩니다.</p>
<h2 id="3-보완사항">3. 보완사항</h2>
<h3 id="3-1-terraform을-어디까지-사용해야-하나">3-1. Terraform을 어디까지 사용해야 하나?</h3>
<ul>
<li>테라폼의 한계로 인하여 상세한 설정 불가로 기준을 확실히 하고 프로젝트를 진행하였으면 서비스에 더욱 집중할 시간이 많지 않았을까 라는 아쉬움이 남는다.</li>
</ul>
<h3 id="3-2-aws-서비스를-어디까지-사용해야-하나">3-2. AWS 서비스를 어디까지 사용해야 하나?</h3>
<ul>
<li>프로젝트 초기 비용적인 문제와 더불어 범용성을 위해 오픈소스를 최대한 활용해보고자 하였는데 생각보다 AWS의 고도화된 자동화 때문에 오픈소스간의 호환이 제대로 되지않아 초기에 생각했던것 보다 더많은 AWS 서비스를 사용하게 되었다.
AWS에 대해 제대로 알지 못하여 발생한 문제로 다양한 퍼블릭 클라우드 서비스에 대해 공부를 해야함을 깨달았다.</li>
</ul>
<h3 id="3-3-항상-예산과-시간이-문제">3-3. 항상 예산과 시간이 문제</h3>
<ul>
<li>경험의 부재로 발생한 문제로 해보지 않았으니 어떻게 될지 모른다.
아무리 좋은 가설을 세우더라도 항상 변수는 발생하며 이에대해 어떻게 대응하는지가 중요한듯하다.
많은 경험을 해보자..</li>
</ul>
<h2 id="4-마무리">4. 마무리</h2>
<p>처음으로 퍼블릭 클라우드를 사용하여 진행해본 프로젝트인 만큼 시행착오도 많고
계획한대로 흘러가지 않았던점이 많았다.
계획대로 되지않아도 그 상황에 맞춰 최선의 선택을 했어야 하는데 그 부분이 미숙했던거같다.
하지만 우여곡절이 많아서 오히려 많은걸 배울 수 있던것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[할일목록]]></title>
            <link>https://velog.io/@mulrung_e/%ED%95%A0%EC%9D%BC%EB%AA%A9%EB%A1%9D</link>
            <guid>https://velog.io/@mulrung_e/%ED%95%A0%EC%9D%BC%EB%AA%A9%EB%A1%9D</guid>
            <pubDate>Sun, 19 Nov 2023 18:24:59 GMT</pubDate>
            <description><![CDATA[<p>요새 벌려놓은 게 많아서 정리를 해볼려고한다.</p>
<p>일단 가장 급한건 CKA가 아닐까싶다.</p>
<p>할인 + 달러 인하로 일단 사두었는데 성격상 해야할 일(?)을 쌓아두고 지내지못해서
이 녀석을 가장 먼저 해치울거같다.</p>
<p>그리고 뻔뻔하지만 20대 마지막 여유를 즐길수 있는 시기가 지금뿐일거라는 생각에
CKA를 취득하면 마지막으로 여행을 한번 더 다녀올려고한다.</p>
<p>여행을 갔다오고나서는 아마도 AWS SAA를 준비할거같다.
사실 AWS 자격증에 대해서 큰 관심과 메리트를 못느꼈는데 요새 사람들을 만나보니 따는게 좋을거같다는 생각이 들어서 할려고한다.</p>
<p>물론 코딩테스트나 클라우드 컴퓨팅 (리눅스, 가상화, 도커, 쿠버 등..)에 대한 공부는 평소에도 꾸준히 하고있었지만 위 두개 자격증 취득을 하고나서는 본격적으로 주제와 목표를 정해 프로젝트 방식으로 진행하고
그 내용을 정리하여 포트폴리오겸 정보 공유용으로 블로그에 작성할거같다.</p>
<p>개인적으로는 Hardway구성 등 가상화에 대한 공부를 할거같고
그룹으로는 Istio, Proxy 등 이제껏 했던 내용보다는 조금더 어려운 내용에대해서 공부할듯하다</p>
<p>사실 위 내용말고도 개인적으로 하고있는일이 있지만 병행하는데 있어 크게 부담되진 않아서 여기에 따로 적진않았다.</p>
<p>뭐... 어쨋든 열심히 하셔야겠지..? 😁</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Samsung Developer Conference Korea 2023 참석 후기]]></title>
            <link>https://velog.io/@mulrung_e/Samsung-Developer-Conference-Korea-2023-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@mulrung_e/Samsung-Developer-Conference-Korea-2023-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 12 Nov 2023 18:32:59 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-참석하게된-계기">📌 참석하게된 계기</h1>
<p>카카오 클라우드 스쿨 3기 과정을 거의 마무리하던 시기에 &quot;수료하고나서 뭐하지?&quot; 라는 생각이 들때
SDC Korea 2023가 개최된다는 소식을 들었고
DevOps 및 클라우드 컴퓨팅에 관하여 더 공부를 하고 싶었기에 신청하게되었습니다.
<del>사실은 수료하면 하루종일 침대에서 안일어날거 같아서 일단 신청했다.</del></p>
<h1 id="📌참석-전">📌참석 전</h1>
<p>SDC 2023 Events 중에 &quot;삼성전자 S/W 개발 Career 컨설팅&quot;이 있어서 신청하였고
그에 따른 멘토링(?), 컨설팅 준비를 하였다.
예를들어 주니어 개발자로서 어떤 준비를 해야할지, 현업과 기술 트렌드 등...</p>
<h1 id="📌-참석">📌 참석</h1>
<p>삼성전자 서초사옥 5층으로 가서 메일로 온 QR 코드를 보여주고 웰컴키트와 소속과 이름이 적혀 있는 명찰을 받았다.</p>
<ul>
<li>웰컴키트의 내용물은 아래 Event에 사진으로 올려두었습니다 !</li>
</ul>
<p>행사장에는 2개의 Track의 세션을 진행하는 강당이 2개와
각종 전시회, 다양한 이벤트존, 컨설팅 홀, 자그마한 휴게공간 등이 있었다.</p>
<h1 id="📌expo">📌Expo</h1>
<p>기술 세션이 시작하기 전에 엑스포를 방문하여 삼성전자의 전시회 제품을 만날 수 있었고, 여러 기념품도 받을 수 있었다.
하지만 사람도 많고 정신도 없어서 제대로 볼 수 없어 아쉬웠다.
그래도 한눈에 봐도 제품에 대한 이해가 될 수 있게 잘 해두셔서 기억에 남는 제품들이 있었다 !</p>
<h1 id="📌-기술-세션">📌 기술 세션</h1>
<p>시간이 되어서 참석하게 된 목적인 기술 세션을 들으러 갔다.
꼭 듣고 싶었던 세션이 있어서 재빨리 가서 입장했다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/3fdf0754-6ff7-4dc2-b9b5-21afbd6f3d3f/image.heic" alt=""></p>
<p>간략하게 들었던 내용을 정리해봤습니다. 📚</p>
<h2 id="1️⃣-devops-acceleration--엔터프라이즈에서-동작하는-devops-모델">1️⃣ DevOps Acceleration : 엔터프라이즈에서 동작하는 DevOps 모델</h2>
<p>진행 : LG UPLUS의 송주영 연구위원님</p>
<p>요새 대세(?)인 DevOps가 과연 무엇인가? 라는 방황을 하고 있었는데 어느정도 감을 잡을 수 있었던 시간이었던거 같다. 😋</p>
<p>이 세션을 보고 느낀 DevOps에 대해 한 문장으로 요약하자면 아래와 같다.</p>
<blockquote>
<p>No Rules, Transparency 그 어떤 경계도 R&amp;R도 없다
S/W의 힘으로 모든 일을 올바르게 가속화 하는 것</p>
</blockquote>
<p>그외에도 글로벌 리더 기업의 조직의 운영 및 관리에 대해 배울 수 있었으며
여러모로 큰 자극이 되는 세션이었다 ! 👍</p>
<h2 id="2️⃣-언제나-samsung-account는-소리없이-움직인다--대규모-트래픽속에서-무중단-클라우드-인프라-업그레이드-아키텍처-소개-및-경험기">2️⃣ 언제나 Samsung Account는 소리없이 움직인다 : 대규모 트래픽속에서 무중단 클라우드 인프라 업그레이드 아키텍처 소개 및 경험기</h2>
<p>진행 : 삼성전자 김제민 파트리더님</p>
<p>Samsung Account 아키텍쳐 소개를 해주시는데 반가운 EKS가 보인다...
개인적으로도 카카오 클라우드 스쿨을하면서도 지겹게 사용하고 괴롭혔던 녀석을 삼성에서도 쓰다니😵‍💫
여튼 아키텍쳐에 대해 설명을 해주시는데 자주 접한 AWS 서비스와 생소한 서비스들도 많았다.
단순히 기술을 사용하는것보다 왜 사용해야하는지가 중요하다고 하셨고 사소한 결정 차이가 비용, 서비스 품질에 대해서는 큰 영향을 끼치신다고 했다!
그리고 관리형 쿠버네티스인 EKS를 무중단으로 업그레이드하는 방식에 대해 자세히 설명을 해주었고
어떠한 점을 고려해야하는지 실제로 어떤 이슈가 생겼는지 다양한 경험을 공유해주셨다.
대규모 트래픽을 다루는 클러스터를 운영해보는 경험은 쉽게 하지 못하기에 정말 값진 경험을 들을 수 있는 기회였다 !</p>
<h2 id="3️⃣-agile에-안정성을-담기-위한-cicd-전략">3️⃣ Agile에 안정성을 담기 위한 CI/CD 전략</h2>
<p>진행: 삼성전자 황연성 프로님</p>
<p>구글의 DevOps Research and Assessment 팀이 만든 DevOps 성과 측정 지표인 Dora Metrics에 대해 집중적으로 설명해주셨고 상당히 많이 강조하신게 기억에 남는다.</p>
<p>촉박한 개발기간, 잦은 요구사항 추가로 인한 짧은 release cycle을 소화하기 위해 적용했던 테스트 및 CI/CD 전략과 아키텍쳐, 운영방법 또한 배울 수 있었으며
접하기 힘든 현업에서의 CI/CD 전략과 아키텍쳐 등을 이해하고 배울 수 있는 좋은 기회였다.</p>
<p>그리고 또 테라폼을 도입한 이유에 대해 발표를 해주셨는데
이미 구성된 인프라 환경에 import 시켜주는 과정이 너무 힘든작업이었고
하면서도 왜 이걸 하는지 잘 모르겠다고 하셨는데 너무 격하게 공감이 되었다..😇</p>
<p>이렇게 목표로 했던 3가지 세션 모두 다 다행히도 전부 참석할 수 있었고 정말 좋은 경험을 할 수 있었다.</p>
<p>그리고 오후에 SSAFY 교육생 분들의 오픈소스 관련 세션도 있었는데
이 세션도 평소에 접할 수 없었던 DeepLearning 및 AI, MLOps 등에 대해 조금이라도 배울 수 있어서 좋았다
특히 YOLO Object Detection을 활용한 프로젝트가 상당히 기억에 남았다 ⭐️</p>
<h1 id="📌-events">📌 Events</h1>
<h2 id="1-사전등록-참여자-웰컴키트-증정-이벤트">1. 사전등록 참여자 웰컴키트 증정 이벤트</h2>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/db32d612-2bfb-4e92-9d9e-caff16a5f05c/image.png" alt=""></p>
<h4 id="꼬질꼬질해진-웰컴키트😢">꼬질꼬질해진 웰컴키트😢</h4>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/7296a355-7861-4ac7-8855-67b7e542bbd8/image.HEIC" alt=""></p>
<h2 id="2-삼성전자-sw-개발-career-컨설팅">2. 삼성전자 S/W 개발 Career 컨설팅</h2>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/1b83a4f5-678c-49ae-89cc-11875a79121b/image.png" alt=""></p>
<blockquote>
<p>가벼운 마음으로 신청하였지만 확실히 앞으로 뭘해야 할지 알 수 있었던기회</p>
</blockquote>
<h4 id="간단하게-진행한-컨설팅-내용에-대해-작성해봅니다">간단하게 진행한 컨설팅 내용에 대해 작성해봅니다.</h4>
<blockquote>
<p>Q. 클라우드 엔지니어로서 추천하시는 직무 분야와 공부 해야할 기술 트렌드 등이 있으시다면?</p>
</blockquote>
<p>A. DevOps를 계속해라 ! 그리고 현재 트렌드는 AIops, MLops 인듯하다.</p>
<blockquote>
<hr>
<p>Q.아래 주제로 클라우드 및 가상화관련 공부를 진행하려고 하는데 어떻게 생각하시나요??
[ Docker없이 컨테이너 만들기, Hardway로 K8S 구성해보기, Istio 등]</p>
</blockquote>
<p>A.트렌디하고 좋다! 하지만, 코딩테스트가 최우선이 되어야한다.</p>
<blockquote>
<hr>
<p>Q. CS부분은 어떻게 해야할지?</p>
</blockquote>
<p>A. 실제로 트러블 슈팅하면서 공부해라! 그리고 아키텍쳐를 구성하면서 왜 이런 내용이 들어가야할지 고찰해봐라.</p>
<blockquote>
<hr>
<p>Q. 포트폴리오를 만들면 좋을까요? 예를들어 블로그나..
A. 무조건 해라! 안한거를 후회하고 있다</p>
<hr>
<p>Q. 온프레미스 경력이 클라우드, 가상화 직무에서 인정을 받는지..?</p>
</blockquote>
<p>A. 당연히 된다. 경력도 넣고 신입도 넣어라, 어차피 면접관들도 온프레미스 하다 오신분들이다.</p>
<h2 id="3-지누스마스-비밀-연구원을-찾아라-이벤트">3. 지누스마스 비밀 연구원을 찾아라 이벤트</h2>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/12783a9f-c013-49f1-adcd-96fcf84265c3/image.png" alt=""></p>
<blockquote>
<p>지누와 스마스입니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/9f2a8880-e46e-46df-813b-70caa9fead31/image.heic" alt=""></p>
<h2 id="4-발표자와-함께하는-네트워킹-타임-talk-with-speakers">4. 발표자와 함께하는 네트워킹 타임 Talk with Speakers</h2>
<blockquote>
<p>참석하고싶었지만, 커리어 컨설팅 일정과 겹쳐서 참석할 수 없었습니다.. ㅠ</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/d3ac288d-84b0-4e35-8235-9e807613de18/image.png" alt=""></p>
<h2 id="5-클로징-세션-lucky-draw-이벤트">5. 클로징 세션 LUCKY DRAW 이벤트</h2>
<blockquote>
<p>갤럭시 플립, 워치, 버즈 등을 추첨을 통해서 준다 !
결과는 당연히 됐겠냐고 ㅋㅋ</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/44b5b119-8083-435e-afc9-19278cae0caa/image.png" alt=""></p>
<h2 id="6-sdc23-korea-만족도-조사-참여-이벤트">6. SDC23 Korea 만족도 조사 참여 이벤트</h2>
<blockquote>
<p>전반적으로 만족스러웠고 역시  삼성전자라는 명성에 걸맞게 많은 인파가 찾아왔다.
하지만 장소는 그정도의 인원을 수용할 정도로 쾌적하지 않은...</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/6dca1ed4-25f8-4c35-8880-c5a2494e43c9/image.png" alt=""></p>
<h1 id="🏁---마무리">🏁   마무리</h1>
<p>한줄요약 : 롱런을 목표로 열심히 살자</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/c2279148-ebbe-42f3-b0b9-23bc6b8fe725/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카카오 클라우드 스쿨 엔지니어 양성과정 3기 수료 후기]]></title>
            <link>https://velog.io/@mulrung_e/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%EC%BF%A8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4-%EC%96%91%EC%84%B1%EA%B3%BC%EC%A0%95-3%EA%B8%B0-%EC%88%98%EB%A3%8C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@mulrung_e/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%EC%BF%A8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4-%EC%96%91%EC%84%B1%EA%B3%BC%EC%A0%95-3%EA%B8%B0-%EC%88%98%EB%A3%8C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 09 Nov 2023 14:52:11 GMT</pubDate>
            <description><![CDATA[<p>2023년, 길고 긴 6개월의 카카오 클라우드 스쿨(이하, 카클) 3기 과정이 모두 종료되었습니다.</p>
<p>전체 과정을 짧게 되돌아보면서, 그간 어땠는지 한번 되돌아봐도 좋을 것같아 이렇게 작성해봅니다.🥺✨</p>
<p>📕 지원
3기 합격 후기 <a href="https://velog.io/@mulrung_e/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%EC%BF%A8">자세히 보기</a></p>
<p>광 전송망 운영 업무를 하면서 클라우드로의 전환을 생각하면서 큰 고민과 걱정을 안고 있었습니다.</p>
<p>개발을 하기싫어서 네트워크 엔지니어를 하게되었지만 클라우드전환을 하게되면
다시 개발을 해야하는 과정속에서 걱정을 하고있었고</p>
<p>그 와중에, 개인적인 사정으로 인하여 퇴사를 하게되었고 마침 그 시기에 카카오 클라우드 스쿨 모집을 하였고, 그렇게 지원하게 되었습니다.</p>
<h2 id="교육과정">교육과정</h2>
<p>실제로는 아래에 나와있는 커리큘럼대로 100% 진행이되진않았고 강사님의 재량에 따라 조금씩 변동되었습니다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/361e29ce-893c-4513-9069-12fc38b2b692/image.png" alt=""></p>
<h2 id="🏁-1달-차">🏁 1달 차</h2>
<p>기초적인 네트워크 인프라 운용 지식과 이론에 대한 강의가 진행되었고
전공(?)으로 하던 일이었기 때문에 큰 어려움 없이 따라갈수 있었습니다.
하지만 생소한 리눅스, 가상화 영역으로 들어가면서 많이 부족한것을 느꼇고
그때부터 정규 강의시간 외에도 남아서 추가로 공부를 했었습니다.
만약 과정 중 혹은 과정이 끝나자마자 취업생각이 있으신분들은 <strong>코딩테스트</strong>를 과정 시작과 동시 혹은 그전부터 준비하시는게 좋을것 같습니다.</p>
<h2 id="📚-2달-차">📚 2달 차</h2>
<p>이쯤부터 슬슬 진짜 클라우드 컴퓨팅에 관련하여 배운다고 생각이 들었던거 같습니다.
각종 가상화 기술, VM 등에 대해 다루기 시작하였고 이때부터 재미를 느끼고 개인적으로 프로젝트도 진행해보고 싶다라는 생각이 들었습니다.
어렵고, 생소하였지만 새로운 개념을 알아가는것도 재밌었고 동기분들하고 서로 질문하고 스터디하면서 많은 발전을 할 수 있었던 시간이었습니다. </p>
<h2 id="🔥-3달-차">🔥 3달 차</h2>
<p>이제야 말로만 듣던 도커, 쿠버네티스를 다루기 시작했습니다.
처음엔 당연하게도 Docker, K8S Config에 대해 숙지하는게 힘들었지만
토이프로젝트를 진행하면서 자주 접하게 되면서 빠르게 숙지를 할 수 있게 되었습니다.</p>
<ul>
<li>프로젝트간 트러블슈팅을 하면서 느낀점이 있는데 안될때 구글링을 하는것도 좋지만 공식문서를 참고해서 해결하는것이 이슈관리 측면에서도 좋고 공부도 잘되었던거 같습니다. 🧐</li>
</ul>
<p>또한 중간 중간에 RestAPI와 Python, IaC 등을 배웠지만 도커와 쿠버네티스에 집중하느라 제대로된 기억이 나진 않습니다..</p>
<h2 id="🌧️-최종프로젝트-46달-차">🌧️ 최종프로젝트 (4~6달 차)</h2>
<p>🔍 IaC를 통한 AWS인프라 프로비저닝과 CI/CD 파이프라인 구축 (2023.09 ~ 2023.11)</p>
<p>최종 프로젝트이기에, 많은시간과 열정을 들여 완성도있는 프로젝트를 만들고싶었고
아키텍쳐 구성, PoC, 자료조사, 구현 등 지하철에서 버스에서 집에가서 새벽까지도 열심히 했었다.
그런데 어느때쯤 문득 혼자만 너무 프로젝트에 모든 시간을 쏟고있고 남긴게 없다는 생각이 들었고
프로젝트 방향성도 처음에 생각했던것과는 많이 달라져 있었기에
욕심도 많이 사라지고 그 생각이 든 이후로는 개인적인 공부를 많이한거 같습니다.
아래에서도 이야기 하겠지만 프로젝트를 진행하면서 팀원들과 대화를 많이하고 방향성을 잘 잡아가길 바랍니다..</p>
<h2 id="📖-수료">📖 수료</h2>
<p>2023년, 클라우드 컴퓨팅 분야로의 첫 걸음을 함께했던 카카오 클라우드 스쿨을 수료하게 되었습니다.
너무 해보고싶었던 과정이었던 만큼 대부분의 과정에 진심으로 참여했고, 정말 많이 성장할 수 있었습니다.</p>
<p>물론 입과하는 개인마다는 목표가 모두 다를 수 있을 것이라고 생각합니다.
하지만, 저의 목표는 6개월동안 최대한 집중해서 많이 배워가는 것 이었고
어느정도 잘 이뤘다고 생각합니다.</p>
<p>물론 항상 좋은 결과만 있는 건 아니었지만 리프레쉬도 되었고 오랜만에 대학교를 다시 다니는 느낌이었습니다 ㅎ..</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/32a4ec21-8fc9-4d80-9a77-edf4d7f0e62e/image.png" alt=""></p>
<h2 id="✅-카카오-클라우드-스쿨-tip">✅ 카카오 클라우드 스쿨 Tip</h2>
<h4 id="입과의-목표를-명확히-둘-것">입과의 목표를 명확히 둘 것</h4>
<p>: 다양한 목표를 갖고 들어옵니다. 하지만 중요한 것 모호하게 했다가는 스스로도 힘들고 함께하는 사람도 힘든 인원을 많이 본거 같아요. 단순히 취업, 프로젝트로 정하라는 것이 아닙니다.
올인이면 올인인 것이 좋지만, 명확하게 몇시까지 프로젝트/수업을 하고 몇시부터는 취업준비를 하겠다는 등의 기준 말이죠.</p>
<p>함께 할 수 있는 과정이고, 또 충분히 취업퇴소하는 인원이 많은 만큼 둘 중 하나로 집중할 필요는 없습니다.</p>
<p>본인이 세운 기준은 유연함은 있지만, 선택에 후회없도록 임하면 이 카카오 클라우드 스쿨 과정이 얼마나 좋은 과정인지 이해할 수 있을 것입니다.</p>
<h4 id="같은-목표를-가진-사람을-찾을-것">같은 목표를 가진 사람을 찾을 것</h4>
<p>: 입과하면 같은 동기들과만 지내게 됩니다. 그렇기에 주변 환경 역시 굉장히 중요합니다. 그렇기에 의지할 수 있고 같이 공부할 수 있는 인원을 만들면 너무 좋습니다.
저는 의가사로 퇴소한 &#39;그&#39; 친구가 가장 기억에 남았네요 ㅎ;</p>
<p>실제 입과하자마자 만나서 수료한 후에도 좋은 연이 되고, 옆에 있으면 자극을 받고 배울 점이 많은 사람입니다.</p>
<p>많은 인원이 아니더라도 단 한두명이라도 얻어가는 것이 정말 중요하다고 느꼈습니다. 짧게는 팀을 구할 때 사용하시고, 길게는 오랫동안 마음을 나누고 의지할 동료를 찾는 것도 좋습니다.</p>
<h4 id="카카오-클라우드-스쿨의-환경을-최대한-활용할-것">카카오 클라우드 스쿨의 환경을 최대한 활용할 것</h4>
<p>: 현직의 개발 활동을 많이 해보신 강사/멘토님과 앞기수를 해본 선배 기수분들, &#39;일&#39; 하다 오신 동기분들 등 환경을 최대한 활용해보는게 중요하다고 생각합니다.</p>
<p>물론, 개개인이 다 만족스러운 환경을 얻진 못할 수도 있습니다. 하지만 개인으로 누릴 수는 없는 환경임은 확실합니다. 그렇기에 필요한 것이 있다면 적극적으로 요청하고 부족하거나 궁금한게 있다면 물어보는 것이 중요합니다.</p>
<h4 id="카카오-클라우드-스쿨이-학교가-아니라는-것을-기억할-것">카카오 클라우드 스쿨이 학교가 아니라는 것을 기억할 것</h4>
<p>: 마음가짐으로는 너무 중요하고 너무 기본인 것 같지만, 다시 한 번 중요하다고 생각했습니다.</p>
<p>카카오 클라우드 스쿨에서 교육을 받지만, 저는 이 과정을 사회생활로 생각했습니다. 실제로 현장에서 어디서든 만날 사람이라고 생각했기 때문이죠. 알바나 인턴하는 것처럼 언행과 행동에 조심하려고 했습니다만 ... 
<img src="https://velog.velcdn.com/images/mulrung_e/post/ad76ddd0-4964-41e3-8241-e5be9ec7f8e2/image.png" alt=""></p>
<h2 id="🌈-마무리">🌈 마무리</h2>
<p>클라우드 분야를 배우고 싶다는 생각에 큰 결심으로 카카오 클라우드 스쿨에 입과했고 수료하게 되었네요.
오랜만에 많은사람들하고 수업을듣고 프로젝트를 진행해보니 상당히 좋은 리프레쉬가 된듯합니다.</p>
<p>저는 23년 수료를 하고, 한동안은 자택경비원으로 지내다가 내년부터 다시 취업준비를 하지 않을까 싶네요.
제가 겪었던 어려움과 부족한 점을 조금이라도 해결하고,
본인 인생에 임팩트나 전환점이 되거나 스스로에게 자신감이 생길 수 있는 교육생이 단 한명이라도 있다면 좋겠다는 바랍입니다.</p>
<p>카카오 클라우드 스쿨을 지원하거나, 지금 하고 계신 분, 또 동기/선후배 분들까지 모두 고생많으셨습니다 !</p>
<p>열심히 하셨잖아, 한잔해</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/cf8da18e-01ef-47d0-8a36-e32b29113075/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker + Kubernetes를 통한 EFK 모니터링 구축]]></title>
            <link>https://velog.io/@mulrung_e/Docker-EKS%EB%A5%BC-%ED%86%B5%ED%95%9C-EFK-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@mulrung_e/Docker-EKS%EB%A5%BC-%ED%86%B5%ED%95%9C-EFK-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Mon, 06 Nov 2023 15:18:27 GMT</pubDate>
            <description><![CDATA[<h1 id="0-efk">0. EFK</h1>
<h2 id="elasticsearch--fluentd--kibana">Elasticsearch + Fluentd + Kibana</h2>
<ul>
<li><p>Fluentd: 로그 수집</p>
</li>
<li><p>Elasticsearch: 수집된 로그를 검색 및 분석하여 저장</p>
</li>
<li><p>Kibana: ES를 통해 데이터 시각화</p>
</li>
</ul>
<hr>
<h2 id="구성환경">구성환경</h2>
<ul>
<li><p>VMware Ubuntu20.04 이미지 활용</p>
</li>
<li><p>Manager Node에서 ElasticSearch, Kibana를 Docker Container로 실행</p>
</li>
<li><p>Fluentd를 Daemonset으로 K8S 클러스터에 배포하여 log를 수집</p>
</li>
</ul>
<hr>
<h2 id="사전조건">사전조건</h2>
<ul>
<li>도커와 쿠버네티스가 설치되어 있어야한다.</li>
<li>편의를 위해 방화벽을 끄고 진행한다.</li>
<li>Dockerhub를 이용하여 이미지를 만들고 저장할 것이므로 docker login을 미리 해준다.</li>
<li>ElasticSearch 컨테이너 Exited를 방지하기위해  vm.max_map_count를 262144로 변경 해주어야 한다.</li>
</ul>
<hr>
<h2 id="진행과정">진행과정</h2>
<ol>
<li>ElasticSearch, Kibana Docker로 Manager Node에 Container로 실행</li>
<li>Nginx Pod를 Deployment로 배포</li>
<li>Fluentd를 Daemonsets로 배포</li>
<li>Kibana로 정상적으로 동작하는지 확인</li>
<li>보완사항</li>
</ol>
<hr>
<h1 id="1-elasticsearch-kibana-docker로-띄우기">1. ElasticSearch, Kibana Docker로 띄우기</h1>
<h2 id="1-1-elasticsearch">1-1. ElasticSearch</h2>
<h4 id="구성간에-편의를-위해-http-통신이-되게끔-진행하였습니다">구성간에 편의를 위해 http 통신이 되게끔 진행하였습니다.</h4>
<p>Docker 작업전 아래 와 같이 입력하여 vm.max_map_count를 변경합니다.
<a href="https://www.gimsesu.me/elasticsearch-change-vm-max-map-count">[ Ref ] - vm.max_map_count</a></p>
<pre><code>sudo sysctl -w vm.max_map_count=262144
</code></pre><h4 id="es-dockerfile-작성">ES Dockerfile 작성</h4>
<pre><code># 베이스 이미지로부터 시작합니다.
FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.1

# Root 권한으로 전환하여 패키지를 설치합니다.
USER root

# Elasticsearch 컨테이너에서 Vim을 설치하는 명령어를 실행합니다.
RUN bin/elasticsearch-plugin install analysis-phonetic

# Docker 이미지 내에서 실행될 명령어를 지정합니다.
CMD [&quot;/usr/share/elasticsearch/bin/elasticsearch&quot;]</code></pre><h4 id="elasticsearch-docker-build--run">ElasticSearch Docker build &amp; Run</h4>
<pre><code>docker build -t my_elasticsearch .
docker run -d -p 9200:9200 -e &quot;discovery.type=single-node&quot; -e &quot;http.host=0.0.0.0&quot; my_elasticsearch
</code></pre><p>우선 설정 파일을 확인하기위해 컨테이너 내부로 진입하자</p>
<p>여기서 확인해야 할 파일은 ~/config/elasticsearch.yml 입니다.</p>
<pre><code>sudo docker exec -it 엘라스틱서치 컨테이너명 /bin/bash</code></pre><pre><code>elasticsearch@c00a7b999cf1:~$ cat config/elasticsearch.yml
cluster.name: &quot;docker-cluster&quot;
network.host: 0.0.0.0

#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#The following settings, TLS certificates, and keys have been automatically
#generated to configure Elasticsearch security features on 30-10-2023 17:49:37
#--------------------------------------------------------------------------------

###Enable security features
xpack.security.enabled: true

xpack.security.enrollment.enabled: true

###Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

###Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------</code></pre><p>여기서 변경해야 할 값은 xpack.security.enabled 값으로 true에서 false로 변경해주면 됩니다.</p>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html">[ Ref ]. ElasticSearch Security-Settings</a></p>
<p>ES 보안 기능을 활성화하는 값으로 false로 비활성화하자.</p>
<p>이는 보안에 대해 사용하지 않는 설정이므로 주의하여 사용할 필요가 있습니다.</p>
<hr>
<h2 id="1-2-kibana">1-2. Kibana</h2>
<h4 id="kibana-docker-run">Kibana Docker run</h4>
<ul>
<li>Masternode(BastionHost)의 IP를 아래에 넣어서 실행시켜줘야합니다.</li>
</ul>
<pre><code>docker run -d -p 5601:5601 -e &quot;ELASTICSEARCH_HOSTS=http://BastionHost IP:9200&quot; docker.elastic.co/kibana/kibana:7.10.1
</code></pre><h2 id="1-3-container-상태-확인">1-3. Container 상태 확인</h2>
<h4 id="elasticsearch">elasticsearch</h4>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/de34dfc9-dce2-4214-8a22-32fa8bd9eeb1/image.png" alt=""></p>
<h4 id="kibana">kibana</h4>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/8b4ec5ea-a97a-4eab-8695-aca007aebdc9/image.png" alt=""></p>
<hr>
<h1 id="2-nginx-배포하기">2. Nginx 배포하기</h1>
<p>먼저 Access.log를 Fluentd가 읽을수 있는 Json 형식으로 바꾼 nginx 이미지를 만들어 주어야합니다.</p>
<h4 id="dockerfile">Dockerfile</h4>
<pre><code># Use an official Nginx image as the base image
FROM nginx:latest

# Copy the custom Nginx configuration that enables JSON format logs
COPY nginx.conf /etc/nginx/nginx.conf</code></pre><hr>
<h4 id="nginxconf">nginx.conf</h4>
<p>이 부분에서 access_log를 사용자 설정으로 바꿧는데 그 이유에 대해서는 맨 아래에서 설명하겠습니다.</p>
<pre><code>

events {
    worker_connections 1024;
}

http {
    log_format json_logs escape=json
        &#39;{&quot;time_local&quot;: &quot;$time_iso8601&quot;, &#39;
        &#39;&quot;remote_addr&quot;: &quot;$remote_addr&quot;, &#39;
        &#39;&quot;request_method&quot;: &quot;$request_method&quot;, &#39;
        &#39;&quot;request_uri&quot;: &quot;$request_uri&quot;, &#39;
        &#39;&quot;status&quot;: $status, &#39;
        &#39;&quot;body_bytes_sent&quot;: $body_bytes_sent, &#39;
        &#39;&quot;http_referer&quot;: &quot;$http_referer&quot;, &#39;
        &#39;&quot;http_user_agent&quot;: &quot;$http_user_agent&quot;}&#39;;

    access_log /var/log/nginx/mulrung.log json_logs;

    server {
        listen 80;
        server_name localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }</code></pre><h4 id="build-및-push">Build 및 Push</h4>
<pre><code>#본인의 Dockerhub repo와 이미진 네임 태그를 지정해서 빌드를한뒤 push를하자
docker build -t  dockerhubID/name:Tag .
docker push dockerhubID/name:Tag </code></pre><h4 id="nginxyaml">nginx.yaml</h4>
<ul>
<li>Mount를 시킨이유는 fluentd와 nginx간 Host의 디렉토리에서 log를 읽고 쓰게 하기 위함이다.<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3  # 원하는 파드 수로 설정
selector:
  matchLabels:
    app: nginx
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: dockerhubID/name:Tag
      ports:
      - containerPort: 80
      volumeMounts:
      - name: varlog
        mountPath: /var/log/nginx
    volumes:
    - name: varlog
      hostPath:
        type: DirectoryOrCreate
        path: /var/log/
</code></pre></li>
</ul>
<pre><code>#### 배포해보자
</code></pre><p>kubectl apply -f nginx.yaml</p>
<pre><code>#### 실제로 nginx가 띄워진 Node에 mount가 되었는지 확인해보자</code></pre><p>root@worker1:~/Dockerfile# ls /var/log/ | grep mulrung
mulrung.log</p>
<pre><code>
 ---

# 3. fluentd Daemonset으로 배포하기
#### fluentd daemonset 으로 설치하기 위해 메니페스트 파일을 다운받는다. </code></pre><p>curl -LJ -o fluentd.yaml <a href="https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch-rbac.yaml?raw=true">https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch-rbac.yaml?raw=true</a></p>
<pre><code>
다운받은 fluentd.yaml에서 FLUENT_ELASTICSEARCH_HOST의 value 값을 ElasticSearch를 띄운 호스트의 ip로 변경하면 됩니다.

      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: &quot;[elasticsearch 호스트 ip]&quot;
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: &quot;9200&quot;
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: &quot;http&quot;

그리고, 이 포스팅에서는 nginx의 Log를 확인할것이므로 수정한 fleunt.conf가 들어간 이미지를 새로 만든다.
-   path /var/log/mulrung.log -&gt; nginx를 배포할때 보면 알수 있듯이 nginx의 access 로그를 사용자 설정으로 만든것이다.
- host의 IP부분은 수정해야한다.


#### fluent.conf
</code></pre><source>
  @type tail
  @id nginx_access
  path /var/log/mulrung.log
  pos_file /var/log/td-agent/nginx-access.log.pos
  tag nginx.access
  format json
  read_from_head true
</source>

<match nginx.access>
  @type elasticsearch
  host [elasticsearch 호스트 ip]
  port 9200
  index_name nginx_access
  type_name nginx_access
  flush_interval 5s
</match>
```
#### Dockerfile

<pre><code># 다운 받은 메니패스트의 기본 이미지명
FROM fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch

# 수정한 conf 파일 Copy
COPY fluent.conf /fluentd/etc/fluent.conf
</code></pre><pre><code>#본인의 Dockerhub repo와 이미진 네임 태그를 지정해서 빌드를한뒤 push를하자
docker build -t  dockerhubID/name:Tag .
docker push dockerhubID/name:Tag </code></pre><h4 id="그-이후-fleuntdyaml의-이미지를-hub에-푸쉬한-이미지로-변경한다">그 이후 fleuntd.yaml의 이미지를 Hub에 푸쉬한 이미지로 변경한다.</h4>
<pre><code>containers:
      - name: fluentd
        image: dockerhubID/name:Tag
</code></pre><h4 id="배포해보자">배포해보자</h4>
<pre><code>kubectl apply -f fluentd.yaml</code></pre><hr>
<h1 id="4-확인">4. 확인</h1>
<ul>
<li>pod및 Contaienr가 정상적으로 Running중 임을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/fd40820c-a4c1-484e-a2cd-31742cb95f1f/image.png" alt="">
<img src="https://velog.velcdn.com/images/mulrung_e/post/23d5577a-d810-49f5-94b7-c50b702bd36a/image.png" alt=""></li>
</ul>
<ul>
<li>kibana의 Stack Management &gt; Index Management
nginx*로 해서 데이터가 쌓이는 것을 확인할 수 있다.
Create Index pattern을 통해 인덱스 패턴을 만들어주자.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/c554a7c8-b9c7-484e-8801-23fa32f3a075/image.png" alt=""></p>
<ul>
<li>Kibana의 Index Pattern에서 nginx*로 설정한 후 discover에서 확인해보자.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/e1ca79d9-f466-4685-a655-683aa24896f4/image.png" alt=""></p>
<ul>
<li>curl을 통해 nginx에 접속을하게되면 log가 쌓이는것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/99532e24-dd4f-4ddb-990b-67dcf70704ac/image.png" alt=""></li>
</ul>
<hr>
<h1 id="5-사연">5. 사연</h1>
<p>사실 이 포스팅은 원래 EKS 환경에서 진행하려고했었다.
하지만 EKS에서는 위와같은 방법으로는 되지않았고 그 원인을 찾다가 지쳐서 로컬환경에서 진행한 내용으로 포스팅하게 되었습니다..</p>
<h2 id="해결해야할-문제들">해결해야할 문제들</h2>
<ol>
<li>쿠버네티스(?) 혹은 EKS 환경에서 nginx의 기본 access 로그인 access.log가 접근이 안된다. 그래서 파일을 새로만들었습니다.</li>
</ol>
<p>-&gt; stdout 설정으로 인하여 contaienrs의 로그에 심볼릭링크가 걸려있는듯하다.(?)
2. EKS에서는 동일하게 진행하여도 왜 안되는지 모르겠다.
-&gt; gid, uid 기타 설정 생각나는건 다해봤는데 안된다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컨테이너 네트워크 인터페이스 (CNI)]]></title>
            <link>https://velog.io/@mulrung_e/2.-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-CNI</link>
            <guid>https://velog.io/@mulrung_e/2.-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-CNI</guid>
            <pubDate>Mon, 06 Nov 2023 07:53:27 GMT</pubDate>
            <description><![CDATA[<p>CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 Container Network Interface는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준이다.</p>
<p>다양한 형태의 컨테이너 런타임과 오케스트레이터 사이의 네트워크 계층을 구현하는 방식이 다양하게 분리되어 각자만의 방식으로 발전하게 되는 것을 방지하고</p>
<p>공통된 인터페이스를 제공하기 만들어 졌고, 쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용한다.</p>
<p>쿠버네티스 뿐만 아니라 Amazon ECS, Cloud Foundry 등 컨테이너 런타임을 포함하고 있는 다양한 플랫폼들은 CNI를 사용하고 있으며,</p>
<p>쿠버네티스는 기본적으로 &#39;kubenet&#39; 이라는 자체적인 CNI 플러그인을 제공하지만 네트워크 기능이 매우 제한적인 단점이 있다.</p>
<p>그 단점을 보완하기 위해, 3rd-party 플러그인을 사용하는데 그 종류에는 Flannel, Calico, Weavenet, NSX 등 다양한 종류의 3rd-party CNI 플러그인들이 존재한다.</p>
<h1 id="cni의-필요성"><strong>CNI의 필요성</strong></h1>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/118b4169-c263-48cc-a75d-80267c450946/image.png" alt=""></p>
<p>예를들어, 위 그림과 같이 컨테이너 기반으로 동작하는 애플리케이션에 Web UI 컨테이너, Login 컨테이너, 장바구니 Cart 컨테이너 이렇게 멀티 호스트로 구성하였을때 </p>
<p>Web UI, Login, Cart 컨테이너는 서로 간에 당연히 통신이 되어야 한다.</p>
<p>UI 컨테이너(172.17.0.2) 에서 Login 컨테이너(172.17.0.2) 로 통신을 하기 위해 트래픽을 보낸다고 가정했을때</p>
<p>정상적인 통신 패턴이라면 UI 컨테이너는 veth0 인터페이스를 통해 docker0 라는 브릿지 인터페이스를 타고 NAT처리 되어 worker node #1의 물리 인터페이스인 ens160의 IP(10.200.155.22) 로 나간다.</p>
<p>그 후,  worker node #2 의 물리 인터페이스인 ens160 (10.200.155.23) 으로 들어와 docker0 브릿지 인터페이스를 통해 Login 컨테이너의 veth0으로 들어온다.</p>
<p>그러나 위 그림에서 보듯이, 두 컨테이너의 IP는 동일하기 때문에 UI 컨테이너에서 Login 컨테이너로 통신을 시도하면 자기 자신인 UI 컨테이너 로컬로 통신을 시도 할 것이고</p>
<p>위와 같은 멀티 호스트로 구성되어 있는 컨테이너 끼리 통신을 하기 위해서는 CNI가 반드시 설치되어 있어야한다.</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/0f960f07-a536-4995-ad5a-3cd1d6a44bf9/image.png" alt=""></p>
<p>CNI는 Calico, Weavenet, AWS CNI 등 매우 다양한 종류가 있다.</p>
<p>위 그림에서는 weave net이라고 하는 CNI가 브릿지 인터페이스를 만들고 컨테이너 네트워크 대역대를 나눠주며</p>
<p>라우팅 테이블까지 생성하여 UI 컨테이너가 Login, Cart 컨테이너로 통신하는데 전혀 문제 없도록 지원한다.</p>
<h1 id="cni에서-사용되는-네트워크-모델"><strong>CNI에서 사용되는 네트워크 모델</strong></h1>
<p>CNI Provider는 <strong>VXLAN(Virtual Extensible Lan), IP-in-IP</strong> 과 같은 캡슐화된 네트워크 모델 또는 <strong>BGP (Border Gateway Protocol)</strong>와 같은 캡슐화 되지 않은 네트워크 모델을 사용하여 네트워크 패브릭을 구현한다.</p>
<h1 id="cni-3rd-party-플러그인-종류-및-지원하는-기능"><strong>CNI 3rd-Party 플러그인 종류 및 지원하는 기능</strong></h1>
<table>
<thead>
<tr>
<th>Provider</th>
<th>NetworkModel</th>
<th>RouteDistribution</th>
<th>NetworkPolicy</th>
<th>Mesh</th>
<th>ExternalDatastore</th>
<th>Encryption</th>
<th>Ingress/Egress Policies</th>
<th>CommercialSupport</th>
</tr>
</thead>
<tbody><tr>
<td>Calico</td>
<td>Layer 3</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Etcd</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Canal</td>
<td>Layer 2vxlan</td>
<td>N/A</td>
<td>Yes</td>
<td>No</td>
<td>Etcd</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Flannel</td>
<td>vxlan</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>None</td>
<td>No</td>
<td>No</td>
<td>No</td>
</tr>
<tr>
<td>kopeio-networking</td>
<td>Layer 2vxlan</td>
<td>N/A</td>
<td>No</td>
<td>No</td>
<td>None</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
</tr>
<tr>
<td>kube-router</td>
<td>Layer 3</td>
<td>BGP</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
</tr>
<tr>
<td>romana</td>
<td>Layer 3</td>
<td>OSPF</td>
<td>Yes</td>
<td>No</td>
<td>Etcd</td>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td>Weave Net</td>
<td>Layer 2vxlan</td>
<td>N/A</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Q] 동일태그로 이미지 빌드시 덮어쓰기가 되나요?]]></title>
            <link>https://velog.io/@mulrung_e/Q-%EB%8F%99%EC%9D%BC%ED%83%9C%EA%B7%B8%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C%EC%8B%9C-%EB%8D%AE%EC%96%B4%EC%93%B0%EA%B8%B0%EA%B0%80-%EB%90%98%EB%82%98%EC%9A%94</link>
            <guid>https://velog.io/@mulrung_e/Q-%EB%8F%99%EC%9D%BC%ED%83%9C%EA%B7%B8%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C%EC%8B%9C-%EB%8D%AE%EC%96%B4%EC%93%B0%EA%B8%B0%EA%B0%80-%EB%90%98%EB%82%98%EC%9A%94</guid>
            <pubDate>Sun, 05 Nov 2023 16:33:06 GMT</pubDate>
            <description><![CDATA[<h2 id="1-dockerfile의-내용을-변경하여-동일태그로-빌드하여-테스트">#1. Dockerfile의 내용을 변경하여 동일태그로 빌드하여 테스트</h2>
<p>@ Dockerfile 작성</p>
<pre><code># 사용할 베이스 이미지를 선택
FROM ubuntu:latest

# 이미지 내에서 명령어 실행
RUN apt-get update
RUN apt-get install -y python3

# 컨테이너가 시작될 때 실행할 명령어
CMD [&quot;python3&quot;, &quot;-c&quot;, &quot;print(&#39;Hello, Docker!&#39;)&quot;]
</code></pre><p>@ v1.0 태그로 Build 진행</p>
<pre><code>docker build -t my-simulation-image:v1.0 .
</code></pre><p>@ 이미지가 정상적으로 Build 되었는지 확인
<img src="https://velog.velcdn.com/images/mulrung_e/post/5cb0844b-4cd9-4436-94c8-a2540919a1f6/image.png" alt=""></p>
<p>@ 이미지 실행 결과 Hello, Docker!가 정상적으로 출력된다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/7e633f03-f758-4d9d-b739-55eb16c68a1e/image.png" alt=""></p>
<p>@Dockerfile의 Print 구문을 수정해보자</p>
<pre><code># 사용할 베이스 이미지를 선택
FROM ubuntu:latest

# 이미지 내에서 명령어 실행
RUN apt-get update
RUN apt-get install -y python3

# 컨테이너가 시작될 때 실행할 명령어
CMD [&quot;python3&quot;, &quot;-c&quot;, &quot;print(&#39;Hello, yourface&#39;)&quot;]</code></pre><p>@ 동일하게 v1.0 태그로 Build를 해보자</p>
<pre><code>docker build -t my-simulation-image:v1.0 .</code></pre><p><img src="https://velog.velcdn.com/images/mulrung_e/post/8d05c010-7e79-444c-aa2a-22c290f3f4b0/image.png" alt=""></p>
<p>@ 동일 태그의 이미지를 실행해보면 변경사항이 적용된걸 확인할 수 있다
<img src="https://velog.velcdn.com/images/mulrung_e/post/de0b86b2-4dbc-4694-ad15-6ea4db09d67c/image.png" alt=""></p>
<hr>
<h2 id="2-dockerfile의-내용변경없이-참조하는-쉘스크립트의-내용-변경하여-테스트">#2. Dockerfile의 내용변경없이 참조하는 쉘스크립트의 내용 변경하여 테스트</h2>
<p>@ Dockerfile 작성</p>
<pre><code># 사용할 베이스 이미지를 선택
FROM ubuntu:latest

# 이미지 내에서 명령어 실행
RUN apt-get update
RUN apt-get install -y bash

# 스크립트 파일 복사
COPY my_script.sh /usr/local/bin/

# 스크립트 실행 권한 부여
RUN chmod +x /usr/local/bin/my_script.sh

# 컨테이너가 시작될 때 실행할 명령어 (스크립트 실행)
CMD [&quot;/usr/local/bin/my_script.sh&quot;]
</code></pre><p>@ Shell 스크립트 작성</p>
<pre><code>#!/bin/bash

echo &quot;This is a simple Shell script executed in a Docker container.&quot;
echo &quot;Hello, Docker!&quot;</code></pre><p>@ v1.0 태그로 Build 진행</p>
<pre><code>docker build -t my-script-container:v1.0 .</code></pre><p>@ 이미지 실행 결과, 정상적으로 Shell 스크립트의 내용이 보인다
<img src="https://velog.velcdn.com/images/mulrung_e/post/0d8b9147-4d3c-4cd2-b505-e6e24c8395af/image.png" alt=""></p>
<p>@ Shell 스크립트의 내용을 수정한 후 동일 태그로 빌드해보자</p>
<pre><code>#!/bin/bash

echo &quot;This is a simple Shell script executed in a Docker container.&quot;
echo &quot;Hello, mulrung!&quot;

---
docker build -t my-script-container:v1.0 .
</code></pre><p>@ 이미지 실행 결과, 변경사항이 잘 적용된다.
<img src="https://velog.velcdn.com/images/mulrung_e/post/d6d2de3c-2977-4b94-a0d9-59e288b26497/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Certified Kubernetes Administrator(CKA) 자격증 취득 후기]]></title>
            <link>https://velog.io/@mulrung_e/Certificate</link>
            <guid>https://velog.io/@mulrung_e/Certificate</guid>
            <pubDate>Sun, 05 Nov 2023 07:04:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/mulrung_e/post/d65aa287-ca17-41c7-a440-c9dd3df17bdf/image.jpg" alt=""></p>
<p>카카오 클라우드 스쿨 수료 후 두번째로 취득한 자격증입니다.
쿠버네티스에 대해 조금더 알아보고 사용해보고 싶어 약 1달간의 공부끝에 CKA 자격증을 취득하였습니다.</p>
<h2 id="📖-공부-방법">📖 공부 방법</h2>
<p>모두들 활용하는 유데미의 뭄샤드님의 강의를 활용하여 준비하였으며 시험 응시시 접속할 수 있는 killer.sh은 단순히 환경을 체험하는 용도로만 사용하였습니다.</p>
<p>특별한 공부방법은 없으며 강의에 있는 모든 카테고리를 Kubedocs를 참고하여 풀 수 있을정도로만하면 별 문제없이 합격할 수 있다고 생각듭니다.</p>
<h3 id="🎯-빈출-유형">🎯 빈출 유형</h3>
<ol>
<li>Create PersistentVolumeClaim &amp; Patch Capacity</li>
<li>Node Troubleshooting</li>
<li>Cluster update Only Master (except etcd, cni, manager)</li>
<li>Etcd Backup &amp; Restore</li>
<li>Ingress</li>
<li>NetworkPolicy</li>
<li>Deployment Scale Up</li>
<li>Create MultiContainer</li>
<li>RBAC (ServiceAccount, Clusterrole, ClusterroleBinding)</li>
<li>Sidecar</li>
<li>Node Drain</li>
<li>Extract Error Logs</li>
<li>Write Pod name using the most CPU</li>
<li>Number of Ready Nodes without taitns</li>
<li>Node Selector</li>
<li>Service (Container port name)</li>
<li>Create pv, pvc, pod</li>
</ol>
<h2 id="💡-시험-tip">💡 시험 Tip</h2>
<p>CKA 시험의 만료일은 구입 기간으로부터 1년 뒤이므로, 만료되기 전까지 자신이 가능한 시간대로 선택하여 고르면 됩니다. 시험 날짜는 응시 하루 전까지 자유롭게 변경할 수 있습니다. 또한, 불합격하더라도 1번의 재시험을 볼 수 있는 기회를 제공해줍니다.</p>
<p>시험 시간은 총 2시간이 주어지며, 주어진 시간보다 빠르게 시험을 마쳤다면 중도에 종료할 수 있습니다. 참고로, 본인 확인을 위한 신분증을 사전에 지참해야 합니다. 감독관이 외국인이므로, 주민등록증보다는 여권을 준비하는 것을 권장합니다.</p>
<p>시험 전에 반드시 Check System Requirements 메뉴에서 자신이 시험을 응시하는 환경이 적절하게 세팅되었는지 확인해야 합니다.</p>
<p>저는 Mac (Chrome)환경에서 시스템 체크를 하였습니다.
-&gt; <strong>현재 23.12기준 Safari를 이용하여 체크하면 OS버전 체크가 정상적으로 안됩니다.</strong></p>
<hr>
<p>다음은 시험 당일에 반드시 숙지하고 있어야 할 사항들입니다.</p>
<p>저는 편의를 위해 스터디카페 그룹룸을 빌려 응시를 하였으며 시험시간 앞뒤로 30분 여유를두어 예약을 하였습니다.</p>
<p>시험 시작 30분전부터 Test Exam 메뉴가 활성화되며 PSI브라우저를 설치한 후
여권 등의 신분증명을 한다음 감독관이 웹캠을 통해 주변 환경에 대한 점검을 진행합니다.</p>
<p>그리고나면 시험이 진행되는데 PSI브라우저 안에서만 시험을 응시할 수 있으므로 killer.sh을 통해 충분히 환경에대해 적응을 할 필요가 있습니다.</p>
<p>또한 각 문제마다 <strong>kubectl config user-context</strong> 명령을 통해 매번 특정 컨텍스트로 전환해야 하므로, 컨텍스트 전환이 제대로 이뤄졌는지 꼭 확인해야 합니다.</p>
<p>문제 하단의 flag 기능을 통해 잘 풀리지 않거나 오래 걸릴 것으로 예상되는 문제들은 체크해놓을 수 있습니다.</p>
<h2 id="🌈-마무리">🌈 마무리</h2>
<p>1달동안 준비하였지만 순 공부시간은 100시간도 안되었던거 같습니다.
난이도는 저 같은 사람도 시험을 본후 &quot;별일없으면 100점이겠다&quot; 라고 생각할 정도니 편한마음으로 공부하시고 응시하시면 될거같습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IaC]]></title>
            <link>https://velog.io/@mulrung_e/IaC</link>
            <guid>https://velog.io/@mulrung_e/IaC</guid>
            <pubDate>Sun, 05 Nov 2023 07:01:07 GMT</pubDate>
            <description><![CDATA[<p>IaC</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카카오 클라우드 스쿨 엔지니어 양성과정 3기 합격 후기]]></title>
            <link>https://velog.io/@mulrung_e/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%EC%BF%A8</link>
            <guid>https://velog.io/@mulrung_e/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%EC%BF%A8</guid>
            <pubDate>Sun, 05 Nov 2023 06:56:21 GMT</pubDate>
            <description><![CDATA[<p><a href="http://kakaocloudschool.rapa.or.kr/ft/main.do">카카오 클라우드 스쿨 4기 지원</a></p>
<h1 id="지원-계기">지원 계기</h1>
<p>클라우드 전환을 생각하여 기존에 하던 광 전송망 운영 업무를 그만두고 카카오 클라우드 스쿨에 지원하게 되었습니다.
-&gt; 카카오 클라우드 스쿨만 보고 퇴사를 결심한건 아니고 그 외에 복합적인 환경을 생각했습니다.</p>
<h1 id="서류">서류</h1>
<p>퇴사 후 귀국하는 비행기에서 간단하게 작성했던걸로 기억이 납니다.
어렴풋이 기억나는 내용들은 자격증, 외국어 능력 등 보통의 지원서와 같았고
적당하게 적당한 내용으로 작성하면 별 문제 없이 통과될듯합니다.</p>
<h1 id="필기">필기</h1>
<p>온라인으로 진행을하였는데 인터넷 검색이 가능해서 큰 어려움은 없었습니다.
면접에서 물어볼수도 있으니 나온 문제를 기억해두고 모르는것은 공부해두면 도움이 될듯합니다.</p>
<h1 id="면접">면접</h1>
<p>편안한 분위기에서 진행되며, 자소서에 적은 프로젝트 및 경험을 기반으로 질문을 하십니다.
그 외에 CS, 네트워크, 백엔드, 프론트엔드에 관한 질문을 받을 수도 있으니 간단하게 공부해가면 좋을듯합니다.
ex) OS, Rest API, 3 Tier Architecture, Protocol etc..</p>
<p>본인이 클라우드 컴퓨팅, 가상화에 대해 공부하였다면 해당 내용에 대한 질문을 유도하면 더 좋을듯 합니다.</p>
<h1 id="qa">Q&amp;A</h1>
<p>궁금한 사항이 있으면 댓글 부탁드립니다.</p>
<p>수료 하게되면 과정 후기도 남기겠습니다.</p>
<p>감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker & Container Image]]></title>
            <link>https://velog.io/@mulrung_e/Docker</link>
            <guid>https://velog.io/@mulrung_e/Docker</guid>
            <pubDate>Sun, 05 Nov 2023 06:51:22 GMT</pubDate>
            <description><![CDATA[<h1 id="들어가기전에">들어가기전에</h1>
<p>애플리케이션은 그것이 실행되는 호스트가 반드시 충족해야 하는 종속성이 있으며 컨테이너 시대 이전의 개발자들은</p>
<p>이러한 작업을 부가적인 방법으로 수행했다.
ex) 자바 애플리케이션은 데이터베이스와 통신하기위해 방화벽 규칙이 함께 실행되는 JVM이 필요하다.</p>
<p>결론적으로 도커는 컨테이너를 실행하는 방법 중 하나이다.</p>
<p>아래에서 도커, 컨테이너, 이미지에 대해 알아보자</p>
<h1 id="docker란">Docker란?</h1>
<p>Docker는 애플리케이션 구축, 구현 및 테스트를 위해 격리된 가상화 환경을 생성하는 서비스형 플랫폼이다.</p>
<p>Docker는 컨테이너 엔진으로 리눅스 커널 기능을 사용하여 운영 체제 위에 컨테이너를 만들고,</p>
<p>Docker 자체는 서비스의 컨테이너를 관리하는 데몬으로 실행된다.</p>
<ul>
<li>Linux 커널의 도커 엔진</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/fccbfd37-c4f8-44ac-8cb8-1d3eb60c33ca/image.png" alt=""></p>
<ul>
<li>Ref. <a href="https://ragin.medium.com/docker-what-it-is-how-images-are-structured-docker-vs-vm-and-some-tips-part-1-d9686303590f">https://ragin.medium.com/docker-what-it-is-how-images-are-structured-docker-vs-vm-and-some-tips-part-1-d9686303590f</a></li>
</ul>
<h1 id="docker-image란">Docker image란?</h1>
<p>도커에서는 애플리케이션을 포장 및 전송하기 위해 &quot;docker image&quot;를 사용한다.</p>
<p>Docker image는 파일로 어플리케이션 실행에 필요한 독립적인 환경을 포함하며, 런타임 환경을 위한 일종의 템플릿이다.</p>
<p>도커 이미지는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다.</p>
<p>이미지는 읽기 전용이므로 스냅샷이라고도 하며, 특정 시점의 애플리케이션과 가상 환경을 나타낸다.</p>
<p>이러한 일관성은 도커의 큰 특징 중 하나로 개발자가 안정적이고 균일한 조건에서 소프트웨어를 테스트하고 실험할 수 있도록 한다.</p>
<p>이미지는 템플릿일 뿐이므로 시작하거나 실행할 수 없다. 컨테이너는 실행 중인 이미지일 뿐이기 때문이다.</p>
<p>컨테이너를 생성하면 쓰기 가능한 레이어가 immutable image(불변 이미지) 위에 추가된다. 즉, 컨테이너는 수정이 가능하다.</p>
<p>컨테이너를 생성하는 이미지 베이스는 별도로 존재하며 변경할 수 없다.</p>
<p>컨테이너 환경을 실행할 때는 기본적으로 컨테이너 내부에 해당 파일 시스템(도커 이미지)의 읽기-쓰기 복사본을 만든다.</p>
<p>이렇게 하면 이미지 전체 복사본을 수정할 수 있는 컨테이너 레이어가 추가된다.</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/aacdc9aa-1cc2-43f2-bcc8-772a3396bbb6/image.png" alt=""></p>
<ul>
<li>Ref. <a href="https://phoenixnap.com/kb/docker-image-vs-container">https://phoenixnap.com/kb/docker-image-vs-container</a></li>
</ul>
<p>하나의 베이스 이미지에서 도커 이미지를 무제한으로 생성할 수 있다.</p>
<p>이미지의 초기 상태를 변경하고 기존 상태를 저장할 때마다 추가 레이어가 있는 새 템플릿을 만든다.</p>
<p>따라서 도커 이미지는 여러 개의 레이어로 구성될 수 있으며, 각각은 다르지만 이전 레이어에서 비롯된다.</p>
<p>이미지 계층은 컨테이너 계층을 사용하여 가상 환경을 시작할 때 추가된 읽기 전용 파일을 나타낸다.</p>
<ul>
<li><p>Ref. <a href="https://ragin.medium.com/docker-what-it-is-how-images-are-structured-docker-vs-vm-and-some-tips-part-1-d9686303590f">https://ragin.medium.com/docker-what-it-is-how-images-are-structured-docker-vs-vm-and-some-tips-part-1-d9686303590f</a></p>
</li>
<li><p>Docker image creation</p>
</li>
</ul>
<pre><code class="language-java">docker build -t=myimage .</code></pre>
<h1 id="docker-container란">Docker container란?</h1>
<p>사용자가 기본 시스템에서 애플리케이션을 분리할 수 있는 가상화된 런타임 환경이다.</p>
<p>이러한 컨테이너는 응용프로그램을 빠르고 쉽게 시작할 수 있는 portable units 이다.</p>
<p>중요 기능은 컨테이너 내부에서 실행되는 컴퓨팅 환경의 표준화다. (standardization of the computing environment running inside the container.)</p>
<p>응용 프로그램이 동일한 환경에서 작동하도록 할 뿐 아니라 다른 사람과의 공유도 단순화한다.</p>
<p>컨테이너는 자율적(autonomous)이기 때문에 strong isolation을 제공하며 서로 방해하지 않는 격리된 환경을 제공한다.</p>
<p>하드웨어 수준에서 가상화가 이루어지는 VM과 달리 컨테이너는 애플리케이션 계층에서 가상화된다.</p>
<p>하나의 머신을 활용하고 커널을 공유하며 분리된 프로세스를 실행하기 위한 운영 체제를 가상화할 수 있다.</p>
<p>따라서 컨테이너가 매우 가벼워져 리소스를 많이 사용하지 않을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/mulrung_e/post/59795485-6309-4735-afde-9f483ceeee07/image.png" alt=""></p>
<ul>
<li><p>Ref. <a href="https://phoenixnap.com/kb/docker-image-vs-container">https://phoenixnap.com/kb/docker-image-vs-container</a></p>
</li>
<li><p>Docker container creation</p>
</li>
</ul>
<pre><code class="language-java">docker run -d --name mycontainer -p 8080:8080 myimage</code></pre>
<h1 id="도커-이미지와-컨테이너의-차이점은-무엇인가-----docker-images-vs-container">도커 이미지와 컨테이너의 차이점은 무엇인가?     Docker Images vs Container</h1>
<p>둘은 밀접한 관련이 있으며 도커 플랫폼에 의해 정의된 시스템의 일부이다.</p>
<p>컨테이너가 존재하려면 이미지를 실행해야 하는 반면, 이미지는 컨테이너 없이 존재할 수 있다.</p>
<p>따라서 컨테이너는 이미지에 종속되어 런타임 환경을 구성하고 애플리케이션을 실행하는 데 사용된다.</p>
<p>도커 이미지는 도커 컨테이너에서 코드를 실행한다. 실행 중인 컨테이너를 만들려면 도커 이미지에 핵심 기능의 쓰기 가능 계층을 추가한다.(Writable container)</p>
<p>도커 컨테이너는 실행 중인 이미지 인스턴스로 간주한다. 각각의 고유한 데이터와 상태를 가진 동일한 이미지에서 여러 개의 컨테이너를 만들 수 있다. 컨테이너 채택의 주요 이점은 개발, 운영 및 테스트의 표준화 및 단순화이다.</p>
<p>CI/CD 파이프라인은 컨테이너를 빌드, 테스트 및 패키징할 수 있다. 그런 다음 배포는 해당 컨테이너를 애플리케이션의 일부로 실행할 수 있는 런타임 환경에 배포한다.</p>
<h1 id="dockerfile-image-container">Dockerfile, Image, Container?</h1>
<blockquote>
<p>Dockerfile --(Build)--&gt; Image --(Create)--&gt; Container</p>
</blockquote>
<p>Dockerfile은 도커 이미지를 빌드하는 방법을 정의하는 스크립트이다.</p>
<p>Docker에서는 환경 정보를 저장하는 파일을 Dockerfile이라고 한다. 이 Dockerfile에는 컨테이너의 구동에 필요한 정보가 작성되어 있다.</p>
<p>Docker file을 빌드해서 이미지를 생성한다.</p>
<p>이미지는 특정 환경에 대한 정보가 변하지 않고 저장되는 정적인 형태의 파일이다.</p>
<p>이미지를 동적인 형태로 변경한 것이 컨테이너이며, 컨테이너가 구동된다는 것은 우리가 필요로 하는 OS와 특정 환경이 경량 가상화로 구현된다는 것을 의미한다. 컨테이너는 어플리케이션을 실행할 격리된 환경이다.</p>
<p>다시 말하면 컨테이너를 생성하는 것은 다른 환경과 분리시킨 환경을 만든다는 말이고, 컨테이너를 구동하는 것은 분리된 프로세스화하여 특정 환경을 만드는 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes]]></title>
            <link>https://velog.io/@mulrung_e/Kubernetes</link>
            <guid>https://velog.io/@mulrung_e/Kubernetes</guid>
            <pubDate>Sun, 05 Nov 2023 06:51:00 GMT</pubDate>
            <description><![CDATA[<p>Kubernetes</p>
]]></description>
        </item>
    </channel>
</rss>