<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Daniel Kim 의 기술 블로그]]></title><description><![CDATA[DevOps 엔지니어의 기록]]></description><link>https://www.kimsehwan96.com/</link><image><url>https://www.kimsehwan96.com/favicon.png</url><title>Daniel Kim 의 기술 블로그</title><link>https://www.kimsehwan96.com/</link></image><generator>Ghost 5.79</generator><lastBuildDate>Thu, 09 Apr 2026 20:08:25 GMT</lastBuildDate><atom:link href="https://www.kimsehwan96.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[ECR Pull-Through Cache 적용기(feat: Docker Rate Limit 을 피해서)]]></title><description><![CDATA[<p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Fecr-pull-through-cache%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=true" alt="Hits" loading="lazy"></a></p>
<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><p>EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; Helm Chart&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC5EC;&#xB7EC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xBC30;&#xD3EC;&#xD558;&#xB2E4; &#xBCF4;&#xBA74;, Docker Hub(registry-1.docker.io)&#xC758; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00;</p>]]></description><link>https://www.kimsehwan96.com/ecr-pull-through-cache/</link><guid isPermaLink="false">67bdb51b7e75cc034090bdbc</guid><category><![CDATA[ECR]]></category><category><![CDATA[eks]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Helm]]></category><category><![CDATA[K8s]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Thu, 27 Feb 2025 14:06:15 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-28-------1.42.19.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-28-------1.42.19.png" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)"><p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Fecr-pull-through-cache%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=true" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy"></a></p>
<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><p>EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; Helm Chart&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC5EC;&#xB7EC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xBC30;&#xD3EC;&#xD558;&#xB2E4; &#xBCF4;&#xBA74;, Docker Hub(registry-1.docker.io)&#xC758; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7F0;&#xB370; NAT IP&#xAC00; &#xACE0;&#xC815;&#xB41C; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; &#xB178;&#xB4DC;&#xAC00; &#xC790;&#xC8FC; &#xCD94;&#xAC00;/&#xC0AD;&#xC81C; &#xB418;&#xB294; &#xC2A4;&#xCF00;&#xC77C; &#xC544;&#xC6C3;/&#xC778;&#xC744; &#xBC18;&#xBCF5;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC774;&#xB77C;&#xBA74; Docker Hub &#xC758; Image Pull Rate Limit &#xC5D0; &#xAC78;&#xB9B4; &#xC6B0;&#xB824;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD2B9;&#xD788;, 2024&#xB144; 6&#xC6D4; 30&#xC77C;&#xBD80;&#xD130; &#xC2DC;&#xD589;&#xB41C; &#xAE30;&#xC874; &#xADDC;&#xC815;&#xC5D0; &#xB530;&#xB974;&#xBA74; &#xC778;&#xC99D;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC0AC;&#xC6A9;&#xC790;(anonymous)&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; 6&#xC2DC;&#xAC04; &#xB3D9;&#xC548; &#xCD5C;&#xB300; 100&#xD68C;&#xC758; Pull&#xB9CC; &#xD5C8;&#xC6A9;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>2025&#xB144; 4&#xC6D4; 1&#xC77C;&#xBD80;&#xD130;&#xB294; &#xC778;&#xC99D;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xC758; Pull &#xD69F;&#xC218;&#xAC00; &#x2018;&#xC2DC;&#xAC04;&#xB2F9; 10&#xBC88;&#x2019;&#xC73C;&#xB85C; &#xC81C;&#xD55C;&#xB418;&#xACE0;, &#xBB34;&#xB8CC; &#xC0AC;&#xC6A9;&#xC790;(&#xB85C;&#xADF8;&#xC778; &#xC0C1;&#xD0DC;)&#xB3C4; &#xC2DC;&#xAC04;&#xB2F9; 100&#xBC88;&#xAE4C;&#xC9C0;&#xB9CC; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; Pull&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC81C;&#xD55C;&#xC774; &#xB354;&#xC6B1; &#xAC15;&#xD654;&#xB420; &#xC608;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xBCC0;&#xD654;&#xB294; Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xC11C; &#xB178;&#xB4DC; &#xAD50;&#xCCB4;&#xAC00; &#xC7A6;&#xC740; EKS &#xD658;&#xACBD;&#xC5D0; &#xD070; &#xC601;&#xD5A5;&#xC744; &#xC904; &#xC218;&#xBC16;&#xC5D0; &#xC5C6;&#xC73C;&#xBA70;, &#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC30;&#xD3EC; &#xBC0F; &#xC2A4;&#xCF00;&#xC77C;&#xB9C1; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0; Pull &#xC2E4;&#xD328; &#xC704;&#xD5D8;&#xC744; &#xD55C;&#xCE35; &#xB192;&#xC774;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.docker.com/docker-hub/usage/pulls/?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Pulls</div><div class="kg-bookmark-description">Learn about pull usage and limits for Docker Hub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.docker.com/favicons/docs@2x.ico" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)"><span class="kg-bookmark-author">Docker Documentation</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.docker.com/images/thumbnail.webp" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)"></div></a></figure><p>&#xB530;&#xB77C;&#xC11C; &#xAC1C;&#xC778; &#xC6A9;&#xB3C4;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xC544;&#xB2CC; &#xC2E4;&#xC81C; &#xD504;&#xB85C;&#xB355;&#xC158;&#xC5D0;&#xC11C; Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC774;&#xC6A9; &#xC911;&#xC774;&#xBA70;, Docker Hub &#xC5D0; &#xD37C;&#xBE14;&#xB9AC;&#xC2F1;&#xB41C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC778;&#xC99D;(Docker  &#xACC4;&#xC815;)&#xC5C6;&#xC774; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; Image Pull Rate Limit &#xC744; &#xB9C8;&#xC8FC;&#xD560; &#xD655;&#xB960;&#xC774; &#xB354;&#xC6B1; &#xCEE4;&#xC9C4;&#xB2E4;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h2 id="%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%BA%90%EC%8B%B1%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%A4%ED%95%B4">&#xC774;&#xBBF8;&#xC9C0; &#xCE90;&#xC2F1;&#xC5D0; &#xB300;&#xD55C; &#xC624;&#xD574;</h2><p>&quot;Kubernetes&#xC5D0;&#xC11C;&#xB294; &#xD55C; &#xBC88; Pull&#xD55C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xB178;&#xB4DC; &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xCE90;&#xC2F1;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xAD73;&#xC774; Rate Limit &#xAC71;&#xC815;&#xC744; &#xD560; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;?&quot;&#xB77C;&#xB294; &#xC758;&#xBB38;&#xC774; &#xB4E4; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC2E4;&#xC81C;&#xB85C; Kubelet&#xC740; &#xAE30;&#xC874;&#xC5D0; Pull&#xB41C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC7AC;&#xC0AC;&#xC6A9;&#xD558;&#xBA70;(imagePullPolicy &#xAC00; Always &#xAC00; &#xC544;&#xB2CC; &#xC774;&#xC0C1;), &#xC124;&#xC815;&#xC5D0; &#xB530;&#xB77C; &#xD2B9;&#xC815; &#xC8FC;&#xAE30;&#xC5D0; &#xC624;&#xB798;&#xB41C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC815;&#xB9AC;(pruning)&#xD558;&#xAC70;&#xB098; &#xB514;&#xC2A4;&#xD06C; &#xACF5;&#xAC04;&#xC774; &#xBD80;&#xC871;&#xD558;&#xBA74; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC81C;&#xAC70;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xB9CC;, EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; Karpenter&#xC640; &#xAC19;&#xC740; &#xC624;&#xD1A0;&#xC2A4;&#xCF00;&#xC77C;&#xB9C1; &#xB3C4;&#xAD6C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xB178;&#xB4DC; &#xC790;&#xCCB4;&#xC758; &#xC0DD;&#xBA85; &#xC8FC;&#xAE30;&#xAC00; &#xC9E7;&#xC544;&#xC9D1;&#xB2C8;&#xB2E4;. </p><p>&#xC2A4;&#xD31F; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC790;&#xC8FC; &#xAD50;&#xCCB4;&#xB418;&#xAC70;&#xB098; &#xBD80;&#xD558; &#xBCC0;&#xD654;&#xC5D0; &#xB530;&#xB77C; &#xB178;&#xB4DC;&#xAC00; &#xBE60;&#xB974;&#xAC8C; &#xCD94;&#xAC00;/&#xC0AD;&#xC81C;&#xB418;&#xBA74;&#xC11C;, &#xC774;&#xC804;&#xC5D0; &#xCE90;&#xC2F1;&#xD574;&#xB454; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC7AC;&#xD65C;&#xC6A9;&#xD560; &#xAE30;&#xD68C;&#xAC00; &#xD06C;&#xAC8C; &#xC904;&#xC5B4;&#xB4E4; &#xC218;&#xBC16;&#xC5D0; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xACB0;&#xAD6D; &#xC774;&#xB7EC;&#xD55C; &#xC774;&#xC720;&#xB85C; &#xC778;&#xD574;, Rate Limit&#xC5D0; &#xAC78;&#xB9B4; &#xC704;&#xD5D8;&#xC131;&#xC774; &#xB354;&#xC6B1; &#xB192;&#xC544;&#xC9C0;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><h2 id="%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4-docker-hub%EC%9D%98-rate-limit%EC%9D%84-%EC%9A%B0%ED%9A%8C%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94"><strong>&#xADF8;&#xB807;&#xB2E4;&#xBA74; Docker Hub&#xC758; Rate Limit&#xC744; &#xC6B0;&#xD68C;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBC29;&#xBC95;&#xC740; &#xBB34;&#xC5C7;&#xC774; &#xC788;&#xC744;&#xAE4C;&#xC694;?</strong></h2><p>&#xD574;&#xB2F9; &#xBB38;&#xC81C;&#xB97C; &#xACAA;&#xC5C8;&#xC744; &#xB54C; &#xB4E4;&#xC5C8;&#xB358; &#xBC29;&#xBC95;&#xC740; &#xBA87;&#xAC00;&#xC9C0;&#xAC00; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>Docker Hub &#xBB34;&#xB8CC; &#xACC4;&#xC815; &#xC0AC;&#xC6A9; + <code>imagePullSecrets</code> &#xC801;&#xC6A9;<ol><li>Docker Hub&#xC758; &#xBB34;&#xB8CC; &#xACC4;&#xC815;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC774;&#xB97C; Kubernetes&#xC5D0; <code>imagePullSecrets</code>&#xB85C; &#xB4F1;&#xB85D;&#xD574; &#xC778;&#xC99D;&#xB41C; Pull&#xC744; &#xC2DC;&#xB3C4;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.<ul><li>&#xD558;&#xC9C0;&#xB9CC; &#xBB34;&#xB8CC; &#xACC4;&#xC815; &#xC5ED;&#xC2DC; Rate Limit&#xC774; &#xC874;&#xC7AC;&#xD558;&#xBA70;, &#xC7A5;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC548;&#xC815;&#xC801;&#xC778; &#xD574;&#xACB0;&#xCC45;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xD310;&#xB2E8;&#xB418;&#xC5B4; &#xC81C;&#xC678;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li></ol></li><li>&#xC9C1;&#xC811; ECR Private Repository&#xC5D0; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC5C5;&#xB85C;&#xB4DC;<ol><li>&#xC6B0;&#xB9AC;&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; ECR Private Repository&#xC5D0; &#xC77C;&#xC77C;&#xC774; Push&#xD574;&#xB450;&#xACE0;, Helm Chart&#xB098; &#xB9E4;&#xB2C8;&#xD398;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; Private Repository&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB098; &#xC560;&#xB4DC;&#xC628; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC790;&#xC8FC; &#xAD50;&#xCCB4;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xC73C;&#xB098;, &#xC5EC;&#xC804;&#xD788; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xB9E4;&#xBC88; &#xC5C5;&#xB85C;&#xB4DC;&#xB7;&#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xBC88;&#xAC70;&#xB85C;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol></li><li>Docker Hub&#xB97C; &#xBBF8;&#xB7EC;&#xB9C1;&#xD558;&#xB294; &#xC11C;&#xB4DC;&#xD30C;&#xD2F0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC; &#xC0AC;&#xC6A9;<ol><li>&#xC678;&#xBD80;&#xC5D0;&#xC11C; Docker Hub &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xBBF8;&#xB7EC;&#xB9C1;&#xD574;&#xC8FC;&#xB294; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xCC3E;&#xC544;&#xC11C;, &#xD574;&#xB2F9; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xB300;&#xC2E0; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xD558;&#xC9C0;&#xB9CC; &#xC11C;&#xB4DC;&#xD30C;&#xD2F0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; &#xB300;&#xD55C; &#xC2E0;&#xB8B0; &#xBB38;&#xC81C;, &#xC7A5;&#xC560;&#xB098; &#xC911;&#xB2E8; &#xBC1C;&#xC0DD; &#xC2DC; &#xCE58;&#xBA85;&#xC801;&#xC778; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xC6B0;&#xB824;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC2E0;&#xB8B0; &#xBB38;&#xC81C;&#xAC00; &#xC544;&#xB2C8;&#xB354;&#xB77C;&#xB3C4; &#xBAA8;&#xB4E0; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBBF8;&#xB7EC;&#xB9C1;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xB294; &#xCC3E;&#xC9C0; &#xBABB;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol></li></ol><p>&#xC138;&#xAC00;&#xC9C0; &#xBC29;&#xBC95; &#xC911; 2&#xBC88;(&#xC9C1;&#xC811; &#xC5C5;&#xB85C;&#xB4DC;)&#xB97C; &#xC790;&#xB3D9;&#xD654; &#xD55C; &#xD615;&#xD0DC;&#xC5D0; &#xAC00;&#xC7A5; &#xAC00;&#xAE4C;&#xC6B4; <code>ECR Pull-Through Cache</code> &#xAC00; &#xAC00;&#xC7A5; &#xC801;&#xD569;&#xD558;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><code>ECR Pull-Through Cache</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; ECR&#xC5D0;&#xC11C; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB9C8;&#xB2E4; &#xCE90;&#xC2F1; &#xC815;&#xCC45;&#xC744; &#xC124;&#xC815;&#xD55C; &#xB4A4;, &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xBCC4;&#xB85C; &#xC0DD;&#xC131;&#xB41C; ECR &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC; &#xC8FC;&#xC18C;&#xB97C; &#xD1B5;&#xD574; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; Pull &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xCC98;&#xC74C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xB54C; ECR&#xC774; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC6D0;&#xBCF8; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xBC1B;&#xC544; ECR Private Repository&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xACE0;, &#xC774;&#xD6C4;&#xC5D0;&#xB294; &#xCE90;&#xC2F1;&#xB41C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xD1B5;&#xD574; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xC6B4;&#xC601;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p></p><h2 id="ecr-pull-through-cache-%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D">ECR Pull-Through Cache &#xC758; &#xAC1C;&#xB150; &#xBC0F; &#xB3D9;&#xC791; &#xBC29;&#xC2DD;</h2><p><code>ECR Pull-Through Cache</code> &#xB294; &#xD2B9;&#xC815; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;(&#xC608;:  Docker Hub)&#xC5D0; &#xB300;&#xD574; <code>&#xD504;&#xB85D;&#xC2DC;(Proxy)</code> &#xCC98;&#xB7FC; &#xB3D9;&#xC791;&#xD569;&#xB2C8;&#xB2E4;. </p><p>ECR&#xC5D0; &#xC774;&#xBBF8;&#xC9C0; &#xC694;&#xCCAD;&#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xBA74; &#xBA3C;&#xC800; ECR &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC; &#xB0B4;&#xBD80;&#xC5D0; &#xD574;&#xB2F9; &#xC774;&#xBBF8;&#xC9C0;&#xAC00; &#xCE90;&#xC2F1;&#xB418;&#xC5B4; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0;, <strong>&#xC5C6;&#xB2E4;&#xBA74; </strong>&#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xAC00;&#xC838;&#xC640; ECR&#xC5D0; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB530;&#xB77C;&#xC11C; &#xC6B0;&#xB9AC;&#xB294; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; &#xC9C1;&#xC811; &#xC811;&#xADFC; &#xD560; &#xD544;&#xC694; &#xC5C6;&#xC774; &#xD56D;&#xC0C1; ECR &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xB97C; &#xD1B5;&#xD574; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; Pull&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>2025&#xB144; 2&#xC6D4; &#xAE30;&#xC900;, <code>ECR Pull-Through Cache</code> &#xAC00; &#xC9C0;&#xC6D0;&#xD558;&#xB294; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;</p><ul><li>ECR Public Registry</li><li>Quay (quay.io)</li><li>Docker Hub (registry.docker.io)</li><li>GitHub Container Registry (ghcr)</li><li>Azure Container Registry</li><li>GitLab Container Registry</li></ul><p>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xB300;&#xBD80;&#xBD84;&#xC758; Helm Chart&#xAC00; Quay, Docker Hub, GitHub Container Registry &#xB4F1;&#xC744; &#xC790;&#xC8FC; &#xC0AC;&#xC6A9;&#xD558;&#xBBC0;&#xB85C; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xC720;&#xC988;&#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xCDA9;&#xBD84;&#xD788; &#xCEE4;&#xBC84; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p></p><h2 id="ecr-pull-through-cache-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95-%EC%9B%B9-%EC%BD%98%EC%86%94">ECR Pull-Through Cache &#xC124;&#xC815; &#xBC29;&#xBC95; (&#xC6F9; &#xCF58;&#xC194;)</h2><p></p><p>&#xC6B0;&#xC120; &#xC6F9; &#xCF58;&#xC194;&#xC5D0;&#xC11C;&#xC758; &#xC0AC;&#xC6A9; &#xBC29;&#xBC95;&#xC744; &#xAC04;&#xB2E8;&#xD788; &#xC18C;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>AWS ECR &#xC11C;&#xBE44;&#xC2A4;&#xC758; Private Registry -&gt; Features &amp; Settings &#xC5D0;&#xC11C; Pull-Through Cache &#xADDC;&#xCE59; &#xC124;&#xC815;&#xC744; &#xC811;&#xADFC;&#xD569;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.25.56.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1802" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.25.56.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.25.56.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.25.56.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.25.56.png 2000w" sizes="(min-width: 720px) 720px"></figure><p></p><p>&#xC774;&#xD6C4; &#xADDC;&#xCE59; &#xCD94;&#xAC00;&#xB97C; &#xC120;&#xD0DD;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.26.30.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1802" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.26.30.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.26.30.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.26.30.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.26.30.png 2000w" sizes="(min-width: 720px) 720px"></figure><p></p><p>&#xC5B4;&#xB5A4; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;(&#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC;)&#xC5D0; &#xB300;&#xD574; &#xADDC;&#xCE59;&#xC744; &#xC0DD;&#xC131;&#xD560;&#xC9C0; &#xC120;&#xD0DD; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.27.22.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1802" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.27.22.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.27.22.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.27.22.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.27.22.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Docker Hub &#xACFC; GitHub Container Registry &#xC758; &#xACBD;&#xC6B0; Public Image &#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xC778;&#xC99D; &#xC815;&#xBCF4;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD558;&#xB294;&#xAC83;&#xC5D0; &#xC720;&#xC758;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC6B0;&#xC120; &#xC778;&#xC99D;&#xC774; &#xD544;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xC740; <code>quay.io</code> &#xC5D0; &#xB300;&#xD574; &#xBA3C;&#xC800; &#xC124;&#xC815;&#xD574;&#xBD05;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.47.13.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="938" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.47.13.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.47.13.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.47.13.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.47.13.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC9C0;&#xC815; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC6F9;&#xCF58;&#xC194;&#xB85C; &#xC9C4;&#xD589;&#xD558;&#xB294;&#xACBD;&#xC6B0; &#xC704;&#xC640;&#xAC19;&#xC774; <code>quay.io</code> &#xC5D0; &#xB300;&#xD55C; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB294; <code>quay</code> &#xB85C; &#xC9C0;&#xC815;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xC0AC;&#xC6A9;&#xD574;&#xB3C4; &#xBB34;&#xBC29;&#xD558;&#xC9C0;&#xB9CC;, &#xC2E4;&#xC81C; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC758; &#xB124;&#xC774;&#xBC0D;&#xC744; &#xADF8;&#xB300;&#xB85C; &#xB530;&#xB77C;&#xAC00;&#xB294;&#xAC83;&#xC744; &#xCD94;&#xCC9C;&#xD569;&#xB2C8;&#xB2E4;. (&#xC608;: <code>ghcr.io</code> , <code>quay.io</code> , <code>registry.k8s.io</code> / <code>docker.io</code> -&gt; &#xC2E4;&#xC81C; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;url &#xC740; <code>registry-1.docker.io</code> &#xC785;&#xB2C8;&#xB2E4;)</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.47.35.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="938" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.47.35.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.47.35.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.47.35.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.47.35.png 2000w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.32.38.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1802" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.32.38.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.32.38.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.32.38.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.32.38.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xC0DD;&#xC131;&#xC744; &#xD558;&#xACE0; &#xB098;&#xBA74; &#xC704;&#xC640; &#xAC19;&#xC774; &#xCE90;&#xC2DC; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xAC00; &#xC0DD;&#xC131;&#xB429;&#xB2C8;&#xB2E4;. </p><p><code>{ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/quay.io/{repository}/{image}:{tag}</code> &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xC774;&#xBBF8;&#xC9C0; Pull &#xC694;&#xCCAD;&#xC744; &#xD558;&#xBA74; &#xC2E4;&#xC81C; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC;&#xC778; <code>quay.io/{repository}/{image}:{tag}</code> &#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xAC16;&#xACE0;&#xC640; &#xCE90;&#xC2F1;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4; <code>quay.io</code> &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code>argo-cd</code> &#xB97C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.35.55.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1802" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.35.55.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.35.55.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.35.55.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.35.55.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xCE90;&#xC2DC; &#xADDC;&#xCE59;&#xC744; &#xC124;&#xC815;&#xD574;&#xB450;&#xC5C8;&#xC9C0;&#xB9CC; &#xD604;&#xC7AC; ECR Private Repository &#xC5D0; &#xC544;&#xBB34;&#xAC83;&#xB3C4; &#xC5C6;&#xB294; &#xC0C1;&#xD0DC;&#xC785;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.40.00.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="844" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.40.00.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.40.00.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.40.00.png 1600w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.40.00.png 2000w" sizes="(min-width: 1200px) 1200px"></figure><p><code>$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin {ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com</code> &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; <code>docker</code> &#xC5D0; ecr&#xC744; &#xD1B5;&#xD574; &#xC778;&#xC99D;&#xC744; &#xD558;&#xACE0;&#xB098;&#xC11C;</p><p><code>$ docker pull {ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/quay.io/argoproj/argocd:v2.5.6</code> &#xC640; &#xAC19;&#xC774; ECR Private Repository &#xB97C; &#xD1B5;&#xD574; image pull &#xC744; &#xC694;&#xCCAD;&#xD569;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xAC00; &#xC544;&#xAE4C; &#xC815;&#xC758;&#xD55C; &#xCE90;&#xC2DC; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xAC83;&#xC5D0; &#xC720;&#xC758;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xD574;&#xB2F9; &#xACBD;&#xB85C;&#xC5D0; &#xC544;&#xC9C1; &#xC774;&#xBBF8;&#xC9C0;&#xAC00; &#xC5C6;&#xC9C0;&#xB9CC;, &#xC124;&#xC815;&#xD55C; &#xCE90;&#xC2DC; &#xADDC;&#xCE59;&#xC744; &#xD1B5;&#xD574; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xAC00;&#xC838;&#xC640; &#xCE90;&#xC2F1; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xAE30;&#xBC18;&#xC758; ECR Private Repository&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xD6C4;&#xC5D0;&#xB294; &#xADF8; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xACE7;&#xBC14;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.45.29.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1142" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.45.29.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.45.29.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.45.29.png 1600w, https://www.kimsehwan96.com/content/images/size/w2400/2025/02/-----------2025-02-27------10.45.29.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>&#xC2E4;&#xC81C;&#xB85C; &#xC6B0;&#xB9AC;&#xAC00; ECR Private Repository &#xB97C; &#xC9C1;&#xC811; &#xC0DD;&#xC131;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC9C0;&#xB9CC;. &#xCE90;&#xC2DC; &#xADDC;&#xCE59;&#xC5D0; &#xC758;&#xD574; &#xC790;&#xB3D9;&#xC73C;&#xB85C; Private Repository &#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xD574;&#xB2F9; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xAC8C;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC544;&#xAE4C; &#xCC98;&#xC74C;&#xC5D0; Docker Hub &#xBC0F; GitHub Container Registry &#xB294; <code>ECR Pull-Through Cache</code> &#xC815;&#xCC45;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC778;&#xC99D; &#xC815;&#xBCF4;&#xAC00; &#xD544;&#xC694;&#xD558;&#xB2E4;&#xACE0; &#xC774;&#xC57C;&#xAE30; &#xD588;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-27------10.49.09.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="2000" height="1177" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-27------10.49.09.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-27------10.49.09.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/02/-----------2025-02-27------10.49.09.png 1600w, https://www.kimsehwan96.com/content/images/size/w2400/2025/02/-----------2025-02-27------10.49.09.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Docker Hub &#xC774;&#xB098; GitHub Container Registry &#xB97C; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC;&#xC73C;&#xB85C; &#xD558;&#xB294; &#xCE90;&#xC2DC;&#xB97C; &#xC6F9;&#xCF58;&#xC194;&#xC5D0;&#xC11C; &#xC0DD;&#xC131;&#xD558;&#xB824;&#xACE0; &#xD558;&#xBA74; &#xBCFC; &#xC218; &#xC788;&#xB294; &#xD654;&#xBA74;&#xC785;&#xB2C8;&#xB2E4;. </p><p><code>ecr-pullthroughcache/</code> &#xB97C; &#xC811;&#xB450;&#xC0AC;&#xB85C; &#xD558;&#xB294; &#xC554;&#xD638;&#xB97C; <code>AWS Secrets Manager</code> &#xC5D0; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD558;&#xB294;&#xAC83;&#xB9CC; &#xB354; &#xCD94;&#xAC00;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xB54C; <code>AWS Secrets Manager</code> &#xC5D0; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC554;&#xD638;&#xC5D0;&#xB294;  <code>username</code> &#xACFC; <code>accessToken</code> &#xC774;&#xB77C;&#xB294; &#xD0A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="ecr-pull-through-cache-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95terraform">ECR Pull-Through Cache &#xC124;&#xC815; &#xBC29;&#xBC95;(Terraform)</h2><p></p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/5b32e980a46a492e5154adcc6c84f194.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>aws_ecr_pull_through_cache_rule</code> &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>Docker Hub &#xC640; GitHub Container Registry &#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; AWS Secrets Manager &#xC5D0; &#xC815;&#xC758;&#xB41C; &#xC554;&#xD638;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD558;&#xBA70;, &#xD574;&#xB2F9; &#xBD80;&#xBD84;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xB294;&#xC9C0;&#xB294; &#xC774; &#xAE00;&#xC758; &#xBC94;&#xC704;&#xB97C; &#xBC97;&#xC5B4;&#xB098;&#xB2C8; &#xC0DD;&#xB7B5;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p></p><h2 id="eks-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;</h2><p>&#xC704;&#xC5D0;&#xC11C; <code>docker pull</code> &#xB85C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; pull &#xD560; &#xB54C;&#xC5D0;&#xB294;, &#xC81C;&#xAC00; &#xC0AC;&#xC6A9;&#xD55C; IAM User &#xC758; &#xC5ED;&#xD560;(IAM Role)&#xC5D0; ECR &#xAD00;&#xB828;&#xB41C; &#xC815;&#xCC45;&#xC774; &#xC774;&#xBBF8; &#xC5F0;&#xACB0;&#xB418;&#xC5B4; &#xC788;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBCC4;&#xB2E4;&#xB978; &#xBB38;&#xC81C; &#xC5C6;&#xC774; &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB2E4;&#xB9CC; &#xC6B0;&#xB9AC;&#xAC00; &#xC2E4;&#xC81C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB420; EKS &#xC6CC;&#xCEE4;&#xB178;&#xB4DC; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xB2F9; &#xAD8C;&#xD55C;&#xB4E4;&#xC774; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC138;&#xD305;&#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xAD8C;&#xD55C;&#xC744; worker node &#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB294; IAM Role &#xC5D0; &#xCD94;&#xAC00;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code>statement {
  effect = &quot;Allow&quot;
  actions = [
    &quot;ecr:BatchImportUpstreamImage&quot;,
    &quot;ecr:CreateRepository&quot;,
    &quot;ecr:ReplicateImage&quot;
  ]
  resources = [&quot;*&quot;]
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">ecr &#xACFC; &#xAD00;&#xB828;&#xB41C; &#xC815;&#xCC45;&#xC744; &#xCD94;&#xAC00;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. resources &#xC758; &#xACBD;&#xC6B0; &#xAC01;&#xC790;&#xC758; &#xD658;&#xACBD;&#xC5D0; &#xB9DE;&#xAC8C; &#xC218;&#xC815;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</span></p></figcaption></figure><p>Terraform EKS &#xBAA8;&#xB4C8;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; self managed node group &#xC744; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/ab3894e4bf3ac1d8759b02176ef1abe9.js"></script>
<!--kg-card-end: html-->
<p></p><h2 id="helm-chart%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EA%B2%BD%EB%A1%9C-%EC%84%A4%EC%A0%95">Helm Chart&#xC5D0;&#xC11C;&#xC758; &#xC774;&#xBBF8;&#xC9C0; &#xACBD;&#xB85C; &#xC124;&#xC815;</h2><p>&#xB300;&#xBD80;&#xBD84;&#xC758; Helm Chart&#xC5D0;&#xC11C;&#xB294; <code>values.yaml</code> &#xB0B4;&#xC758; <code>image.repository</code> &#xB610;&#xB294; <code>image.registry</code> &#xAC12;&#xC744; &#xC870;&#xD569;&#xD574; &#xCD5C;&#xC885; Pull &#xACBD;&#xB85C;&#xB97C; &#xACB0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xB85C;&#xC9C1;&#xC740; &#xBCF4;&#xD1B5;</p><ol><li><code>_helpers.tpl</code> &#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xD15C;&#xD50C;&#xB9BF; &#xD568;&#xC218;&#xB85C; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xAC70;&#xB098;</li><li><code>deployment.yaml</code>, <code>statefulset.yaml</code>, <code>daemonset.yaml</code> &#xB4F1; <strong>&#xC6CC;&#xD06C;&#xB85C;&#xB4DC; &#xB9E4;&#xB2C8;&#xD398;&#xC2A4;&#xD2B8;</strong> &#xB0B4;&#xBD80;&#xC758; <code>containers[].image</code> &#xD56D;&#xBAA9;&#xC5D0; &#xC778;&#xB77C;&#xC778;&#xC73C;&#xB85C; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; ArgoCD Helm Chart(&#xC608;: <code>argo-cd</code> &#xCC28;&#xD2B8;&#xC758; <code>argocd-server</code> &#xBD80;&#xBD84;) <code>deployment.yaml</code> &#xC5D0;&#xC11C; <code>deployment.yaml</code>&#xC744; &#xBCF4;&#xBA74; (<a href="https://github.com/argoproj/argo-helm/blob/f26595848502480f9427c1365a8313270d9aa3af/charts/argo-cd/templates/argocd-server/deployment.yaml?ref=kimsehwan96.com#L67-L70">link</a>)</p><pre><code>      containers:
      - name: {{ .Values.server.name }}
        image: {{ default .Values.global.image.repository .Values.server.image.repository }}:{{ default (include &quot;argo-cd.defaultTag&quot; .) .Values.server.image.tag }}
        imagePullPolicy: {{ default .Values.global.image.imagePullPolicy .Values.server.image.imagePullPolicy }}</code></pre><p>&#xC5EC;&#xAE30;&#xC11C; <code>default A B</code>&#xB77C;&#xB294; Helm &#xD568;&#xC218;&#xB294; &#x201C;B&#xAC00; &#xC124;&#xC815;&#xB418;&#xC5B4; &#xC788;&#xC73C;&#xBA74; B&#xB97C;, <strong>&#xC5C6;&#xB2E4;&#xBA74;</strong> A&#xB97C; &#xC0AC;&#xC6A9;&#x201D;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC785;&#xB2C8;&#xB2E4;. &#xC989;,</p><ul><li><code>.Values.server.image.repository</code>&#xAC00; &#xC788;&#xC73C;&#xBA74; &#xADF8; &#xAC12;&#xC744; &#xC0AC;&#xC6A9;,</li><li>&#xC5C6;&#xC73C;&#xBA74; <code>.Values.global.image.repository</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</li></ul><pre><code>## Globally shared configuration
global:
  # -- Default domain used by all components
  ## Used for ingresses, certificates, SSO, notifications, etc.
  domain: argocd.example.com

  # -- Common labels for the all resources
  additionalLabels: {}
    # app: argo-cd

  # -- Number of old deployment ReplicaSets to retain. The rest will be garbage collected.
  revisionHistoryLimit: 3

  # Default image used by all components
  image:
    # -- If defined, a repository applied to all Argo CD deployments
    repository: quay.io/argoproj/argocd</code></pre><p>&#xB530;&#xB77C;&#xC11C; <code>global.image.repository</code> &#xAC12;&#xC744; &#xC218;&#xC815;&#xD558;&#xBA74;, ArgoCD &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xC804;&#xBC18;&#xC5D0; &#xAC78;&#xCE5C; &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xB97C; &#xC77C;&#xAD04;&#xC801;&#xC73C;&#xB85C; &#xBCC0;&#xACBD;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; Dex&#xC640; Redis&#xB294; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8;&#xAC00; &#xC544;&#xB2CC;, ArgoCD &#xCC28;&#xD2B8;&#xC758; &#xD15C;&#xD50C;&#xB9BF; &#xC77C;&#xBD80;&#xB85C; &#xD3EC;&#xD568;&#xB418;&#xC5B4; &#xC788;&#xB294;&#xB370;, &#xC774;&#xB4E4;&#xC740; <code>global.image.repository</code>&#xB97C; &#xCC38;&#xC870;&#xD558;&#xB3C4;&#xB85D; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C; <strong>&#xBCC4;&#xB3C4;</strong>&#xB85C; <code>dex.image.repository</code>, <code>redis.image.repository</code> &#xB4F1;&#xC744; &#xC124;&#xC815;&#xD574;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="%EC%9D%B4-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C-%EB%8B%A4%EB%A3%B0-%EC%98%88%EC%8B%9C-%EC%B0%A8%ED%8A%B8%EB%93%A4">&#xC774; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xB2E4;&#xB8F0; &#xC608;&#xC2DC; &#xCC28;&#xD2B8;&#xB4E4;</h2><p>&#xC544;&#xB798; Helm Chart&#xB4E4;&#xC744; &#xC608;&#xC2DC;&#xB85C; &#xB4E4;&#xC5B4;, &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; ECR Pull-Through Cache &#xC8FC;&#xC18C;&#xB85C; &#xBC14;&#xAFB8;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xAD04;&#xD638; &#xC548;&#xC740; &#xD14C;&#xC2A4;&#xD2B8; &#xC2DC;&#xC810;&#xC758; Chart &#xBC84;&#xC804;)</p><ul><li>argo-cd (7.8.5)</li><li>cert-manager(v1.15.3)</li><li>external-secrets(0.9.16)</li><li>keda(2.14.0)</li><li>istiod(1.21.2)</li><li>fluentd(0.5.2)</li><li>kube-prometheus-stack(58.3.1)</li><li>external-dns(7.2.0)</li></ul><p></p><h3 id="argocd">argocd</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/c08ab25fd57216285fa64dcd03cc3f46.js"></script>
<!--kg-card-end: html-->
<p><code>global.image.repository</code> &#xB97C; &#xD1B5;&#xD574; <code>argocd</code> &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xB4E4;&#xC758; &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xB97C; &#xC77C;&#xAD04; &#xC9C0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. <code>repository</code> &#xB77C;&#xB294; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xC4F0;&#xC774;&#xBA74; pull-path &#xB85C; &#xC815;&#xC758;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. (<code>{registry}/{repository}/{image}</code> -&gt; <code>{ACCOUNT-ID}.dkr.ecr.ap-northeast-2.amazonaws.com/quay.io/argoproj/argocd</code>)</p><p><code>global.image.tag</code> &#xAC12;&#xC744; &#xC815;&#xC758;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC774;&#xC720;&#xB294;  argocd helm chart &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC815;&#xC758;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. (<a href="https://github.com/argoproj/argo-helm/blob/f26595848502480f9427c1365a8313270d9aa3af/charts/argo-cd/templates/_common.tpl?ref=kimsehwan96.com#L37-L39">&#xB9C1;&#xD06C; &#xCC38;&#xACE0;</a>)</p><p><code>dex</code> &#xC640; <code>redis</code> &#xB294; Helm &#xC758; sub chart &#xAE30;&#xB2A5;&#xC744; &#xD65C;&#xC6A9;&#xD55C;&#xAC83;&#xC740; &#xC544;&#xB2C8;&#xACE0; argocd &#xCC28;&#xD2B8;&#xC758; &#xD15C;&#xD50C;&#xB9BF;&#xC911; &#xC77C;&#xBD80;&#xB85C; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. <code>dex</code> &#xC640; <code>redis</code> &#xB294; <code>global.image.repository</code> &#xC758; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xC9C0; &#xC54A;&#xACE0; &#xBCC4;&#xB3C4;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (<a href="https://github.com/argoproj/argo-helm/blob/f26595848502480f9427c1365a8313270d9aa3af/charts/argo-cd/templates/dex/deployment.yaml?ref=kimsehwan96.com#L70-L76">&#xB9C1;&#xD06C; &#xCC38;&#xACE0;</a>)</p><h3 id="cert-manager">cert-manager</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/6386ca7cd5c0a244df82575274e3da24.js"></script>
<!--kg-card-end: html-->
<p>cert-manager &#xC758; helm chart &#xB97C; &#xBCF4;&#xBA74; controller &#xC790;&#xCCB4;&#xB294; <code>image.registry</code> &#xB85C; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB9CC; &#xBCC0;&#xACBD; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (values.yaml &#xC5D0;&#xB294; <code>image.registry</code> &#xD56D;&#xBAA9;&#xC774; &#xC5C6;&#xB294;&#xB370; &#xC0AC;&#xC2E4; <code>_helpers.tpl</code> &#xCABD;&#xC5D0; &#xBC1B;&#xC544;&#xC11C; &#xCC98;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB2E4; / <a href="https://github.com/cert-manager/cert-manager/blob/0448418353269ce5ecbb4eaeb0f301c5dcbeb8de/deploy/charts/cert-manager/templates/_helpers.tpl?ref=kimsehwan96.com#L176-L188">&#xB9C1;&#xD06C; &#xCC38;&#xACE0;</a>)</p><p></p><p>webhook &#xACFC; cainjector &#xC758; &#xACBD;&#xC6B0;&#xB294; <code>webhook.image.registry</code> &#xC640; &#xAC19;&#xC740;&#xAC83;&#xC73C;&#xB85C; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB9CC; &#xBCC0;&#xACBD;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD558;&#xACE0; <code>repository</code> &#xB97C; &#xBCC0;&#xACBD;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C;&#xB3C4; &#xB290;&#xB07C;&#xACA0;&#xC9C0;&#xB9CC; &#xBCF4;&#xD1B5; <code>registry</code> &#xC758; &#xACBD;&#xC6B0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC; &#xC815;&#xBCF4;&#xB9CC; &#xC8FC;&#xC785;&#xD558;&#xBA74; &#xB418;&#xB294; &#xBC18;&#xBA74;, <code>repository</code> &#xC758; &#xACBD;&#xC6B0; <code>registry</code> &#xB97C; &#xD3EC;&#xD568;&#xD574;&#xC11C; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;/&#xC774;&#xBBF8;&#xC9C0; &#xAC12;&#xAE4C;&#xC9C0; &#xD3EC;&#xD568;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p></p><h3 id="external-secrets">external-secrets</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/a4b4427e14a6791587b2130179dfd3b6.js"></script>
<!--kg-card-end: html-->
<p><code>image.repository</code> &#xB294; external-secrets &#xBA54;&#xC778; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xACE0;, <code>webhook</code> , <code>certController</code> &#xB610;&#xD55C; &#xAC01;&#xAC01; &#xBCC4;&#xB3C4;&#xB85C; &#xC9C0;&#xC815;&#xD574;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><h3 id="external-dns">external-dns</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/2dc7c0599a4cfcd06788f8cbb7d6d30f.js"></script>
<!--kg-card-end: html-->
<p><code>registry</code> &#xB9CC; &#xBCC0;&#xACBD;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xACE0;, external-dns &#xC790;&#xCCB4;&#xAC00; &#xC5EC;&#xB7EC; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xAC00; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB9E4;&#xC6B0; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xBCC0;&#xACBD; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="keda">keda</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/1cda0e49e36bb892f26ef6a7378cd61a.js"></script>
<!--kg-card-end: html-->
<p>keda &#xC758; &#xBAA8;&#xB4E0; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xC77C;&#xAD04; &#xBCC0;&#xACBD; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; <code>global.image.registry</code> &#xAC12;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xBBC0;&#xB85C; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="istiod">istiod</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/8eb54ec55140c4296bda612d6f59c7b4.js"></script>
<!--kg-card-end: html-->
<p><code>defaults.pilot.hub</code> &#xC758; &#xACBD;&#xC6B0; <code>istiod</code> &#xAC00; &#xC0AC;&#xC6A9;&#xD560; &#xC774;&#xBBF8;&#xC9C0;&#xC5D0; &#xB300;&#xD55C;  registry &#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294; &#xAC12;&#xC785;&#xB2C8;&#xB2E4;. </p><p><code>defaults.global.hub</code> &#xC758; &#xACBD;&#xC6B0; sidecar injection &#xC744; &#xC218;&#xD589;&#xD560; &#xB54C; &#xC0AC;&#xC6A9;&#xD560; registry &#xBC0F; <code>defaults.pilot.hub</code> &#xAC12;&#xC774; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xC744; &#xB54C; &#xC0AC;&#xC6A9;&#xD560; &#xAE30;&#xBCF8; &#xAC12;(istiod &#xC758; &#xC774;&#xBBF8;&#xC9C0;)&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="fluentd">fluentd</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/035b8c2a6aeddae29b62552fab929555.js"></script>
<!--kg-card-end: html-->
<h3 id="kube-prometheus-stack">kube-prometheus-stack</h3><p>kube-prometheus-stack &#xC740; &#xC5EC;&#xB7EC; helm sub chart &#xAC00; &#xD568;&#xAED8; &#xC0AC;&#xC6A9; &#xB418;&#xB294; &#xD615;&#xD0DC;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-28-------1.07.08.png" class="kg-image" alt="ECR Pull-Through Cache &#xC801;&#xC6A9;&#xAE30;(feat: Docker Rate Limit &#xC744; &#xD53C;&#xD574;&#xC11C;)" loading="lazy" width="1254" height="1104" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/02/-----------2025-02-28-------1.07.08.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/02/-----------2025-02-28-------1.07.08.png 1000w, https://www.kimsehwan96.com/content/images/2025/02/-----------2025-02-28-------1.07.08.png 1254w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kube-prometheus-stack &#xC758; helm chart. charts/ &#xC5D0; &#xC788;&#xB294; &#xCC28;&#xD2B8;&#xB4E4;&#xC740; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8;&#xB4E4;&#xC774;&#xB2E4;.</span></figcaption></figure><p>&#xB530;&#xB77C;&#xC11C; values.yaml &#xC5D0;&#xC11C;&#xB3C4; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8; / kube-prometheus-stack &#xC790;&#xCCB4;&#xC758; &#xCC28;&#xD2B8; &#xAC01;&#xAC01;&#xC5D0; &#xC4F0;&#xC774;&#xB294; &#xAC12;&#xB4E4;&#xC774; &#xD63C;&#xC7AC;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/9c4b0c87ab021f7a8aeff4a677bd7f4e.js"></script>
<!--kg-card-end: html-->
<p>&#xC11C;&#xBE0C;&#xCC28;&#xD2B8;&#xC758; &#xACBD;&#xC6B0; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8;&#xC758; &#xC774;&#xB984;&#xC744; &#xD1B5;&#xD574;&#xC11C; values &#xAC12;&#xC744; &#xC804;&#xB2EC;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.(&#xC608;: <code>kube-state-metrics</code> &#xC5D0; &#xC804;&#xB2EC;&#xD560; &#xAC12;&#xC740; <code>kube-state-metrics.image.registry</code> -&gt; &#xD574;&#xB2F9; &#xC11C;&#xBE0C; &#xCC28;&#xD2B8;&#xC758; <code>.Values.image.registry</code>)</p><p><code>alertmanager</code> , <code>prometheusOperator</code> , <code>prometheus</code> &#xB294; &#xBAA8;&#xB450; <code>kube-prometheus-stack</code> &#xC758; &#xC790;&#xCCB4; &#xD15C;&#xD50C;&#xB9BF;&#xC774;&#xACE0;. <code>prometheusOperator</code> &#xB294; &#xC790;&#xCCB4; <code>deployment</code> &#xB85C; &#xB728;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>prometheusOperator.image.registry</code> &#xD615;&#xD0DC;&#xB85C; &#xC9C1;&#xC811; &#xC804;&#xB2EC;&#xD558;&#xACE0;. <code>alertmanager</code> &#xC640; <code>prometheus</code> &#xB294; &#xBAA8;&#xB450; <code>CustomResource</code> &#xB85C; &#xC0DD;&#xC131;&#xB418;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; <code>Spec</code> &#xC774;&#xB77C;&#xB294; postfix &#xB85C; value &#xB97C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC720;&#xC758;&#xD560;&#xC810;&#xC740;. <code>grafana</code> , <code>prometheusOperator</code> &#xC640; &#xAC19;&#xC774; &#xD558;&#xB098;&#xC758; &#xCD94;&#xC0C1;&#xC801;&#xC778; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB3C4; &#xC11C;&#xBE0C; &#xC774;&#xBBF8;&#xC9C0;(&#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xB4F1;)&#xB4E4;&#xC774; &#xAC01;&#xAC01; &#xB2E4;&#xB978; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xC4F8; &#xC218;&#xB3C4; &#xC788;&#xC73C;&#xBBC0;&#xB85C; <code>values.yaml</code> &#xC5D0;&#xC11C; &#xBAA8;&#xB4E0; &#xC774;&#xBBF8;&#xC9C0; &#xBD80;&#xBD84;&#xC744; &#xD655;&#xC778;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</p><p></p><h3 id="helm-chart-%EC%98%88%EC%8B%9C%EB%93%A4%EC%9D%84-%EB%B3%B4%EA%B3%A0-%EB%82%98%EC%84%9C">Helm Chart &#xC608;&#xC2DC;&#xB4E4;&#xC744; &#xBCF4;&#xACE0; &#xB098;&#xC11C;</h3><p>&#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC14;&#xC640; &#xAC19;&#xC774;, Helm Chart&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;(&#xB610;&#xB294; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;)&#xB97C; &#xC124;&#xC815;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC740; &#xCC28;&#xD2B8;&#xB9C8;&#xB2E4; &#xC81C;&#xAC01;&#xAC01;&#xC785;&#xB2C8;&#xB2E4;.</p><ol><li><strong><code>image.registry</code> vs. <code>image.repository</code></strong><ol><li>&#xC5B4;&#xB5A4; &#xCC28;&#xD2B8;&#xB294; &#xB2E8;&#xC21C;&#xD788; <code>image.registry</code>&#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xBA74; &#xB098;&#xBA38;&#xC9C0; &#xACBD;&#xB85C;(&#xB9AC;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;/&#xC774;&#xBBF8;&#xC9C0;&#xBA85;)&#xB294; &#xD15C;&#xD50C;&#xB9BF;&#xC774; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xBD99;&#xC5EC;&#xC8FC;&#xB294; &#xAD6C;&#xC870;&#xB97C; &#xAC16;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xBC18;&#xBA74; &#xB2E4;&#xB978; &#xCC28;&#xD2B8;&#xB294; <code>image.repository</code> &#xC790;&#xCCB4;&#xC5D0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;+&#xC870;&#xC9C1;+&#xC774;&#xBBF8;&#xC9C0;&#xBA85;&#xC744; &#xC804;&#xBD80; &#xB123;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xB418;&#xC5B4; &#xC788;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol></li><li><strong><code>global</code> &#xC124;&#xC815;</strong><ol><li>&#xC77C;&#xBD80; &#xCC28;&#xD2B8;&#xB294; <code>global.image.repository</code>(or <code>global.image.registry</code>)&#xB9CC; &#xC124;&#xC815;&#xD558;&#xBA74; &#xC5EC;&#xB7EC; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xAC00; &#xC77C;&#xAD04;&#xC801;&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xAC12;&#xC744; &#xCC38;&#xC870;&#xD558;&#xB3C4;&#xB85D; &#xB9CC;&#xB4E4;&#xC5B4;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD558;&#xC9C0;&#xB9CC; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8;(&#xD639;&#xC740; &#xAC19;&#xC740; &#xCC28;&#xD2B8; &#xB0B4; &#xC5EC;&#xB7EC; &#xD15C;&#xD50C;&#xB9BF;)&#xB9C8;&#xB2E4; &#xBCC4;&#xB3C4;&#xC758; <code>image.repository</code> &#xAC12;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xC73C;&#xBA74;, &#xAC01;&#xAC01; &#xBCC4;&#xB3C4;&#xB85C; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB4DC;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li></ol></li><li>&#xC11C;&#xBE0C;&#xCC28;&#xD2B8; &amp; &#xC0AC;&#xC774;&#xB4DC;&#xCE74;<ol><li><code>kube-prometheus-stack</code>&#xCC98;&#xB7FC; &#xBCF5;&#xC7A1;&#xD55C; &#xCC28;&#xD2B8;&#xB294; &#xC11C;&#xBE0C;&#xCC28;&#xD2B8;, CRD, &#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xC774;&#xBBF8;&#xC9C0;&#xAC00; &#xC11E;&#xC5EC; &#xC788;&#xC5B4;, &#xC5EC;&#xB7EC; &#xC704;&#xCE58;&#xC5D0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC; &#xC124;&#xC815;&#xC774; &#xD769;&#xC5B4;&#xC838; &#xC788;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C; values.yaml &#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xBAA8;&#xB4E0; &#xC774;&#xBBF8;&#xC9C0; &#xAD00;&#xB828; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xBE60;&#xC9D0;&#xC5C6;&#xC774; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xD544;&#xC694;&#xD558;&#xB2E4;&#xBA74; <strong>&#xAC01;&#xAC01;</strong> ECR Pull-Through Cache &#xACBD;&#xB85C;&#xB85C; &#xBC14;&#xAFD4;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li></ol></li></ol><h2 id></h2><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>&#xACB0;&#xAD6D; Docker Hub&#xC758; &#xC774;&#xBBF8;&#xC9C0; Pull Rate Limit &#xC774;&#xC288;&#xB294;, &#xC2A4;&#xD31F; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB098; Karpenter &#xAC19;&#xC740; &#xC624;&#xD1A0;&#xC2A4;&#xCF00;&#xC77C;&#xB9C1; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xB178;&#xB4DC;&#xAC00; &#xC790;&#xC8FC; &#xAD50;&#xCCB4;&#xB418;&#xB294; EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xD2B9;&#xD788; &#xCDE8;&#xC57D;&#xD558;&#xAC8C; &#xC791;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC9C1;&#xC811; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC5C5;&#xB85C;&#xB4DC;&#xD558;&#xAC70;&#xB098;, &#xC678;&#xBD80; &#xBBF8;&#xB7EC;&#xB9C1; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xAE30;&#xBCF4;&#xB2E4;&#xB294; AWS ECR Pull-Through Cache&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC758; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; ECR &#xD504;&#xB77C;&#xC774;&#xBE57; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xC5D0; &#xCE90;&#xC2F1;&#xD558;&#xB294;&#xAC83;&#xC774; &#xAC00;&#xC7A5; &#xC548;&#xC815;&#xC801;&#xC774;&#xACE0; &#xAC04;&#xB2E8;&#xD55C; &#xBC29;&#xBC95;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xBB3C;&#xB860; Helm Chart&#xB9C8;&#xB2E4; <code>image.registry</code>, <code>image.repository</code>, <code>global.image.*</code> &#xB4F1;&#xC758; &#xC124;&#xC815; &#xBC29;&#xC2DD;&#xC774; &#xB2E4;&#xB974;&#xBBC0;&#xB85C;, &#xD544;&#xC694;&#xD55C; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB7;&#xC11C;&#xBE0C;&#xCC28;&#xD2B8;&#xBCC4;&#xB85C; &#xAF3C;&#xAF3C;&#xD788; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC; &#xACBD;&#xB85C;&#xB97C; &#xBCC0;&#xACBD;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD558;&#xC9C0;&#xB9CC; &#xC774; &#xC791;&#xC5C5;&#xC744; &#xD55C; &#xBC88; &#xC9C4;&#xD589;&#xD558;&#xACE0; &#xB098;&#xBA74;, &#xB300;&#xBD80;&#xBD84; Helm Chart&#xC5D0;&#xC11C; image &#xC640; &#xAD00;&#xB828;&#xB41C; &#xD15C;&#xD50C;&#xB9BF; &#xBD80;&#xBD84;&#xC774; &#xBCC0;&#xACBD;&#xB418;&#xC9C0;&#xB294; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB354; &#xC774;&#xC0C1; &#xC2E0;&#xACBD;&#xC4F0;&#xC9C0; &#xC54A;&#xACE0; &#xC5EC;&#xB7EC;&#xBD84;&#xC758; ECR &#xD504;&#xB77C;&#xC774;&#xBE57; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xC5D0; &#xD37C;&#xBE14;&#xB9AD; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xCE90;&#xC2F1;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; &#xD37C;&#xBE14;&#xB9AD; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC758; &#xC815;&#xCC45; &#xBCC0;&#xD654;&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xC9C0; &#xC54A;&#xACE0; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xB355;&#xC158; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[EMR on EKS 환경에서 spark driver 와 executor 가 같은 AZ 에 스케쥴링 되도록 하는 방법 (가용성까지 확보하면서)]]></title><description><![CDATA[<p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Femr-on-eks-spark-driver-and-executor-same-az%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=false" alt="Hits" loading="lazy"></a></p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">emr-on-eks &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver pod &#xC640; executor pod &#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; AZ(&#xAC00;&#xC6A9;&#xC601;&#xC5ED;)&#xC5D0; &#xC788;&#xC73C;&#xBA74; AZ &#xAC04; &#xD1B5;&#xC2E0;&#xBE44;&#xC6A9;&#xC774; &#xB9CE;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; spark driver pod &#xAC00; &#xCFE0;</div></div>]]></description><link>https://www.kimsehwan96.com/emr-on-eks-spark-driver-and-executor-same-az/</link><guid isPermaLink="false">675c46e6bccbbe88b94a0004</guid><category><![CDATA[Airflow]]></category><category><![CDATA[EMR]]></category><category><![CDATA[eks]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Spark]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Fri, 13 Dec 2024 15:10:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/12/Site-Merch_Amazon-EMR-on-EKS_SocialMedia_2.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.kimsehwan96.com/content/images/2024/12/Site-Merch_Amazon-EMR-on-EKS_SocialMedia_2.png" alt="EMR on EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver &#xC640; executor &#xAC00; &#xAC19;&#xC740; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBC29;&#xBC95; (&#xAC00;&#xC6A9;&#xC131;&#xAE4C;&#xC9C0; &#xD655;&#xBCF4;&#xD558;&#xBA74;&#xC11C;)"><p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Femr-on-eks-spark-driver-and-executor-same-az%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=false" alt="EMR on EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver &#xC640; executor &#xAC00; &#xAC19;&#xC740; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBC29;&#xBC95; (&#xAC00;&#xC6A9;&#xC131;&#xAE4C;&#xC9C0; &#xD655;&#xBCF4;&#xD558;&#xBA74;&#xC11C;)" loading="lazy"></a></p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">emr-on-eks &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver pod &#xC640; executor pod &#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; AZ(&#xAC00;&#xC6A9;&#xC601;&#xC5ED;)&#xC5D0; &#xC788;&#xC73C;&#xBA74; AZ &#xAC04; &#xD1B5;&#xC2E0;&#xBE44;&#xC6A9;&#xC774; &#xB9CE;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; spark driver pod &#xAC00; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC5D0; &#xC758;&#xD574; &#xD2B9;&#xC815; &#xB178;&#xB4DC;&#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xC5C8;&#xC744; &#xB54C;, executor pod &#xAC00; &#xD574;&#xB2F9; driver pod &#xAC00; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB41C; &#xB178;&#xB4DC;&#xC758; AZ &#xC640; &#xB3D9;&#xC77C;&#xD55C; AZ&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB178;&#xB4DC;&#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xD558;&#xAE30;&#xC704;&#xD574; &#xC870;&#xCE58;&#xD588;&#xB358; &#xBC29;&#xBC95;&#xC744; &#xACF5;&#xC720;&#xD569;&#xB2C8;&#xB2E4;.</div></div><h2 id="emr-on-eks">EMR on EKS</h2><p>EMR on EKS &#xB780; EKS &#xC5D0;&#xC11C; &#xC624;&#xD508;&#xC18C;&#xC2A4; &#xBE45;&#xB370;&#xC774;&#xD130; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC2E4;&#xD589; &#xD560; &#xC218; &#xC788;&#xB294; &#xC544;&#xB9C8;&#xC874;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;. EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xC11C; Amazon EMR &#xAE30;&#xBC18; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC2E4;&#xD589; &#xD560; &#xC218; &#xC788;&#xB294;&#xB370;. AWS EMR &#xC5D0; Spark Job &#xC744; submit &#xD558;&#xBA74; &#xAC00;&#xC0C1;&#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB77C;&#xACE0; &#xBD88;&#xB9AC;&#xB294; EKS &#xD658;&#xACBD;&#xC5D0; Spark driver &#xC640; Spark Executor &#xB97C; &#xC2E4;&#xD589; &#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>Karpenter &#xC640; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xADF8; &#xD3B8;&#xB9AC;&#xD568;&#xC774; &#xADF9;&#xB300;&#xD654; &#xB418;&#xB294;&#xB370;, &#xBB34;&#xAC70;&#xC6B4; Spark Job &#xC774; &#xC218;&#xD589;&#xB418;&#xB294; &#xACBD;&#xC6B0; Karpenter &#xC5D0; &#xC758;&#xD574; Node &#xAC00; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xB418;&#xACE0;, &#xC791;&#xC5C5;&#xC774; &#xB05D;&#xB09C; &#xC774;&#xD6C4;&#xC5D0;&#xB294; &#xD574;&#xB2F9; &#xB178;&#xB4DC;&#xB97C; &#xB0B4;&#xB9AC;&#xB294; &#xB4F1;&#xC758; &#xC791;&#xC5C5;&#xC744; &#xC790;&#xB3D9;&#xD654; &#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB9E4;&#xC6B0; &#xBE44;&#xC6A9; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xB2E4;.</p><p>&#xD604;&#xC7AC; &#xC6B0;&#xB9AC;&#xB294; Airflow &#xC640; &#xD568;&#xAED8; EMR on EKS &#xB97C; &#xC0AC;&#xC6A9;&#xC911;&#xC778;&#xB370;. Airflow &#xC758; EMROperator &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xD544;&#xC694;&#xD55C; Spark Job &#xC744; &#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xC600;&#xB2E4;. &#xD604;&#xC7AC; &#xC6B0;&#xB9AC;&#xC758; &#xAD6C;&#xC131;&#xC744; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xADF8;&#xB9AC;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/12/-----------2024-12-14-------2.01.06.png" class="kg-image" alt="EMR on EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver &#xC640; executor &#xAC00; &#xAC19;&#xC740; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBC29;&#xBC95; (&#xAC00;&#xC6A9;&#xC131;&#xAE4C;&#xC9C0; &#xD655;&#xBCF4;&#xD558;&#xBA74;&#xC11C;)" loading="lazy" width="1524" height="1282" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/12/-----------2024-12-14-------2.01.06.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/12/-----------2024-12-14-------2.01.06.png 1000w, https://www.kimsehwan96.com/content/images/2024/12/-----------2024-12-14-------2.01.06.png 1524w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xADF8;&#xB9BC;&#xC5D0;&#xC11C;&#xB294; job submitter pod &#xADF8;&#xB9BC;&#xC774; &#xC0DD;&#xB7B5;&#xB418;&#xC5C8;&#xB2E4;.</span></figcaption></figure><p>EMROperator &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; (&#xC815;&#xD655;&#xD788;&#xB294; &#xADF8;&#xAC83;&#xC744; &#xC0C1;&#xC18D;&#xD558;&#xC5EC; &#xBCC4;&#xB3C4;&#xB85C; &#xAD6C;&#xD604;&#xD55C; Operator &#xB97C; &#xC0AC;&#xC6A9;&#xC911;&#xC774;&#xB2E4;.) Spark Job context &#xC640; &#xD568;&#xAED8; AWS EMR &#xC5D0; job &#xC744; submit &#xD558;&#xBA74;, AWS EMR &#xC744; &#xD1B5;&#xD574; EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC5D0; Spark Driver Pod &#xC640; Spark Executor Pod &#xAC00; &#xC0DD;&#xC131;&#xB418;&#xAC8C; &#xB41C;&#xB2E4;. (Job Submitter Pod &#xB3C4; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xB370; &#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xB2F9; &#xB0B4;&#xC6A9;&#xC744; &#xC0DD;&#xB7B5;&#xD55C;&#xB2E4;)</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/43225f8791e335d8f8b2f921cfb3e311.js"></script>
<!--kg-card-end: html-->
<p></p><h2 id="%EB%AC%B8%EC%A0%9C-%EC%83%81%ED%99%A9">&#xBB38;&#xC81C; &#xC0C1;&#xD669;</h2><p>Spark Job &#xC740; &#xB300;&#xBD80;&#xBD84; &#xCEF4;&#xD4E8;&#xD305; &#xB9AC;&#xC18C;&#xC2A4;(CPU, &#xBA54;&#xBAA8;&#xB9AC; &#xB458;&#xB2E4;)&#xB97C; &#xB9CE;&#xC774; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774;&#xBBC0;&#xB85C;, Karpenter &#xB97C; &#xD1B5;&#xD574; &#xD544;&#xC694;&#xD560;&#xB54C;&#xB9CC; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xCEF4;&#xD4E8;&#xD305; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;&#xACE0; &#xD558;&#xB354;&#xB77C;&#xB3C4; EC2 &#xBE44;&#xC6A9;&#xC774; &#xB9E4;&#xC6B0; &#xB9CE;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xBE44;&#xC6A9; &#xD6A8;&#xC728;&#xC131; &#xAC1C;&#xC120;&#xC744; &#xC704;&#xD574; Spark Driver Pod &#xB294; on-demand &#xBA38;&#xC2E0;&#xC5D0;, Spark Executor Pod &#xB294; spot &#xBA38;&#xC2E0;&#xC5D0; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD558;&#xB3C4;&#xB85D; <code>podTemplate</code> (<a href="https://spark.apache.org/docs/latest/running-on-kubernetes.html?ref=kimsehwan96.com#pod-template">https://spark.apache.org/docs/latest/running-on-kubernetes.html#pod-template</a>)&#xC744; &#xD1B5;&#xD574; &#xC124;&#xC815;&#xD558;&#xC600;&#xB2E4;</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/b64b14e93b8a951e1f6ec5317a75e180.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xC640; &#xAC19;&#xC740; PodTemplate &#xB97C; AWS EMR &#xC5D0; job submit &#xD560; &#xB54C; &#xC81C;&#xCD9C;&#xD558;&#xBA74;, &#xC6B0;&#xB9AC;&#xAC00; &#xC9C0;&#xC815;&#xD55C; properties (e.g spec.nodeSelector)&#xB97C; &#xAC16;&#xACE0;, &#xADF8; &#xC678; &#xAC12;&#xB4E4;&#xC744; &#xCC44;&#xC6CC;&#xC11C; EKS &#xD658;&#xACBD;&#xC5D0; driver &#xC640; executor &#xAC00; &#xC0DD;&#xC131;&#xB41C;&#xB2E4;.</p><p>Spark Driver &#xC758; &#xACBD;&#xC6B0; &#xC2E4;&#xD328;&#xD558;&#xBA74; &#xBAA8;&#xB4E0; &#xC791;&#xC5C5;&#xC744; &#xB2E4;&#xC2DC; &#xC2DC;&#xC791;&#xD574;&#xC57C; &#xD558;&#xC9C0;&#xB9CC; (executor &#xB3C4; &#xBAA8;&#xB450; &#xC885;&#xB8CC;), Spark Executor &#xC758; &#xACBD;&#xC6B0; &#xC885;&#xB8CC;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#xC804;&#xCCB4; &#xC791;&#xC5C5;&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xB07C;&#xCE58;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; spot &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC218;&#xD589;&#xD558;&#xB294;&#xAC83;&#xC774; &#xD6E8;&#xC52C; &#xBE44;&#xC6A9; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xC600;&#xB2E4;.</p><p>&#xBB38;&#xC81C;&#xB294;, &#xC704;&#xC640; &#xAC19;&#xC774; &#xAD6C;&#xC131;&#xD558;&#xC600;&#xC744; &#xACBD;&#xC6B0;, &#xADF8;&#xB9AC;&#xACE0; (&#xB2F9;&#xC5F0;&#xD788;&#xB3C4;) EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xD658;&#xACBD;&#xC758; &#xB178;&#xB4DC;&#xAC00; &#xC5EC;&#xB7EC; &#xAC00;&#xC6A9;&#xC601;&#xC5ED;(AZ)&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xACBD;&#xC6B0;. AWS EMR &#xC744; &#xD1B5;&#xD574; &#xC0DD;&#xC131;&#xB418;&#xB294; driver pod &#xC640; executor pod &#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xACE0;, &#xC774;&#xB7EC;&#xD55C; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; driver pod &#xC640; executor pod &#xAC04;&#xC758; &#xD1B5;&#xC2E0;&#xC774; &#xBAA8;&#xB450; &#xBE44;&#xC6A9;&#xC73C;&#xB85C; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. (&#xD55C;&#xAD6D; &#xB9AC;&#xC804; &#xAE30;&#xC900; $0.01 per GB)</p><p><a href="https://aws.github.io/aws-emr-containers-best-practices/node-placement/docs/eks-node-placement/?ref=kimsehwan96.com">https://aws.github.io/aws-emr-containers-best-practices/node-placement/docs/eks-node-placement/</a></p><p>&#xC544;&#xB9C8;&#xC874;&#xC774; &#xC81C;&#xACF5;&#xD558;&#xB294; AWS EMR &#xD658;&#xACBD;&#xC5D0; &#xB300;&#xD55C; Best Practice &#xBB38;&#xC11C;&#xB97C; &#xBCF4;&#xBA74; AWS EKS &#xAE30;&#xBC18;&#xC758; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xAC00; &#xC5EC;&#xB7EC; AZ &#xC5D0; &#xAC78;&#xCCD0;&#xC11C; &#xC788;&#xB294; &#xACBD;&#xC6B0;, Driver &#xC640; Executor &#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; AZ &#xC5D0; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xB420; &#xC218; &#xC788;&#xACE0;, &#xC774;&#xB7F0; &#xACBD;&#xC6B0; &#xBE44;&#xC6A9;&#xC774; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xB294; &#xB0B4;&#xC6A9;&#xC774; &#xB098;&#xC640;&#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/12/-----------2024-12-14-------3.12.57.png" class="kg-image" alt="EMR on EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; spark driver &#xC640; executor &#xAC00; &#xAC19;&#xC740; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBC29;&#xBC95; (&#xAC00;&#xC6A9;&#xC131;&#xAE4C;&#xC9C0; &#xD655;&#xBCF4;&#xD558;&#xBA74;&#xC11C;)" loading="lazy" width="1572" height="1300" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/12/-----------2024-12-14-------3.12.57.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/12/-----------2024-12-14-------3.12.57.png 1000w, https://www.kimsehwan96.com/content/images/2024/12/-----------2024-12-14-------3.12.57.png 1572w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Driver &#xC640; Executor &#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xBA74; AZ &#xAC04; &#xD1B5;&#xC2E0; &#xBE44;&#xC6A9;&#xC774; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;.</span></figcaption></figure><p>&#xC5EC;&#xAE30;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC194;&#xB8E8;&#xC158;&#xC740; spark job submit parameter &#xC5D0; nodeSelector&#xB97C; <code>topology.kubernetes.io/zone</code> &#xB4F1;&#xC744; &#xC124;&#xC815;&#xD558;&#xC5EC; job &#xC744; submit &#xD558;&#xACE0; job submitter, driver, executor &#xB4F1;&#xC744; &#xB2E8;&#xC77C; AZ &#xC5D0;&#xC11C; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC774;&#xB2E4;.</p><p>&#xB2F9;&#xC5F0;&#xD788; &#xB3D9;&#xC791;&#xD558;&#xAE34; &#xD560;&#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB807;&#xC9C0;&#xB9CC; &#xC774; &#xBB38;&#xC11C;&#xC5D0;&#xC11C; &#xB098;&#xC640;&#xC788;&#xB4EF;&#xC774; &#xD2B9;&#xC815; AZ &#xB97C; &#xD558;&#xB4DC;&#xCF54;&#xB529;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; AZ &#xC5D0; on-demand, spot &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xBD80;&#xC871;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; pending &#xC0C1;&#xD0DC;&#xC5D0; &#xBE60;&#xC9C8;&#xAC83;&#xC774;&#xB2E4;. (karpenter &#xB3C4; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC904; &#xC218; &#xC5C6;&#xB2E4;. &#xC2E4;&#xC81C; &#xD574;&#xB2F9; AZ&#xC5D0; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xBD80;&#xC871;&#xD55C;&#xAC70;&#xB2C8;&#xAE4C;)</p><p>&#xADF8;&#xB798;&#xC11C; &#xC624;&#xD788;&#xB824; job submitter, driver pod &#xB294; &#xC544;&#xBB34; AZ &#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB178;&#xB4DC;&#xC5D0; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xACE0; (Kubernetes Scheduler &#xC5D0;&#xAC8C; &#xC804;&#xC801;&#xC73C;&#xB85C; &#xC704;&#xC784;&#xD558;&#xACE0;), executor pod &#xB9CC; driver pod &#xC640; &#xB3D9;&#xC77C;&#xD55C; AZ &#xC5D0; &#xC788;&#xB294; &#xB178;&#xB4DC;&#xC5D0; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294;&#xAC83;&#xC774; &#xB354; &#xAC00;&#xC6A9;&#xC131; &#xD5A5;&#xC0C1;&#xC774; &#xB41C;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD588;&#xB2E4;.</p><h2 id="%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95">&#xD574;&#xACB0; &#xBC29;&#xBC95;</h2><p>driver pod &#xAC00; &#xB5A0;&#xC788;&#xB294; &#xB178;&#xB4DC;&#xC758; <a href="http://topology.kubernetes.io/zone?ref=kimsehwan96.com"><code>topology.kubernetes.io/zone</code></a> &#xB808;&#xC774;&#xBE14;&#xC744; &#xAC16;&#xB294; &#xB178;&#xB4DC;&#xC5D0; executor pod &#xAC00; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xBA74; &#xB418;&#xB294; &#xC0C1;&#xD669;&#xC774;&#xAE30;&#xB54C;&#xBB38;&#xC5D0;, &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xAC00; &#xC774;&#xB7F0; &#xC0C1;&#xD669;&#xC744; &#xCC98;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xB294; <code>inter-pod-affinity</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB41C;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xB2E4;. (<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/?ref=kimsehwan96.com#inter-pod-affinity-and-anti-affinity">https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity</a>)</p><p><code>inter-pod-affinity</code> &#xB780; &#xD574;&#xB2F9; &#xB178;&#xB4DC;&#xC5D0;&#xC11C; &#xC774;&#xBBF8; &#xC2E4;&#xD589;&#xC911;&#xC778; &#xD30C;&#xB4DC;&#xC758; <code>&#xB808;&#xC774;&#xBE14;</code> &#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xD30C;&#xB4DC;&#xB97C; &#xC2A4;&#xCF00;&#xC904;&#xB9C1; &#xD560; &#xC218; &#xC788;&#xB294; &#xB178;&#xB4DC;&#xB97C; &#xC81C;&#xD55C; &#xD560; &#xC218; &#xC788;&#xB294; &#xAE30;&#xB2A5;&#xC774;&#xB2E4;.</p><p>driver pod &#xAC00; &#xC2A4;&#xCF00;&#xC974;&#xB9C1;&#xB41C; node &#xC758; <a href="http://topology.kubernetes.io/zone?ref=kimsehwan96.com"><code>topology.kubernetes.io/zone</code></a> &#xB808;&#xC774;&#xBE14;&#xC758; &#xAC12;&#xC744; &#xAC16;&#xB294; &#xB178;&#xB4DC;&#xC5D0; executor pod &#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD558;&#xACE0;&#xC790; &#xD560; &#xB54C; <code>inter-pod-affinity</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xAD6C;&#xD604;&#xC774; &#xAC00;&#xB2A5;&#xD55C; &#xAC83;&#xC774;&#xB2E4;.</p><blockquote>inter-pod-affinity &#xB294; &#xC0C1;&#xB2F9;&#xD55C; &#xCC98;&#xB9AC;&#xB7C9;&#xC744; &#xD544;&#xC694;&#xB85C; &#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774;&#xB77C; &#xC218;&#xBC31;&#xB300; &#xC774;&#xC0C1;&#xC758; &#xB178;&#xB4DC;&#xB97C; &#xC6B4;&#xC601;&#xD558;&#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xC11C;&#xB294; &#xC0AC;&#xC6A9;&#xC774; &#xAD8C;&#xC7A5;&#xB418;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xD30C;&#xB4DC;&#xAC00; &#xC2A4;&#xCF00;&#xC974;&#xB9C1;&#xB418;&#xAE30; &#xAE4C;&#xC9C0; (&#xC774; &#xC870;&#xAC74;&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xB290;&#xB77C;) &#xC624;&#xB798; &#xAC78;&#xB9B4; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xD55C;&#xB2E4;.</blockquote>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/07c67e2b7647d480d664523226dab1a4.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xAD6C;&#xC131;&#xD558;&#xBA74; <code>spark-app</code> &#xC774;&#xB77C;&#xB294; driver pod &#xC758; label &#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C;, &#xD574;&#xB2F9; &#xD30C;&#xB4DC;&#xAC00; &#xB5A0;&#xC788;&#xB294; &#xB178;&#xB4DC;&#xC758; <a href="http://topology.kubernetes.io/zone?ref=kimsehwan96.com"><code>topology.kubernetes.io/zone</code></a> &#xB808;&#xC774;&#xBE14;&#xC758; &#xAC12;&#xACFC; &#xB3D9;&#xC77C;&#xD55C; Node &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xD558;&#xB3C4;&#xB85D; &#xAC15;&#xC81C; &#xD560; &#xC218; &#xC788;&#xB2E4;. (topologyKey &#xCC38;&#xACE0;)</p><p>&#xC774;&#xB860;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xAC04;&#xB2E8;&#xD55C; &#xC811;&#xADFC;&#xC774;&#xC600;&#xC9C0;&#xB9CC; &#xD604;&#xC2E4;&#xC801;&#xC73C;&#xB85C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;.</p><ol><li>spark job &#xC744; submit &#xD558;&#xAE30; &#xC804;&#xC5D0;&#xB294; &#xAC01; job &#xBCC4;&#xB85C; &#xACE0;&#xC720;&#xD55C; job id &#xB97C; &#xC54C; &#xC218; &#xC5C6;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; PodTemplate &#xC740; spark job submit &#xD558;&#xAE30;&#xC804;&#xC5D0; &#xC774;&#xBBF8; &#xC788;&#xC5B4;&#xC57C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; job id &#xAE30;&#xBC18;&#xC758; &#xB808;&#xC774;&#xBE14;&#xC744; &#xC120;&#xD0DD; &#xD560; &#xC218; &#xC5C6;&#xB2E4;.</li><li>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xAC01; Job &#xBCC4;&#xB85C; (Airflow &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; DAG / Task) static &#xD558;&#xAC8C; app name &#xB4F1;&#xC744; &#xC9C0;&#xC815;&#xD558;&#xACE0;, &#xADF8;&#xAC83;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB808;&#xC774;&#xBE14;&#xC744; &#xC120;&#xD0DD;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xBA74; &#xB418;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;? &#x2192; &#xB9CC;&#xC57D; &#xAC19;&#xC740; &#xC2DC;&#xAC04;&#xC5D0; &#xC911;&#xBCF5; &#xC2E4;&#xD589;&#xB418;&#xACE0;&#xC788;&#xB2E4;&#xBA74; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD; &#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ol><p>AWS EMR &#xC5D0; job &#xC744; submit &#xD558;&#xAE30;&#xC804;&#xC5D0; driver &#xC640; pod &#xC5D0; &#xB300;&#xD55C; PodTemplate &#xC744; &#xC804;&#xB2EC;&#xD574;&#xC57C; &#xD558;&#xB294;&#xB370;, &#xC989; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; driver &#xC640; pod &#xB97C; &#xACE0;&#xC720;&#xD558;&#xAC8C; &#xB9E4;&#xCE6D;&#xC2DC;&#xCF1C;&#xC904; &#xC218; &#xC788;&#xB294; &#xD0A4;/&#xAC12;&#xC744; &#xACE0;&#xC815;&#xD574;&#xC57C;&#xB9CC; &#xC6B0;&#xB9AC;&#xAC00; &#xD558;&#xACE0;&#xC790; &#xD588;&#xB358; &#xB3D9;&#xC791;&#xC744; &#xC815;&#xD655;&#xD558;&#xAC8C; &#xAD6C;&#xD604; &#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; Airflow EMROperator &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC6B0;&#xB9AC; &#xD658;&#xACBD;&#xC5D0;, AWS EMR &#xC5D0; job &#xC744; submit &#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0; &#xD574;&#xB2F9; &#xC791;&#xC5C5;&#xC758; &#xC774;&#xB984;(e.g <code>etl-foo-bar</code> )&#xACFC; timestamp &#xB97C; &#xC870;&#xD569;&#xD574;&#xC11C; affinity &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD55C; label &#xACFC; value &#xB97C; &#xACE0;&#xC815;&#xD558;&#xC600;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; EMROperator &#xAC00; job &#xC744; submit &#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0; PodTemplate &#xC744; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xD558;&#xC5EC; S3 &#xC5D0; &#xC5C5;&#xB85C;&#xB4DC;&#xD558;&#xACE0;, &#xADF8; S3 &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xACBD;&#xB85C;&#xB97C; AWS EMR &#xC5D0; submit &#xD560; &#xB54C; &#xAC19;&#xC774; &#xB118;&#xACA8;&#xC8FC;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xD604;&#xD558;&#xC600;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/d3e88ca349b66f113a38724971243deb.js"></script>
<!--kg-card-end: html-->
<p><code>spark.kubernetes.driver.label</code> &#xD615;&#xC2DD;&#xC73C;&#xB85C; spark driver pod &#xC758; &#xB808;&#xC774;&#xBE14;&#xC744; &#xC9C0;&#xC815;&#xD574;&#xC904; &#xC218; &#xC788;&#xACE0;. &#xC774;&#xAC83;&#xC744; &#xC0AC;&#xC804;&#xC5D0; &#xC9C0;&#xC815;&#xD558;&#xACE0;, PodTemplate &#xC5D0;&#xB294; &#xC9C0;&#xC815;&#xB41C; label &#xC758; value &#xB97C; <code>inter-pod-affinity</code> &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xAD6C;&#xD604;&#xD558;&#xC600;&#xB2E4;. &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB41C; PodTemplate &#xC740; S3 &#xC5D0; &#xC5C5;&#xB85C;&#xB4DC;&#xD558;&#xACE0;, &#xADF8;&#xAC83;&#xC5D0; &#xB300;&#xD55C; &#xACBD;&#xB85C;&#xB97C; <code>spark.kubernetes.executor.podTemplateFile</code> , <code>spark.kubernetes.driver.podTemplateFile</code> &#xD615;&#xD0DC;&#xB85C; &#xB118;&#xACA8;&#xC8FC;&#xC5B4;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xC600;&#xB2E4;.</p><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xC5EC;&#xC11C; driver pod &#xC5D0; &#xB300;&#xD55C; &#xACE0;&#xC720;&#xD55C; label key:value &#xB97C; job submit &#xD558;&#xAE30; &#xC804;&#xC5D0; &#xD578;&#xB4E4;&#xB9C1; &#xD560; &#xC218; &#xC788;&#xACE0;, &#xC774;&#xAC83;&#xC744; &#xD1B5;&#xD574;&#xC11C; PodTemplate &#xC744; &#xC0DD;&#xC131;&#xD558;&#xBA74; &#xC6B0;&#xB9AC;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC744; &#xAD6C;&#xD604; &#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC774; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; label &#xC758; key, value &#xB294; &#xC5B4;&#xB5A4;&#xAC83;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xB3C4; &#xC0C1;&#xAD00;&#xC5C6;&#xB2E4;. &#xB2E4;&#xB9CC; value &#xB294; &#xB3D9;&#xC77C;&#xD55C; &#xC791;&#xC5C5;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC5EC;&#xB7EC;&#xBC88; submit &#xB418;&#xAC70;&#xB098; &#xB3D9;&#xC2DC;&#xC5D0; &#xC2E4;&#xD589;&#xB418;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xBC1C;&#xC0DD;&#xD574;&#xB3C4; conflict &#xC774; &#xB098;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xAC8C;&#xB9CC; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><h2 id="%EC%89%BD%EA%B2%8C-%ED%95%B4%EA%B2%B0-%ED%95%A0-%EC%88%98-%EC%97%86%EC%9D%84%EA%B9%8C">&#xC27D;&#xAC8C; &#xD574;&#xACB0; &#xD560; &#xC218; &#xC5C6;&#xC744;&#xAE4C;?</h2><p>&#xC774;&#xB807;&#xAC8C; &#xD2B9;&#xC815; &#xD30C;&#xB4DC;&#xB97C; &#xB2E4;&#xC591;&#xD55C; &#xC870;&#xAC74;&#xC73C;&#xB85C; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xD558;&#xB294; &#xBC29;&#xBC95;&#xC740; Kubernetes &#xC5D0;&#xC11C;&#xC758; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xAC00; &#xD310;&#xB2E8; &#xD560; &#xC218; &#xC788;&#xB294; nodeSelector, affinity , topology spread constraints &#xB4F1;&#xC744; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C; &#xC798; &#xC870;&#xD569;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.</p><p>&#xC774;&#xBC88; &#xBB38;&#xC81C;&#xC0C1;&#xD669;&#xACFC; &#xAC19;&#xC740; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; <code>inter-pod-affinity</code> &#xB97C; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xC740; &#xAC00;&#xB2A5;&#xD588;&#xC9C0;&#xB9CC;. AWS EKS &#xBFD0;&#xB9CC; &#xC544;&#xB2C8;&#xB77C; AWS EMR &#xC774;&#xB77C;&#xB294; &#xC911;&#xAC04; layer &#xAC00; &#xB4E4;&#xC5B4;&#xAC00; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xC6B0;&#xD68C;&#xBC95;&#xC744; &#xCC3E;&#xC544;&#xC11C; &#xD574;&#xACB0;&#xC744; &#xD574;&#xC57C; &#xD588;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; spark on kuberentes &#xC5D0;&#xC11C; podTemplate &#xC5D0; &#xB300;&#xD55C; &#xD15C;&#xD50C;&#xB9AC;&#xD305; &#xBCC0;&#xC218;&#xB97C; &#xC9C0;&#xC6D0;&#xD574;&#xC8FC;&#xAC70;&#xB098;, AWS EMR &#xC5D0;&#xC11C; &#xADF8;&#xB7EC;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD574;&#xC92C;&#xB2E4;&#xBA74; &#xC9C0;&#xAE08;&#xACFC; &#xAC19;&#xC774; Airflow Operator (&#xD639;&#xC740; &#xADF8;&#xC678; &#xB2E4;&#xC591;&#xD55C; &#xC5EC;&#xB7EC;&#xBD84;&#xC758; &#xD658;&#xACBD;)&#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xAD6C;&#xD604;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xC5C8;&#xC744; &#xB0B4;&#xC6A9;&#xC774;&#xB2E4;.</p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4;</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/b6727df27383978d298bab17e2f3aa30.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xC640; &#xAC19;&#xC740; {JOB_ID} &#xB4F1;&#xC744; spark on kuberentes &#xD639;&#xC740; AWS EMR &#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xB97C; &#xD574;&#xC900;&#xB2E4;&#xBA74;</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/4eea06c345b50a62f5d9f9c78106a3dd.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; PodTemplate &#xB9CC; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xAD6C;&#xD604; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xC548;&#xD0C0;&#xAE5D;&#xAC8C;&#xB3C4; spark on kuberentes , AWS EMR &#xBAA8;&#xB450; &#xC774;&#xB7EC;&#xD55C; &#xAE30;&#xB2A5;&#xC740; &#xC81C;&#xACF5;&#xB418;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD658;&#xACBD;&#xC5D0; &#xB9DE;&#xAC8C; &#xC801;&#xC808;&#xD55C; &#xC6B0;&#xD68C;&#xBC95;&#xC744; &#xCC3E;&#xC544;&#xC11C; &#xAD6C;&#xD604;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.</p><p>&#xC9C0;&#xAE08; &#xC0C1;&#xD669;&#xC758; &#xACBD;&#xC6B0;&#xB3C4; mutatingWebhook &#xB4F1;&#xC744; &#xCEE4;&#xC2A4;&#xD140;&#xD558;&#xAC8C; &#xAD6C;&#xD604;&#xD574;&#xC11C; affinity &#xBD80;&#xBD84;&#xC744; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB418;&#xAC8C; &#xAD6C;&#xD604;&#xD55C;&#xB2E4;&#xBA74; &#xB354; &#xC6B0;&#xC544;&#xD558;&#xAC8C; &#xCC98;&#xB9AC; &#xB420; &#xC218; &#xC788;&#xB2E4;.</p><p>Spark driver &#xC640; executor Pod &#xAC00; <code>&#xC0DD;&#xC131; &#xB420; &#xB54C;</code> &#xC5D0;&#xB294; downward API &#xB97C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; AWS EMR &#xC774; EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xC0DD;&#xC131;&#xC744; &#xC694;&#xCCAD;&#xD55C; request &#xB97C; mutatingWebhook &#xC5D0;&#xC11C; &#xD55C;&#xBC88; &#xAC00;&#xB85C;&#xCC44;&#xC11C;, metadata &#xD639;&#xC740; &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xC5D0; &#xC124;&#xC815;&#xB41C; driver / executor &#xBAA8;&#xB450; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xACE0;&#xC720;&#xD55C; &#xAC12;(&#xB192;&#xC740; &#xCE74;&#xB514;&#xB110;&#xB9AC;&#xD2F0;&#xB97C; &#xAC00;&#xC9C0;&#xB294; id &#xC640; &#xAC19;&#xC740; &#xAC12;&#xB4E4;&#xC774; &#xB450; &#xD30C;&#xB4DC; &#xBAA8;&#xB450; &#xC124;&#xC815;&#xB418;&#xB3C4;&#xB85D; &#xC0DD;&#xC131;&#xB41C;&#xB2E4;)&#xC744; executor pod &#xC758; <code>labelSelector.matchLabels</code> &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xAC8C; Pod Spec &#xC744; &#xC870;&#xC791;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xD604;&#xB3C4; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>&#xACB0;&#xB860;&#xC801;&#xC73C;&#xB85C; EMR on EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xB3D9;&#xC77C; &#xB9AC;&#xC804; / &#xB2E4;&#xB978; AZ &#xAC04; &#xD1B5;&#xC2E0; &#xBE44;&#xC6A9;&#xC744; &#xC904;&#xC774;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; driver pod &#xC640; executor pod &#xAC00; &#xAC19;&#xC740; AZ &#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xBA74; &#xB41C;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; &#xC815;&#xB9D0; &#xACE0;&#xAC00;&#xC6A9;&#xC131;&#xC774; &#xD544;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;&#xBA74; &#xC790;&#xC2E0;&#xC758; EKS &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xD558;&#xB098;&#xC758; AZ &#xB97C; &#xC120;&#xD0DD;&#xD574;&#xC11C; driver / executor pod &#xC758; nodeSelector &#xC5D0; &#xD574;&#xB2F9; AZ &#xB97C; &#xD558;&#xB4DC;&#xCF54;&#xB529;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xB9CC;&#xC57D; &#xD574;&#xB2F9; AZ &#xAC00; &#xC5B4;&#xB5A0;&#xD55C; &#xC774;&#xC720;&#xC5D0;&#xC11C;&#xB4E0; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xBA74; &#xC774;&#xB7F0; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, driver pod (job submitter pod &#xD3EC;&#xD568;) &#xD574;&#xC11C; &#xAC00;&#xB2A5;&#xD55C; &#xC544;&#xBB34; AZ &#xC5D0; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xACE0;, executor &#xB9CC; driver pod &#xAC00; &#xC2A4;&#xCF00;&#xC974;&#xB9C1;&#xB41C; &#xB178;&#xB4DC;&#xC758; AZ &#xC640; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xC2A4;&#xCF00;&#xC974;&#xB9C1; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xACE0; &#xC2F6;&#xB2E4;&#xBA74;.</p><ol><li>&#xB3D9;&#xC801;&#xC73C;&#xB85C; PodTemplate &#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC804;&#xB7B5;</li><li>mutatingWebhook &#xC744; &#xAD6C;&#xD604;&#xD574;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xC804;&#xB7B5;</li></ol><p>&#xB450;&#xAC00;&#xC9C0; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xACE0;, &#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; 1&#xBC88;&#xC744; &#xC18C;&#xAC1C;&#xD588;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Airflow 무중단 이전]]></title><description><![CDATA[<h2 id></h2><p>&#xCD5C;&#xADFC; EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBC84;&#xC804; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB97C;, &#xB178;&#xB4DC;&#xBCC4;&#xB85C; in-place &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xD558;&#xB294;&#xAC83;&#xC774; &#xC544;&#xB2CC;, &#xC0C8;&#xB85C;&#xC6B4; &#xBC84;&#xC804;&#xC758; EKS &#xB97C; &#xC900;&#xBE44;&#xD574;&#xC11C; &#xAE30;&#xC874;&#xBC84;&#xC804; -&gt; &#xC2E0;</p>]]></description><link>https://www.kimsehwan96.com/airflow-mujungdan-ijeon/</link><guid isPermaLink="false">673b68e0bccbbe88b949ffb9</guid><category><![CDATA[K8s]]></category><category><![CDATA[Airflow]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[AWS]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Mon, 18 Nov 2024 02:50:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/11/af.png" medium="image"/><content:encoded><![CDATA[<h2 id></h2><img src="https://www.kimsehwan96.com/content/images/2024/11/af.png" alt="Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804;"><p>&#xCD5C;&#xADFC; EKS &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBC84;&#xC804; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB97C;, &#xB178;&#xB4DC;&#xBCC4;&#xB85C; in-place &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xD558;&#xB294;&#xAC83;&#xC774; &#xC544;&#xB2CC;, &#xC0C8;&#xB85C;&#xC6B4; &#xBC84;&#xC804;&#xC758; EKS &#xB97C; &#xC900;&#xBE44;&#xD574;&#xC11C; &#xAE30;&#xC874;&#xBC84;&#xC804; -&gt; &#xC2E0;&#xADDC;&#xBC84;&#xC804;&#xC73C;&#xB85C; &#xC77C;&#xC885;&#xC758; rolling update&#xB97C; &#xD558;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</p><p>&#xC774; &#xB54C; &#xC5EC;&#xB7EC; Addon(Istio, Argocd &#xB4F1;&#xB4F1;), &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xB4E4;&#xC744; &#xC774;&#xC804;&#xD588;&#xB294;&#xB370;, &#xD2B9;&#xD788; Airflow &#xB97C; &#xBB34;&#xC911;&#xB2E8;&#xC73C;&#xB85C; &#xC774;&#xC804;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xACE0;&#xBBFC;&#xD558;&#xACE0;, &#xC2E4;&#xC81C;&#xB85C; &#xBB34;&#xC911;&#xB2E8;&#xB85C; &#xC774;&#xC804;&#xD55C; &#xACFC;&#xC815;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xACF5;&#xC720;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xD55C;&#xB2E4;. </p><h2 id="airflow-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8">Airflow &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;</h2><p>Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804; &#xC791;&#xC5C5;&#xC744; &#xC124;&#xACC4;&#xD558;&#xAE30; &#xC55E;&#xC11C;&#xC11C;, &#xC815;&#xD655;&#xD788; Airflow &#xC758; &#xAC01; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xAC00; &#xC5B4;&#xB5A4; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294;&#xC9C0; &#xD30C;&#xC545;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><p> Airflow &#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xB294;&#xB370;</p><ol><li>Scheduler : &#xC608;&#xC57D;&#xB41C; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xB97C; &#xD2B8;&#xB9AC;&#xAC70;&#xD558;&#xACE0;, &#xC2E4;&#xD589;&#xD560; &#xC791;&#xC5C5;&#xC744; executor &#xB85C; &#xC81C;&#xCD9C;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;</li><li>Webserver : DAG &#xC640; &#xC791;&#xC5C5;&#xC758; &#xB3D9;&#xC791;&#xC744; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xC2E4;&#xD589;&#xC2DC;&#xD0A4;&#xAC70;&#xB098;, &#xB514;&#xBC84;&#xAE45; &#xD560; &#xC218; &#xC788;&#xB294; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;</li><li>Metadata database : Airflow &#xC758; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xAC00; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0; &#xBC0F; &#xC791;&#xC5C5;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xB294;&#xB370; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;</li></ol><p> &#xC704; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC740; &#xD544;&#xC218;&#xC801;&#xC73C;&#xB85C; &#xD544;&#xC694;&#xD55C; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC774;&#xACE0;, &#xC774; &#xC678;&#xC5D0; triggerer &#xB4F1;&#xC774; &#xCD94;&#xAC00;&#xC801;&#xC73C;&#xB85C; &#xD544;&#xC694; &#xD560; &#xC218; &#xC788;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; <code>scheduler</code> &#xB294; &#xC608;&#xC57D;&#xB41C; &#xC791;&#xC5C5;&#xB4E4;&#xC744; &#xD2B8;&#xB9AC;&#xAC70;&#xD558;&#xACE0;, executor &#xAC00; &#xC2E4;&#xD589; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xC911;&#xC694;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294;&#xB370;, &#xC774;&#xAC83;&#xC740; Metadata database &#xB97C; &#xBC14;&#xB77C;&#xBCF4;&#xBA70; &#xC791;&#xC5C5;&#xC744; &#xC608;&#xC57D;&#xD558;&#xAC70;&#xB098;, queued &#xB41C; &#xC608;&#xC57D;&#xB41C; &#xC791;&#xC5C5;&#xC744; executor &#xC5D0; &#xC81C;&#xCD9C;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD55C;&#xB2E4;. </p><p></p><h2 id="%EB%AC%B4%EC%A4%91%EB%8B%A8-%EC%9D%B4%EC%A0%84-%EC%84%A4%EA%B3%84">&#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804; &#xC124;&#xACC4;</h2><p>&#xB530;&#xB77C;&#xC11C;, &#xAE30;&#xC874; &#xBC84;&#xC804;&#xC758; EKS &#xC640;, &#xC2E0;&#xADDC; &#xBC84;&#xC804;&#xC758; EKS &#xC591;&#xCABD;&#xC5D0; &#xB3D9;&#xC77C;&#xD55C; Airflow &#xAD6C;&#xC131; (Metadata database &#xD3EC;&#xD568;)&#xC744; &#xD558;&#xACE0;, &#xC810;&#xC9C4;&#xC801;&#xC73C;&#xB85C; &#xAE30;&#xC874; &#xBC84;&#xC804; EKS&#xC758; Airflow &#xC5D0;&#xB294; executor &#xC5D0; &#xC791;&#xC5C5;&#xC744; submit &#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xBA74;&#xC11C;, &#xC2E0;&#xADDC; &#xBC84;&#xC804; EKS &#xC758; Airflow &#xC5D0;&#xB294; executor &#xC5D0; &#xC791;&#xC5C5;&#xC744; submit &#xD558;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC791;&#xC5C5;&#xD558;&#xBA74; &#xB420; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xAD6C;&#xC0C1;&#xD588;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/11/-----------2024-11-19-------1.34.10.png" class="kg-image" alt="Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804;" loading="lazy" width="1546" height="1062" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/11/-----------2024-11-19-------1.34.10.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/11/-----------2024-11-19-------1.34.10.png 1000w, https://www.kimsehwan96.com/content/images/2024/11/-----------2024-11-19-------1.34.10.png 1546w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC124;&#xACC4;&#xB41C; &#xC791;&#xC5C5;&#xC758; &#xAD6C;&#xC131;&#xB3C4;</span></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xAD6C;&#xC131;&#xC744; &#xD558;&#xAE30; &#xC804;&#xC5D0;, &#xBA87;&#xAC00;&#xC9C0; &#xC6B0;&#xB824;&#xB418;&#xB294; &#xC810;&#xC774; &#xC788;&#xC5C8;&#xB294;&#xB370;.</p><ol><li>&#xB3D9;&#xC77C;&#xD55C; &#xAD6C;&#xC131;, &#xB3D9;&#xC77C;&#xD55C; Metadata database &#xB97C; &#xBC14;&#xB77C;&#xBCF4;&#xB294; &#xB450; Airflow &#xAC00; &#xC788;&#xC744; &#xB54C;, &#xD55C;&#xCABD; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xB9CC; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xB370;, &#xC591;&#xCABD;&#xC5D0; &#xB3D9;&#xC2DC;&#xC5D0; &#xC2E4;&#xD589;&#xB418;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;?</li><li>&#xAE30;&#xC874; &#xBC84;&#xC804; EKS &#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; Airflow &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB4E4;&#xC744; &#xB0B4;&#xB9B4;&#xACBD;&#xC6B0;, &#xD574;&#xB2F9; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC548;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xB4E4;&#xC774; &#xC2E4;&#xD328;&#xD558;&#xAC8C; &#xB420;&#xAE4C;?</li></ol><p>&#xACB0;&#xB860;&#xBD80;&#xD130; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xBA74; 1&#xBC88;, 2&#xBC88; &#xBAA8;&#xB450; &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/11/-----------2024-11-19-------1.43.36.png" class="kg-image" alt="Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804;" loading="lazy" width="1804" height="974" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/11/-----------2024-11-19-------1.43.36.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/11/-----------2024-11-19-------1.43.36.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/11/-----------2024-11-19-------1.43.36.png 1600w, https://www.kimsehwan96.com/content/images/2024/11/-----------2024-11-19-------1.43.36.png 1804w" sizes="(min-width: 1200px) 1200px"></figure><p>1&#xBC88;&#xC758; &#xACBD;&#xC6B0;, Metadata database &#xC758; &#xD14C;&#xC774;&#xBE14;&#xC911; <code>public.task_instance</code> &#xB97C; &#xBCF4;&#xBA74; scheduled &#xB41C; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xB098;, &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xD2B8;&#xB9AC;&#xAC70;&#xD55C; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xB294; &#xBAA8;&#xB450; &#xD574;&#xB2F9; &#xD14C;&#xC774;&#xBE14;&#xC5D0; <code>queued</code> &#xC0C1;&#xD0DC;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB418;&#xB294;&#xB370;, &#xC774; &#xB54C; &#xC591;&#xCABD;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xC911; &#xD558;&#xB098;&#xAC00; <code>queued</code> &#xB41C; &#xC791;&#xC5C5;&#xC744; executor &#xC5D0; &#xC81C;&#xCD9C;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xC774; &#xB54C; &#xB450; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xAC00; &#xB3D9;&#xC2DC;&#xC5D0; &#xAC19;&#xC740; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC218;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; (Lock) &#xB450; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xC911; &#xD558;&#xB098;&#xB9CC;&#xC774; &#xC791;&#xC5C5;&#xC744; &#xAC00;&#xC838;&#xAC00;&#xAC8C; &#xB41C;&#xB2E4;.</p><p>2&#xBC88;&#xC758; &#xACBD;&#xC6B0; &#xC2E4;&#xC81C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF8;&#xACB0;&#xACFC;, Airflow &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB4E4;&#xC744; &#xB0B4;&#xB9B0;&#xB2E4;&#xACE0;&#xD574;&#xC11C; &#xAE30;&#xC874; &#xC791;&#xC5C5;&#xB4E4;&#xC5D0; SIGTERM &#xC2E0;&#xD638;&#xAC00; &#xC804;&#xB2EC;&#xB418;&#xAC70;&#xB098; &#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. </p><p></p><h2 id="%EC%8B%A4%EC%A0%9C-%EC%9E%91%EC%97%85-%EC%A4%91-%EA%B2%AA%EC%9D%80-%EC%9E%A5%EC%95%A0">&#xC2E4;&#xC81C; &#xC791;&#xC5C5; &#xC911; &#xACAA;&#xC740; &#xC7A5;&#xC560;</h2><p>&#xC591;&#xCABD; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xB3D9;&#xC77C;&#xD55C; Airflow &#xC778;&#xC2A4;&#xD134;&#xC2A4; (&#xC815;&#xD655;&#xD788;&#xB294; &#xB3D9;&#xC77C;&#xD55C; helmchart &#xC640; values &#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;)&#xB97C; &#xC138;&#xD305;&#xD558;&#xACE0; DAG &#xB4E4;&#xC774; &#xC2A4;&#xCF00;&#xC974;&#xB9C1;&#xB418;&#xACE0;, &#xC2E4;&#xD589;&#xB418;&#xB294;&#xB370; &#xBB38;&#xC81C; &#xC5C6;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD588;&#xC9C0;&#xB9CC;. Airflow &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC804;&#xC5ED; &#xBCC0;&#xC218;&#xB97C; &#xD55C;&#xCABD; &#xC778;&#xC2A4;&#xD134;&#xC2A4;(&#xC6F9;&#xC11C;&#xBC84;)&#xC5D0;&#xC11C; &#xC218;&#xC815;&#xD558;&#xBA74;, &#xBC18;&#xB300;&#xD3B8; &#xC6F9;&#xC11C;&#xBC84;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xB2F9; &#xBCC0;&#xC218;&#xB97C; &#xCC3E;&#xC9C0; &#xBABB;&#xD558;&#xACE0;, &#xBC18;&#xB300;&#xB85C; &#xD574;&#xB3C4; &#xD55C;&#xCABD;&#xC740; &#xCC3E;&#xACE0; &#xD55C;&#xCABD;&#xC740; &#xBABB;&#xCC3E;&#xB294; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC600;&#xB2E4;.</p><p>&#xC774;&#xAC83;&#xC740; Airflow &#xAC00; &#xB370;&#xC774;&#xD130;&#xB97C; metadata database &#xC5D0; &#xC800;&#xC7A5;&#xD560;&#xB54C;, &#xD2B9;&#xC815; &#xB370;&#xC774;&#xD130;&#xB4E4; (&#xC804;&#xC5ED; &#xBCC0;&#xC218;)&#xC744; &#xC554;&#xD638;&#xD654; &#xD574;&#xC11C; &#xC800;&#xC7A5;&#xD558;&#xB294;&#xB370;, Airflow &#xC5D0;&#xC11C;&#xB294; fernet key &#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://airflow.apache.org/docs/apache-airflow/stable/security/secrets/fernet.html?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Fernet &#x2014; Airflow Documentation</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://airflow.apache.org/docs/apache-airflow/stable/_static/pin_32.png" alt="Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804;"></div></div></a></figure><p>&#xB530;&#xB77C;&#xC11C; &#xAE30;&#xC874; Airflow &#xC5D0;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB41C; fernet key &#xB97C; &#xC591;&#xCABD; helm value &#xC5D0; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xC801;&#xC6A9;&#xD558;&#xACE0; &#xC2E4;&#xD589;&#xD558;&#xB2C8;, &#xC644;&#xC804;&#xD558;&#xAC8C; &#xB450; &#xBC8C;&#xC758; Airflow &#xAC00; &#xBB38;&#xC81C;&#xC5C6;&#xC774; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xAC78; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2025/11/-----------2024-11-19-------1.51.05.png" class="kg-image" alt="Airflow &#xBB34;&#xC911;&#xB2E8; &#xC774;&#xC804;" loading="lazy" width="1710" height="1050" srcset="https://www.kimsehwan96.com/content/images/size/w600/2025/11/-----------2024-11-19-------1.51.05.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2025/11/-----------2024-11-19-------1.51.05.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2025/11/-----------2024-11-19-------1.51.05.png 1600w, https://www.kimsehwan96.com/content/images/2025/11/-----------2024-11-19-------1.51.05.png 1710w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">helm values</span></figcaption></figure><h2 id="%EC%9E%A5%EC%95%A0-%EC%9D%B8-%EC%A4%84-%EC%95%8C%EC%95%98%EB%8D%98-%EA%B2%83">&#xC7A5;&#xC560; &#xC778; &#xC904; &#xC54C;&#xC558;&#xB358; &#xAC83;</h2><p>&#xC774;&#xB807;&#xAC8C; &#xB450;&#xBC8C;&#xC758; Airflow &#xB97C; &#xAD6C;&#xC131;&#xD558;&#xACE0;, &#xC5B4;&#xB290; &#xD55C; &#xCABD;&#xC758; Airflow webserver &#xB97C; &#xC811;&#xADFC;&#xD574;&#xC11C; DAG &#xC2E4;&#xD589; &#xB85C;&#xADF8;&#xB97C; &#xD655;&#xC778; &#xD560; &#xB54C;, &#xAC04;&#xD5D0;&#xC801;&#xC73C;&#xB85C; &#xB85C;&#xADF8;&#xAC00; &#xD655;&#xC778;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC544;&#xC11C; &#xC124;&#xC815;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xB098;? &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xAC74;&#xAC00;? &#xB77C;&#xB294; &#xC0DD;&#xAC01;&#xC744; &#xD558;&#xAE30;&#xB3C4; &#xD588;&#xC5C8;&#xB2E4;.</p><p>&#xACB0;&#xB860;&#xC801;&#xC73C;&#xB85C;(&#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4;) &#xC811;&#xADFC;&#xD55C; Airflow &#xAC00; &#xC18D;&#xD574;&#xC788;&#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; executor &#xAC00; &#xC2E4;&#xD589;&#xC911;&#xC778; DAG &#xC758; &#xACBD;&#xC6B0;&#xB294; &#xB85C;&#xADF8;&#xAC00; &#xBCF4;&#xC774;&#xC9C0;&#xB9CC;, &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xC740;&#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xB85C;&#xADF8;&#xAC00; &#xBCF4;&#xC774;&#xC9C0; &#xC54A;&#xB294;&#xAC83;&#xC5D0; &#xBD88;&#xACFC;&#xD588;&#xB2E4;. </p><p>&#xB2F9;&#xC5F0;&#xD55C; &#xB3D9;&#xC791;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Airflow &#xB97C; &#xC591;&#xCABD;&#xC5D0; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xD55C;&#xCABD; Airflow &#xB97C; &#xB0B4;&#xB9AC;&#xACE0; &#xC2E0;&#xADDC; &#xBC84;&#xC804;&#xC758; EKS &#xB0B4;&#xC758; &#xC0C8;&#xB85C; &#xC0DD;&#xC131;&#xD55C; Airflow &#xCABD;&#xC5D0;&#xB9CC; &#xBAA8;&#xB4E0; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xB3C4;&#xB85D; &#xD558;&#xACE0; &#xB098;&#xC11C; &#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4; &#xD574;&#xB2F9; &#xBB38;&#xC81C;&#xB294; &#xD574;&#xACB0;&#xB418;&#xC5C8;&#xB2E4;.</p><p></p><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>Airflow &#xB97C; &#xBB34;&#xC911;&#xB2E8;&#xC73C;&#xB85C; &#xC774;&#xC804;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xAC80;&#xC0C9;&#xD574;&#xBCF4;&#xACE0;, &#xC801;&#xC808;&#xD55C; &#xC811;&#xADFC;&#xBC95;&#xC774; &#xC788;&#xC73C;&#xBA74; &#xBC18;&#xC601;&#xD574;&#xC11C; &#xC791;&#xC5C5;&#xD558;&#xB824;&#xACE0; &#xD588;&#xC9C0;&#xB9CC; &#xB531;&#xD788; &#xB0B4;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xC815;&#xBCF4;&#xAC00; &#xB098;&#xC624;&#xC9C0; &#xC54A;&#xC544;&#xC11C; &#xACB0;&#xAD6D; &#xB1CC;&#xD53C;&#xC15C;(?)&#xB85C; &#xC124;&#xACC4;&#xD558;&#xACE0;, &#xC2E4;&#xC81C;&#xB85C; &#xD504;&#xB85C;&#xB355;&#xC158; &#xC791;&#xC5C5; &#xC774;&#xC804;&#xC5D0; &#xAC1C;&#xBC1C; &#xD658;&#xACBD;&#xC5D0;&#xC11C; Airflow &#xB97C; &#xC774;&#xAC83;&#xC800;&#xAC83; &#xB9CC;&#xC838;&#xBCF4;&#xACE0; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD558;&#xACE0; &#xD504;&#xB85C;&#xB355;&#xC158; Airflow &#xAE4C;&#xC9C0; &#xC6D0;&#xD65C;&#xD558;&#xAC8C; &#xC774;&#xC804; &#xC791;&#xC5C5;&#xC744; &#xC644;&#xB8CC;&#xD588;&#xB2E4;.</p><p>&#xCC98;&#xC74C;&#xC5D0;&#xB294; &#xB450; &#xBC8C;&#xC758; Airflow &#xB97C; &#xB3D9;&#xC2DC;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xAC8C; &#xD558;&#xB294;&#xAC83;&#xC774; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xB294;&#xAC00;? &#xB77C;&#xB294; &#xC758;&#xBB38;&#xC774; &#xACC4;&#xC18D; &#xB4E4;&#xC5C8;&#xC9C0;&#xB9CC;, &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD574;&#xBCF4;&#xB2C8; &#xACB0;&#xAD6D; &#xADF8;&#xB7F0; &#xC124;&#xC815;&#xC5D0;&#xB3C4; &#xB3D9;&#xC77C;&#xD55C; Metadata database &#xB97C; &#xC4F0;&#xACE0;&#xC788;&#xB2E4;&#xBA74; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xAC00; &#xC791;&#xC5C5;&#xC744; &#xAC00;&#xC838;&#xAC08; &#xB54C; &#xB450; &#xC2A4;&#xCF00;&#xC974;&#xB7EC;&#xC911; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xB9CC;&#xC774; &#xC791;&#xC5C5;&#xC744; &#xAC00;&#xC838;&#xAC00;&#xAC8C; &#xB418;&#xB294; (DB Lock &#xC73C;&#xB85C; &#xC778;&#xD558;&#xC5EC;)&#xAD6C;&#xC870;&#xB77C;&#xB294;&#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><p>&#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; (&#xC774;&#xB860;&#xC801;&#xC73C;&#xB85C;) &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD588;&#xC9C0;&#xB9CC; &#xD639;&#xC2DC;&#xB098; &#xC911;&#xBCF5;&#xC2E4;&#xD589;&#xB418;&#xBA74; &#xC5B4;&#xB5A1;&#xD558;&#xC9C0;? &#xB77C;&#xB294; &#xAC71;&#xC815;&#xC5D0; &#xB370;&#xC774;&#xD130; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xBD84;&#xB4E4;&#xACFC; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xB098;&#xB220;&#xBD24;&#xB294;&#xB370;, DAG &#xB77C;&#xB294;&#xAC83;&#xC774; &#xACB0;&#xAD6D; &#xBA71;&#xB4F1;&#xC131;&#xC774; &#xBCF4;&#xC7A5;&#xB418;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xAC83;&#xC774;&#xACE0;, &#xADF8;&#xB807;&#xAC8C; &#xAD6C;&#xC131;&#xC744; &#xD588;&#xB2E4;&#xACE0; &#xD574;&#xC11C; &#xC911;&#xBCF5;&#xC2E4;&#xD589;&#xB418;&#xB294; &#xAC83;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xD06C;&#xAC8C; &#xAC71;&#xC815;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC791;&#xC5C5;&#xC744; &#xD588;&#xB2E4;. (&#xBB3C;&#xB860; &#xC911;&#xBCF5;&#xC2E4;&#xD589; &#xB418;&#xC9C0;&#xB3C4; &#xC54A;&#xC9C0;&#xB9CC;!)</p><p>&#xAC80;&#xC0C9;&#xD574;&#xC11C; &#xC88B;&#xC740; &#xB808;&#xD37C;&#xB7F0;&#xC2A4;&#xB97C; &#xCC3E;&#xC544;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xB294;&#xAC83;&#xB3C4; &#xC88B;&#xC9C0;&#xB9CC;, &#xD574;&#xB2F9; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xC5B4;&#xB5A4; &#xAD6C;&#xC131;&#xC744; &#xAC16;&#xACE0;&#xC788;&#xACE0;, &#xCD94;&#xC0C1;&#xC801;&#xC778; &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xC9C0;&#xB97C; &#xD655;&#xC778;&#xD558;&#xACE0; &#xC2E4;&#xC81C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xBA74;&#xC11C; &#xC791;&#xC5C5;&#xD558;&#xBA74; &#xCDA9;&#xBD84;&#xD788; &#xBB34;&#xB9AC;&#xC5C6;&#xC774; &#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294;&#xAC78; &#xB290;&#xB07C;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[S3 다운로드 작업시 동기, 비동기, 멀티스레드, 멀티프로세스 성능 비교 (python)]]></title><description><![CDATA[<p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Fs3-donwload-sync-async-thread-process-perfomance-comparision%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=false" alt="Hits" loading="lazy"></a></p>
<p>&#xCD5C;&#xADFC; &#xB9CE;&#xC740; &#xD30C;&#xC77C;&#xB4E4; (&#xBC84;&#xD0B7; &#xC790;&#xCCB4;&#xB85C; &#xB530;&#xC9C0;&#xBA74; &#xCC9C;&#xB9CC;&#xAC1C; &#xC774;&#xC0C1;, Prefix &#xB098; &#xB0A0;&#xC9DC;&#xBCC4;&#xB85C; &#xBD84;&#xB9AC;&#xD574;&#xB3C4; &#xC218;&#xCC9C;~&#xC218;&#xB9CC; &#xC774;&#xC0C1;)&#xB4E4;&#xC744; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;&#xBC1B;&#xACE0; &#xADF8;&#xAC83;&#xC744; tar.gz &#xC73C;</p>]]></description><link>https://www.kimsehwan96.com/s3-donwload-sync-async-thread-process-perfomance-comparision/</link><guid isPermaLink="false">66bc2719e37c7a6661011b6b</guid><category><![CDATA[S3]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Wed, 14 Aug 2024 05:35:29 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/08/-----------2024-08-14------2.35.09.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.kimsehwan96.com/content/images/2024/08/-----------2024-08-14------2.35.09.png" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)"><p><a href="https://hits.seeyoufarm.com/?ref=kimsehwan96.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fwww.kimsehwan96.com%2Fs3-donwload-sync-async-thread-process-perfomance-comparision%2F&amp;count_bg=%2379C83D&amp;title_bg=%23555555&amp;icon=&amp;icon_color=%23E7E7E7&amp;title=hits&amp;edge_flat=false" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy"></a></p>
<p>&#xCD5C;&#xADFC; &#xB9CE;&#xC740; &#xD30C;&#xC77C;&#xB4E4; (&#xBC84;&#xD0B7; &#xC790;&#xCCB4;&#xB85C; &#xB530;&#xC9C0;&#xBA74; &#xCC9C;&#xB9CC;&#xAC1C; &#xC774;&#xC0C1;, Prefix &#xB098; &#xB0A0;&#xC9DC;&#xBCC4;&#xB85C; &#xBD84;&#xB9AC;&#xD574;&#xB3C4; &#xC218;&#xCC9C;~&#xC218;&#xB9CC; &#xC774;&#xC0C1;)&#xB4E4;&#xC744; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;&#xBC1B;&#xACE0; &#xADF8;&#xAC83;&#xC744; tar.gz &#xC73C;&#xB85C; &#xC544;&#xCE74;&#xC774;&#xBE0C; &#xBC0F; &#xC555;&#xCD95;&#xC744; &#xD574;&#xC11C; &#xD2B9;&#xC815; &#xBC84;&#xD0B7;&#xC5D0; glacier &#xD074;&#xB798;&#xC2A4;&#xB85C; &#xBC00;&#xC5B4;&#xB123;&#xC5B4;&#xC57C; &#xD558;&#xB294; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;. </p><p>&#xC774; &#xB54C; &#xD30C;&#xC77C;&#xC744; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xC544;&#xC57C; &#xC544;&#xCE74;&#xC774;&#xBE0C; &#xBC0F; &#xC555;&#xCD95;&#xC744; &#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCC98;&#xC74C;&#xC5D0;&#xB294; <code>aws cli</code> &#xB97C; &#xD1B5;&#xD574; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xACE0;, <code>tar</code> &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; &#xC544;&#xCE74;&#xC774;&#xBE0C;&#xD574;&#xC11C; &#xBC00;&#xC5B4;&#xB123;&#xB294; &#xCD5C;&#xB300;&#xD55C; &#xB2E8;&#xC21C;&#xD55C; &#xBC29;&#xBC95;&#xC744; &#xACE0;&#xB824;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; <code>c7g.16xlarge</code> &#xC640; &#xAC19;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xC774; &#xCD5C;&#xB300; 30Gbps(=3750 MB/s) &#xB098;&#xC624;&#xB294; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB85C;&#xB3C4; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xB418;&#xB294; &#xC18D;&#xB3C4;&#xB294; &#xCD5C;&#xB300; 250MB/s &#xC5D0; &#xBD88;&#xACFC;&#xD588;&#xC5C8;&#xB294;&#xB370;. &#xB2E4;&#xC591;&#xD55C; &#xC6D0;&#xC778;&#xC774; &#xC788;&#xACA0;&#xC9C0;&#xB9CC; </p><ol><li>&#xC77C;&#xB2E8; &#xD558;&#xB098;&#xC758; <code>aws cli</code> &#xC694;&#xCCAD; (&#xD558;&#xC9C0;&#xB9CC; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xC2A4;&#xB808;&#xB4DC; &#xD480;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; &#xC5EC;&#xB7EC; &#xC694;&#xCCAD;&#xC744; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xD558;&#xACE0;&#xB294; &#xC788;&#xB2E4;)&#xC774; EC2 &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xB0B4;&#xC758; NIC &#xAC00; &#xCC98;&#xB9AC; &#xAC00;&#xB2A5;&#xD55C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB300;&#xC5ED;&#xD3ED;&#xC744; &#xBAA8;&#xB450; &#xD3EC;&#xD654;&#xC2DC;&#xD0A4;&#xC9C0;&#xB294; &#xBABB;&#xD55C;&#xB2E4;. </li><li>gp3 &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB97C; &#xAE30;&#xBCF8;&#xAC12; (IOPS 3000, &#xCC98;&#xB9AC;&#xB7C9; 125MB)&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xD574;&#xC11C; &#xC5F0;&#xACB0;&#xD55C; &#xACBD;&#xC6B0; Disk &#xC4F0;&#xAE30; &#xC18D;&#xB3C4;&#xC758; &#xC81C;&#xD55C;&#xC73C;&#xB85C; &#xC778;&#xD574;&#xC11C; &#xBCD1;&#xBAA9;&#xD604;&#xC0C1;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;. </li></ol><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://repost.aws/knowledge-center/s3-transfer-data-bucket-instance?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Transfer data between Amazon S3 bucket and Amazon EC2</div><div class="kg-bookmark-description">I want to improve the speed when transferring data from my Amazon Elastic Compute Cloud (Amazon EC2) instance to my Amazon Simple Storage Service (Amazon S3) bucket.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://repost.aws/apple-touch-icon.png" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)"><span class="kg-bookmark-author">Amazon Web Services, Inc.</span><span class="kg-bookmark-publisher">AWS Official</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_1200x630.png" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)"></div></a></figure><p>&#xC704; &#xAE00;&#xC744; &#xCC38;&#xACE0;&#xD558;&#xBA74; S3 &#x2194;&#xFE0E; EC2 &#xAC04; &#xC131;&#xB2A5; &#xD5A5;&#xC0C1;&#xC744; &#xC704;&#xD574;&#xC11C;&#xB294; &#x201C;&#xBCD1;&#xB82C;&#x201D; &#xC801;&#xC778; &#xC791;&#xC5C5; &#xBD80;&#xD558;, &#xC5C5;&#xB85C;&#xB4DC;&#xC2DC;&#xC5D0;&#xB294; &#xBA40;&#xD2F0;&#xD30C;&#xD2B8; &#xC5C5;&#xB85C;&#xB4DC; &#xC124;&#xC815; &#xCD5C;&#xC801;&#xD654;, &#xADF8;&#xB9AC;&#xACE0; &#xAC00;&#xB2A5;&#xD55C; &#xACBD;&#xC6B0; VPC Endpoint &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB77C;&#xB294; &#xB4F1;&#xC758; &#xB0B4;&#xC6A9;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC77C;&#xB2E8; &#xB2E4;&#xB978; &#xC124;&#xC815;&#xB4E4;&#xC740; &#xC81C;&#xC678;&#xD558;&#xACE0; &#x201C;&#xBCD1;&#xB82C;&#x201D;&#xC801;&#xC778; &#xC791;&#xC5C5;&#xBD80;&#xD558;&#xC640; &#xAC19;&#xC740; &#xBCD1;&#xB82C;&#xC801;&#xC778; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC774;&#xB098;, &#xD639;&#xC740; &#xBE44;&#xB3D9;&#xAE30; &#xCC98;&#xB9AC;&#xB4F1;&#xC744; &#xD1B5;&#xD574;&#xC11C; S3 &#xB85C;&#xBD80;&#xD130; EC2 &#xAE4C;&#xC9C0; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC1B;&#xC544;&#xC624;&#xB294;&#xB370; &#xC131;&#xB2A5;&#xC744; &#xC62C;&#xB9AC;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC801;&#xC6A9;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xBD24;&#xB2E4;. &#xC774; &#xB54C; &#xBAA8;&#xB4E0; &#xD30C;&#xC77C;&#xC740; &#x201C;&#xBA54;&#xBAA8;&#xB9AC;&#x201D;&#xC5D0; &#xC800;&#xC7A5;&#xD574;&#xC11C; SSD &#xC758; &#xC4F0;&#xAE30; &#xC18D;&#xB3C4;&#xC758; &#xC81C;&#xD55C;&#xC744; &#xBC1B;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xC791;&#xC5C5;&#xD558;&#xC600;&#xB2E4;. </p><h2 id="%EC%A0%91%EA%B7%BC-%EB%B0%A9%EB%B2%95%EB%93%A4">&#xC811;&#xADFC; &#xBC29;&#xBC95;&#xB4E4;</h2><p>&#xC6B0;&#xC120; &#xD06C;&#xAC8C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; 4&#xAC1C;&#xC758; &#xC811;&#xADFC; &#xBC29;&#xBC95;&#xC744; &#xACE0;&#xB824;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><ol><li>&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;</li><li>&#xBE44;&#xB3D9;&#xAE30; &#xBAA8;&#xB4C8; &#xAE30;&#xBC18; &#xCF54;&#xB4DC; (aioboto3, aiobotocore..)</li><li>&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC; &#xCF54;&#xB4DC; (concurrent.future &#xC5D0;&#xC11C;&#xC758; ThreadPoolExectutor)</li><li>&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC; (concurrent.future &#xC5D0;&#xC11C;&#xC758; ProcessPoolExecutor)</li></ol><p>&#xAC01;&#xAC01;&#xC758; &#xCF54;&#xB4DC;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xB2E4;.</p><h3 id="%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C">&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/bcaee231a1c8d467ad0f0bb51990efde.js"></script>
<!--kg-card-end: html-->
<h3 id="%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C">&#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/b27fdb9ede3a408c9293042f8694e079.js"></script>
<!--kg-card-end: html-->
<h3 id="%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%BD%94%EB%93%9C">&#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC; &#xCF54;&#xB4DC;</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/6e5dc54d6bd76eebf1c2bad18a3a880a.js"></script>
<!--kg-card-end: html-->
<h3 id="%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%BD%94%EB%93%9C">&#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC;</h3>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/2d34bb7f5c919811a5d368cea57adde5.js"></script>
<!--kg-card-end: html-->
<p></p><h2 id="%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%B0%A9%EB%B2%95">&#xD14C;&#xC2A4;&#xD2B8; &#xBC29;&#xBC95;</h2><p></p><p><code>$ dd if=/dev/urandom of=50MB.file bs=1M count=50</code> &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xC5EC;&#xB7EC; &#xC6A9;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;. </p><p><code>$ seq 1 1000 &gt; object_ids</code> &#xACFC; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xBC84;&#xD0B7;&#xC758; &#xD0A4;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xBB38;&#xC790;&#xB97C; &#xBBF8;&#xB9AC; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. </p><p><code>$ time parallel --will-cite -a object_ids -j 10 aws s3 cp 50MB.file s3://YOUT_TEST_BUCKET/{}</code> &#xD615;&#xD0DC;&#xB85C; <code>aws s3 cp</code> &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; (&#xB3D9;&#xC2DC;&#xC5D0; 10&#xAC1C;) &#xC218;&#xD589;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8; &#xD560; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC5C5;&#xB85C;&#xB4DC;&#xD55C;&#xB2E4;.</p><p>&#xB808;&#xD37C;&#xB7F0;&#xC2A4; : <a href="https://github.com/aws-samples/maximizing-storage-throughput-and-performance?ref=kimsehwan96.com">https://github.com/aws-samples/maximizing-storage-throughput-and-performance</a></p><p>&#xC774;&#xB807;&#xAC8C; &#xD14C;&#xC2A4;&#xD2B8; &#xD560; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC84;&#xD0B7;&#xC5D0; &#xC62C;&#xB9AC;&#xACE0; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC;&#xB85C; S3 &#xB85C;&#xBD80;&#xD130; &#xD30C;&#xC77C;&#xC744; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xB294; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><p></p><h2 id="%ED%85%8C%EC%8A%A4%ED%8A%B8-with-profiler-viztracer">&#xD14C;&#xC2A4;&#xD2B8; with profiler (viztracer)</h2><p>&#xAC01; &#xCF54;&#xB4DC;&#xAC00; &#xC2E4;&#xC81C;&#xB85C; &#xC5B4;&#xB5A4; &#xD750;&#xB984;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xC9C0; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>viztracer</code> &#xB77C;&#xB294; &#xD504;&#xB85C;&#xD30C;&#xC77C;&#xB9C1; &#xD234;&#xC744; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xAC01; &#xCF54;&#xB4DC;&#xB97C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><h3 id="%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C-1">&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;</h3><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/8e2a2459-1ec5-406d-854c-7eb103466de4.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/8e2a2459-1ec5-406d-854c-7eb103466de4.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/8e2a2459-1ec5-406d-854c-7eb103466de4.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/8e2a2459-1ec5-406d-854c-7eb103466de4.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;&#xC758; &#xACBD;&#xC6B0; &#xAC01; &#xD30C;&#xC77C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC758; &#xBA54;&#xC778; &#xC2E4;&#xD589; &#xD750;&#xB984;&#xC5D0;&#xC11C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xC9C4;&#xD589;&#xB428;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;. </p><h3 id="%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C-1">&#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;</h3><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/78fcd375-4fe0-437a-bf3d-b0cdf5f8cdaa.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/78fcd375-4fe0-437a-bf3d-b0cdf5f8cdaa.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/78fcd375-4fe0-437a-bf3d-b0cdf5f8cdaa.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/78fcd375-4fe0-437a-bf3d-b0cdf5f8cdaa.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>aioboto3(aiobotocore)&#xB97C; &#xC0AC;&#xC6A9;&#xD55C; &#xCF54;&#xB4DC;&#xC758; &#xD504;&#xB85C;&#xD30C;&#xC77C;&#xB9C1; &#xACB0;&#xACFC;&#xB2E4;. </p><p>aioboto3(aiobotocore)&#xB294; aiohttp&#xB97C; &#xB798;&#xD551;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD328;&#xD0A4;&#xC9C0;&#xB85C; S3 &#xC791;&#xC5C5;&#xC5D0; &#xB300;&#xD574; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC704; &#xC2A4;&#xD06C;&#xB9B0;&#xC0F7;&#xC5D0;&#xC11C; &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;(&#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;)&#xC5D0;&#xC11C; &#xCD08;&#xAE30;&#xC5D0; &#xC5EC;&#xB7EC; &#xD30C;&#xC77C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; Future &#xAC1D;&#xCCB4;&#xB4E4;&#xC744; &#xBAA8;&#xB450; &#xB4F1;&#xB85D;&#xD558;&#xACE0; await &#xB3D9;&#xC791;&#xC5D0; &#xB530;&#xB77C;&#xC11C; &#xCC98;&#xB9AC; &#xC644;&#xB8CC;&#xB41C; Network I/O &#xC791;&#xC5C5;&#xC5D0; &#xB300;&#xD574; &#xBA54;&#xC778;&#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xBE44;&#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/373f9fc1-f520-4bbb-8ee5-995ac22fbd82.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/373f9fc1-f520-4bbb-8ee5-995ac22fbd82.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/373f9fc1-f520-4bbb-8ee5-995ac22fbd82.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/373f9fc1-f520-4bbb-8ee5-995ac22fbd82.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>&#xC704; &#xC2A4;&#xD06C;&#xB9B0;&#xC0F7;&#xC740; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xC2E4;&#xD589; &#xCD08;&#xAE30;&#xC5D0; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xB4E4;&#xC744; &#xB4F1;&#xB85D;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/4d86c960-5e24-4180-a01e-246f88a751ce.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/4d86c960-5e24-4180-a01e-246f88a751ce.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/4d86c960-5e24-4180-a01e-246f88a751ce.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/4d86c960-5e24-4180-a01e-246f88a751ce.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xD6C4; &#xCC98;&#xB9AC;&#xAC00; &#xB41C; HTTP Request &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC900;&#xBE44;&#xB41C; &#xBE44;&#xB3D9;&#xAE30; Task &#xB85C;&#xBD80;&#xD130; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC1B;&#xB294; &#xBD80;&#xBD84;&#xC744; &#xD655;&#xB300;&#xD55C; &#xC2A4;&#xD06C;&#xB9B0;&#xC0F7;&#xC774;&#xB2E4;.</p><p>&#xC774;&#xB807;&#xAC8C; &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; Network I/O &#xC791;&#xC5C5;&#xC774; &#xBE14;&#xB85C;&#xD0B9;&#xB418;&#xC9C0; &#xC54A;&#xACE0;. select / epoll / kqueue &#xC640; &#xAC19;&#xC740; &#xBE44;&#xB3D9;&#xAE30; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xCC98;&#xB9AC;&#xB41C;&#xB2E4;. </p><p>&#xC774; &#xC791;&#xC5C5;&#xC740; &#x201C;&#xB2E8;&#xC77C; &#xC2A4;&#xB808;&#xB4DC;&#x201D; &#xC5D0;&#xC11C; &#xB3D9;&#xC791;&#xD558;&#xBBC0;&#xB85C; &#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4; &#x201C;&#xD558;&#xB098;&#xC758; CPU &#xCF54;&#xC5B4;&#x201D; &#xC5D0;&#xB9CC; &#xBD80;&#xD558;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. </p><h3 id="%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C">&#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC;</h3><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/0af51855-081c-49a8-92e8-111fd3ab5737.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/0af51855-081c-49a8-92e8-111fd3ab5737.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/0af51855-081c-49a8-92e8-111fd3ab5737.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/0af51855-081c-49a8-92e8-111fd3ab5737.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC; (ThreadPoolExecutor) &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0;. &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xB294; &#xC81C;&#xC5B4; &#xD750;&#xB984;&#xB9CC; &#xAD00;&#xB9AC;&#xD558;&#xACE0; &#xC2E4;&#xC81C; S3&#xB85C;&#xBD80;&#xD130; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xB294; &#xC791;&#xC5C5;&#xC740; worker thread &#xC5D0;&#xC11C; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xC218;&#xD589;&#xB41C;&#xB2E4;. </p><p>&#xC774; &#xB54C; &#xBA40;&#xD2F0;&#xCF54;&#xC5B4; CPU &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; &#xC774; &#xC791;&#xC5C5;&#xC774; &#x201C;&#xC5EC;&#xB7EC; CPU&#x201D; &#xC5D0;&#xC11C; &#xBC1C;&#xC0DD; &#xD560; &#xC218; &#xC788;&#xACE0;. &#xB610;&#xD55C; &#xC2A4;&#xB808;&#xB4DC;&#xAC04; &#xC791;&#xC5C5; &#xC804;&#xD658;&#xC5D0;&#xB294; &#x201C;&#xCEE8;&#xD14D;&#xC2A4;&#xD2B8; &#xC2A4;&#xC704;&#xCE6D;&#x201D;&#xC744; &#xD544;&#xC694;&#xB85C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD2B9;&#xC815; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xC774; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8; &#xC2A4;&#xC704;&#xCE6D; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xC5D0; &#xC758;&#xD574;&#xC11C; &#xC6D0;&#xD558;&#xB294; &#xC131;&#xB2A5;&#xC774; &#xB098;&#xC624;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">aws cli &#xB610;&#xD55C; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; <code spellcheck="false" style="white-space: pre-wrap;">concurrent.futures.ThreadPoolExecutor</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xC5B4;&#xC788;&#xACE0;. S3 &#xC5D0; &#xAD00;&#xD55C; &#xC124;&#xC815; &#xC911; <code spellcheck="false" style="white-space: pre-wrap;">max_concurrent_requests</code> &#xC635;&#xC158;&#xC758; &#xACBD;&#xC6B0; &#xADF8; &#xC2A4;&#xB808;&#xB4DC; &#xD480;&#xC758; &#xCD5C;&#xB300; &#xC2A4;&#xB808;&#xB4DC; &#xAC1C;&#xC218;&#xB97C; &#xC81C;&#xD55C;&#xD558;&#xB294; &#xC635;&#xC158;&#xC774;&#xB2E4;. <a href="https://github.com/boto/s3transfer/blob/9a168299c932077e665a618bfa5e2d5e39343745/s3transfer/futures.py?ref=kimsehwan96.com#L406-L411">https://github.com/boto/s3transfer/blob/9a168299c932077e665a618bfa5e2d5e39343745/s3transfer/futures.py#L406-L411</a></div></div><h3 id="%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4">&#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4;</h3><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/08/5706c24b-2395-4330-a99c-f7ac2da0ec5a.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1024" height="535" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/5706c24b-2395-4330-a99c-f7ac2da0ec5a.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/5706c24b-2395-4330-a99c-f7ac2da0ec5a.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/5706c24b-2395-4330-a99c-f7ac2da0ec5a.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; (ProcessPoolExecutor)&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC544;&#xB2CC; &#x201C;&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C;&#x201D; &#xC6CC;&#xCEE4;&#xB85C;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC73C;&#xB85C; CPU bound &#xC791;&#xC5C5; &#xB610;&#xD55C; &#xC131;&#xB2A5; &#xAC1C;&#xC120;&#xC744; &#xB178;&#xB824;&#xBCFC; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xB9CC; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xBCC4;&#xB85C; &#xBCC4;&#xB3C4;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xACF5;&#xAC04;&#xC744; &#xAC00;&#xC838;&#xC57C; &#xD558;&#xBBC0;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC774; &#xB354; &#xD06C;&#xB2E4;&#xB294; &#xC810;&#xB3C4; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xBA38;&#xC2E0;&#xC758; &#xC790;&#xC6D0;&#xC774; &#xB110;&#xB110;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xAC8C; &#xC88B;&#xC544;&#xBCF4;&#xC778;&#xB2E4;. </p><p></p><h2 id="%EC%83%81%ED%99%A9-%EB%B3%84-%ED%85%8C%EC%8A%A4%ED%8A%B8">&#xC0C1;&#xD669; &#xBCC4; &#xD14C;&#xC2A4;&#xD2B8;</h2><p>&#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD558;&#xAE30; &#xC704;&#xD55C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB85C; <code>c7g.16xlarge</code> EC2 &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xACE0;. &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xC740; &#xCD5C;&#xB300; 30Gbps &#xC778; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB2E4;.</p><p>1KB, 1MB, 50MB &#xD30C;&#xC77C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xAC01;&#xAC01; 10&#xAC1C;, 50&#xAC1C;, 100&#xAC1C;, 500&#xAC1C;, 1000&#xAC1C;&#xB97C; &#xBC1B;&#xC744; &#xB54C; &#xC18C;&#xC694;&#xC2DC;&#xAC04;&#xC744; &#xCCB4;&#xD06C;&#xD574;&#xBCF4;&#xC558;&#xACE0;. 3GB &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xC18C;&#xC694;&#xC2DC;&#xAC04;&#xC744; &#xCCB4;&#xD06C;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><h3 id="1kb-%ED%8C%8C%EC%9D%BC">1KB &#xD30C;&#xC77C;</h3>
<table>
<thead>
<tr>
<th style="text-align:left">&#xBC29;&#xC2DD;/&#xAC1C;&#xC218;</th>
<th style="text-align:center">10</th>
<th style="text-align:center">50</th>
<th style="text-align:center">100</th>
<th style="text-align:center">500</th>
<th style="text-align:center">1000</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">&#xB3D9;&#xAE30;</td>
<td style="text-align:center">0.7s</td>
<td style="text-align:center">3.1s</td>
<td style="text-align:center">5s</td>
<td style="text-align:center">30s</td>
<td style="text-align:center">57s</td>
</tr>
<tr>
<td style="text-align:left">&#xBE44;&#xB3D9;&#xAE30;</td>
<td style="text-align:center">0.15s</td>
<td style="text-align:center">0.25s</td>
<td style="text-align:center">0.37s</td>
<td style="text-align:center">1.4s</td>
<td style="text-align:center">2.73s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;</td>
<td style="text-align:center">1.29s</td>
<td style="text-align:center">3.9s</td>
<td style="text-align:center">5.04s</td>
<td style="text-align:center">15.25s</td>
<td style="text-align:center">28.87s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4;</td>
<td style="text-align:center">0.23s</td>
<td style="text-align:center">0.25s</td>
<td style="text-align:center">0.38s</td>
<td style="text-align:center">0.66s</td>
<td style="text-align:center">6.1s</td>
</tr>
</tbody>
</table>
<p>&#xC804;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xAE30; &#xBC29;&#xC2DD;&#xC740; &#xC120;&#xD615;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC; &#xC2DC;&#xAC04;&#xC774; &#xB298;&#xC5B4;&#xB09C;&#xB2E4;. &#xBE44;&#xB3D9;&#xAE30;&#xC758; &#xACBD;&#xC6B0; &#xC804;&#xCCB4; &#xCF00;&#xC774;&#xC2A4;&#xC5D0; &#xAC70;&#xCCD0;&#xC11C; &#xC88B;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xBCF4;&#xC778;&#xB2E4;.</p>
<p>&#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC; &#xBC29;&#xC2DD;&#xC758; &#xACBD;&#xC6B0; &#xADF8;&#xB807;&#xAC8C; &#xC88B;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xB0B4;&#xC9C4; &#xC54A;&#xACE0;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBC29;&#xC2DD;&#xC758; &#xACBD;&#xC6B0; &#xD2B9;&#xC815; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; &#xB354; &#xB0AB;&#xC9C0;&#xB9CC; &#xC5B4;&#xB5A4; &#xACBD;&#xC6B0; &#xC544;&#xB2C8;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;. (&#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xC5D0; &#xC758;&#xD55C; &#xBD80;&#xBD84; &#xCC28;&#xC774;&#xB85C; &#xB290;&#xAEF4;&#xC9D0;)</p>
<h3 id="1mb-%ED%8C%8C%EC%9D%BC">1MB &#xD30C;&#xC77C;</h3>
<table>
<thead>
<tr>
<th style="text-align:left">&#xBC29;&#xC2DD;/&#xAC1C;&#xC218;</th>
<th style="text-align:center">10</th>
<th style="text-align:center">50</th>
<th style="text-align:center">100</th>
<th style="text-align:center">500</th>
<th style="text-align:center">1000</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">&#xB3D9;&#xAE30;</td>
<td style="text-align:center">0.75s</td>
<td style="text-align:center">3.3s</td>
<td style="text-align:center">6.1s</td>
<td style="text-align:center">30s</td>
<td style="text-align:center">137s</td>
</tr>
<tr>
<td style="text-align:left">&#xBE44;&#xB3D9;&#xAE30;</td>
<td style="text-align:center">0.18s</td>
<td style="text-align:center">0.33s</td>
<td style="text-align:center">0.53s</td>
<td style="text-align:center">1.4s</td>
<td style="text-align:center">4.4s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;</td>
<td style="text-align:center">1.24s</td>
<td style="text-align:center">4.01s</td>
<td style="text-align:center">5.05s</td>
<td style="text-align:center">15.76s</td>
<td style="text-align:center">29.80s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4;</td>
<td style="text-align:center">0.24s</td>
<td style="text-align:center">0.27s</td>
<td style="text-align:center">0.39s</td>
<td style="text-align:center">0.82s</td>
<td style="text-align:center">1.34s</td>
</tr>
</tbody>
</table>
<h3 id="50mb-%ED%8C%8C%EC%9D%BC">50MB &#xD30C;&#xC77C;</h3>
<table>
<thead>
<tr>
<th style="text-align:left">&#xBC29;&#xC2DD;/&#xAC1C;&#xC218;</th>
<th style="text-align:center">10</th>
<th style="text-align:center">50</th>
<th style="text-align:center">100</th>
<th style="text-align:center">500</th>
<th style="text-align:center">1000</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">&#xB3D9;&#xAE30;</td>
<td style="text-align:center">0.70s</td>
<td style="text-align:center">3.18s</td>
<td style="text-align:center">6.22s</td>
<td style="text-align:center">46.45s</td>
<td style="text-align:center">113.07s</td>
</tr>
<tr>
<td style="text-align:left">&#xBE44;&#xB3D9;&#xAE30;</td>
<td style="text-align:center">1.21s</td>
<td style="text-align:center">5.01s</td>
<td style="text-align:center">10.30s</td>
<td style="text-align:center">58.33s</td>
<td style="text-align:center">116.80s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;</td>
<td style="text-align:center">1.85s</td>
<td style="text-align:center">5.97s</td>
<td style="text-align:center">6.23s</td>
<td style="text-align:center">31.71s</td>
<td style="text-align:center">60.66s</td>
</tr>
<tr>
<td style="text-align:left">&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4;</td>
<td style="text-align:center">0.78s</td>
<td style="text-align:center">1.32s</td>
<td style="text-align:center">2.99s</td>
<td style="text-align:center">8.6s</td>
<td style="text-align:center">15.48s</td>
</tr>
</tbody>
</table>
<p>&#xD30C;&#xC77C; &#xD06C;&#xAE30;&#xAC00; &#xD070; &#xACBD;&#xC6B0;&#xC5D0;. &#xD30C;&#xC77C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC790;&#xCCB4; I/O &#xAC00; &#xAE34; &#xC791;&#xC5C5;&#xC774;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; &#x201C;&#xBE44;&#xB3D9;&#xAE30;&#x201D;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xB3D9;&#xC2DC;&#xC131;&#xC73C;&#xB85C; &#xC131;&#xB2A5;&#xC744; &#xB04C;&#xC5B4;&#xC62C;&#xB9AC;&#xB824;&#xACE0; &#xD574;&#xB3C4;. &#xC624;&#xD788;&#xB824; I/O &#xC5D0; &#xC758;&#xD55C; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD574;&#xC11C; &#xB3D9;&#xAE30;&#xC2DD; &#xCF54;&#xB4DC;&#xBCF4;&#xB2E4; &#xB290;&#xB824;&#xC9C0;&#xB294; &#xACBD;&#xD5A5;&#xC774; &#xC788;&#xB2E4;. &#xC774;&#xB7F4; &#xB54C;&#xC5D0;&#xB294; &#xBCD1;&#xB82C; &#xC2E4;&#xD589;&#xC774; &#xC624;&#xD788;&#xB824; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB300;&#xC5ED;&#xD3ED;&#xB3C4; &#xC798; &#xC4F0;&#xACE0; , &#xB124;&#xD2B8;&#xC6CC;&#xD06C; I/O&#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC;&#xAC00; &#xB354; &#xB098;&#xC544;&#xC9C4;&#xB2E4;.</p>
<h3 id="3gb-%ED%8C%8C%EC%9D%BC-1%EA%B0%9C">3GB &#xD30C;&#xC77C; 1&#xAC1C;</h3>
<p>&#xB3D9;&#xAE30; : 0.13s</p>
<p>&#xBE44;&#xB3D9;&#xAE30; : 35s</p>
<p>&#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC; : 0.15s</p>
<p>&#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4; : 0.2s</p>
<p>&#xC804;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC791;&#xC740; &#xD30C;&#xC77C;&#xC774; &#xC5EC;&#xB7EC;&#xAC1C; &#xC788;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xB85C;&#xC9C1;&#xC774; &#xB354; &#xB098;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xBCF4;&#xC778;&#xB2E4;.</p><p>&#xD30C;&#xC77C; &#xAC1C;&#xC218;&#xAC00; &#xB9CE;&#xACE0; &#xAC01; &#xD30C;&#xC77C;&#xC774; &#xD070; &#xACBD;&#xC6B0;(&#xD06C;&#xB2E4; &#xB77C;&#xB294;&#xAC83;&#xC774; &#xB108;&#xBB34; &#xCD94;&#xC0C1;&#xC801;&#xC774;&#xC9C0;&#xB9CC; &#xB300;&#xCDA9; &#xC218;&#xC2ED;MB &#xC774;&#xC0C1;&#xC778; &#xACBD;&#xC6B0;&#xB77C;&#xACE0; &#xC0DD;&#xAC01; &#xD560; &#xC218; &#xC788;&#xB2E4;), &#xD639;&#xC740; &#xD070; &#xD30C;&#xC77C;(&#xC218; GB &#xC774;&#xC0C1;&#xC758; &#xD30C;&#xC77C;) &#xD558;&#xB098;&#xB97C; &#xBC1B;&#xC544;&#xC624;&#xB294;&#xB370;&#xC5D0;&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xB85C;&#xC9C1;&#xC774; &#xC131;&#xB2A5;&#xC774; &#xB098;&#xBE60;&#xC9C4;&#xB2E4;.</p><p>&#xC544;&#xB798;&#xB294; &#xAC01; &#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD55C; &#xADF8;&#xB798;&#xD504;&#xB85C; &#xB098;&#xD0C0;&#xB0B8; &#xC790;&#xB8CC;&#xC774;&#xB2E4;. </p><p>&#xB192;&#xC774;&#xAC00; &#xB0AE;&#xC744;&#xC218;&#xB85D; &#xC131;&#xB2A5;&#xC774; &#xC88B;&#xC740;&#xAC83; (&#xC18C;&#xC694; &#xC2DC;&#xAC04;&#xC774; &#xC9E7;&#xC740; &#xAC83;)&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/08/sync_r.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1200" height="600" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/sync_r.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/sync_r.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/sync_r.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">1KB &#xD30C;&#xC77C;&#xC758; &#xACBD;&#xC6B0; &#xC77C;&#xAD00;&#xC801;&#xC73C;&#xB85C; &#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;&#xAC00; &#xAC00;&#xC7A5; &#xD6A8;&#xC728;&#xC801;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/08/thread_r.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1200" height="600" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/thread_r.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/thread_r.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/thread_r.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">1MB &#xD30C;&#xC77C;&#xC758; &#xACBD;&#xC6B0;&#xB3C4; &#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;&#xAC00; &#xD6A8;&#xC728;&#xC801;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/08/process_r.png" class="kg-image" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)" loading="lazy" width="1200" height="600" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/08/process_r.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/08/process_r.png 1000w, https://www.kimsehwan96.com/content/images/2024/08/process_r.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">50MB &#xD30C;&#xC77C;&#xC758; &#xACBD;&#xC6B0; &#xC624;&#xD788;&#xB824; &#xB3D9;&#xAE30;&#xB85C;&#xC9C1;&#xBCF4;&#xB2E4; &#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;&#xAC00; &#xBE44;&#xD6A8;&#xC728;&#xC801;. &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;,&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xB354; &#xB098;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xBCF4;&#xC784;</span></figcaption></figure><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>&#xC704; &#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC;&#xB97C; &#xD1B5;&#xD574; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC5B4;&#xB290; &#xD558;&#xB098; &#x201C;&#xBAA8;&#xB4E0;&#x201D;&#xC0C1;&#xD669;&#xC5D0; &#xC88B;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xB0B4;&#xB294; &#xC811;&#xADFC; &#xBC95;&#xC740; <strong>&#xC5C6;&#xB2E4;</strong>&#xB77C;&#xB294; &#xACB0;&#xB860;&#xC744; &#xC5BB;&#xC5C8;&#xB2E4;.</p><p><strong>&#xB2E4;&#xB9CC; &#xC791;&#xC740; &#xD30C;&#xC77C;&#xC774; &#xC5EC;&#xB7EC;&#xAC1C; &#xC788;&#xB2E4; &#x2192; &#xBE44;&#xB3D9;&#xAE30;&#xAC00; &#xC720;&#xB9AC;&#xD558;&#xB2E4;</strong></p><p><strong>&#xD30C;&#xC77C;&#xC774; &#xAC01;&#xAC01;&#xC774; &#xD06C;&#xAE30;&#xAC00; &#xD06C;&#xB2E4; &#x2192; &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;/&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC720;&#xB9AC;&#xD558;&#xB2E4;. </strong></p><p><strong>&#xADF8;&#xB9AC;&#xACE0; &#xADF8;&#xAC83;&#xACFC; &#xBCC4;&#xAC1C;&#xB85C; S3 Prefix &#xAD6C;&#xC870;&#xB97C; &#xC798; &#xC9DC;&#xB1A8;&#xB2E4; &#x2192; &#xBCD1;&#xB82C; &#xC2E4;&#xD589;&#xD574;&#xC11C; &#xC131;&#xB2A5;&#xC744; &#xB04C;&#xC5B4; &#xC62C;&#xB9B4; &#xC218; &#xC788;&#xB2E4;. </strong></p><p><strong>&#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;/&#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC131;&#xB2A5;&#xC774; &#xD5A5;&#xC0C1;&#xB418;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xC788;&#xC9C0;&#xB9CC;. &#xADF8; &#xB300;&#xAC00;&#xB85C; &#xC790;&#xC6D0;&#xC744; &#xB354; &#xB9CE;&#xC774; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB41C;&#xB2E4; (&#xC5EC;&#xB7EC; CPU &#xCF54;&#xC5B4;&#xC5D0; &#xD55C; &#xC2E4;&#xD589;&#xC2DC;&#xAC04;&#xC744; &#xB354; &#xC4F0;&#xAC8C; &#xB428;)</strong></p><p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xC778;&#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><p>&#xACB0;&#xAD6D; &#xBAA8;&#xB4E0;&#xAC83;&#xC774; trade-off &#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xACE0;, &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C; &#xB054; &#xC801;&#xC808;&#xD55C; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC744; &#xCDE8;&#xD574;&#xC57C; &#xD558;&#xACE0; &#xACB0;&#xAD6D; &#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xD37C;&#xD3EC;&#xBA3C;&#xC2A4;&#xAC00; &#xAC00;&#xC7A5; &#xB098;&#xC740;&#xC9C0;&#xB97C; &#xC2E4;&#xC81C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xACE0; &#xACB0;&#xC815;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.</p><p></p><h2 id="%EB%B2%88%EC%99%B8">&#xBC88;&#xC678;</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/peak/s5cmd?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - peak/s5cmd: Parallel S3 and local filesystem execution tool.</div><div class="kg-bookmark-description">Parallel S3 and local filesystem execution tool. Contribute to peak/s5cmd development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">peak</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/78885e41a12987f28a7070d63d6eb1101d3ad9df2c9c882ec5fd1707bb499c53/peak/s5cmd" alt="S3 &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xC791;&#xC5C5;&#xC2DC; &#xB3D9;&#xAE30;, &#xBE44;&#xB3D9;&#xAE30;, &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC;, &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC131;&#xB2A5; &#xBE44;&#xAD50; (python)"></div></a></figure><p>s5cmd &#xB77C;&#xB294; &#xD234;&#xC740; Go &#xB85C; &#xC791;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xACE0; &#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC744; &#xBAA8;&#xB450; &#xAC00;&#xC838;&#xAC00;&#xC11C; 40Gbps(~4.3GB/s) &#xC815;&#xB3C4;&#xC758; &#xB300;&#xC5ED;&#xD3ED;&#xB3C4; &#xD3EC;&#xD654; &#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xB294; &#xC131;&#xB2A5;&#xC744; &#xAC16;&#xACE0;&#xC788;&#xB2E4;&#xACE0; &#xD55C;&#xB2E4;. Disk &#xC758; I/O &#xC131;&#xB2A5;&#xC774; &#xCDA9;&#xBD84;&#xD558;&#xAC70;&#xB098;, &#xADF8; &#xC678; &#xC5EC;&#xB7EC; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC9C1;&#xC811; &#xCF54;&#xB4DC;&#xB85C; &#xAD6C;&#xD604;&#xD558;&#xB294;&#xAC83;&#xBCF4;&#xB2E4; &#xB098;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB2E4;. </p><p>&#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC704;&#xD574; <code>c7g.16xlarge</code> &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5D0; Ramdisk &#xB97C; 80GB &#xD560;&#xB2F9;&#xD558;&#xACE0; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. &#xB7A8;&#xB514;&#xC2A4;&#xD06C;&#xC758; &#xC77D;&#xAE30;/&#xC4F0;&#xAE30; &#xC131;&#xB2A5;&#xC740; &#xC57D; 5.83GB/s &#xC774;&#xBBC0;&#xB85C; s5cmd &#xB85C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xD1B5;&#xD574; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC1B;&#xACE0; &#xB514;&#xC2A4;&#xD06C;&#xC5D0; &#xC4F0;&#xB354;&#xB77C;&#xB3C4; &#xBCD1;&#xBAA9;&#xD604;&#xC0C1;&#xC774; &#xD06C;&#xAC8C; &#xC0DD;&#xAE30;&#xC9C0; &#xC54A;&#xC744; &#xAC83;&#xC73C;&#xB85C; &#xD310;&#xB2E8;&#xD588;&#xB2E4;. (fio &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; ramdisk &#xC131;&#xB2A5;&#xC744; EC2 &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xB0B4;&#xC5D0;&#xC11C; &#xCE21;&#xC815;&#xD55C; &#xACB0;&#xACFC;)</p><p>50MB &#xD30C;&#xC77C; 1000&#xAC1C; (&#xCD1D; 50GB)&#xB97C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xB294;&#xAC83;&#xC744; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xBA85;&#xB839;&#xC5B4;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><p><code>$ time s5cmd cp s3://MY_TEST_BUCKET/test/* /mnt/ramdisk</code> </p><p>15&#xCD08; &#xC815;&#xB3C4;&#xAC00; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. 50GB &#xB97C; 15&#xCD08;&#xB9CC;&#xC5D0; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xC558;&#xB2E4;&#xB294;&#xAC83;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xC774; &#xC57D; 27.31Gbps &#xC815;&#xB3C4;&#xC600;&#xB2E4;&#xB294;&#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xACE0; &#xBCC4;&#xB2E4;&#xB978; &#xC124;&#xC815; &#xC5C6;&#xC774; <code>s5cm5d</code> &#xBA85;&#xB839;&#xC5B4; &#xD558;&#xB098;&#xB9CC;&#xC73C;&#xB85C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;(<code>c7.16xlarge</code>)&#xC758; &#xCD5C;&#xB300; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xC815;&#xB3C4;&#xB97C; &#xD3EC;&#xD654;&#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><p>&#xD30C;&#xC774;&#xC36C; &#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xB611;&#xAC19;&#xC774; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD574;&#xBCF4;&#xC558;&#xB2E4;. (&#xB2E4;&#xB9CC; &#xAE30;&#xC874; &#xCF54;&#xB4DC;&#xC640; &#xB2E4;&#xB974;&#xAC8C; &#xB7A8;&#xB514;&#xC2A4;&#xD06C;&#xC5D0; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xD30C;&#xC77C;&#xC744; &#xC4F0;&#xB3C4;&#xB85D; &#xC218;&#xC815;&#xD574;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8; &#xD558;&#xC600;&#xB2E4;)</p><p>&#xC774;&#xB54C;&#xB294; 15.48&#xCD08; &#xC815;&#xB3C4; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. <code>s5cmd</code> &#xC640; &#xAC70;&#xC758; &#xBE44;&#xC2B7;&#xD55C; &#xC131;&#xB2A5;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. </p><p><code>s5cmd</code> &#xB294; &#xB3D9;&#xC2DC;&#xC131; + &#xBCD1;&#xB82C;&#xC131;&#xC744; &#xBAA8;&#xB450; &#xBC18;&#xC601;&#xD588;&#xB2E4;&#xACE0; &#xD558;&#xACE0;, &#xC704;&#xC5D0;&#xC11C; &#xBCF8; &#xBA40;&#xD2F0; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC; &#xB610;&#xD55C; &#xAC00;&#xC6A9;&#xD55C; &#xBAA8;&#xB4E0; CPU &#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xC218;&#xD589;&#xD588;&#xACE0;. <code>s5cmd</code> &#xBC0F; &#xBA40;&#xD2F0;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xCF54;&#xB4DC; &#xBAA8;&#xB450; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC758; &#xCD5C;&#xB300; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xC5D0; &#xAC00;&#xAE5D;&#xAC8C; &#xB300;&#xC5ED;&#xD3ED;&#xC744; &#xD3EC;&#xD654; &#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xC5C8;&#xB2E4;&#xACE0; &#xCD94;&#xCE21;&#xB41C;&#xB2E4;. </p><p><code>s5cmd</code> &#xB294; &#xD070; &#xB178;&#xB825; &#xC5C6;&#xC774; &#xAC00;&#xC6A9;&#xD55C; &#xC790;&#xC6D0;&#xC744; &#xBAA8;&#xB450; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; S3 &#xB97C; &#xC774;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xD310;&#xB2E8;&#xB41C;&#xB2E4;. &#xB2E4;&#xB9CC; &#xC8FC;&#xC758;&#xD560; &#xC810;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC131;&#xB2A5;&#xACFC; &#xBCC4;&#xAC1C;&#xB85C; &#xD30C;&#xC77C;&#xC2DC;&#xC2A4;&#xD15C;&#xC5D0; &#xD30C;&#xC77C;&#xC744; &#xC4F0;&#xB294; &#xACBD;&#xC6B0; Disk I/O &#xC131;&#xB2A5;(IOPS) &#xC744; &#xACE0;&#xB824;&#xD574;&#xC57C; &#xD560; &#xAC83;&#xC774;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[Istio Sidecar 설정을 통한 Pod 의 egress 제어]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Istio &#xC758; Sidecar &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574; &#xAC01; &#xC6CC;&#xD06C;&#xB85C;&#xB4DC;&#xC5D0; &#xBD99;&#xC5B4;&#xC788;&#xB294; &#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xD504;&#xB85D;&#xC2DC;&#xC758; &#xAD6C;&#xC131; &#xC124;&#xC815;&#xC744; &#xBCC0;&#xACBD; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; &#xC774; &#xC124;&#xC815;</div></div>]]></description><link>https://www.kimsehwan96.com/istio-sidecar-egress-control/</link><guid isPermaLink="false">669620ba30749cc47571b7f3</guid><category><![CDATA[Istio]]></category><category><![CDATA[Sidecar]]></category><category><![CDATA[ServiceMesh]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[K8s]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Tue, 16 Jul 2024 08:10:51 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/07/-----------2024-07-16------5.09.06.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Istio &#xC758; Sidecar &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574; &#xAC01; &#xC6CC;&#xD06C;&#xB85C;&#xB4DC;&#xC5D0; &#xBD99;&#xC5B4;&#xC788;&#xB294; &#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xD504;&#xB85D;&#xC2DC;&#xC758; &#xAD6C;&#xC131; &#xC124;&#xC815;&#xC744; &#xBCC0;&#xACBD; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; &#xC774; &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574; &#xD2B9;&#xC815; &#xC11C;&#xBE44;&#xC2A4;&#xAC00;, &#xC9C0;&#xC815;&#xB41C; &#xC11C;&#xBE44;&#xC2A4;&#xB9CC; &#xD638;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC81C;&#xC5B4;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC18C;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;.</div></div><h2 id="network-policy">Network Policy</h2><img src="https://www.kimsehwan96.com/content/images/2024/07/-----------2024-07-16------5.09.06.png" alt="Istio Sidecar &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD55C; Pod &#xC758; egress &#xC81C;&#xC5B4;"><p>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC5D0;&#xC11C; &#xD30C;&#xB4DC; -  &#xD30C;&#xB4DC; , &#xD30C;&#xB4DC; - &#xC11C;&#xBE44;&#xC2A4; &#xB4F1;&#xC758; &#xBAA8;&#xB4E0; &#xD1B5;&#xC2E0;&#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xD5C8;&#xC6A9;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xB2E4;. </p><p>&#xC774; &#xB54C; Kubernetes &#xC5D0;&#xC11C; &#xB124;&#xC774;&#xD2F0;&#xBE0C;&#xD558;&#xAC8C; &#xC9C0;&#xC6D0;&#xD558;&#xB294; <code>Network Policy</code> &#xB85C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC815;&#xCC45;&#xC744; &#xC7A1;&#xC544; &#xD30C;&#xB4DC;-&#xD30C;&#xB4DC; &#xB4F1;&#xC758; &#xD638;&#xCD9C;&#xC744; &#xBD88;&#xAC00;&#xB2A5;&#xD558;&#xB3C4;&#xB85D; &#xB9C9;&#xC744; &#xC218; &#xC788;&#xB2E4;.</p><ol><li>&#xB2E4;&#xB978; <strong>&#xD30C;&#xB4DC;</strong> &#xC758; &#xC694;&#xCCAD;&#xC744; &#xD5C8;&#xC6A9;&#xD560;&#xC9C0; &#xC5EC;&#xBD80; (&#xD30C;&#xB4DC; &#xC790;&#xCCB4;&#xC758; &#xD2B8;&#xB798;&#xD53D;, &#xC989; &#xD30C;&#xB4DC; &#xC548;&#xC758; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xAC04;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xC81C;&#xC5B4; &#xD560; &#xC218;&#xB294; &#xC5C6;&#xC74C;)</li><li>&#xB2E4;&#xB978; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC6CC;&#xD06C;&#xB85C;&#xB4DC;&#xB85C;&#xBD80;&#xD130;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xD5C8;&#xC6A9;&#xD560;&#xC9C0; &#xC5EC;&#xBD80;</li><li>IP &#xBE14;&#xB85D; &#xAE30;&#xBC18;&#xC758; &#xD5C8;&#xC6A9; &#xC5EC;&#xBD80; (&#xC774; &#xC124;&#xC815;&#xACFC; &#xAD00;&#xACC4;&#xC5C6;&#xC774; &#xD30C;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xC911;&#xC778; &#xB178;&#xB4DC;&#xC640;&#xC758; &#xD2B8;&#xB798;&#xD53D;&#xC740; &#xD56D;&#xC0C1; &#xD5C8;&#xC6A9;&#xB428;)</li></ol><p>&#xC544;&#xB798;&#xB294; Network Policy &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xC608;&#xC2DC;&#xC774;&#xB2E4;.</p><pre><code class="language-yaml">apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978</code></pre><p>ingress &#xC640; egress &#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xACE0; &#xB098;&#xAC00;&#xB294; &#xD2B8;&#xB798;&#xD53D;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xD30C;&#xB4DC;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xAC70;&#xB098;, &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xAC70;&#xB098;, ip &#xB300;&#xC5ED;&#xC744; &#xC9C0;&#xC815;&#xD574;&#xC11C; &#xD5C8;&#xC6A9; &#xC5EC;&#xBD80;&#xB97C; &#xACB0;&#xC815; &#xD560; &#xC218; &#xC788;&#xB2E4;. </p><p>&#xB2E4;&#xB9CC; Network Policy &#xB85C;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xAC83;&#xC744; &#xD560; &#xC218; &#xC5C6;&#xB2E4;.</p><ol><li>&#xB0B4;&#xBD80; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xD2B9;&#xC815; &#xAC8C;&#xC774;&#xD2B8;&#xC6E8;&#xC774;&#xB97C; &#xD1B5;&#xACFC;&#xD558;&#xB3C4;&#xB85D; &#xAC15;&#xC81C; (&#xC11C;&#xBE44;&#xC2A4; &#xBA54;&#xC2DC;&#xB098; &#xAE30;&#xD0C0; &#xD504;&#xB85D;&#xC2DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xAC83;&#xC744; &#xAD8C;&#xC7A5;)</li><li>TLS &#xC640; &#xAD00;&#xB828;&#xB41C; &#xBAA8;&#xB4E0;&#xAC83; (&#xC11C;&#xBE44;&#xC2A4; &#xBA54;&#xC2DC;&#xB098; Ingress Controller &#xC0AC;&#xC6A9; &#xAD8C;&#xC7A5;)</li><li>&#xB178;&#xB4DC; &#xBCC4; &#xC815;&#xCC45; </li><li>&#xC11C;&#xBE44;&#xC2A4; &#xB124;&#xC784;(&#xB3C4;&#xBA54;&#xC778; &#xB124;&#xC784;)&#xC744; &#xD0C0;&#xAC8C;&#xD305;&#xD55C; &#xC815;&#xCC45;</li><li>&#xBAA8;&#xB4E0; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xB610;&#xB294; &#xD30C;&#xB4DC;&#xC5D0; &#xBC18;&#xC601;&#xB418;&#xB294; &quot;&#xAE30;&#xBCF8;&quot; &#xC815;&#xCC45;</li></ol><p>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xAC04; &#xD638;&#xCD9C;&#xC740; &quot;&#xC11C;&#xBE44;&#xC2A4;&quot; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xD638;&#xCD9C;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xAC83;&#xC774; &#xBCF4;&#xD3B8;&#xC801;&#xC774;&#xB2E4;. (e.g <code>example-service.example.svc.cluster.local</code>)</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xC704;&#xC5D0;&#xC11C; &#xC54C; &#xC218; &#xC788;&#xB4EF;&#xC774; <code>&#xC11C;&#xBE44;&#xC2A4; &#xB124;&#xC784;</code> &#xAE30;&#xBC18;&#xC758; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD2B8;&#xB798;&#xD53D; &#xC815;&#xCC45;&#xC744; <code>Network Policy</code> &#xB85C;&#xB294; &#xAD6C;&#xC131; &#xD560; &#xC218; &#xC5C6;&#xB2E4; &#xC774; &#xB54C; <code>Istio</code> &#xB97C; &#xC4F0;&#xACE0;&#xC788;&#xB2E4;&#xBA74; &#xC774;&#xB7F0; &#xAD6C;&#xC131;&#xC744; &#xD560; &#xC218; &#xC788;&#xB2E4; </p><h2 id="istio-sidecar">Istio Sidecar</h2><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C; A &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC740; &#xC624;&#xC9C1; B &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC640;, C &#xC11C;&#xBE44;&#xC2A4;(&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;)&#xACFC;&#xB9CC; &#xD1B5;&#xC2E0;&#xC744; &#xD558;&#xBA74; &#xB418;&#xACE0;, &#xADF8; &#xC678;&#xC5D0; &#xAC83;&#xB4E4;&#xACFC;&#xB294; &#xD1B5;&#xC2E0;&#xC744; &#xD560; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xB2E4;&#xACE0; &#xD588;&#xC744; &#xB54C;. Istio Sidecar &#xB97C; &#xBCC4;&#xB3C4;&#xB85C; &#xC124;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xACBD;&#xC6B0; B &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;, C&#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD3EC;&#xD568;&#xD574;&#xC11C; &#xADF8; &#xC678; D,E,F,G,&#x2026;. &#xB4F1;&#xC758; &#xAC19;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC548;&#xC5D0; &#xC788;&#xB294; &#xB2E4;&#xB978; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;&#xC744; &#xD638;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xB294; &#xC0C1;&#xD0DC;&#xAC00; &#xB41C;&#xB2E4;. </p><p>&#xB530;&#xB77C;&#xC11C; Sidecar &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574;&#xC11C; Egress &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC81C;&#xD55C;&#xD568;&#xC73C;&#xB85C;&#xC11C; &#xD2B9;&#xC815; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xD5C8;&#xC6A9;&#xB41C; &#xC11C;&#xBE44;&#xC2A4;&#xB9CC; &#xD638;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xAC15;&#xC81C; &#xD560; &#xC218; &#xC788;&#xB2E4;. </p><h3 id="%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%84%A4%EC%A0%95-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%82%98%EC%9A%94">&#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815; &#xD560; &#xC218; &#xC788;&#xB098;&#xC694;?</h3><p>&#xC77C;&#xB2E8; Istio &#xC758; MeshConfig &#xBD80;&#xD130; &#xC190;&#xC744; &#xBD10;&#xC57C;&#xD558;&#xB294;&#xB370;. </p><p><a href="https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/?ref=kimsehwan96.com#MeshConfig-OutboundTrafficPolicy-Mode">Global Mesh Options</a> </p><p>Istio &#xC758; &#xC11C;&#xBE44;&#xC2A4; &#xBA54;&#xC2DC; &#xAE00;&#xB85C;&#xBC8C; &#xC635;&#xC158;&#xC778; <code>outboundTrafficPolicy</code> &#xAC00; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C;&#xB294; <code>ALLOW_ANY</code>&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xC774;&#xAC83;&#xC740; &#xB300;&#xC0C1; &#xD3EC;&#xD2B8;&#xC5D0; &#xB300;&#xD55C; &#xC11C;&#xBE44;&#xC2A4; &#xB610;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xAC00; &#xC5C6;&#xB294; &#xACBD;&#xC6B0; &#xBB34;&#xC870;&#xAC74;&#xC801;&#xC73C;&#xB85C; &#xC544;&#xC6C3;&#xBC14;&#xC6B4;&#xB4DC; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xB2E4;. </p><p>&#xC27D;&#xAC8C; &#xC0DD;&#xAC01;&#xD574;&#xC11C; &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD3EC;&#xD568;&#xD574;&#xC11C; &#xC678;&#xBD80; &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;(e.g <a href="http://www.google.com/?ref=kimsehwan96.com">www.google.com</a>)&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBAA8;&#xB450; &#xB2E4; &#xC544;&#xC6C3;&#xBC14;&#xC6B4;&#xB4DC; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xB2E4;. </p><p><code>REGISTRY_ONLY</code> &#xC635;&#xC158;&#xC758; &#xACBD;&#xC6B0; &#xC544;&#xC6C3;&#xBC14;&#xC6B4;&#xD2B8; &#xD2B8;&#xB798;&#xD53D;&#xC73C;&#xB85C; &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xB85C; &#xAD00;&#xB9AC;&#xD558;&#xACE0;&#xC788;&#xAC70;&#xB098;, &#xC11C;&#xBE44;&#xC2A4; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; &#xB4F1;&#xB85D;&#xB41C; &#xC11C;&#xBE44;&#xC2A4;&#xB9CC; &#xC544;&#xC6C3;&#xBC14;&#xC6B4;&#xB4DC; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; Sidecar &#xC635;&#xC158;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; <code>outboundTrafficPolicy</code> &#xB97C; <code>REGISTRY_ONLY</code> &#xB85C; &#xC218;&#xC815;&#xD558;&#xACE0; &#xC9C4;&#xD589;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Service Registry : Istio &#xAC00; &#xC778;&#xC9C0;&#xD558;&#xACE0;&#xC788;&#xB294; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xB77C;&#xC6B0;&#xD305; &#xD560; &#xC218; &#xC788;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;(&#xD639;&#xC740; &#xAC00;&#xC0C1; &#xC11C;&#xBE44;&#xC2A4;), &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xB4F1;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;. </div></div><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Service Entry : &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xB294; Istio &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0; Mesh &#xC678;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xCD94;&#xAC00;&#xD574;&#xC11C; &#xC11C;&#xBE44;&#xC2A4; &#xBA54;&#xC2DC; &#xC548;&#xC5D0;&#xC11C; &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xB85C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xCD94;&#xAC00;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; Istio &#xAC00; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xB77C;&#xC6B0;&#xD305; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xAC1C;&#xB150;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01; &#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4; outboundTrafficPolicy&#xAC00; ALLOW_ANY &#xC778; &#xACBD;&#xC6B0; Istio (&#xD639;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;)&#xAC00; &#xAD00;&#xB9AC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC778; &#xACBD;&#xC6B0; Istio &#xC11C;&#xBE44;&#xC2A4; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0;&#xB294; &#xC5C6;&#xC9C0;&#xB9CC;, &#xC5B4;&#xCA44;&#xB4E0; outbound traffic &#xC740; &#xD5C8;&#xC6A9;&#xB418;&#xB294; &#xC0C1;&#xD0DC;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xB118;&#xC5B4; &#xAC08; &#xC218; &#xC788;&#xB2E4;. &#xBC18;&#xBA74; REGISTRY_ONLY &#xC778; &#xACBD;&#xC6B0; &#xC11C;&#xBE44;&#xC2A4; &#xC5D4;&#xD2B8;&#xB9AC;&#xB85C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xCD94;&#xAC00;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xACBD;&#xC6B0; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xB77C;&#xC6B0;&#xD305; &#xB418;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. (Istio &#xD639;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;, &#xC11C;&#xBE44;&#xC2A4; &#xB4F1;&#xC774; &#xC544;&#xB2CC;&#xACBD;&#xC6B0;)</div></div><pre><code class="language-yaml">meshConfig:
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; Istio &#xC758; meshConfig &#xC758; <code>outboundTrafficPolicy</code> mode &#xB97C; &#xC218;&#xC815;&#xD55C;&#xB2E4;. (&#xB514;&#xD3F4;&#xD2B8;&#xB294; <code>ALLOW_ANY</code>)</p><pre><code class="language-yaml">apiVersion: v1
kind: Namespace
metadata:
  name: red
  labels:
    istio-injection: enabled
---
apiVersion: v1
kind: Namespace
metadata:
  name: blue
  labels:
    istio-injection: enabled
---
apiVersion: v1
kind: Namespace
metadata:
  name: green
  labels:
    istio-injection: enabled
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-red-1
  namespace: red
  labels:
    name: nginx-red-1
    app: nginx-red-1
spec:
  containers:
  - name: nginx
    image: nginx:latest
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-blue-1
  namespace: blue
  labels:
    name: nginx-blue-1
    app: nginx-blue-1
spec:
  containers:
  - name: nginx
    image: nginx:latest
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-green-1
  namespace: green
  labels:
    name: nginx-green-1
    app: nginx-green-1
spec:
  containers:
  - name: nginx
    image: nginx:latest</code></pre><p>&#xD14C;&#xC2A4;&#xD2B8;&#xB97C;&#xC704;&#xD574; red, green, blue &#xB77C;&#xB294; &#xC138; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0;, nginx &#xD30C;&#xB4DC;&#xB97C; &#xAC01;&#xAC01; &#xB744;&#xC6B0;&#xB3C4;&#xB85D; &#xC704; yaml &#xC744; &#xBC18;&#xC601;&#xD55C;&#xB2E4;. &#xC774; &#xB54C; sidecar &#xB294; &#xBAA8;&#xB450; inject &#xB418;&#xB3C4;&#xB85D; Namespace &#xB808;&#xBCA8;&#xC5D0;&#xC11C; <code>istio-injection: enabled</code> &#xB808;&#xC774;&#xBE14;&#xC774; &#xBD99;&#xC5B4;&#xC788;&#xB2E4;.</p><pre><code class="language-yaml">apiVersion: v1
kind: Service
metadata:
  name: nginx-red-svc
  namespace: red
spec:
  selector:
    name: nginx-red-1
  ports:
  - port: 80
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-blue-svc
  namespace: blue
spec:
  selector:
    app: nginx-blue-1
  ports:
  - port: 80
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-green-svc
  namespace: green
spec:
  selector:
    app: nginx-green-1
  ports:
  - port: 80
    targetPort: 80</code></pre><p>&#xC774;&#xD6C4; &#xAC01; &#xD30C;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. </p><p>&#xC774; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; <code>red</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC758; &#xD30C;&#xB4DC;&#xC5D0;&#xC11C; <code>green</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC758; &#xD30C;&#xB4DC;&#xB85C;, <code>red</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xD30C;&#xB4DC;&#xC5D0;&#xC11C; <code>blue</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC758; &#xD30C;&#xB4DC;&#xB85C; HTTP &#xC694;&#xCCAD;&#xC744; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xD574;&#xBCF8;&#xB2E4;.</p><pre><code>$ kubectl exec -it -n red nginx-red-1 -- curl -XGET -v nginx-green-svc.green.svc.cluster.local

$ kubectl exec -it -n red nginx-red-1 -- curl -XGET -v nginx-blue-svc.blue.svc.cluster.local</code></pre><p> <code>Istio Sidecar</code> &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC11C; egress &#xB97C; &#xAC15;&#xC81C;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC774; &#xC798; &#xB4E4;&#xC5B4;&#xC624;&#xAC8C; &#xB41C;&#xB2E4;. </p><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: red-sidecar
  namespace: red
spec:
  egress:
  - hosts:
    - &quot;istio-system/*&quot;</code></pre><p>&#xC774; &#xB54C; <code>red</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; <code>egress</code> &#xD56D;&#xBAA9;&#xC5D0; <code>hosts</code> &#xB97C; <code>istio-system/*</code> &#xB85C; &#xC9C0;&#xC815;&#xD558;&#xC5EC; Sidecar &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xBCF4;&#xC790;.</p><p>&#xC774;&#xAC83;&#xC740; <code>istio-system</code> &#xC744; &#xC81C;&#xC678;&#xD55C; &#xB098;&#xBA38;&#xC9C0; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; outbound &#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xB2E4;&#xB294; &#xC124;&#xC815;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC774;&#xB54C; <code spellcheck="false" style="white-space: pre-wrap;">hosts</code> &#xB0B4;&#xC758; &#xD56D;&#xBAA9;&#xC740; <code spellcheck="false" style="white-space: pre-wrap;">namespace/dnsName</code> &#xD3EC;&#xBA67;&#xC73C;&#xB85C; &#xC791;&#xC131;&#xD55C;&#xB2E4;. &#xC704; &#xCF00;&#xC774;&#xC2A4;&#xB294; <code spellcheck="false" style="white-space: pre-wrap;">istio-system</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC758; &#xBAA8;&#xB4E0; &#xD638;&#xC2A4;&#xD2B8;&#xC5D0; &#xB300;&#xD55C; egress &#xB97C; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xB2E4;. </div></div><p>&#xC774;&#xD6C4;</p><pre><code>$ kubectl exec -it -n red nginx-red-1 -- curl -XGET -v nginx-green-svc.green.svc.cluster.local

$ kubectl exec -it -n red nginx-red-1 -- curl -XGET -v nginx-blue-svc.blue.svc.cluster.local</code></pre><p>&#xC744; &#xD1B5;&#xD574; <code>red</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; <code>green</code> , <code>blue</code> &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD638;&#xCD9C; &#xD574;&#xBCF4;&#xBA74;  502 BadGateway &#xAC00; &#xB728;&#xBA74;&#xC11C; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xB118;&#xC5B4;&#xAC00;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/07/-----------2024-07-16------5.04.51.png" class="kg-image" alt="Istio Sidecar &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD55C; Pod &#xC758; egress &#xC81C;&#xC5B4;" loading="lazy" width="1702" height="1062" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/07/-----------2024-07-16------5.04.51.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/07/-----------2024-07-16------5.04.51.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/07/-----------2024-07-16------5.04.51.png 1600w, https://www.kimsehwan96.com/content/images/2024/07/-----------2024-07-16------5.04.51.png 1702w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">502 Bad Gateway &#xC751;&#xB2F5;</span></figcaption></figure><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: red-sidecar
  namespace: red
spec:
  egress:
  - hosts:
    - &quot;istio-system/*&quot;
    - &quot;green/*&quot;
    - &quot;blue/*&quot;</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xC218;&#xC815;&#xD558;&#xACE0; &#xBC18;&#xC601;&#xD55C;&#xB4A4; &#xC694;&#xCCAD;&#xD558;&#xBA74;, &#xC774; &#xB54C;&#xB294; &#xC751;&#xB2F5;&#xC774; &#xC798; &#xB4E4;&#xC5B4;&#xC628;&#xB2E4;. </p><h3 id="registryonly-%EB%A1%9C-meshconfig-%EB%82%B4-%EC%84%A4%EC%A0%95%EC%9D%84-%EB%B3%80%EA%B2%BD%ED%96%88%EB%8D%94%EB%8B%88-%EC%99%B8%EB%B6%80-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%97%90-%EB%8C%80%ED%95%9C-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%95%88%EB%90%98%EC%9A%94">REGISTRY_ONLY &#xB85C; meshConfig &#xB0B4; &#xC124;&#xC815;&#xC744; &#xBCC0;&#xACBD;&#xD588;&#xB354;&#xB2C8; &#xC678;&#xBD80; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB300;&#xD55C; &#xD2B8;&#xB798;&#xD53D; &#xCC98;&#xB9AC;&#xAC00; &#xC548;&#xB418;&#xC694;!</h3><p>&#xC704;&#xC640; &#xAC19;&#xC774; Sidecar &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC124;&#xC815;&#xD558;&#xACE0;, outboundTrafficPolicy.mode &#xAC00; REGISTRY_ONLY &#xC778; &#xACBD;&#xC6B0; egress &#xC5D0; &#xB4F1;&#xB85D;&#xB41C; &#xD638;&#xC2A4;&#xD2B8;(&#xC11C;&#xBE44;&#xC2A4;) &#xC678;&#xC5D0;&#xB294; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xB118;&#xC5B4;&#xAC00;&#xC9C0; &#xC54A;&#xAC8C; &#xB41C;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; <code>red</code> nginx &#xC571;&#xC5D0;&#xC11C; <code>www.google.com</code> &#xC744; &#xD638;&#xCD9C;&#xD558;&#xACE0; &#xC2F6;&#xB2E4;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC124;&#xC815;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: red-sidecar
  namespace: red
spec:
  egress:
  - hosts:
    - &quot;istio-system/*&quot;
    - &quot;green/*&quot; # green &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB85C; &#xB118;&#xC5B4;&#xAC00;&#xB294; outbound &#xD2B8;&#xB798;&#xD53D; &#xD5C8;&#xC6A9;
    - &quot;blue/*&quot; # blue &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB85C; &#xB118;&#xC5B4;&#xAC00;&#xB294; outbound &#xD2B8;&#xB798;&#xD53D; &#xD5C8;&#xC6A9;
    - &quot;red/*&quot; # &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC758; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; &#xBAA8;&#xB4E0; &#xD638;&#xC2A4;&#xD2B8; &#xD5C8;&#xC6A9; -&gt; service entry &#xCD94;&#xAC00; &#xD56D;&#xBAA9; &#xBC18;&#xC601; (ServiceEntry &#xB97C; red &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xC0DD;&#xC131;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;)
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc-entry
  namespace: red
spec:
  hosts:
  - www.google.com
  ports:
  - number: 443
    name: https
    protocol: TLS
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: DNS</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>ServiceEntry</code> &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, Sidecar &#xC624;&#xBE0C;&#xC81D;&#xD2B8; &#xB610;&#xD55C; &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC758; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xBA74; <code>www.google.com</code> &#xC5D0; &#xB300;&#xD55C; egress &#xD2B8;&#xB798;&#xD53D;&#xB3C4; &#xD5C8;&#xC6A9;&#xB418;&#xAC8C; &#xB41C;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC704; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; <code spellcheck="false" style="white-space: pre-wrap;">ServiceEntry</code> &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC5D0; &#xB300;&#xD55C; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xAC00; <code spellcheck="false" style="white-space: pre-wrap;">red</code> &#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Sidecar &#xC5D0;&#xC11C;&#xB3C4; <code spellcheck="false" style="white-space: pre-wrap;">red/*</code> &#xC744; &#xC9C0;&#xC815;&#xD588;&#xB2E4;. &#xB9CC;&#xC57D; &#xD574;&#xB2F9; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xAC00; &#xB2E4;&#xB978; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xC788;&#xB2E4;&#xBA74; &#xB2E4;&#xB978; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xB41C;&#xB2E4;. </div></div><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: google
  namespace: entries
spec:
  hosts:
  - www.google.com
  ports:
  - number: 443
    name: https
    protocol: TLS
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: DNS</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>entries</code> &#xB77C;&#xB294; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; <code>ServiceEntry</code> &#xB97C; &#xC0DD;&#xC131;&#xD588;&#xB2E4;&#xBA74;. </p><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
...
spec:
  egress:
  - hosts:
    - &quot;istio-system/*&quot;
    - &quot;entries/www.google.com&quot;</code></pre><p>&#xACFC; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;/FQDN &#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD574;&#xC11C; <code>www.google.com</code> &#xC5D0; &#xB300;&#xD55C; egress &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD5C8;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[kubelet "서버" 를 위한 인증서 (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS 인증서 오류 조치)]]></title><description><![CDATA[<p></p><h2 id="kubelet-%EC%9D%80-kube-apiserver-%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B7%B8%EC%A0%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%95%84%EB%8B%88%EC%98%80%EB%82%98%EC%9A%94">Kubelet &#xC740; kube-apiserver &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xADF8;&#xC800; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC544;&#xB2C8;&#xC600;&#xB098;&#xC694;?</h2><p></p><p>kubelet &#xC740; &#xCEE8;&#xD2B8;&#xB864;&#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;, &#xC6CC;&#xCEE4; &#xB178;&#xB4DC; &#xAD00;&#xACC4;&#xC5C6;&#xC774; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; &#xB178;&#xB4DC;&#xB77C;&#xBA74; &#xBB34;&#xC870;</p>]]></description><link>https://www.kimsehwan96.com/kubelet-server-certificates/</link><guid isPermaLink="false">6669a3ee30749cc47571b776</guid><category><![CDATA[Kubelet]]></category><category><![CDATA[Kubernetes]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Wed, 12 Jun 2024 14:08:15 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/06/-----------2024-06-12------11.06.36.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.kimsehwan96.com/content/images/2024/06/-----------2024-06-12------11.06.36.png" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><p></p><h2 id="kubelet-%EC%9D%80-kube-apiserver-%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B7%B8%EC%A0%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%95%84%EB%8B%88%EC%98%80%EB%82%98%EC%9A%94">Kubelet &#xC740; kube-apiserver &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xADF8;&#xC800; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC544;&#xB2C8;&#xC600;&#xB098;&#xC694;?</h2><p></p><p>kubelet &#xC740; &#xCEE8;&#xD2B8;&#xB864;&#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;, &#xC6CC;&#xCEE4; &#xB178;&#xB4DC; &#xAD00;&#xACC4;&#xC5C6;&#xC774; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; &#xB178;&#xB4DC;&#xB77C;&#xBA74; &#xBB34;&#xC870;&#xAC74; &#xC2E4;&#xD589;&#xB418;&#xC5B4;&#xC57C; &#xD558;&#xB294; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB85C;, &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB7F0;&#xD0C0;&#xC784;&#xACFC; &#xD1B5;&#xC2E0;&#xD558;&#xC5EC; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB294;&#xB370; &#xC774;&#xB294; static pod &#xBFD0; &#xC544;&#xB2C8;&#xB77C; API &#xC11C;&#xBC84;&#xB85C;&#xBD80;&#xD130; &#xBC1B;&#xC740; PodSpec &#xC5D0; &#xAE30;&#xBC18;&#xD574;&#xC11C; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774; kubelet &#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; kube-apiserver &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; &#xB178;&#xB4DC;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC5D0; &#xC54C;&#xB824;&#xC8FC;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294;&#xB370;. &#xC774; &#xB54C; Kubelet &#xC774; kube-apiserver &#xC5D0; &#xC778;&#xC99D;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xD2B9;&#xBCC4;&#xD55C; &#xC778;&#xC99D; &#xBAA8;&#xB4DC;&#xC778; <code>Node Authorizer</code> &#xB77C;&#xB294; &#xBAA8;&#xB4DC;&#xC758; &#xC778;&#xC99D;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.  (<a href="https://kubernetes.io/docs/reference/access-authn-authz/node/?ref=kimsehwan96.com">Using Node Authorization</a> )</p><p>&#xC774; &#xB54C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; x.509(TLS) &#xC778;&#xC99D;&#xC11C;&#xB294; CN &#xC5D0; <code>system:node:&lt;nodename&gt;</code> &#xD615;&#xD0DC;&#xB85C; &#xAC01; kubelet &#xC774; &#xB5A0;&#xC788;&#xB294; &#xB178;&#xB4DC;&#xC758; &#xC774;&#xB984;&#xC774; &#xAC01; &#xC778;&#xC99D;&#xC11C;&#xBCC4;&#xB85C; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB807;&#xAC8C; kubelet &#xC774; kube-apiserver &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0;, &#xC778;&#xC99D;&#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xAE30; &#xC704;&#xD574; &#xC0AC;&#xC6A9;&#xD558;&#xB294; x.509 &#xC778;&#xC99D;&#xC11C;&#xB294; <code>/var/lib/kubelet/pki</code> &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xC5D0; <code>kubelet-client-current.pem (&#xC2EC;&#xBCFC;&#xB9AD; &#xB9C1;&#xD06C;)</code> &#xD615;&#xD0DC;&#xB85C; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;. </p><p>kubelet.conf &#xB4F1;&#xC758; kubelet &#xC774; &#xC0AC;&#xC6A9;&#xD560; kubeconfig &#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xC2DC;&#xBA74; &#xC544;&#xC2DC;&#xACA0;&#xC9C0;&#xB9CC;, kubeconfig &#xD30C;&#xC77C;&#xC740; &#xD574;&#xB2F9; &#xC2EC;&#xBCFC;&#xB9AD; &#xB9C1;&#xD06C;&#xB97C; &#xC778;&#xC99D;&#xC11C;&#xB85C; &#xBC14;&#xB77C;&#xBCF4;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xACE0;, &#xC2E4;&#xC81C; &#xC778;&#xC99D;&#xC11C;&#xB294; <code>kubelet-client-2024-05-27-17-07-20.pem</code> &#xACFC; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; datetime &#xC774; &#xB4A4;&#xCABD;&#xC5D0; &#xBD99;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xAC74; &#xC2E4;&#xC81C;&#xB85C; kubelet &#xC774; &#xC774; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xD544;&#xC694;&#xC2DC;&#xC5D0; <code>rotate</code> &#xD558;&#xAE30; &#xC704;&#xD568;&#xC774;&#xACE0;. kubeconfig &#xB294; &#xC2EC;&#xBCFC;&#xB9AD; &#xB9C1;&#xD06C;&#xB9CC; &#xBC14;&#xB77C;&#xBCF4;&#xB3C4;&#xB85D; &#xD574;&#xC11C; &#xC2E4;&#xC81C; &#xC2EC;&#xBCFC;&#xB9AD; &#xB9C1;&#xD06C;&#xB9CC;&#xC744; &#xC778;&#xC99D;&#xC11C;&#xAC00; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xB418;&#xC5C8;&#xC744; &#xB54C; &#xBC14;&#xB77C;&#xBCF4;&#xB294; &#xACBD;&#xB85C;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xD558;&#xC5EC;&#xC11C; kubeconfig &#xD30C;&#xC77C;&#xC758; &#xC218;&#xC815;&#xC774; &#xD544;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xAC00; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>kubelet</code> &#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xB85C; 10250/10255 &#xBC88; &#xD3EC;&#xD2B8;&#xB85C; <code>&#xC11C;&#xBC84;</code> &#xB97C; &#xB744;&#xC6B0;&#xACE0; Listen &#xC744; &#xD558;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774; kubelet &#xC11C;&#xBC84;&#xC758; &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8; &#xC815;&#xBCF4;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes/kubernetes/blob/68091805a53c6fdd42553f8ccdbf932ab263fbdd/pkg/kubelet/server/server.go?ref=kimsehwan96.com#L94-L104"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kubernetes/pkg/kubelet/server/server.go at 68091805a53c6fdd42553f8ccdbf932ab263fbdd &#xB7; kubernetes/kubernetes</div><div class="kg-bookmark-description">Production-Grade Container Scheduling and Management - kubernetes/kubernetes</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/2c7f09fb9cc0374c1464d331c33d06e0da4728ae268e757636d928b494c3700b/kubernetes/kubernetes" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"></div></a></figure><p>&#xC774; &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xB300;&#xD45C;&#xC801;&#xC778; &#xCF00;&#xC774;&#xC2A4;&#xAC00; <code>metrics-server</code> &#xC785;&#xB2C8;&#xB2E4;. metrics-server &#xB294; K8s &#xB0B4;&#xC758; Pod &#xC758; &#xBA54;&#xD2B8;&#xB9AD;&#xC744; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC218;&#xC9D1;&#xD574;&#xC11C; kube-apiserver &#xC5D0; &#xC804;&#xB2EC;&#xD558;&#xAC8C;&#xB418;&#xB294;&#xB370;&#xC694;, &#xC774;&#xAC83;&#xC744; &#xD1B5;&#xD574; HPA(Horizontal Pod Autocaling), VPA(Vertical Pod Autoscaling) &#xB4F1;&#xC744; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p><code>metrics-server</code> &#xB294; &#xAC01; &#xB178;&#xB4DC;&#xC5D0; &#xC788;&#xB294; kubelet &#xC758; 10250 &#xBC88; &#xD3EC;&#xD2B8;&#xB85C; &#xBA54;&#xD2B8;&#xB9AD;&#xC744; &#xC218;&#xC9D1;&#xD558;&#xAE30;&#xC704;&#xD574; kubelet &#xC11C;&#xBC84;&#xC5D0; HTTP Request &#xB97C; &#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.&#xA0;</p><p>kubelet &#xC740; kube-apiserver &#xC5D0; &#xB300;&#xD55C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC774;&#xC790;, &#xD30C;&#xB4DC;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xC774;&#xC790;, metrics &#xBC0F; &#xAE30;&#xD0C0; &#xAE30;&#xB2A5;&#xC744; &#xB178;&#xCD9C;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xB85C;&#xC11C; &#xB3D9;&#xC791;&#xC744; &#xD558;&#xB294; &#xC148;&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="kubelet-%EC%9D%98-%EC%84%9C%EB%B2%84-%EC%9D%B8%EC%A6%9D%EC%84%9C-x509">Kubelet &#xC758; &#xC11C;&#xBC84; &#xC778;&#xC99D;&#xC11C; (x.509)</h2><p>&#xA0;<a href="https://github.com/kubernetes/kubernetes/blob/4bb434501d9ee5edda6faf52a9d6d32a969ae183/cmd/kubelet/app/server.go?ref=kimsehwan96.com#L1100-L1181">kubernetes/cmd/kubelet/app/server.go at 4bb434501d9ee5edda6faf52a9d6d32a969ae183 &#xB7; kubernetes/kubernetes</a>  </p><p>kubelet &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; TLS &#xC778;&#xC99D;&#xC11C;/&#xD0A4;&#xB97C; &#xB530;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC744; &#xACBD;&#xC6B0; self-signed certs &#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC11C; Kubelet &#xC758; &#xC11C;&#xBC84;(10250 &#xBC88; &#xD3EC;&#xD2B8;)&#xB97C; TLS &#xB97C; enable &#xD55C; &#xC11C;&#xBC84;&#xB85C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.&#xA0;</p><p><code>/var/lib/kubelet/pki</code> &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xC758; <code>kubelet.crt</code> , <code>kubelet.key</code> &#xB294; kubelet self-signed &#xD0A4;, &#xC778;&#xC99D;&#xC11C; &#xC785;&#xB2C8;&#xB2E4;.</p><p><code>/var/lib/kubelet/pki</code> &#xC5D0;&#xB294; &#xB450;&#xAC00;&#xC9C0; &#xC885;&#xB958;&#xC758; &#xC778;&#xC99D;&#xC11C;&#xAC00; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB418;&#xB294;&#xB370;&#xC694;.</p><p><code>kubelet-client-xxx.pem</code> &#xC740; <code>kubelet</code> &#x2192; <code>kube-apiserver</code> &#xC778;&#xC99D;&#xC2DC; <code>Node Authorizer</code> &#xC778;&#xC99D; &#xBAA8;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; (&#xC774;&#xAC74; x509 &#xC778;&#xC99D;&#xC11C; &#xB0B4;&#xC758; CN&#xC774; system:nodes:&lt;node-name&gt; &#xD615;&#xD0DC;&#xB85C; &#xC11C;&#xBA85;&#xB41C; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xAC70;) apiserver &#xC5D0; &#xC778;&#xC99D;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;.</p><p><code>kubelet.crt</code> &#xB294; <code>kubelet</code> &#xC11C;&#xBC84;&#xAC00; TLS &#xC11C;&#xBC84;&#xB97C; &#xC624;&#xD508;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294;  &#xD6C4;&#xC790;&#xB97C; &#xB2E4;&#xB8E8;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/06/086bd862-66cc-4231-a05e-c6b31e2141b2.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="1530" height="396" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/086bd862-66cc-4231-a05e-c6b31e2141b2.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/086bd862-66cc-4231-a05e-c6b31e2141b2.png 1000w, https://www.kimsehwan96.com/content/images/2024/06/086bd862-66cc-4231-a05e-c6b31e2141b2.png 1530w" sizes="(min-width: 720px) 720px"><figcaption><code spellcheck="false" style="white-space: pre-wrap;"><span>/var/lib/kubelet/pki</span></code><span style="white-space: pre-wrap;"> &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC758; &#xAD6C;&#xC870;</span></figcaption></figure><p>&#xC55E;&#xC11C; &#xC774;&#xC57C;&#xAE30; &#xD55C; &#xAC83; &#xCC98;&#xB7FC; <code>kubelet-client-current.pem</code> &#xC758; &#xACBD;&#xC6B0; <code>kubelet -&gt; kube-apiserver</code> &#xC778;&#xC99D;&#xC744; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;. </p><p><code>$ openssl x509 -text -noout -in kubelet-client-current.pem</code> &#xC744; &#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-code-card"><pre><code>Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2796500698555846452 (0x26cf2a919f8d8f34)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = kubernetes
        Validity
            Not Before: May 27 08:02:17 2024 GMT
            Not After : May 27 08:07:19 2025 GMT
        Subject: O = system:nodes, CN = system:node:node1
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b6:9d:8f:31:03:12:47:b6:b9:83:62:ef:96:ba:
                    ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier:
                8F:3C:69:8E:62:01:95:BF:FB:D8:8B:41:4A:D7:B8:CF:0F:9C:36:9F
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        9d:38:83:5b:78:2c:56:53:90:02:cb:e3:1e:b4:b0:d3:61:07:
        ...</code></pre><figcaption><p><code spellcheck="false" style="white-space: pre-wrap;"><span>kubelet-client-current.pem</span></code></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>CN</code> &#xC774; <code>system:node:&lt;node-name&gt;</code> &#xC778; <code>node-authorizer</code> &#xC778;&#xC99D;&#xC744; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C;&#xC784;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xA0;</p><p>&#xADF8;&#xB7EC;&#xBA74; kubelet&#xC758;  TLS &#xC11C;&#xBC84;&#xB97C; &#xC704;&#xD55C; <code>kubelet.crt</code> &#xB294; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;?</p><p><code>$ openssl x509 -text -noout -in kubelet.crt</code> &#xB97C; &#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-code-card"><pre><code class="language-`">Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 8001362879639973410 (0x6f0a8d255fefee22)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = node1-ca@1716797154
        Validity
            Not Before: May 27 07:05:54 2024 GMT
            Not After : May 27 07:05:54 2025 GMT
        Subject: CN = node1@1716797154
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c3:19:c5:5e:71:3f:3c:0e:8b:dc:56:85:2e:7a:
                    ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier:
                CC:87:5A:94:20:C4:F3:11:C6:06:90:A7:A4:C1:B9:1E:FE:51:CE:9F
            X509v3 Subject Alternative Name:
                DNS:node1
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        60:7d:e4:4e:23:2d:50:92:1d:78:51:22:43:ab:38:75:82:93:
        ...</code></pre><figcaption><p><span style="white-space: pre-wrap;">kubelet.crt</span></p></figcaption></figure><p><code>Issuer</code> &#xC758; Common Name&#xC744; &#xBCF4;&#xBA74; &#xC54C;&#xACA0;&#xC9C0;&#xB9CC; self-sigend &#xC778;&#xC99D;&#xC11C;&#xC784;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774; &#xC778;&#xC99D;&#xC11C;&#xB294; <code>kubelet</code> &#xC744; &#xC2E4;&#xD589; &#xD560; &#xB54C; kubelet configuration&#xC5D0; <code>tlsPrivateKeyFile</code> , <code>tlsCertFile</code> &#xC744; &#xC9C0;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xACBD;&#xC6B0; <code>&#xC790;&#xB3D9;</code> &#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB429;&#xB2C8;&#xB2E4;.</p><p><a href="https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/?ref=kimsehwan96.com#kubelet-config-k8s-io-v1beta1-KubeletConfiguration">https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration</a> &#xCC38;&#xACE0;. </p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/06/8f71cfad-36e0-4c5a-85ac-cc0303bf3ccb.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="2000" height="1908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/8f71cfad-36e0-4c5a-85ac-cc0303bf3ccb.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/8f71cfad-36e0-4c5a-85ac-cc0303bf3ccb.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/06/8f71cfad-36e0-4c5a-85ac-cc0303bf3ccb.png 1600w, https://www.kimsehwan96.com/content/images/size/w2400/2024/06/8f71cfad-36e0-4c5a-85ac-cc0303bf3ccb.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>&#xB9CC;&#xC57D; <code>/var/lib/pki/kubelet.crt</code> , <code>/var/lib/pki/kubelet.key</code> &#xB97C; &#xC0AD;&#xC81C;&#xD558;&#xACE0; kubelet &#xC744; &#xC7AC;&#xC2E4;&#xD589; &#xD558;&#xB354;&#xB77C;&#xB3C4; &#xB2E4;&#xC2DC; &#xC0DD;&#xC131;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; &#xC774; &#xB3D9;&#xC791;&#xC774; &#xD06C;&#xAC8C; &#xBB38;&#xC81C; &#xB420;&#xC77C;&#xC740; &#xC5C6;&#xC9C0;&#xB9CC;. </p><p><code>metrics-server</code> &#xC758; &#xACBD;&#xC6B0; <code>kubelet</code> &#xC11C;&#xBC84;&#xC758; (10250) &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xCC14;&#xB7EC;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC218;&#xC9D1;&#xD558;&#xB294;&#xB370;, &#xC774; &#xB54C; 10250 &#xD3EC;&#xD2B8;&#xB85C; &#xC5F4;&#xB9B0; kubelet &#xC758; &#xC778;&#xC99D;&#xC11C;&#xAC00; self-signed &#xC778;&#xC99D;&#xC11C; &#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;  metrics server &#xB97C; &#xC124;&#xCE58; &#xD55C; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xC5D0;&#xB7EC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB420;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/06/43104c64-50c4-497e-a2da-6c74f63b8b7c.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="2000" height="1144" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/43104c64-50c4-497e-a2da-6c74f63b8b7c.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/43104c64-50c4-497e-a2da-6c74f63b8b7c.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/06/43104c64-50c4-497e-a2da-6c74f63b8b7c.png 1600w, https://www.kimsehwan96.com/content/images/size/w2400/2024/06/43104c64-50c4-497e-a2da-6c74f63b8b7c.png 2400w" sizes="(min-width: 720px) 720px"></figure><p><code>&quot;Failed to scrape node&quot; err=&quot;Get \&quot;https://192.168.207.7:10250/metrics/resource\\&quot;: x509: cannot validate certificate for 192.168.207.7 because it doesn&apos;t contain any IP SANs&quot; node=&quot;node5&quot;</code></p><p>kubelet TLS &#xC11C;&#xBC84;&#xB97C; &#xB744;&#xC6B0;&#xAE30; &#xC704;&#xD55C; kubelet self-signed &#xC778;&#xC99D;&#xC11C; &#xB0B4;&#xC5D0; SANs &#xD544;&#xB4DC;&#xC5D0; DNS &#xC815;&#xBCF4;&#xB294; &#xC788;&#xC9C0;&#xB9CC;, &#xD574;&#xB2F9; kubelet&#xC774; &#xB5A0;&#xC788;&#xB294; &#xB178;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; IP &#xC815;&#xBCF4;&#xAC00; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xBB38;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;. &#xC704;&#xCABD;&#xC5D0;&#xC11C; <code>kubelet.crt</code> &#xC778;&#xC99D;&#xC11C; &#xB0B4;&#xC6A9;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF8; &#xB0B4;&#xC6A9;&#xC744; &#xB2E4;&#xC2DC; &#xBCF4;&#xBA74;. <code>DNS:node1</code> &#xACFC; &#xAC19;&#xC740; &#xC815;&#xBCF4;&#xB294; &#xC788;&#xC9C0;&#xB9CC;, IP &#xC815;&#xBCF4;&#xB294; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xADF8;&#xB807;&#xC2B5;&#xB2C8;&#xB2E4;.&#xA0;</p><p>&#xC774; &#xB54C; &#xBCF4;&#xD1B5; &#xCC3E;&#xC544;&#xBCF4;&#xBA74; &#xB098;&#xC624;&#xB294; &#xBC29;&#xBC95;&#xC774;. <code>metrics-server</code> &#xB0B4;&#xC5D0; <code>--kubelet-insecure-tls</code> &#xB97C; &#xC2E4;&#xD589;&#xC778;&#xC790;&#xB85C; &#xC8FC;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xB354; &#xC62C;&#xBC14;&#xB978; &#xC811;&#xADFC;&#xBC95;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h2 id="kubelet-%EC%9D%98-tls-%EC%9D%B8%EC%A6%9D%EC%84%9C%EB%A5%BC-kube-apiserver-%EB%A1%9C-%EB%B6%80%ED%84%B0-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0-tls-bootstrap">kubelet &#xC758; TLS &#xC778;&#xC99D;&#xC11C;&#xB97C; kube-apiserver &#xB85C; &#xBD80;&#xD130; &#xBC1B;&#xC544;&#xC624;&#xAE30; (TLS Bootstrap)</h2><p></p><p>&#xC774;&#xAC83;&#xC740; kubelet &#xC2E4;&#xD589; &#xC778;&#xC790;, &#xD639;&#xC740; kubelet configuration &#xC5D0;&#xC11C; </p><p><code>serverTLSBootstrap: true</code></p><p>&#xC744; &#xCD94;&#xAC00;&#xD574;&#xC11C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/06/1637e004-0492-4e41-9670-1f49c56f30f5.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="2000" height="924" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/1637e004-0492-4e41-9670-1f49c56f30f5.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/1637e004-0492-4e41-9670-1f49c56f30f5.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/06/1637e004-0492-4e41-9670-1f49c56f30f5.png 1600w, https://www.kimsehwan96.com/content/images/size/w2400/2024/06/1637e004-0492-4e41-9670-1f49c56f30f5.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">serverTLSBootstrap &#xC778;&#xC790;&#xB97C; kubelet configuration &#xC5D0; &#xCD94;&#xAC00;&#xD55C; &#xBAA8;&#xC2B5;</span></figcaption></figure><p>kube-apiserver / controller-manager &#xC5D0;&#xAC8C; TLS &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xAC83;&#xC744; TLSBootstrap &#xC774;&#xB77C;&#xACE0; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xC120; &#xAE30;&#xC874; kubelet configuration &#xC5D0; serverTLSBootstrap: true &#xB97C; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;.</p><p><code>/etc/kubernetes/kubelet-config.yaml</code> &#xC5D0; &#xBCF4;&#xD1B5; <code>KubeletConfiguration</code> &#xC774; &#xC124;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xC744;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC218;&#xC815; &#xD55C; &#xC774;&#xD6C4;</p><p><code>$ systemctl stop kubelet</code></p><p><code>$ systemctl restart kubelet</code></p><p><code>$ kubectl get csr -A</code></p><p>&#xD574;&#xB2F9; &#xBA85;&#xB839;&#xC5B4;&#xB4E4;&#xC744; &#xC218;&#xD589;&#xD574;&#xBCF4;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC744;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/06/8f5ff4cc-c44f-4c3a-a8a2-8408d2c04fc0.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="2000" height="159" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/8f5ff4cc-c44f-4c3a-a8a2-8408d2c04fc0.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/8f5ff4cc-c44f-4c3a-a8a2-8408d2c04fc0.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/06/8f5ff4cc-c44f-4c3a-a8a2-8408d2c04fc0.png 1600w, https://www.kimsehwan96.com/content/images/2024/06/8f5ff4cc-c44f-4c3a-a8a2-8408d2c04fc0.png 2040w" sizes="(min-width: 720px) 720px"></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>system:node:&lt;node-name&gt;</code> &#xC73C;&#xB85C;&#xBD80;&#xD130; <code>kubernetes.io/kubelet-serving</code> &#xD615;&#xD0DC;&#xC758; &#xC11C;&#xBA85; &#xC694;&#xCCAD;&#xC774; &#xC0DD;&#xACBC;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; <code>$ kubectl certificate approve csr-bvbnx</code> &#xC640; &#xAC19;&#xC774; &#xD574;&#xB2F9; &#xC11C;&#xBA85; &#xC694;&#xCCAD;&#xC5D0;&#xB300;&#xD574;&#xC11C; <code>approve</code> &#xD574;&#xBD05;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/06/9eb678b1-351c-48d7-acf7-23a72febd791.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="1556" height="382" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/9eb678b1-351c-48d7-acf7-23a72febd791.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/9eb678b1-351c-48d7-acf7-23a72febd791.png 1000w, https://www.kimsehwan96.com/content/images/2024/06/9eb678b1-351c-48d7-acf7-23a72febd791.png 1556w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC774;&#xC81C; <code>kubelet-server-current.pem</code> &#xC774;&#xB77C;&#xB294; &#xC778;&#xC99D;&#xC11C;&#xAC00; &#xBCF4;&#xC774;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. (<code>kubelet.crt</code> , <code>kubelet.key</code> &#xB294; &#xC0AD;&#xC81C;&#xD574;&#xB3C4; &#xB429;&#xB2C8;&#xB2E4;.) </p><p>&#xC774;&#xC81C; &#xD574;&#xB2F9; &#xC778;&#xC99D;&#xC11C;&#xB85C; &#xD574;&#xB2F9; &#xB178;&#xB4DC;&#xC758; <code>kubelet</code> &#xC740; 10250 &#xBC88; &#xD3EC;&#xD2B8;&#xB85C; TLS &#xC11C;&#xBC84;&#xB97C; &#xC624;&#xD508;&#xD569;&#xB2C8;&#xB2E4;. </p><p><code>$ openssl x509 -text -noout -in kubelet-server-current.pem</code> &#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-code-card"><pre><code>Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            21:24:58:0f:29:01:0d:ab:45:c4:10:a1:3b:d3:fc:7d
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = kubernetes
        Validity
            Not Before: May 27 09:19:33 2024 GMT
            Not After : May 27 09:19:33 2025 GMT
        Subject: O = system:nodes, CN = system:node:node1
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:e1:30:d0:21:06:29:4b:0d:5e:4e:45:04:9f:d1:
                    ...
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier:
                8F:3C:69:8E:62:01:95:BF:FB:D8:8B:41:4A:D7:B8:CF:0F:9C:36:9F
            X509v3 Subject Alternative Name:
                DNS:node1, IP Address:192.168.207.3
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        ca:a1:b9:79:7a:8e:9e:83:89:ad:01:4b:d7:34:ea:f2:6d:13:
        ...</code></pre><figcaption><p><span style="white-space: pre-wrap;">kubelet-server-current.pem</span></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; Issuer &#xC758; CN &#xC774; kubernetes &#xC784;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xAC74; &#xC6B0;&#xB9AC;&#xAC00; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xB9CC;&#xB4E4; &#xB54C;, &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; CA &#xB97C; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;( <code>/etc/kubernetes/ssl/{ca.crt,ca.key}</code> ). &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xB0B4;&#xC758; &#xAC01;&#xC885; &#xC778;&#xC99D;&#xC11C;&#xC758; CA &#xB294; &#xC774;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.  (etcd &#xBC0F; front-proxy &#xB294; &#xBCC4;&#xB3C4;&#xC758; CA&#xB97C; &#xB450;&#xB294; &#xD3B8;&#xC785;&#xB2C8;&#xB2E4;)</p><p>&#xB610;&#xD55C; &#xAE30;&#xC874;&#xC5D0; self-signed &#xC778;&#xC99D;&#xC11C;&#xC5D0;&#xB294; &#xC5C6;&#xC5C8;&#xB358; IP Address &#xD56D;&#xBAA9;&#xC774; SAN &#xD544;&#xB4DC;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xC788;&#xB294;&#xAC83;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB85C;&#xC368; metrics-server &#xAC00; &#xD574;&#xB2F9; <code>https://&#xD574;&#xB2F9;IP:10250</code> &#xB85C; &#xC811;&#xADFC; &#xD588;&#xC744; &#xB54C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCE21;&#xC5D0;&#xC11C; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE38; &#xAC83;&#xC740; &#xC5C6;&#xC5B4;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xAE30;&#xC874;&#xC5D0;&#xB294; <code>https://&#xD574;&#xB2F9;IP:10250</code> &#xC73C;&#xB85C; &#xC811;&#xADFC;&#xD558;&#xC9C0;&#xB9CC;, &#xC815;&#xC791; &#xC778;&#xC99D;&#xC11C; &#xC815;&#xBCF4;&#xC5D0;&#xB294; <code>DNS</code> &#xC815;&#xBCF4;&#xB9CC; &#xC788;&#xC5B4;&#xC11C; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACBC;&#xC2B5;&#xB2C8;&#xB2E4;.)</p><p>&#xC774;&#xC81C; &#xC774;&#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; metrics-server &#xB97C; <code>insecure</code> &#xC635;&#xC158; &#xC5C6;&#xC774; &#xC368;&#xBCF4;&#xBA74; &#xC624;&#xB958; &#xC5C6;&#xC774; metrics-server &#xAC00; &#xC798; kubelet &#xC758; &#xBA54;&#xD2B8;&#xB9AD;&#xC744; &#xC218;&#xC9D1;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xA0;&#xC5EC;&#xAE30;&#xC11C; &#xBD80;&#xAC00;&#xC801;&#xC73C;&#xB85C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB294; &#xC7A5;&#xC810;&#xC740;. kubelet &#xC758; rotateCerts &#xAE30;&#xB2A5;&#xC5D0; &#xC774;&#xC81C; current-server-pem &#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xAC8C; &#xB418;&#xB294;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;. (self-signed &#xC778;&#xC99D;&#xC11C;&#xB294; kubelet &#xC758; &#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xC774; &#xD1B5;&#xC81C;&#xD558;&#xC9C0; &#xC54A;&#xC74C;. &#xAD00;&#xB828;&#xD55C; &#xB2E4;&#xC591;&#xD55C; &#xC774;&#xC288; &#xB610;&#xD55C; &#xC874;&#xC7AC;. kubeadm &#xB3C4; &#xADF8;&#xAC83;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xC9C0; &#xC54A;&#xC74C;) </p><h2 id="%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%88%98%EB%8F%99%EC%9C%BC%EB%A1%9C-approve-%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94-%EB%85%B8%EB%93%9C%EA%B0%80-%EA%B3%84%EC%86%8D-%EB%8A%98%EC%96%B4%EB%82%98%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%98%EC%A3%A0">&#xC774;&#xB807;&#xAC8C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; approve &#xD574;&#xC57C; &#xD558;&#xB098;&#xC694;? &#xB178;&#xB4DC;&#xAC00; &#xACC4;&#xC18D; &#xB298;&#xC5B4;&#xB098;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C;&#xD558;&#xC8E0;?</h2><p>&#xC6B0;&#xB9AC;&#xAC00; &#xBC29;&#xAE08; &#xD55C; &#xBC29;&#xC2DD;&#xC740; TLS Bootstrap &#xC694;&#xCCAD;, CSR &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; approve &#xB97C; &#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB294; &#xC774;&#xB7F0; &#xC778;&#xC99D;&#xC11C; &#xC11C;&#xBA85; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574; &#xC790;&#xB3D9;&#xD654; &#xD558;&#xAE30; &#xC704;&#xD574; <code>Approver</code> &#xB77C;&#xB294; &#xAC1C;&#xB150;&#xC744; &#xB450;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xB9AC;&#xAC00; &#xCEE8;&#xD2B8;&#xB864;&#xD50C;&#xB808;&#xC778;/&#xC6CC;&#xCEE4;&#xB178;&#xB4DC; join &#xC744; &#xD560;&#xB54C;, &#xBC14;&#xB2D0;&#xB77C; &#xD639;&#xC740; kubeadm &#xC744; &#xC368;&#xBCF4;&#xBA74; <code>token</code> &#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; join &#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xD574;&#xBCF8;&#xC801;&#xC774; &#xC788;&#xC744;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xAC83;&#xC740; <code>token</code> &#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC778;&#xC99D;&#xB41C; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; TLS Bootstrap &#xC694;&#xCCAD;&#xC744;(CSR) &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC218;&#xB77D;&#xD558;&#xB294; Approver &#xB97C; &#xC124;&#xC815;&#xD55C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>  <code>kube-controller-manager</code> &#xC5D0;&#xC11C; <code>controllers</code> &#xB85C; default &#xB85C; &#xCD94;&#xAC00;&#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xC544;&#xC11C; (&#xC815;&#xD655;&#xD788;&#xB294; Default &#xB85C; disable &#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC11C;) &#xCD94;&#xAC00;&#xD574;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p> kubeadm &#xC73C;&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD588;&#xB2E4;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xB294; &#xC0AC;&#xD56D;&#xC785;&#xB2C8;&#xB2E4;. (<a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/?ref=kimsehwan96.com">kube-controller-manager</a> )</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/06/dcde787f-79f6-42f0-8ea5-0e342d32991c.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="1556" height="1296" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/dcde787f-79f6-42f0-8ea5-0e342d32991c.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/dcde787f-79f6-42f0-8ea5-0e342d32991c.png 1000w, https://www.kimsehwan96.com/content/images/2024/06/dcde787f-79f6-42f0-8ea5-0e342d32991c.png 1556w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kube-controller-manager &#xC758; &#xC2E4;&#xD589; &#xC778;&#xC790;&#xC911; --controllers</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><code spellcheck="false" style="white-space: pre-wrap;">bootstrapsigner</code>, <code spellcheck="false" style="white-space: pre-wrap;">tokencleaner</code> &#xB294; &#xB514;&#xD3F4;&#xD2B8;&#xB85C; &#xD65C;&#xC131;&#xD654;&#xB418;&#xB294; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB4E4;&#xC774; &#xC544;&#xB2C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCD94;&#xAC00;&#xAC00; &#xB418;&#xB294;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.&#xA0;</div></div><p>&#xC774;&#xB807;&#xAC8C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC870;&#xC778;&#xC2DC; &#xC0AC;&#xC6A9;&#xB418;&#xB294; TLS Bootstrap &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC2B9;&#xC778; &#xD560; &#xC218; &#xC788;&#xB294; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB294; &#xC0AC;&#xC804;&#xC5D0; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC788;&#xC9C0;&#xB9CC;. </p><p><code>kubelet</code> &#xC758; <strong> Server TLS &#xC778;&#xC99D;&#xC11C; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xB3D9; &#xC2B9;&#xC778; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB294; kube-controller-manager &#xC5D0; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC788;&#xC9C0;&#xB294; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;</strong>. &#xADF8;&#xB798;&#xC11C; &#xACFC;&#xAC70;&#xC5D0;&#xB294;</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://github.com/kontena/kubelet-rubber-stamp?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kontena/kubelet-rubber-stamp: Simple CSR approver for Kubernetes</div><div class="kg-bookmark-description">Simple CSR approver for Kubernetes. Contribute to kontena/kubelet-rubber-stamp development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kontena</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/a0aeea0bf74f735f57031d5d14756af05155e12afdfaadd7d214fff7839c4b09/kontena/kubelet-rubber-stamp" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"></div></a><figcaption><p><span style="white-space: pre-wrap;">kubelet-rubber-stamp</span></p></figcaption></figure><p><code>kubelet-rubber-stamp</code> &#xB77C;&#xB294;  &#xAC83;&#xC774; &#xC0AC;&#xC6A9;&#xB418;&#xC5C8;&#xC5C8;&#xC9C0;&#xB9CC;, &#xD604;&#xC7AC; &#xC720;&#xC9C0;&#xBCF4;&#xC218; &#xB418;&#xACE0;&#xC788;&#xB294; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xAC00; &#xC544;&#xB2C8;&#xACE0;, &#xB610;&#xD55C; &#xBA87;&#xAC00;&#xC9C0; &#xBCF4;&#xC548; &#xD5C8;&#xC810;&#xC774; &#xC788;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xB824;&#xC838;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://github.com/postfinance/kubelet-csr-approver?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - postfinance/kubelet-csr-approver: Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks</div><div class="kg-bookmark-description">Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks - postfinance/kubelet-csr-approver</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">postfinance</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ec4ddc87096e73766d33a0346d5843ace02a1ce1af19e35eeffb3955e3ab99c9/postfinance/kubelet-csr-approver" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"></div></a><figcaption><p><span style="white-space: pre-wrap;">kubelet-csr-approver</span></p></figcaption></figure><p>&#xC774;&#xAC83;&#xC744; &#xC704;&#xD55C; &#xB300;&#xC548;&#xC73C;&#xB85C; <code>kubelet-csr-approver</code> &#xB77C;&#xB294; &#xAC83;&#xC774; &#xC788;&#xACE0; kubespray &#xB610;&#xD55C; kubelet &#xC758; serverTLSBootstrap &#xC635;&#xC158;&#xC744; &#xD65C;&#xC131;&#xD654; &#xD558;&#xBA74; &#xC774;&#xAC83;&#xC744; &#xD568;&#xAED8; &#xBC30;&#xD3EC;&#xD558;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EA%B7%B8%EB%9F%BC-kubespray-%EC%97%90%EC%84%9C-%EC%A0%80%EC%B9%9C%EA%B5%AC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B8-%EC%88%98-%EC%9E%88%EC%96%B4%EC%9A%94">&#xADF8;&#xB7FC; kubespray &#xC5D0;&#xC11C; &#xC800;&#xCE5C;&#xAD6C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC4F8; &#xC218; &#xC788;&#xC5B4;&#xC694;?</h2><p>&#xA0;</p><p>&#xC6B0;&#xC120; &#xC804;&#xC5ED;&#xBCC0;&#xC218;&#xC5D0; <code>kubelet_rotate_server_certificates: true</code> &#xB97C; &#xB123;&#xC5B4;&#xC918;&#xC57C; &#xD558;&#xACE0; </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/06/689e80a1-36c9-4c90-a009-fa42f7520970.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="1116" height="458" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/689e80a1-36c9-4c90-a009-fa42f7520970.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/689e80a1-36c9-4c90-a009-fa42f7520970.png 1000w, https://www.kimsehwan96.com/content/images/2024/06/689e80a1-36c9-4c90-a009-fa42f7520970.png 1116w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xB807;&#xAC8C; ansible host.yaml &#xD30C;&#xC77C;&#xC5D0; &#xC804;&#xC5ED;&#xBCC0;&#xC218;&#xB85C; &#xB123;&#xC5B4;&#xC8FC;&#xBA74; &#xB41C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes-sigs/kubespray/blob/5616a4a3eedf3462d25346f02afe57bf36ae77c3/roles/kubernetes-apps/kubelet-csr-approver/defaults/main.yml?ref=kimsehwan96.com#L12"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kubespray/roles/kubernetes-apps/kubelet-csr-approver/defaults/main.yml at 5616a4a3eedf3462d25346f02afe57bf36ae77c3 &#xB7; kubernetes-sigs/kubespray</div><div class="kg-bookmark-description">Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes-sigs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/18a8e2cb2b9ed2962e7ff190feb3fd78171247bfd3301bbc77d9a359877b869c/kubernetes-sigs/kubespray" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"></div></a></figure><p>&#xC5EC;&#xAE30;&#xC758; <code>kubelet-csr-approver</code> &#xC758; &#xBCC0;&#xC218;&#xB97C; &#xC124;&#xC815;&#xD558;&#xB294; defaults/main.yml &#xB0B4;&#xC5D0; <code>kubelet_csr_approver_values</code> &#xB97C; &#xC790;&#xC2E0;&#xC758; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C; &#xC801;&#xC808;&#xD558;&#xAC8C; &#xCC44;&#xC6CC;&#xC918;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD604;&#xC7AC; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC758; &#xACBD;&#xC6B0; &#xBAA8;&#xB4E0; &#xB178;&#xB4DC;&#xB294; <code>node1</code>, <code>node2</code> &#xC640; &#xAC19;&#xC774; <code>node</code> &#xB77C;&#xB294; &#xC774;&#xB984;&#xC744; prefix &#xB85C; &#xAC16;&#xAC8C;&#xD558;&#xACE0;, &#xBAA8;&#xB4E0; &#xB178;&#xB4DC;&#xB294; <code>192.168.207.0/24</code> CIDR &#xBE14;&#xB85D; &#xC548;&#xC5D0;&#xC11C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD588;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC124;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/06/4d0096f8-47a0-48c8-a6a0-8d5407a80c03.png" class="kg-image" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)" loading="lazy" width="1528" height="774" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/06/4d0096f8-47a0-48c8-a6a0-8d5407a80c03.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/06/4d0096f8-47a0-48c8-a6a0-8d5407a80c03.png 1000w, https://www.kimsehwan96.com/content/images/2024/06/4d0096f8-47a0-48c8-a6a0-8d5407a80c03.png 1528w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC5EC;&#xB7EC;&#xBD84;&#xC5D0; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C; &#xC218;&#xC815;&#xD574;&#xC57C;&#xD558;&#xACE0; .. &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; kubelet-csr-approver &#xB808;&#xD3EC; &#xCC38;&#xACE0;</span></figcaption></figure><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC6B0;&#xB9AC;&#xAC00; &#xC218;&#xB3D9;&#xC73C;&#xB85C; approve &#xD558;&#xC9C0; &#xC54A;&#xACE0; kubelet-csr-appover &#xAC00; &#xC124;&#xC815;&#xC5D0; &#xB9DE;&#xB294; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; approve &#xD558;&#xB3C4;&#xB85D; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="kubespray-%EC%95%88%EC%93%B0%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8D%A8%EC%9A%94">Kubespray &#xC548;&#xC4F0;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xC368;&#xC694;?</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/postfinance/kubelet-csr-approver?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - postfinance/kubelet-csr-approver: Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks</div><div class="kg-bookmark-description">Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks - postfinance/kubelet-csr-approver</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">postfinance</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ec4ddc87096e73766d33a0346d5843ace02a1ce1af19e35eeffb3955e3ab99c9/postfinance/kubelet-csr-approver" alt="kubelet &quot;&#xC11C;&#xBC84;&quot; &#xB97C; &#xC704;&#xD55C; &#xC778;&#xC99D;&#xC11C; (kubelet.crt, kubelet.key) (feat: Metrics-Server TLS &#xC778;&#xC99D;&#xC11C; &#xC624;&#xB958; &#xC870;&#xCE58;)"></div></a></figure><p>kubelet-csr-approver &#xB294; helm &#xC73C;&#xB85C; &#xD328;&#xD0A4;&#xC9D5;&#xB418;&#xC5B4;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD574;&#xB2F9; &#xB808;&#xD3EC;&#xB97C; &#xCC38;&#xC870;&#xD574;&#xC11C; helm &#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD558;&#xB294;&#xAC83;&#xC744; &#xAD8C;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. </p><pre><code>helm repo add kubelet-csr-approver https://postfinance.github.io/kubelet-csr-approver
helm install kubelet-csr-approver kubelet-csr-approver/kubelet-csr-approver -n kube-system \
  --set providerRegex=&apos;^node-\w*\.int\.company\.ch$&apos; \
  --set providerIpPrefixes=&apos;192.168.8.0/22&apos; \
  --set maxExpirationSeconds=&apos;86400&apos;
  --set bypassDnsResolution=&apos;false&apos;</code></pre><p>&#xC5EC;&#xAE30;&#xC11C;&#xB3C4; &#xC5ED;&#xC2DC;&#xB098; &#xC704;&#xC5D0;&#xC11C; &#xC774;&#xC57C;&#xAE30;&#xD55C;&#xB300;&#xB85C; <code>providerRegex</code> , <code>providerIpPrefixes</code> &#xB4F1;&#xC744; &#xC5EC;&#xB7EC;&#xBD84;&#xC758; &#xD658;&#xACBD;&#xC5D0; &#xB9DE;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. </p><h2 id="wrapping-up">Wrapping up</h2><p>&#xA0;</p><p>Kubelet &#xC740; 10250 &#xBC88; &#xD3EC;&#xD2B8;&#xC5D0; TLS &#xAE30;&#xBC18;&#xC758; HTTP &#xC11C;&#xBC84;(HTTPS)&#xB97C; &#xC5F4;&#xC5B4;&#xB450;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. Kubelet &#xC740; kube-apiserver &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0;, &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB7F0;&#xD0C0;&#xC784; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; &#xD30C;&#xB4DC;(&#xCEE8;&#xD14C;&#xC774;&#xB108;)&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294;&#xAC83; &#xC774;&#xC678;&#xC5D0;&#xB3C4; metrics, log &#xB4F1;&#xC744; &#xC704;&#xD574; 10250&#xBC88; &#xD3EC;&#xD2B8;&#xB85C; &#xC11C;&#xBC84;&#xB97C; &#xC5F4;&#xC5B4;&#xB450;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB54C; &#xBCC4;&#xB2E4;&#xB978; &#xC124;&#xC815;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xACE0; kubelet &#xC744; &#xC2E4;&#xD589;&#xD558;&#xBA74; <code>kubelet.crt</code> , <code>kubelet.key</code> &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xC758; <code>self-signed</code> &#xC778;&#xC99D;&#xC11C;&#xAC00; <code>/var/lib/kubelet/pki</code> &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xC5D0; &#xC0DD;&#xC131;&#xB418;&#xACE0;, &#xADF8;&#xAC83;&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; TLS &#xC11C;&#xBC84;&#xB97C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD06C;&#xAC8C; &#xBB38;&#xC81C;&#xB420;&#xC77C;&#xC740; &#xC5C6;&#xC9C0;&#xB9CC; <code>metrics-server</code> &#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; <code>self-signed</code> &#xC778;&#xC99D;&#xC11C;&#xC758; &#xBB38;&#xC81C;&#xC810;&#xC73C;&#xB85C; &#xC778;&#xD574; <code>metrics-server</code> &#xAC00; kubelet metrics &#xB97C; &#xAE01;&#xC5B4;&#xC62C; &#xC218; &#xC5C6;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; &#xBCF4;&#xD1B5;&#xC740; <code>--kubelet-insecure-tls</code> &#xC635;&#xC158;&#xC744; <code>metrics-server</code> &#xC5D0; &#xCD94;&#xAC00;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xC9C0;&#xB9CC; &#xADFC;&#xBCF8;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD55C;&#xAC83;&#xC740; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. </p><p><code>kubelet</code> &#xC774; kubernetes-ca &#xB97C; &#xD1B5;&#xD574; &#xC11C;&#xBA85;&#xB41C; &#xC778;&#xC99D;&#xC11C;&#xB97C; kubelet &#xC11C;&#xBC84;&#xC5D0; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; <code>serverTLSBootstrap</code> &#xC635;&#xC158;&#xC744; <code>KubeletConfiguration</code> (&#xD639;&#xC740; kubelet &#xC2E4;&#xD589; &#xC778;&#xC790;&#xC5D0;&#xB3C4; &#xB123;&#xC744; &#xC218; &#xC788;&#xC9C0;&#xB9CC; depracted &#xB418;&#xC5B4;&#xAC00;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.)&#xC5D0; &#xCD94;&#xAC00;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; &#xC774; &#xB54C;&#xC5D0;&#xB3C4; &#xD574;&#xB2F9; CSR(Certificate Signing Request)&#xB97C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC218;&#xB77D;&#xD558;&#xB294; &#xBCC4;&#xB3C4;&#xC758; &#xC560;&#xB4DC;&#xC628;&#xB4F1;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; <code>approve</code> &#xD574;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[kubeadm 은 CoreDNS 를 어떻게 설치할까요? 파드는 서비스 도메인을 어떻게 처리할까요? 그리고 설정은 어떻게 할까요? (feat: NodeLocal DNSCache)]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">CoreDNS &#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#x201C;&#xC11C;&#xBE44;&#xC2A4; &#xB514;&#xC2A4;&#xCEE4;&#xBC84;&#xB9AC;&#x201D;&#xB97C; &#xC704;&#xD55C; &#xD575;&#xC2EC; &#xC560;&#xB4DC;&#xC628;&#xC785;&#xB2C8;&#xB2E4;. kubeadm &#xC5D0;&#xC11C;&#xB294; CoreDNS , kube-proxy &#xB450;&#xAC00;&#xC9C0;&#xC758; &#xC560;&#xB4DC;&#xC628;&#xC744; &#xC124;&#xCE58;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D;</div></div>]]></description><link>https://www.kimsehwan96.com/core-dns-with-kubeadm/</link><guid isPermaLink="false">66585e1e30749cc47571b70d</guid><category><![CDATA[kubeadm]]></category><category><![CDATA[K8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[CoreDNS]]></category><category><![CDATA[NodeLocalDNSCache]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Thu, 30 May 2024 13:30:48 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/05/-----------2024-05-30------10.30.22.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">CoreDNS &#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#x201C;&#xC11C;&#xBE44;&#xC2A4; &#xB514;&#xC2A4;&#xCEE4;&#xBC84;&#xB9AC;&#x201D;&#xB97C; &#xC704;&#xD55C; &#xD575;&#xC2EC; &#xC560;&#xB4DC;&#xC628;&#xC785;&#xB2C8;&#xB2E4;. kubeadm &#xC5D0;&#xC11C;&#xB294; CoreDNS , kube-proxy &#xB450;&#xAC00;&#xC9C0;&#xC758; &#xC560;&#xB4DC;&#xC628;&#xC744; &#xC124;&#xCE58;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xBC14;&#xB2D0;&#xB77C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD558;&#xACE0; &#xC788;&#xB2E4;&#xBA74; &#xC774;&#xB7EC;&#xD55C; &#xC560;&#xB4DC;&#xC628;&#xC740; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </div></div><h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><img src="https://www.kimsehwan96.com/content/images/2024/05/-----------2024-05-30------10.30.22.png" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)"><p>Kubeadm &#xC758; &#xACBD;&#xC6B0; CoreDNS &#xBC0F; kube-proxy &#xB97C; addon &#xC73C;&#xB85C; &#xBD80;&#xB974;&#xBA70;, &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD569;&#xB2C8;&#xB2E4;.  Kubeadm &#xC744; wrapping &#xD55C; Kubespray &#xB610;&#xD55C; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; Kubeadm &#xACFC; &#xAC19;&#xC740; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD234;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD588;&#xB2E4;&#xBA74; CNI &#xC124;&#xCE58;, CoreDNS , kube-proxy&#xC758; &#xC124;&#xCE58;&#xAC19;&#xC740; &#xC791;&#xC5C5;&#xC740; &#xAD00;&#xB9AC;&#xC790;&#xAC00; &#xC9C1;&#xC811; &#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xBC14;&#xB2D0;&#xB77C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD234; &#xC791;&#xC5C5;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xBA74;&#xC11C; Kubeadm &#xC740; &#xACFC;&#xC5F0; &#xC5B4;&#xB5BB;&#xAC8C; CoreDNS &#xB97C; &#xC124;&#xCE58;&#xD558;&#xACE0;, &#xB610; &#xC5B4;&#xB5BB;&#xAC8C; <code>10.96.0.10</code> &#xB4F1;&#xC758; ClusterIP &#xB97C; &#xACE0;&#xC815;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xB294;&#xC9C0; &#xAD81;&#xAE08;&#xD558;&#xC5EC; Kubeadm &#xC758; &#xCF54;&#xB4DC;&#xB97C; &#xD655;&#xC778;&#xD574;&#xAC00;&#xBA74;&#xC11C; &#xADF8; &#xB3D9;&#xC791;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xADF8; &#xC774;&#xD6C4; &#xACFC;&#xC5F0; &#xD30C;&#xB4DC;&#xB4E4;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; nameserver &#xC124;&#xC815;&#xC744; &#xB514;&#xD3F4;&#xD2B8;&#xB85C; &#xAC16;&#xACE0; &#xC624;&#xAC8C; &#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACE0;, PodSpec &#xB0B4;&#xC758; dnsPolicy, dnsConfig &#xB4F1;&#xC758; &#xB0B4;&#xC6A9;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB9C8;&#xC9C0;&#xB9C9;&#xC73C;&#xB85C;&#xB294; NodeLocal DNSCache &#xB77C;&#xB294; &#xAC01; &#xB178;&#xB4DC;&#xBCC4;&#xB85C; &#xC124;&#xCE58;&#xB418;&#xB294; DNS &#xCE90;&#xC2F1; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC124;&#xBA85;&#xD558;&#xACE0;, &#xC124;&#xCE58;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC18C;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;. </p><p>Kubespary&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD558;&#xAC8C; &#xB418;&#xBA74; NodeLocal DNSCache &#xB294; &#xB514;&#xD3F4;&#xD2B8;&#xB85C; &#xC124;&#xCE58;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; Kubeadm &#xC73C;&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD558;&#xBA74; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. </p><h2 id="coredns">CoreDNS</h2><p>CoreDNS &#xB294; Go &#xB85C; &#xC791;&#xC131;&#xB41C; DNS &#xC11C;&#xBC84;&#xC785;&#xB2C8;&#xB2E4;. &#xB2E4;&#xC591;&#xD55C; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; DNS &#xC11C;&#xBC84;&#xB85C; &#xBCF4;&#xD1B5;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xC124;&#xCE58;&#xB418;&#xC5B4;&#xC11C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB0B4;&#xC5D0;&#xC11C; &#xB3C4;&#xBA54;&#xC778; &#xB124;&#xC784; resolving &#xC744; &#xC704;&#xD574; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.(cluster.local) </p><h2 id="kubernetes-pod-%EC%9D%98-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%94%94%EC%8A%A4%EC%BB%A4%EB%B2%84%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-nameserver-%EC%84%A4%EC%A0%95">Kubernetes Pod &#xC758; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC11C;&#xBE44;&#xC2A4; &#xB514;&#xC2A4;&#xCEE4;&#xBC84;&#xB9AC;&#xB97C; &#xC704;&#xD55C; nameserver &#xC124;&#xC815;</h2><p>&#xA0;</p><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD30C;&#xB4DC;&#xB97C; &#xB744;&#xC6B0;&#xBA74; &#xBAA8;&#xB4E0; &#xD30C;&#xB4DC;&#xC5D0;&#xB294; <code>/etc/resolv.conf</code> &#xD30C;&#xC77C;&#xC774; &#xC788;&#xACE0;. &#xC774; &#xD30C;&#xC77C;&#xC5D0;&#xB294; <code>nameserver</code> &#xC815;&#xBCF4;&#xAC00; &#xB4E4;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. kubeadm &#xC73C;&#xB85C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC758; &#xD30C;&#xB4DC;&#xC758; <code>/etc/resolv.conf</code> &#xB97C; &#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><code>$ kubectl run -i -t --rm nginx --image=nginx --restart=Never &#x2013; sh</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/b06e9bd7-762e-43ea-af6c-56db32718b9a.png" class="kg-image" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)" loading="lazy" width="532" height="93"><figcaption><code spellcheck="false" style="white-space: pre-wrap;"><span>$ cat /etc/resolv.conf</span></code><span style="white-space: pre-wrap;"> &#xB97C; &#xC218;&#xD589;&#xD55C; &#xACB0;&#xACFC;</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">search &#xB294; &#xC5B4;&#xB5A4; Domain &#xC5D0; &#xB300;&#xD55C; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; Domain Name Resolve &#xAC00; &#xC2E4;&#xD328;&#xD558;&#xB294;&#xACBD;&#xC6B0; &#xD574;&#xB2F9; &#xB3C4;&#xBA54;&#xC778; &#xC694;&#xCCAD;&#xC5D0; &#xB4B7;&#xBD80;&#xBD84;&#xC5D0; default.svc.cluster.local , svc.cluster.local, cluster.local &#xB4F1;&#xC744; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xCD94;&#xAC00;&#xD558;&#xB824;&#xACE0; &#xD558;&#xB294; &#xB3D9;&#xC791;&#xC774;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C; <code spellcheck="false" style="white-space: pre-wrap;">nginx-0</code> &#xC5D0; &#xB300;&#xD55C; &#xC694;&#xCCAD;&#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xBA74; <code spellcheck="false" style="white-space: pre-wrap;">nginx-0.default.svc.cluster.local</code> &#xC5D0; &#xB300;&#xD574;&#xC11C; resolve &#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xC2E4;&#xD328;&#xD558;&#xBA74; <code spellcheck="false" style="white-space: pre-wrap;">nginx-0.svc.cluster.local</code> &#xB85C; &#xC2DC;&#xB3C4;&#xD558;&#xACE0; &#xD558;&#xB294; &#xC2DD;&#xC774;&#xB2E4;.</div></div><p>&#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74; <code>nameserver 10.96.0.10</code> &#xC774;&#xB77C;&#xB294; &#xAC12;&#xC774; &#xB4E4;&#xC5B4;&#xAC00;&#xC788;&#xB294; &#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB124;&#xC784;&#xC11C;&#xBC84;&#xB294; &#xC5B4;&#xB514;&#xC5D0; &#xC788;&#xB294; &#xAC83;&#xC77C;&#xAE4C;&#xC694;?</p><p>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC5D0; &#xC124;&#xCE58;&#xB41C; <code>coreDNS</code> &#xC758; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><code>$ kubectl get svc -n kube-system</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/0ce2fbea-b354-4739-a6f1-07218895d2f4.png" class="kg-image" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)" loading="lazy" width="1101" height="71" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/0ce2fbea-b354-4739-a6f1-07218895d2f4.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/05/0ce2fbea-b354-4739-a6f1-07218895d2f4.png 1000w, https://www.kimsehwan96.com/content/images/2024/05/0ce2fbea-b354-4739-a6f1-07218895d2f4.png 1101w" sizes="(min-width: 720px) 720px"><figcaption><code spellcheck="false" style="white-space: pre-wrap;"><span>kube-dns</span></code><span style="white-space: pre-wrap;">&#xB77C;&#xB294; &#xC774;&#xB984;&#xC758; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x2753;</div><div class="kg-callout-text">coreDNS &#xB97C; &#xC124;&#xCE58;&#xD588;&#xC9C0;&#xB9CC; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8; &#xC774;&#xB984;&#xC774; kube-dns &#xC778; &#xC774;&#xC720;&#xB294; <a href="https://github.com/kubernetes/kubernetes/blob/5732a8bbb44113f7fba40721f0f2e03051999da0/cmd/kubeadm/app/phases/addons/dns/manifests.go?ref=kimsehwan96.com#L19-L26">kubernetes/cmd/kubeadm/app/phases/addons/dns/manifests.go at 5732a8bbb44113f7fba40721f0f2e03051999da0 &#xB7; kubernetes/kubernetes</a> manifests &#xC790;&#xCCB4;&#xC5D0; coreDNS &#xC774;&#xC9C0;&#xB9CC; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xC774;&#xB984;&#xC744; kube-dns &#xB85C; &#xC0DD;&#xC131;&#xD574;&#xC11C; &#xADF8;&#xB807;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCC98;&#xC74C;&#xC5D0;&#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD300;&#xC774; &#xB193;&#xCE5C;&#xAC83;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xC9C0;&#xB9CC; &#xCF54;&#xB4DC;&#xB97C; &#xC798; &#xBCF4;&#xB2C8;, node-local-dns-cache &#xB4F1;&#xC774; &#xB4B7;&#xB2E8;&#xC774; coreDNS &#xB4E0; kube-dns &#xB4E0; &#xC0C1;&#xAD00;&#xC5C6;&#xC774; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB77C;&#xACE0; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; DNS &#xC11C;&#xBE44;&#xC2A4; &#xC774;&#xB984;&#xC740; &#xADF8;&#xB0E5; kube-dns &#xB85C; &#xB450;&#xB824;&#xACE0; &#xD55C;&#xAC83;&#xC774; &#xC544;&#xB2D0;&#xAE4C;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xB294;&#xB370;, &#xC2E4;&#xC81C;&#xB85C; &#xD558;&#xC704;&#xD638;&#xD658;&#xC131;&#xC744; &#xC704;&#xD574; &#xADF8;&#xB807;&#xAC8C; &#xB450;&#xC5C8;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;. (&#xCC38;&#xACE0; : <a href="https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/?ref=kimsehwan96.com#introduction">https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/?ref=kimsehwan96.com#introduction</a>)</div></div><p>&#xC704; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; <code>ClusterIP</code> &#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74; &#xC544;&#xAE4C; <code>nameserver 10.96.0.10</code> &#xC5D0;&#xC11C; &#xBCF8;&#xAC83;&#xACFC; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB7FC; &#xC774; &#xD30C;&#xB4DC;&#xBCC4;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB420; <code>/etc/resolv.conf</code> &#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC9C0;&#xC815;&#xC774; &#xB418;&#xC5C8;&#xACE0;, kubeadm &#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xC11C; &#xBCC4;&#xB3C4;&#xB85C; &#xC9C0;&#xC815;&#xD55C;&#xC801;&#xB3C4; &#xC5C6;&#xB294; coreDNS(&#xD639;&#xC740; kube-dns)&#xC758; ClusterIP &#xB294; &#xC5B4;&#xB5BB;&#xAC8C; 10.96.0.10 &#xC73C;&#xB85C; &#xACE0;&#xC815;&#xC774; &#xB418;&#xC5C8;&#xC744;&#xAE4C;&#xC694;? </p><h2 id="kubelet-%EC%9D%98-clusterdns-%EC%84%A4%EC%A0%95">Kubelet &#xC758; clusterDNS &#xC124;&#xC815;</h2><p>&#xAC01; &#xD30C;&#xB4DC;&#xBCC4;&#xB85C; &#xC0DD;&#xC131;&#xB420; <code>/etc/resolv.conf</code> &#xC758; &#xC815;&#xBCF4;&#xB294; <code>kubelet configuration</code> &#xC5D0;&#xC11C;&#xC758; <code>clusterDNS</code> &#xD56D;&#xBAA9;&#xC744; &#xD1B5;&#xD574; &#xC124;&#xC815;&#xC774; &#xB429;&#xB2C8;&#xB2E4;. <code>kubelet config</code> &#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/cd6c15ff-0c72-4261-b50d-6c46d6370918.png" class="kg-image" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)" loading="lazy" width="560" height="752"><figcaption><span style="white-space: pre-wrap;">clusterDNS &#xC5D0; 10.96.0.10 &#xC8FC;&#xC18C;&#xAC00; &#xB4E4;&#xC5B4;&#xC788;&#xB2E4;.</span></figcaption></figure><p><code>clusterDNS</code> &#xD56D;&#xBAA9;&#xC5D0; &#xD074;&#xB7EC;&#xC2A4;&#xD130; Domain Name &#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD55C; nameserver &#xB9AC;&#xC2A4;&#xD2B8;&#xB97C; &#xB123;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xC74C;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.  (<a href="https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/?ref=kimsehwan96.com">Customizing DNS Service</a> )</p><p>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; node &#xC758; kubelet &#xC758; <code>clusterDNS</code> &#xD56D;&#xBAA9;&#xC744; &#xC0C1;&#xC18D;&#xD558;&#xC9C0;&#xB9CC;, &#xD30C;&#xB4DC;&#xBCC4;&#xB85C; &#xBCC4;&#xB3C4;&#xB85C; &#xC218;&#xC815;&#xD574;&#xC57C; &#xD560; &#xD544;&#xC694;&#xAC00; &#xC788;&#xB2E4;&#xBA74; podSpec &#xB0B4;&#xC758; <code>dnsPolicy</code> &#xBC0F; <code>dnsConfig</code> &#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBCC0;&#xACBD; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. </p><p><a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/?ref=kimsehwan96.com"></a></p><p><a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/?ref=kimsehwan96.com">DNS for Services and Pods</a> </p><p>Pod &#xC758; DNS Policy &#xB294; &#xD30C;&#xB4DC;&#xBCC4;&#xB85C; &#xC124;&#xC815;&#xC774; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC5D0; &#xC124;&#xC815; &#xAC00;&#xB2A5;&#xD55C; &#xAC12;&#xC73C;&#xB85C;&#xB294; <code>Default</code>, <code>ClusterFirst</code> , <code>ClusterFirstWithHostNet</code> , <code>None</code> &#xB4F1;&#xC774; &#xC124;&#xC815; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xBA85;&#xC2DC;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xD30C;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xBA74; <code>ClusterFirst</code> &#xB85C; &#xC124;&#xC815;&#xB429;&#xB2C8;&#xB2E4;. </p><p><code>ClusterFirst</code> &#xB85C; &#xC9C0;&#xC815;&#xD558;&#xBA74; <code>cluster.local</code> &#xACFC; &#xAC19;&#xC740; suffix &#xAC00; &#xC544;&#xB2CC; <code>www.google.com</code> &#xACFC; &#xAC19;&#xC740; DNS &#xCFFC;&#xB9AC;&#xB294; DNS &#xC11C;&#xBC84;&#xC758; &#xC5C5;&#xC2A4;&#xD2B8;&#xB9BC; &#xB124;&#xC784;&#xC11C;&#xBC84;&#xB85C; &#xB118;&#xC5B4;&#xAC00;&#xB3C4;&#xB85D; &#xD558;&#xB294;, &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; CoreDNS(kube-dns) &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC635;&#xC158;&#xC785;&#xB2C8;&#xB2E4;.</p><p><code>Default</code> &#xB85C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xD574;&#xB2F9; &#xD30C;&#xB4DC;&#xAC00; &#xB5A0;&#xC788;&#xB294; &#xB178;&#xB4DC;&#xC758; <code>/etc/resolv.conf</code> &#xC124;&#xC815;&#xC744; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC774;&#xB807;&#xAC8C; &#xC9C0;&#xC815;&#xD558;&#xACE0; <code>cluster.local</code> suffix &#xB97C; &#xAC00;&#xC9C4; DNS &#xCFFC;&#xB9AC;&#xB97C; &#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xC744; &#xB54C;, <em><strong>&#xB178;&#xB4DC;</strong> &#xC5D0; &#xC801;&#xC808;&#xD55C; &#xB124;&#xC784;&#xC11C;&#xBC84;&#xAC00; &#xC124;&#xC815;&#xB418;&#xC9C0; &#xC54A;&#xC740;&#xACBD;&#xC6B0; &#xCC98;&#xB9AC;&#xB418;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</em></p><p><code>ClusterFirstWithHostNet</code> &#xC740; &#xD30C;&#xB4DC;&#xC758; <code>hostNetwork: true</code> &#xC124;&#xC815;&#xC744; &#xD588;&#xC744; &#xB54C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD558;&#xBA70;, &#xB9CC;&#xC57D; <code>hostNetwork: true</code> &#xC124;&#xC815;&#xC744; &#xD588;&#xC9C0;&#xB9CC; , <code>ClusterFirst</code> &#xB85C; &#xC124;&#xC815;&#xD558;&#xAC70;&#xB098;, &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; <code>Default</code> &#xC124;&#xC815;&#xC73C;&#xB85C; fallback &#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p><code>None</code> &#xC758; &#xACBD;&#xC6B0;&#xB294; &#xD574;&#xB2F9; &#xD30C;&#xB4DC;&#xAC00; &#xB5A0;&#xC788;&#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC0C1;&#xC18D;&#xBC1B;&#xB294; &#xBAA8;&#xB4E0; DNS &#xC124;&#xC815;&#xC744; &#xBB34;&#xC2DC;&#xD558;&#xACE0;, <code>dnsConfig</code> &#xB97C; &#xD1B5;&#xD574; DNS &#xC124;&#xC815;&#xC744; &#xCEE4;&#xC2A4;&#xD140; &#xD560; &#xB54C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; Pod &#xB0B4;&#xC758; DNS &#xC124;&#xC815;&#xC744; &#xC9C1;&#xC811; &#xD558;&#xACE0; &#xC2F6;&#xB2E4;&#xBA74;, dnsConfig &#xB97C; &#xD1B5;&#xD574; namserver , searches, options &#xB4F1;&#xC744; &#xC9C0;&#xC815; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><pre><code class="language-yaml">apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: hayden
spec:
  containers:
  - name: dnsutils
    image: registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3
    command:
      - sleep
      - &quot;infinity&quot;
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  dnsConfig:
    nameservers:
      - 10.96.0.10
      - 123.123.123.123
      - 8.8.8.8
    searches: 
      - consul.local
</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; dnsConfig &#xB97C; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC2E4;&#xC81C; &#xC0DD;&#xC131;&#xB41C; Pod &#xB0B4;&#xC5D0;&#xC11C; <code>/etc/resolv.conf</code> &#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/05/04801d32-c259-42d4-8c81-7c0809b0fb33.png" class="kg-image" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)" loading="lazy" width="807" height="163" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/04801d32-c259-42d4-8c81-7c0809b0fb33.png 600w, https://www.kimsehwan96.com/content/images/2024/05/04801d32-c259-42d4-8c81-7c0809b0fb33.png 807w" sizes="(min-width: 720px) 720px"></figure><h2 id="corednskube-dns%EC%9D%98-ip-%EC%A3%BC%EC%86%8C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B2%B0%EC%A0%95%EB%90%98%EC%97%88%EC%9D%84%EA%B9%8C%EC%9A%94">CoreDNS(kube-dns)&#xC758; IP &#xC8FC;&#xC18C;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xACB0;&#xC815;&#xB418;&#xC5C8;&#xC744;&#xAE4C;&#xC694;?</h2><p><code>kubeadm</code> &#xC5D0;&#xC11C;&#xB294; <a href="https://github.com/kubernetes/kubernetes/blob/1d5589e4910ed859a69b3e57c25cbbd3439cd65f/cmd/kubeadm/app/phases/addons/dns/manifests.go?ref=kimsehwan96.com#L38">kubernetes/cmd/kubeadm/app/phases/addons/dns/manifests.go at 1d5589e4910ed859a69b3e57c25cbbd3439cd65f &#xB7; kubernetes/kubernetes</a>  &#xC5EC;&#xAE30;&#xC11C; <code>.DNSIP</code> &#xB77C;&#xB294; &#xBCC0;&#xC218;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBC1B;&#xC544;&#xC11C; CoreDNS &#xC758; ClusterIP &#xC8FC;&#xC18C;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294;&#xB370;&#xC694;.</p><p><a href="https://github.com/kubernetes/kubernetes/blob/5732a8bbb44113f7fba40721f0f2e03051999da0/cmd/kubeadm/app/constants/constants.go?ref=kimsehwan96.com#L635-L650">kubernetes/cmd/kubeadm/app/constants/constants.go at 5732a8bbb44113f7fba40721f0f2e03051999da0 &#xB7; kubernetes/kubernetes</a> </p><p>&#xC704; &#xCF54;&#xB4DC;&#xBD80;&#xBD84;&#xC744; &#xBCF4;&#xBA74; &#xC54C;&#xACA0;&#xC9C0;&#xB9CC;, Service Object &#xC758; CIDR &#xBE14;&#xB85D;&#xC5D0;&#xC11C; 10&#xBC88;&#xC9F8;&#xC758; IP &#xC8FC;&#xC18C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; kubeadm &#xC73C;&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD558;&#xBA74; DNS &#xB97C; &#xC704;&#xD55C; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; ClusterIP &#xC8FC;&#xC18C;&#xB294; 10.96.0.10 &#xACFC; &#xAC19;&#xC774; 10&#xBC88;&#xC9F8; IP &#xC8FC;&#xC18C;&#xB85C; &#xACE0;&#xC815;&#xC774; &#xB418;&#xB294;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xAC83;&#xC744; kubelet &#xC758; clusterDNS &#xD56D;&#xBAA9;&#xC5D0;&#xB3C4;, CoreDNS &#xC758; ClusterIP &#xD56D;&#xBAA9;&#xC5D0;&#xB3C4; &#xB123;&#xC5B4;&#xC11C; &#xC77C;&#xCE58;&#xC2DC;&#xCF1C;&#xC8FC;&#xB294;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>kubeadm &#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD55C; &#xACBD;&#xC6B0;(Vanilia) &#xC704;&#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xC0AC;&#xC804;&#xC5D0; CoreDNS(&#xD639;&#xC740; kube-dns) &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; ClusterIP &#xB97C; &#xBBF8;&#xB9AC; &#xACC4;&#xD68D;&#xD558;&#xACE0;, Kubelet &#xC758; <code>clusterDNS</code> &#xD56D;&#xBAA9;&#xC5D0; &#xC124;&#xC815;&#xD574;&#xC918;&#xC57C; &#xBCC4;&#xB2E4;&#xB978; &#xC124;&#xC815;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xC740; &#xD30C;&#xB4DC;&#xB4E4;&#xC774; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB300;&#xD55C; DNS &#xCFFC;&#xB9AC; Resolve &#xB97C; &#xC218;&#xD589; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p></p><h2 id="kubeadm-%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-coredns-%EB%A5%BC-%EC%84%A4%EC%B9%98%ED%95%98%EB%82%98%EC%9A%94">Kubeadm &#xC740; &#xC5B4;&#xB5BB;&#xAC8C; CoreDNS &#xB97C; &#xC124;&#xCE58;&#xD558;&#xB098;&#xC694;?</h2><p><code>$ kubeadm init</code> &#xC73C;&#xB85C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xB97C; &#xCD5C;&#xCD08;&#xB85C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; <a href="https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/cmd/init.go?ref=kimsehwan96.com#L106-L192">https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/cmd/init.go#L106-L192</a></p><p>&#xD639;&#xC740; <code>$ kubeadm init phase addon</code> &#xBA85;&#xB839;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; (<a href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/?ref=kimsehwan96.com#cmd-phase-addon">https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon</a>)</p><p>kubeadm workflow runner &#xC5D0; &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xC640; &#xAC19;&#xC740; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p><a href="https://github.com/kubernetes/kubernetes/blob/1d5589e4910ed859a69b3e57c25cbbd3439cd65f/cmd/kubeadm/app/cmd/phases/init/addons.go?ref=kimsehwan96.com#L49-L85">https://github.com/kubernetes/kubernetes/blob/1d5589e4910ed859a69b3e57c25cbbd3439cd65f/cmd/kubeadm/app/cmd/phases/init/addons.go#L49-L85</a></p><p>&#xC5EC;&#xAE30;&#xC11C; <code>runCoreDNSAddon</code> &#xC740; &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xC640; &#xAC19;&#xC740;&#xAC83;&#xC744; &#xC218;&#xD589;&#xD558;&#xACE0;</p><p><a href="https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/cmd/phases/init/addons.go?ref=kimsehwan96.com#L108-L114">https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/cmd/phases/init/addons.go#L108-L114</a></p><p>&#xC5EC;&#xAE30;&#xC5D0;&#xC11C;&#xC758; EnsureDNSAddon&#xB294; &#xC544;&#xB798;&#xCABD; &#xCF54;&#xB4DC;&#xC5D0; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xACE0;</p><p><a href="https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/phases/addons/dns/dns.go?ref=kimsehwan96.com#L90-L170">https://github.com/kubernetes/kubernetes/blob/bce55b94cdc3a4592749aa919c591fa7df7453eb/cmd/kubeadm/app/phases/addons/dns/dns.go#L90-L170</a></p><p>&#xC804;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD15C;&#xD50C;&#xB9BF; manifests &#xB294; &#xC544;&#xB798;&#xC5D0; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><a href="https://github.com/kubernetes/kubernetes/blob/1d5589e4910ed859a69b3e57c25cbbd3439cd65f/cmd/kubeadm/app/phases/addons/dns/manifests.go?ref=kimsehwan96.com">https://github.com/kubernetes/kubernetes/blob/1d5589e4910ed859a69b3e57c25cbbd3439cd65f/cmd/kubeadm/app/phases/addons/dns/manifests.go</a></p><p>&#xC27D;&#xAC8C; &#xCD94;&#xC0C1;&#xD654;&#xD574;&#xBCF4;&#xBA74;, <code>kubeadm init</code> &#xC744; &#xC218;&#xD589;&#xD558;&#xBA74; &#xC5EC;&#xB7EC; <code>phases</code> &#xB97C; &#xC218;&#xD589;&#xD558;&#xB294;&#xB370;, &#xADF8; &#xC911; <code>addon phase</code> &#xAC00; &#xC788;&#xACE0;, &#xBCC4;&#xB3C4;&#xB85C; <code>kubeadm init phase addon</code> &#xC73C;&#xB85C; &#xD574;&#xB2F9; <code>phase</code> &#xB9CC; &#xC218;&#xD589;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. </p><p><code>addon phase</code> &#xC5D0;&#xC11C;&#xB294; &#xC0AC;&#xC804;&#xC5D0; &#xC815;&#xC758;&#xB41C; manifests &#xB97C; &#xD15C;&#xD50C;&#xB9AC;&#xD305;&#xD558;&#xC5EC;&#xC11C; kubeadm &#xC124;&#xC815;&#xC5D0; &#xB9DE;&#xAC8C; manifests&#xB97C; &#xB80C;&#xB354;&#xB9C1;&#xD558;&#xACE0; &#xADF8;&#xAC83;&#xC744; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xBC18;&#xC601;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C; <code>CoreDNS</code>&#xB97C; &#xC124;&#xCE58;&#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (kube-proxy &#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xC785;&#xB2C8;&#xB2E4;.)</p><h2 id="nodelocal-dnscache">NodeLocal DNSCache</h2><p><a href="https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/?ref=kimsehwan96.com">Using NodeLocal DNSCache in Kubernetes Clusters</a> </p><p><code>kubeadm</code> &#xC73C;&#xB85C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; CoreDNS &#xC815;&#xB3C4;&#xB9CC; &#xC124;&#xCE58;&#xD558;&#xB294; &#xBC18;&#xBA74;, <code>kubeadm</code> &#xC744; wrapping &#xD55C; <code>kubespray</code> &#xC758; &#xACBD;&#xC6B0; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; <code>NodeLocal DNSCache</code> &#xB97C; &#xC124;&#xCE58;&#xD558;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>NodeLocal DNSCache</code> &#xB294; &#xAC01; &#xB178;&#xB4DC;&#xBCC4;&#xB85C; DNS &#xCE90;&#xC2F1; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xB97C; <code>DaemonSet</code> &#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD558;&#xC5EC; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; DNS &#xC131;&#xB2A5;&#xC744; &#xD5A5;&#xC0C1;&#xC2DC;&#xD0A4;&#xAE30; &#xC704;&#xD574; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC5D0;&#xC11C; &#xB0B4;&#xBD80; &#xD30C;&#xB4DC;&#xAC04; &#xD1B5;&#xC2E0;&#xC740; &#xB300;&#xBD80;&#xBD84; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xD558;&#xAC8C; &#xB418;&#xB294;&#xB370;, &#xC774; &#xB54C; DNS Query &#xACFC;&#xC815;&#xC740; <code>Pod</code> &#xAC00; &#xB85C;&#xCEEC;&#xC758; <code>/etc/resolv.conf</code> &#xC124;&#xC815;&#xC744; &#xBCF4;&#xACE0; &#xB124;&#xC784;&#xC11C;&#xBC84;&#xC5D0; DNS Query &#xB97C; &#xD558;&#xAC8C; &#xB418;&#xACE0;. &#xD574;&#xB2F9; &#xC124;&#xC815;&#xC5D0;&#xB294; &#xBCF4;&#xD1B5; <code>CoreDNS</code> &#xC5D0; &#xB300;&#xD55C; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8; ClusterIP &#xAC00; &#xC9C0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; <code>ClusterIP</code> &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xD558;&#xAC8C;&#xB418;&#xBA74; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C;&#xB294; <code>kube-proxy</code> &#xAC00; &#xCD94;&#xAC00;&#xD55C; <code>iptables rule</code> &#xC5D0; &#xC758;&#xD574; &#xC2E4;&#xC81C; CoreDNS(kube-dns) &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB85C; &#xBCC0;&#xD658;&#xB418;&#xB294; &#xACFC;&#xC815;&#xC744; &#xAC70;&#xCE58;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; &#xAC01; &#xB178;&#xB4DC;&#xBCC4;&#xB85C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB300;&#xD55C; DNS &#xC815;&#xBCF4;&#xB97C; &#xCE90;&#xC2F1;&#xD55C; &#xB370;&#xBAAC;&#xC14B;&#xC774; &#xC788;&#xB294; &#xACBD;&#xC6B0; &#xC774; iptables &#xC758; DNAT &#xADDC;&#xCE59;, connection tracking &#xC744; &#xD53C;&#xD558;&#xACE0; &#xB2E8;&#xC21C;&#xD788; &#xAC01; &#xB178;&#xB4DC;&#xC758; &#xB85C;&#xCEEC;&#xC5D0; &#xC788;&#xB294; DNS &#xCE90;&#xC2DC; &#xC11C;&#xBC84;&#xC5D0; &#xC9C8;&#xC758;&#xB97C; &#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xB2E8;&#xC21C;&#xD654; &#xB418;&#xACE0;, &#xB9CC;&#xC57D; &#xAC01; &#xB85C;&#xCEEC;&#xC5D0; &#xC788;&#xB294; DNS &#xCE90;&#xC2F1; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xAC00; Cache Miss &#xB418;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; CoreDNS(kube-dns)&#xC5D0; &#xCE90;&#xC2F1; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xAC00; &#xB300;&#xC2E0; DNS &#xC815;&#xBCF4;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xD558;&#xB294; &#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xC870;&#xAC00; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xBC14;&#xB01D;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/8af9a114-c83e-4547-9eef-e03950ac9ec9.png" class="kg-image" alt="kubeadm &#xC740; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560;&#xAE4C;&#xC694;? &#xD30C;&#xB4DC;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;? &#xADF8;&#xB9AC;&#xACE0; &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;? (feat: NodeLocal DNSCache)" loading="lazy" width="601" height="501" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/8af9a114-c83e-4547-9eef-e03950ac9ec9.png 600w, https://www.kimsehwan96.com/content/images/2024/05/8af9a114-c83e-4547-9eef-e03950ac9ec9.png 601w"><figcaption><span style="white-space: pre-wrap;">&#xBCF4;&#xD1B5; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>NodeLocal DNSCache</span></code><span style="white-space: pre-wrap;"> &#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8; IP &#xB300;&#xC5ED;&#xACFC; &#xCDA9;&#xB3CC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xB300;&#xC5ED;&#xC758; IP &#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xB418;&#xACE0;, &#xAD8C;&#xC7A5;&#xB418;&#xB294; &#xB300;&#xC5ED;&#xC740; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>169.254.0.0/16</span></code><span style="white-space: pre-wrap;"> &#xC785;&#xB2C8;&#xB2E4;. &#xBCF4;&#xD1B5;&#xC740; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>169.254.xx.10</span></code><span style="white-space: pre-wrap;"> &#xB97C; &#xC8FC;&#xB85C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. </span></figcaption></figure><h2 id="nodelocal-dnscache-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95">NodeLocal DNSCache &#xC124;&#xCE58; &#xBC29;&#xBC95;</h2><p><a href="https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/?ref=kimsehwan96.com">Using NodeLocal DNSCache in Kubernetes Clusters</a> </p><p>&#xB9CC;&#xC57D; &#xAE30;&#xC874; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; <code>NodeLocal DNSCache</code> &#xB97C; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xC2F6;&#xB2E4;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xC120; <a href="https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml?ref=kimsehwan96.com">kubernetes/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml at master &#xB7; kubernetes/kubernetes</a>  &#xC8FC;&#xC18C;&#xC758; yaml &#xD30C;&#xC77C;&#xC744; &#xB0B4;&#xB824;&#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-yaml"># Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

apiVersion: v1
kind: ServiceAccount
metadata:
  name: node-local-dns
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: &quot;true&quot;
    addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: v1
kind: Service
metadata:
  name: kube-dns-upstream
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: &quot;true&quot;
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: &quot;KubeDNSUpstream&quot;
spec:
  ports:
  - name: dns
    port: 53
    protocol: UDP
    targetPort: 53
  - name: dns-tcp
    port: 53
    protocol: TCP
    targetPort: 53
  selector:
    k8s-app: kube-dns
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: node-local-dns
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  Corefile: |
    __PILLAR__DNS__DOMAIN__:53 {
        errors
        cache {
                success 9984 30
                denial 9984 5
        }
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        health __PILLAR__LOCAL__DNS__:8080
        }
    in-addr.arpa:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        }
    ip6.arpa:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        }
    .:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__UPSTREAM__SERVERS__
        prometheus :9253
        }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-local-dns
  namespace: kube-system
  labels:
    k8s-app: node-local-dns
    kubernetes.io/cluster-service: &quot;true&quot;
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 10%
  selector:
    matchLabels:
      k8s-app: node-local-dns
  template:
    metadata:
      labels:
        k8s-app: node-local-dns
      annotations:
        prometheus.io/port: &quot;9253&quot;
        prometheus.io/scrape: &quot;true&quot;
    spec:
      priorityClassName: system-node-critical
      serviceAccountName: node-local-dns
      hostNetwork: true
      dnsPolicy: Default  # Don&apos;t use cluster DNS.
      tolerations:
      - key: &quot;CriticalAddonsOnly&quot;
        operator: &quot;Exists&quot;
      - effect: &quot;NoExecute&quot;
        operator: &quot;Exists&quot;
      - effect: &quot;NoSchedule&quot;
        operator: &quot;Exists&quot;
      containers:
      - name: node-cache
        image: registry.k8s.io/dns/k8s-dns-node-cache:1.23.0
        resources:
          requests:
            cpu: 25m
            memory: 5Mi
        args: [ &quot;-localip&quot;, &quot;__PILLAR__LOCAL__DNS__,__PILLAR__DNS__SERVER__&quot;, &quot;-conf&quot;, &quot;/etc/Corefile&quot;, &quot;-upstreamsvc&quot;, &quot;kube-dns-upstream&quot; ]
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9253
          name: metrics
          protocol: TCP
        livenessProbe:
          httpGet:
            host: __PILLAR__LOCAL__DNS__
            path: /health
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
        volumeMounts:
        - mountPath: /run/xtables.lock
          name: xtables-lock
          readOnly: false
        - name: config-volume
          mountPath: /etc/coredns
        - name: kube-dns-config
          mountPath: /etc/kube-dns
      volumes:
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
      - name: kube-dns-config
        configMap:
          name: kube-dns
          optional: true
      - name: config-volume
        configMap:
          name: node-local-dns
          items:
            - key: Corefile
              path: Corefile.base
---
# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.
# We use this to expose metrics to Prometheus.
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/port: &quot;9253&quot;
    prometheus.io/scrape: &quot;true&quot;
  labels:
    k8s-app: node-local-dns
  name: node-local-dns
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: metrics
      port: 9253
      targetPort: 9253
  selector:
    k8s-app: node-local-dns</code></pre><p>&#xD30C;&#xC77C; &#xBA85;&#xC740; <code>nodelocaldns.yaml</code> &#xB85C; &#xD569;&#xB2C8;&#xB2E4;. (&#xC544;&#xB798;&#xCABD;&#xC758; sed &#xBA85;&#xB839;&#xC5B4;&#xC758; &#xD0C0;&#xAC9F; &#xD30C;&#xC77C;&#xBA85;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;)</p><pre><code class="language-sh">kubedns=`kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}`
domain=&lt;cluster-domain&gt;
localdns=&lt;node-local-address&gt;</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC218;&#xD589;&#xD574;&#xC11C; &#xC62C;&#xBC14;&#xB978; &#xAC12;&#xC744; &#xB123;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB300;&#xBD80;&#xBD84;&#xC758; &#xACBD;&#xC6B0;</p><p>kubedns=10.96.0.10 (&#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; CIDR &#xB300;&#xC5ED;&#xC5D0;&#xC11C;&#xC758; 10&#xBC88;&#xC9F8; &#xAC12;)</p><p>domain=cluster.local</p><p>localdns=169.254.25.10</p><p>&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p> &#xB9CC;&#xC57D; <code>kube-proxy</code> &#xAC00; IPTABLES &#xBAA8;&#xB4DC;&#xB85C; &#xC2E4;&#xD589;&#xB418;&#xACE0;&#xC788;&#xB2E4;&#xBA74;</p><pre><code class="language-sh">sed -i &quot;s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g&quot; nodelocaldns.yaml</code></pre><p>IPVS &#xBAA8;&#xB4DC;&#xB85C; &#xC2E4;&#xD589;&#xB418;&#xACE0; &#xC788;&#xB2E4;&#xBA74;</p><pre><code class="language-sh">sed -i &quot;s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g&quot; nodelocaldns.yaml</code></pre><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x26A0;&#xFE0F;</div><div class="kg-callout-text">MacOS &#xB97C; &#xC0AC;&#xC6A9;&#xC911;&#xC774;&#xB77C;&#xBA74; <code spellcheck="false" style="white-space: pre-wrap;">$ brew install gnu-sed</code> &#xB97C; &#xC124;&#xCE58;&#xD558;&#xACE0;. sed &#xBA85;&#xB839;&#xC5B4;&#xB300;&#xC2E0; gsed &#xB85C; &#xC704; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.</div></div><p>&#xC704; &#xBA85;&#xB839;&#xC5B4;&#xB4E4;&#xC740; ConfigMap &#xC744; &#xC218;&#xC815;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBA85;&#xB839;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-yaml">apiVersion: v1
kind: ConfigMap
metadata:
  name: node-local-dns
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  Corefile: |
    __PILLAR__DNS__DOMAIN__:53 {
        errors
        cache {
                success 9984 30
                denial 9984 5
        }
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        health __PILLAR__LOCAL__DNS__:8080
        }
    in-addr.arpa:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        }
    ip6.arpa:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__CLUSTER__DNS__ {
                force_tcp
        }
        prometheus :9253
        }
    .:53 {
        errors
        cache 30
        reload
        loop
        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__
        forward . __PILLAR__UPSTREAM__SERVERS__
        prometheus :9253
        }</code></pre><p>&#xC5EC;&#xAE30;&#xC11C; <code>__PILLAR__LOCAL__DNS__</code> &#xB294; &#xAC01; &#xB178;&#xB4DC;&#xC5D0;&#xC11C; &#xC774; DNS Cache &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xAC00; &#xC5B4;&#xB5A4; IP &#xB85C; &#xBC14;&#xC778;&#xB529; &#xB420;&#xC9C0;&#xB97C; &#xACB0;&#xC815;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC774;&#xACE0;. &#xC6B0;&#xB9AC;&#xB294; &#xC5EC;&#xAE30;&#xC11C; <code>169.254.25.10</code> &#xC73C;&#xB85C; &#xB300;&#xCE58;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p><code>__PILLAR__DNS__SERVER__</code> &#xC758; &#xACBD;&#xC6B0; CoreDNS(kube-dns) &#xC758; ClusterIP &#xB85C; &#xB300;&#xCE58;&#xB429;&#xB2C8;&#xB2E4;.</p><p><code>__PILLAR__CLUSTER__DNS__</code> &#xBC0F; <code>__PILLAR__UPSTREAM__SERVERS__</code> &#xB294; node-local-dns-cache &#xB370;&#xBAAC;&#xC14B; &#xD30C;&#xB4DC; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xB300;&#xCE58;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC778;&#xB370;, <code>__PILLAR__CLUSTER__DNS__</code> &#xB294; &#xC774; yaml &#xD30C;&#xC77C;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC0DD;&#xC131;&#xD558;&#xB294; <code>kube-dns-upstream</code> &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; ClusterIP &#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC720;&#xC758;&#xD574;&#xC57C;&#xD558;&#xB294;&#xC810;&#xC740; <code>kube-dns-upstream</code> &#xC11C;&#xBE44;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xB808;&#xC774;&#xBE14; &#xC140;&#xB809;&#xD130;&#xB85C; <code>k8s-app=kube-dns</code> &#xB85C; &#xB418;&#xC5B4;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; CoreDNS &#xB97C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD55C; &#xACBD;&#xC6B0; &#xB808;&#xC774;&#xBE14;&#xC5D0; <code>k8s-app=kube-dns</code> &#xB97C; &#xCD94;&#xAC00;&#xD574;&#xC918;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>(&#xB9CC;&#xC57D; CoreDNS &#xB97C; helm &#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD588;&#xB2E4;&#xBA74; values &#xC5D0; <code>k8sAppLabelOverride: &quot;kube-dns&quot;</code> &#xB77C;&#xB294; &#xAC12;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;)</p><p><code>__PILLAR__UPSTREAM__SERVERS__</code> &#xC758; &#xACBD;&#xC6B0; <code>__PILLAR__LOCAL__DNS__</code> &#xAC12;&#xACFC; CoreDNS(kube-dns) ClusterIP &#xAC12;&#xC73C;&#xB85C; &#xD3C9;&#xAC00;&#xB418;&#xC5B4;&#xC11C; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>s<strong>ed &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC9C1;&#xC811; &#xC218;&#xC815;&#xD560; &#xACBD;&#xC6B0;</strong> &#xC544;&#xB798; &#xAC12;&#xB4E4;&#xC744; &#xC9C1;&#xC811; &#xB300;&#xCE58;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p><code>__PILLAR__DNS__DOMAIN__</code> : cluster.local &#xB4F1;&#xC758; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB3C4;&#xBA54;&#xC778;</p><p><code>__PILLAR__LOCAL__DNS__</code> : 169.254.25.10 &#xB4F1;&#xC758; node local dns cache &#xB370;&#xBAAC;&#xC14B; &#xD30C;&#xB4DC;&#xAC00; Listen &#xD560; IP &#xC9C0;&#xC815;</p><p><code>__PILLAR__DNS__SERVER__</code> : CoreDNS(kube-dns) &#xC758; ClusterIP</p><p>&#xC774;&#xB807;&#xAC8C; &#xD574;&#xC11C; <code>node-local-dns</code> &#xB77C;&#xB294; &#xC774;&#xB984;&#xC758; &#xB370;&#xBAAC;&#xC14B;&#xC774; &#xC131;&#xACF5;&#xC801;&#xC73C;&#xB85C; &#xBC30;&#xD3EC;&#xB418;&#xACE0; &#xB098;&#xBA74;, &#xC2E4;&#xC81C; &#xD30C;&#xB4DC;&#xB4E4;&#xC774; <code>node-local-dns</code> &#xD30C;&#xB4DC;&#xB85C; DNS &#xCFFC;&#xB9AC;&#xB97C; &#xD558;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p><code>KubeletConfiguration</code> &#xC758; <code>clusterDNS</code> &#xC815;&#xBCF4;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xACE0;, kubelet &#xC7AC;&#xC2DC;&#xC791;&#xC744; &#xD568;&#xC73C;&#xB85C;&#xC11C; &#xC0C8;&#xB85C; &#xC0DD;&#xC131;&#xB418;&#xB294; &#xD30C;&#xB4DC;&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; <code>node-local-dns</code> &#xC5D0; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB300;&#xD55C; DNS &#xCFFC;&#xB9AC;&#xB97C; &#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xA0;</p><h2 id="wrapping-up">Wrapping up</h2><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; Pod &#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB300;&#xD55C; DNS Query Resolve &#xB97C; &#xD558;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xBA74;&#xC11C;, CoreDNS &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xACE0;, kubeadm &#xC740; &#xADF8;&#xAC83;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD558;&#xB294;&#xC9C0;, &#xADF8;&#xB9AC;&#xACE0; &#xAC01; &#xD30C;&#xB4DC;&#xBCC4; DNS &#xC124;&#xC815;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD558;&#xB294;&#xC9C0;, &#xB354; &#xB098;&#xC544;&#xAC00;&#xC11C; NodeLocal DNSCache &#xAE4C;&#xC9C0; &#xB2E4;&#xC591;&#xD558;&#xAC8C; &#xB2E4;&#xB8E8;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xA0;</p><p>kubadm / kubespray &#xB4F1;&#xC758; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD234;&#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; kube-proxy, CoreDNS &#xB4F1;&#xC758; &#xC560;&#xB4DC;&#xC628;&#xC744; &#xC54C;&#xC544;&#xC11C; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xCC98;&#xB9AC;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; Vanilia Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xADF8;&#xB7F0;&#xAC83;&#xB4E4;&#xC744; &#xBAA8;&#xB450; &#xC9C1;&#xC811; &#xC124;&#xC815;&#xD574;&#xC918;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>kubeadm &#xC5D0;&#xC11C; CoreDNS &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD558;&#xACE0;, CoreDNS &#xC758; ClusterIP &#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xB41C;&#xAC83;&#xC778;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xBA74;&#xC11C; &#xC65C; <code>10.96.0.10</code> &#xACFC; &#xAC19;&#xC740; IP &#xC8FC;&#xC18C;&#xAC00; &#xC124;&#xC815;&#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC54C; &#xC218; &#xC788;&#xC5C8;&#xACE0;. &#xB354; &#xB098;&#xC544;&#xAC00;&#xC11C; kubelet &#xACFC;&#xB3C4; &#xAE34;&#xBC00;&#xD788; &#xC5F0;&#xACC4;&#xB418;&#xC5B4;&#xC788;&#xC74C;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[kubelet 이 원하는 커널 파라미터]]></title><description><![CDATA[Kubelet 은 실행하는 머신의 커널 파라미터가 특정 값이  제대로 설정되어있지 않다면 동작하지 않고 오류가 발생하게 됩니다. 이 때 kubelet에  --protect-kernel-defaults=false 라는 실행 인자를 념겨주면 정상 동작을 하게 됩니다. 이런 단순한 오류 해결을 넘어서 실제로 kubelet 은 어떤 커널 파라미터가 세팅되어있기를 원하는지, 그리고 어떤 코드에서 그런 내용을 볼 수 있는지 등에 대해서 다루는 글입니다. ]]></description><link>https://www.kimsehwan96.com/kubelet-expected-kernel-parameters/</link><guid isPermaLink="false">663bb91730749cc47571b6a2</guid><category><![CDATA[Kubelet]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[K8s]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Wed, 08 May 2024 14:12:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/05/-----------2024-05-09-------4.12.46.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; Packer &#xB97C; &#xD1B5;&#xD574; &#xAC00;&#xC0C1;&#xBA38;&#xC2E0;&#xC5D0;&#xC11C; &#xAD6C;&#xB3D9;&#xD560; K8s &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xB300;&#xD55C; &#xACE8;&#xB4E0; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xC791;&#xC5C5;, &#xADF8;&#xB9AC;&#xACE0; &#xC2E4;&#xC81C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD558;&#xACE0; &#xD14C;&#xC2A4;&#xD2B8; &#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xACAA;&#xC740; kubelet&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xBB38;&#xC81C;&#xB97C; &#xB2E4;&#xB8F9;&#xB2C8;&#xB2E4;. </div></div><img src="https://www.kimsehwan96.com/content/images/2024/05/-----------2024-05-09-------4.12.46.png" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><p>&#xCD5C;&#xADFC; <code>packer</code> &#xB97C; &#xC774;&#xC6A9;&#xD558;&#xC5EC; <code>golden image</code> &#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC11C; Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC744;, &#xBCC4;&#xB2E4;&#xB978; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD234;&#xC758; &#xB3C4;&#xC6C0; &#xC5C6;&#xC774; (kubeadm &#xC870;&#xCC28;&#xB3C4; &#xC4F0;&#xC9C0; &#xC54A;&#xACE0;)&#xC9C4;&#xD589;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/2bd5f17c-fc76-450f-b4cb-07d38ef192de.png" class="kg-image" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;" loading="lazy" width="1800" height="1673" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/2bd5f17c-fc76-450f-b4cb-07d38ef192de.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/05/2bd5f17c-fc76-450f-b4cb-07d38ef192de.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/05/2bd5f17c-fc76-450f-b4cb-07d38ef192de.png 1600w, https://www.kimsehwan96.com/content/images/2024/05/2bd5f17c-fc76-450f-b4cb-07d38ef192de.png 1800w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">packer &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; hcl &#xD30C;&#xC77C;&#xC758; &#xC77C;&#xBD80;. &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xC774;&#xBBF8;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xBA85;&#xC138; &#xC791;&#xC131;&#xC774; &#xAC00;&#xB2A5;&#xD588;&#xB2E4;!</span></figcaption></figure><p>&#xC774; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xB294; &#xC774;&#xC720;&#xB294; <code>Virtual Machine</code> &#xB4E4;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;/&#xC6B4;&#xC601; &#xD558;&#xAE30; &#xC704;&#xD568;&#xC774;&#xACE0;. &#xC804;&#xBC18;&#xC801;&#xC778; &#xBAA8;&#xC2B5;&#xC740; &#xC544;&#xB9C8;&#xB3C4; <code>EKS</code> &#xC640; &#xB9E4;&#xC6B0; &#xBE44;&#xC2B7;&#xD55C; &#xBAA8;&#xC2B5;&#xC77C;&#xAC81;&#xB2C8;&#xB2E4;.</p><p><code>EKS</code> &#xB294; &#xAC01; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;(&#xBC14;&#xC774;&#xB108;&#xB9AC;)&#xAC00; &#xC0AC;&#xC804;&#xC5D0; &#xC124;&#xCE58;&#xB41C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC6A9; <code>ami</code> &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xAC00;&#xC0C1;&#xBA38;&#xC2E0;(ec2)&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xADF8;&#xAC83;&#xB4E4;&#xC744; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; join &#xC2DC;&#xD0A4;&#xBA70;, &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC740; AWS&#xAC00; managed &#xB85C; &#xCC98;&#xB9AC;&#xD574;&#xC8FC;&#xB294; &#xCEE8;&#xC149;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; <code>Virtual Machine</code> &#xAE30;&#xBC18;&#xC758; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF4;&#xACE0; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C;, <strong>&#xAC00;&#xC0C1;&#xBA38;&#xC2E0;&#xC744; &#xD55C;&#xBC88; &#xAED0;&#xB2E4;&#xAC00; &#xCF30;&#xB354;&#xB2C8;</strong> <code>kubelet</code> &#xC774; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xC5D0;&#xB7EC; &#xB85C;&#xADF8;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xACE0; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xD604;&#xC7AC; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC740; M1 Mac(ARM64) + VMWare Fusion &#xC744; &#xC0AC;&#xC6A9;&#xD55C; &#xAC00;&#xC0C1;&#xBA38;&#xC2E0;(ARM64) &#xD658;&#xACBD;&#xC785;&#xB2C8;&#xB2E4;.</div></div><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">kubelet &#xC740; <code spellcheck="false" style="white-space: pre-wrap;">systemd</code> &#xB85C; &#xBCF4;&#xD1B5; &#xC2E4;&#xD589;&#xB418;&#xAE30;&#xB54C;&#xBB38;&#xC5D0;, &#xB85C;&#xADF8;&#xB97C; &#xBCF4;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; <code spellcheck="false" style="white-space: pre-wrap;">journalctl -xeu kubelet -f</code> &#xC640; &#xAC19;&#xC740; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC218;&#xD589;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. </div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/a4550ac5-5724-46c5-8775-612eaa69caac.png" class="kg-image" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;" loading="lazy" width="1265" height="483" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/a4550ac5-5724-46c5-8775-612eaa69caac.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/05/a4550ac5-5724-46c5-8775-612eaa69caac.png 1000w, https://www.kimsehwan96.com/content/images/2024/05/a4550ac5-5724-46c5-8775-612eaa69caac.png 1265w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kubelet&#xC774; &#xC608;&#xC0C1;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xAC12;&#xACFC; &#xB2EC;&#xB77C;&#xC11C; kubelet &#xC2E4;&#xD589;&#xC774; &#xC2E4;&#xD328;&#xD55C;&#xB2E4;. ($ journalctl -xeu kubelet -f)</span></figcaption></figure><p>May 02 03:05:49 control1 kubelet[1295]: E0502 03:05:49.409568 1295<br>kubelet.go:1542] &quot;Failed to start ContainerManager&quot; err=&quot;[invalid kernel flag: kernel/panic, expected value: 10, actual value: 0, invalid kernel flag: vm/overcommit_memory, expected value: 1, actual value: 0]&quot;</p><p>&#xC704; &#xC5D0;&#xB7EC; &#xB85C;&#xADF8;&#xB97C; &#xD574;&#xC11D;&#xD574;&#xBCF4;&#xC790;&#xBA74; <code>kubelet</code> &#xC774; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB9E4;&#xB2C8;&#xC800;&#xB97C; &#xC2E4;&#xD589;&#xC2DC;&#xD0A4;&#xB294;&#xB370; &#xC2E4;&#xD328;&#xD588;&#xACE0;, &#xADF8; &#xC774;&#xC720;&#xB294; <code>kernal/panic</code> &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xC640; <code>vm/overcommit_memory</code> &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xAC00; <code>kubelet</code> &#xC774; &#x201C;&#xC608;&#xC0C1;&#x201D; &#xD55C; &#xAC12;&#xACFC; &#xB2E4;&#xB974;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>kubelet</code> &#xC758; &#xC2E4;&#xD589;&#xC774; &#xC2E4;&#xD328;&#xD55C;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC6B0;&#xC120; &#xC798; &#xC54C;&#xB824;&#xC9C4; &#xD574;&#xACB0; &#xBC29;&#xBC95;&#xC740; <code>kubelet</code> &#xC744; &#xC2E4;&#xD589; &#xD560; &#xB54C; <code>--protect-kernel-defaults=false</code> &#xC2E4;&#xD589; &#xC778;&#xC790;&#xB97C; &#xCD94;&#xAC00;&#xD574;&#xC8FC;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC18C;&#xAC1C;&#xB418;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0AC;&#xC2E4; <code>--protect-kernel-defaults=true</code> &#xAC00; &#xAE30;&#xBCF8;&#xAC12;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC704; &#xC5D0;&#xB7EC; &#xB85C;&#xADF8;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xAC83;&#xC774;&#xB77C;&#xACE0; &#xB2E4;&#xC2DC; &#xD574;&#xC11D;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xB370;&#xC694;. </p><p>&#xC774; &#xC2E4;&#xD589; &#xC778;&#xC790;&#xB294; <code>kubelet</code> &#xC774; &#xAD8C;&#xC7A5;/&#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xC640; &#xC2E4;&#xC81C; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xC124;&#xC815;&#xAC12;&#xC774; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xC744; &#xACBD;&#xC6B0; <code>kubelet</code> &#xC774; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB4DC; &#xD560;&#xAC83;&#xC774;&#xB0D0; &#xB9D0;&#xAC83;&#xC774;&#xB0D0;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294; &#xC635;&#xC158;&#xC73C;&#xB85C;. &#xB9D0; &#xADF8;&#xB300;&#xB85C; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xC124;&#xC815;&#xAC12;&#xC744; &#xBCF4;&#xD638; &#xD558;&#xACA0;&#xB0D0;, &#xBCF4;&#xD638;&#xD558;&#xC9C0; &#xC54A;&#xACA0;&#xB0D0;&#xC758; &#xC758;&#xBBF8;&#xB85C; &#xD574;&#xC11D;&#xD558;&#xC2DC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; <code>--protect-kernel-defaults=false</code> &#xC778;&#xC790;&#xB97C; <code>kubelet</code> &#xC5D0; &#xC2E4;&#xD589; &#xC778;&#xC790;&#xB85C; &#xC8FC;&#xB294; &#xACBD;&#xC6B0; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xBA74;&#xC11C; &#xC798; &#xB3D9;&#xC791;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><h2 id="kubelet-%EC%9D%98-%EC%8B%A4%ED%96%89-%EC%9D%B8%EC%9E%90-%EC%B6%94%EA%B0%80%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">kubelet &#xC758; &#xC2E4;&#xD589; &#xC778;&#xC790; &#xCD94;&#xAC00;/&#xBCC0;&#xACBD;&#xD558;&#xB294; &#xBC29;&#xBC95;</h2><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">kubelet systemd &#xD30C;&#xC77C;&#xC740; kubeadm &#xC73C;&#xB85C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD588;&#xB294;&#xC9C0;, &#xC9C1;&#xC811; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD588;&#xB294;&#xC9C0; &#xB4F1;&#xC5D0; &#xB530;&#xB77C;&#xC11C; systemd service &#xD30C;&#xC77C;&#xC758; &#xD615;&#xD0DC;&#xAC00; &#xB2E4;&#xC18C; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. service &#xD30C;&#xC77C;&#xC5D0; &#xC9C1;&#xC811; &#xC778;&#xC790;&#xB97C; &#xB123;&#xC5B4;&#xC904;&#xC218;&#xB3C4; &#xC788;&#xACE0;, kubeadm &#xC73C;&#xB85C; &#xBC30;&#xD3EC;&#xD55C; &#xACBD;&#xC6B0; <code spellcheck="false" style="white-space: pre-wrap;">systemd drop in</code> &#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xC778;&#xC790;&#xB97C; &#xB123;&#xC5B4;&#xC904;&#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAC01;&#xC790;&#xC758; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD658;&#xACBD;&#xC5D0; &#xB9DE;&#xAC8C; &#xC801;&#xC6A9;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </div></div><h3 id="kubelet-systemd-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%A7%81%EC%A0%91-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%84%9C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%ED%94%84%EB%A1%9C%EB%B9%84%EC%A0%80%EB%8B%9D-%ED%95%9C-%EA%B2%BD%EC%9A%B0">Kubelet systemd &#xC11C;&#xBE44;&#xC2A4; &#xD30C;&#xC77C;&#xC744; &#xC9C1;&#xC811; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD55C; &#xACBD;&#xC6B0;</h3><p>&#xC6B0;&#xC120; <code>kubelet</code> &#xC5D0; &#xB300;&#xD55C; <code>systemd</code>  <code>drop-in</code> &#xD30C;&#xC77C;&#xC774; &#xC5C6;&#xB294; &#xAD6C;&#xC870;&#xC5D0;&#xC11C;, &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; <code>kubelet</code> &#xC2E4;&#xD589;&#xC778;&#xC790;&#xB97C; &#xC9C1;&#xC811; <code>service</code> &#xD30C;&#xC77C;&#xC5D0; &#xC9C0;&#xC815;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-code-card"><pre><code>[Install]
WantedBy=multi-user.target
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=containerd.service
Wants=containerd.service
[Service]
ExecStart=/usr/local/bin/kubelet \
  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubeconfig \
  --config=/etc/kubernetes/kubelet-config.yaml \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --register-node=true \
  --v=2 \
  --protect-kernel-defaults=false
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target</code></pre><figcaption><p><span style="white-space: pre-wrap;">kubelet.service</span></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xC2E4;&#xD589; &#xC778;&#xC790;&#xC5D0; &#xC9C1;&#xC811; <code>protect-kernel-defaults=false</code> &#xB97C; &#xB123;&#xC5B4;&#xC8FC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. </p><h3 id="kubeadm-%EC%9D%84-%ED%86%B5%ED%95%B4-%ED%94%84%EB%A1%9C%EB%B9%84%EC%A0%80%EB%8B%9D%ED%95%9C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0">Kubeadm &#xC744; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/a8007a09-0f64-4d28-8a85-0c61004ee0ba.png" class="kg-image" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;" loading="lazy" width="785" height="235" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/a8007a09-0f64-4d28-8a85-0c61004ee0ba.png 600w, https://www.kimsehwan96.com/content/images/2024/05/a8007a09-0f64-4d28-8a85-0c61004ee0ba.png 785w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kubeadm &#xC744; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; kubelet systemd service</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">kubelet &#xC744; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC758; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C; &#xC124;&#xCE58;&#xD588;&#xC744;&#xB54C;&#xC758; &#xBAA8;&#xC2B5;&#xC785;&#xB2C8;&#xB2E4;. &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC9C1;&#xC811; &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xB97C; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC; &#xBC1B;&#xC544;&#xC11C; kubeadm &#xC73C;&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C;&#xACBD;&#xC6B0; &#xC774; &#xC0C1;&#xD669;&#xACFC; &#xC644;&#xC804;&#xD788; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</div></div><p>&#xB9CC;&#xC57D; <code>systemctl status kubelet</code> &#xC744; &#xD588;&#xC744; &#xB54C; <code>drop-in</code> &#xD30C;&#xC77C;&#xC774; &#xC788;&#xB294;&#xACBD;&#xC6B0; &#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC704; &#xCF00;&#xC774;&#xC2A4;&#xC758; &#xACBD;&#xC6B0; <code>kubeadm</code> &#xC744; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC774;&#xACE0;. <code>/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf</code> &#xD30C;&#xC77C;&#xC5D0; &#xC9C0;&#xC815;&#xB41C; <code>systemd</code> &#xD30C;&#xC77C;&#xC758; &#xC120;&#xC5B8; &#xBE14;&#xB85D;&#xB4E4;&#xC774; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB4DC; &#xB429;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD574;&#xBD05;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code># Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment=&quot;KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf&quot;
Environment=&quot;KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml&quot;
# This is a file that &quot;kubeadm init&quot; and &quot;kubeadm join&quot; generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS</code></pre><figcaption><p><span style="white-space: pre-wrap;">10-kubeadm.conf</span></p></figcaption></figure><p>&#xC704; &#xD56D;&#xBAA9;&#xC5D0; &#xC5EC;&#xB7EC; &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294;&#xB370;. <code>$KUBELET_EXTRA_ARGS</code>  &#xC758; &#xACBD;&#xC6B0;<code>/etc/sysconfig/kubelet</code> &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xB85C;&#xB4DC;&#xD558;&#xACE0;. &#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC744; &#xC5F4;&#xC5B4;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-code-card"><pre><code>KUBELET_EXTRA_ARGS=</code></pre><figcaption><p><span style="white-space: pre-wrap;">/etc/sysconfig/kubelet</span></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>KUBELET_EXTRA_ARGS</code> &#xB97C; &#xBCFC;&#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; </p><figure class="kg-card kg-code-card"><pre><code>KUBELET_EXTRA_ARGS=&quot;--protect-kernel-defaults=false&quot;</code></pre><figcaption><p><span style="white-space: pre-wrap;">/etc/sysconfig/kubelet</span></p></figcaption></figure><p>&#xB97C; &#xB123;&#xC5B4;&#xC8FC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="kubespray-%EB%A5%BC-%ED%86%B5%ED%95%B4-%ED%94%84%EB%A1%9C%EB%B9%84%EC%A0%80%EB%8B%9D%ED%95%9C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0">Kubespray &#xB97C; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/05/8e6f2c15-8b1f-4613-83e5-a8e2bf0c711b-1.png" class="kg-image" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;" loading="lazy" width="971" height="211" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/05/8e6f2c15-8b1f-4613-83e5-a8e2bf0c711b-1.png 600w, https://www.kimsehwan96.com/content/images/2024/05/8e6f2c15-8b1f-4613-83e5-a8e2bf0c711b-1.png 971w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kubespray &#xB97C; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; systemctl status kubelet &#xACB0;&#xACFC;</span></figcaption></figure><p>kubespray &#xB97C; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD;&#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xB2E8;&#xC77C; systemd service &#xD30C;&#xC77C;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code>[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=containerd.service
Wants=containerd.service
[Service]
EnvironmentFile=-/etc/kubernetes/kubelet.env
ExecStart=/usr/local/bin/kubelet \
                $KUBE_LOGTOSTDERR \
                $KUBE_LOG_LEVEL \
                $KUBELET_API_SERVER \
                $KUBELET_ADDRESS \
                $KUBELET_PORT \
                $KUBELET_HOSTNAME \
                $KUBELET_ARGS \
                $DOCKER_SOCKET \
                $KUBELET_NETWORK_PLUGIN \
                $KUBELET_VOLUME_PLUGIN \
                $KUBELET_CLOUDPROVIDER
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target</code></pre><figcaption><p><span style="white-space: pre-wrap;">kubelet.service</span></p></figcaption></figure><p>&#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; <code>/etd/kubernetes/kubelet.env</code> &#xB97C; &#xD1B5;&#xD574; &#xB85C;&#xB4DC;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC744; &#xC5F4;&#xC5B4;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-code-card"><pre><code>KUBE_LOG_LEVEL=&quot;--v=2&quot;
KUBELET_ADDRESS=&quot;--node-ip=192.168.207.3&quot;
KUBELET_HOSTNAME=&quot;--hostname-override=node1&quot;
KUBELET_ARGS=&quot;--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
--config=/etc/kubernetes/kubelet-config.yaml \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--runtime-cgroups=/system.slice/containerd.service \
 &quot;
KUBELET_CLOUDPROVIDER=&quot;&quot;
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
</code></pre><figcaption><p><span style="white-space: pre-wrap;">/etd/kubernetes/kubelet.env</span></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC218;&#xC815;&#xD574;&#xC11C; &#xC800;&#xC7A5;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code>KUBE_LOG_LEVEL=&quot;--v=2&quot;
KUBELET_ADDRESS=&quot;--node-ip=192.168.207.3&quot;
KUBELET_HOSTNAME=&quot;--hostname-override=node1&quot;
KUBELET_ARGS=&quot;--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
--config=/etc/kubernetes/kubelet-config.yaml \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--runtime-cgroups=/system.slice/containerd.service \
--protect-kernel-defaults=false \
 &quot;
KUBELET_CLOUDPROVIDER=&quot;&quot;
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</code></pre><figcaption><p><span style="white-space: pre-wrap;">/etd/kubernetes/kubelet.env KUBELET_ARGS &#xBD80;&#xBD84;&#xC758; &#xB9E8; &#xC544;&#xB798;&#xCABD;&#xC5D0; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>--protect-kernel-defaults=false</span></code><span style="white-space: pre-wrap;"> &#xCD94;&#xAC00;&#xB428;</span></p></figcaption></figure><h2 id="kubelet-%EC%9D%B4-%EC%96%B4%EB%96%A4-%EC%BB%A4%EB%84%90-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EB%93%A4%EC%9D%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%84%A4%EC%A0%95%EB%90%98%EC%9E%88%EA%B8%B0%EB%A5%BC-%EC%98%88%EC%83%81%ED%95%98%EB%82%98%EC%9A%94">kubelet &#xC774; &#xC5B4;&#xB5A4; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB4E4;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xB418;&#xC788;&#xAE30;&#xB97C; &#xC608;&#xC0C1;&#xD558;&#xB098;&#xC694;?</h2><p>&#xC704; &#xD2B8;&#xB7EC;&#xBE14; &#xC288;&#xD305;&#xC744; &#xD558;&#xBA74;&#xC11C; &#xAD81;&#xAE08;&#xD588;&#xB358;&#xAC74;, <code>kubelet</code> &#xC740; &#xADF8;&#xB7FC; &#xC5B4;&#xB5A4; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xB418;&#xC788;&#xAE30;&#xB97C; &#xC6D0;&#xD558;&#xB290;&#xB0D0;&#xAC00; &#xAD81;&#xAE08;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB2E8;&#xC21C;&#xD788; <code>kubelet</code> &#xC774; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB4DC; &#xD558;&#xB3C4;&#xB85D; &#xB450;&#xB294;&#xAC83;&#xBCF4;&#xB2E4;, &#xC560;&#xCD08;&#xC5D0; VM &#xC758; &#xCEE4;&#xB110; &#xC124;&#xC815;&#xC744; &#xADF8;&#xB807;&#xAC8C; &#xD558;&#xB294;&#xAC83;&#xC774; &#xC88B;&#xACA0;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAC70;&#xAE30;&#xB2E4;&#xAC00; kubelet &#xC774; &#xD574;&#xB2F9; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xC6D0;&#xD558;&#xB294;&#xB370;&#xC5D0;&#xB294; kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xC6B4;&#xC601;&#xD558;&#xAE30; &#xC704;&#xD568;&#xC774;&#xB77C;&#xB294; &#xCD94;&#xCE21;&#xC774; &#xC788;&#xC5C8;&#xACE0;, &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xB418;&#xC788;&#xAE30;&#xB97C; &#xBC14;&#xB77C;&#xB294;&#xC9C0; &#xC544;&#xB294;&#xAC83; &#xB610;&#xD55C; &#xCDA9;&#xBD84;&#xD788; &#xC758;&#xBBF8;&#xAC00; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes/kubernetes/blob/82cd82aa15aeb5e5ac1201c3b800b8134eb51cb9/pkg/kubelet/cm/container_manager_linux.go?ref=kimsehwan96.com#L400-L446"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kubernetes/pkg/kubelet/cm/container_manager_linux.go at 82cd82aa15aeb5e5ac1201c3b800b8134eb51cb9 &#xB7; kubernetes/kubernetes</div><div class="kg-bookmark-description">Production-Grade Container Scheduling and Management - kubernetes/kubernetes</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/74223d6337f888837b89008f0178537fcdeaadf6dde61093427eb57c657d3584/kubernetes/kubernetes" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"></div></a></figure><pre><code class="language-go">// setupKernelTunables validates kernel tunable flags are set as expected
// depending upon the specified option, it will either warn, error, or modify the kernel tunable flags
func setupKernelTunables(option KernelTunableBehavior) error {
	desiredState := map[string]int{
		utilsysctl.VMOvercommitMemory: utilsysctl.VMOvercommitMemoryAlways,
		utilsysctl.VMPanicOnOOM:       utilsysctl.VMPanicOnOOMInvokeOOMKiller,
		utilsysctl.KernelPanic:        utilsysctl.KernelPanicRebootTimeout,
		utilsysctl.KernelPanicOnOops:  utilsysctl.KernelPanicOnOopsAlways,
		utilsysctl.RootMaxKeys:        utilsysctl.RootMaxKeysSetting,
		utilsysctl.RootMaxBytes:       utilsysctl.RootMaxBytesSetting,
	}

	sysctl := utilsysctl.New()

	errList := []error{}
	for flag, expectedValue := range desiredState {
		val, err := sysctl.GetSysctl(flag)
		if err != nil {
			errList = append(errList, err)
			continue
		}
		if val == expectedValue {
			continue
		}

		switch option {
		case KernelTunableError:
			errList = append(errList, fmt.Errorf(&quot;invalid kernel flag: %v, expected value: %v, actual value: %v&quot;, flag, expectedValue, val))
		case KernelTunableWarn:
			klog.V(2).InfoS(&quot;Invalid kernel flag&quot;, &quot;flag&quot;, flag, &quot;expectedValue&quot;, expectedValue, &quot;actualValue&quot;, val)
		case KernelTunableModify:
			klog.V(2).InfoS(&quot;Updating kernel flag&quot;, &quot;flag&quot;, flag, &quot;expectedValue&quot;, expectedValue, &quot;actualValue&quot;, val)
			err = sysctl.SetSysctl(flag, expectedValue)
			if err != nil {
				if inuserns.RunningInUserNS() {
					if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.KubeletInUserNamespace) {
						klog.V(2).InfoS(&quot;Updating kernel flag failed (running in UserNS, ignoring)&quot;, &quot;flag&quot;, flag, &quot;err&quot;, err)
						continue
					}
					klog.ErrorS(err, &quot;Updating kernel flag failed (Hint: enable KubeletInUserNamespace feature flag to ignore the error)&quot;, &quot;flag&quot;, flag)
				}
				errList = append(errList, err)
			}
		}
	}
	return utilerrors.NewAggregate(errList)
}</code></pre><p><code>kubelet</code> &#xC758; linux &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB9E4;&#xB2C8;&#xC800; &#xCF54;&#xB4DC;&#xC778; <code>pkg/kubelet/cm/container_manager_linux.go</code> &#xCF54;&#xB4DC;&#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74; </p><p><code>VMOvercommitMemory</code> , <code>VMPanicOnOOM</code> &#xACFC; &#xAC19;&#xC740; &#xAC12;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xB294;&#xB370; &#xC774;&#xAC83;&#xC740; <code>utilsysctl</code> &#xCABD;&#xC5D0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes/kubernetes/blob/82cd82aa15aeb5e5ac1201c3b800b8134eb51cb9/staging/src/k8s.io/component-helpers/node/util/sysctl/sysctl.go?ref=kimsehwan96.com#L26-L65"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kubernetes/staging/src/k8s.io/component-helpers/node/util/sysctl/sysctl.go at 82cd82aa15aeb5e5ac1201c3b800b8134eb51cb9 &#xB7; kubernetes/kubernetes</div><div class="kg-bookmark-description">Production-Grade Container Scheduling and Management - kubernetes/kubernetes</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/74223d6337f888837b89008f0178537fcdeaadf6dde61093427eb57c657d3584/kubernetes/kubernetes" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"></div></a></figure><pre><code class="language-go">const (
	sysctlBase = &quot;/proc/sys&quot;
	// VMOvercommitMemory refers to the sysctl variable responsible for defining
	// the memory over-commit policy used by kernel.
	VMOvercommitMemory = &quot;vm/overcommit_memory&quot;
	// VMPanicOnOOM refers to the sysctl variable responsible for defining
	// the OOM behavior used by kernel.
	VMPanicOnOOM = &quot;vm/panic_on_oom&quot;
	// KernelPanic refers to the sysctl variable responsible for defining
	// the timeout after a panic for the kernel to reboot.
	KernelPanic = &quot;kernel/panic&quot;
	// KernelPanicOnOops refers to the sysctl variable responsible for defining
	// the kernel behavior when an oops or BUG is encountered.
	KernelPanicOnOops = &quot;kernel/panic_on_oops&quot;
	// RootMaxKeys refers to the sysctl variable responsible for defining
	// the maximum number of keys that the root user (UID 0 in the root user namespace) may own.
	RootMaxKeys = &quot;kernel/keys/root_maxkeys&quot;
	// RootMaxBytes refers to the sysctl variable responsible for defining
	// the maximum number of bytes of data that the root user (UID 0 in the root user namespace)
	// can hold in the payloads of the keys owned by root.
	RootMaxBytes = &quot;kernel/keys/root_maxbytes&quot;
	// VMOvercommitMemoryAlways represents that kernel performs no memory over-commit handling.
	VMOvercommitMemoryAlways = 1
	// VMPanicOnOOMInvokeOOMKiller represents that kernel calls the oom_killer function when OOM occurs.
	VMPanicOnOOMInvokeOOMKiller = 0
	// KernelPanicOnOopsAlways represents that kernel panics on kernel oops.
	KernelPanicOnOopsAlways = 1
	// KernelPanicRebootTimeout is the timeout seconds after a panic for the kernel to reboot.
	KernelPanicRebootTimeout = 10
	// RootMaxKeysSetting is the maximum number of keys that the root user (UID 0 in the root user namespace) may own.
	// Needed since docker creates a new key per container.
	RootMaxKeysSetting = 1000000
	// RootMaxBytesSetting is the maximum number of bytes of data that the root user (UID 0 in the root user namespace)
	// can hold in the payloads of the keys owned by root.
	// Allocate 25 bytes per key * number of MaxKeys.
	RootMaxBytesSetting = RootMaxKeysSetting * 25
)</code></pre><p>&#xC704; &#xCF54;&#xB4DC;&#xC758; &#xB0B4;&#xC6A9;&#xB4E4;&#xC744; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xBA74; <code>kubelet</code> &#xC774; &#xAC80;&#xC99D;( <code>--protect-kernel-defaults=false</code> &#xC778;&#xC790;&#xAC00; &#xB4E4;&#xC5B4;&#xC628;&#xB2E4;&#xBA74; &#xC218;&#xC815;)&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. </p><pre><code>vm.overcommit_memory = 1
vm.panic_on_oom = 0
kernel.panic = 10
kernel.panic_on_oops = 1
kernel.keys.root_maxkeys = 1000000
kernel.keys.root_maxbytes = 25000000 # root_maxkeys * 25
</code></pre><p>&#xC81C;&#xAC00; &#xC791;&#xC5C5;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; <code>packer</code> &#xB97C; &#xD1B5;&#xD574; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xB178;&#xB4DC;(&#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;, &#xC6CC;&#xCEE4;&#xB178;&#xB4DC; &#xBAA8;&#xB450;)&#xC758; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xB9CC;&#xB4E4;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xBE4C;&#xB4DC;&#xD560; &#xB54C;&#xC5D0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; <code>ansible</code> task &#xB97C; &#xCD94;&#xAC00;&#xD558;&#xC5EC;&#xC11C; &#xBC18;&#xC601;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code>- name: kubelet&#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xBCC0;&#xACBD;
  ansible.posix.sysctl:
    sysctl_file: /etc/sysctl.d/k8s.conf
    name: &quot;{{ item.name }}&quot;
    value: &quot;{{ item.value }}&quot;
    state: present
    reload: yes
  with_items:
    - { name: kernel.keys.root_maxbytes, value: 25000000 }
    - { name: kernel.keys.root_maxkeys, value: 1000000 }
    - { name: kernel.panic, value: 10 }
    - { name: kernel.panic_on_oops, value: 1 }
    - { name: vm.overcommit_memory, value: 1 }
    - { name: vm.panic_on_oom, value: 0 }</code></pre><figcaption><p><span style="white-space: pre-wrap;">ansible task</span></p></figcaption></figure><p>&#xC2E4;&#xC81C;&#xB85C; <code>kubespray</code> &#xB610;&#xD55C; &#xBE44;&#xC2B7;&#xD55C; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xB294;&#xB370;&#xC694;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes-sigs/kubespray/blob/e01355834b461cf6e5578088ac377be2b6f70e6a/roles/kubernetes/preinstall/tasks/0080-system-configurations.yml?ref=kimsehwan96.com#L107-L121"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kubespray/roles/kubernetes/preinstall/tasks/0080-system-configurations.yml at e01355834b461cf6e5578088ac377be2b6f70e6a &#xB7; kubernetes-sigs/kubespray</div><div class="kg-bookmark-description">Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes-sigs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/45277c7ab23fae6f3b03e3ec81f8fc930785f64e8b8f0475bb680e1865aaa0cf/kubernetes-sigs/kubespray" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"></div></a></figure><p>&#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xD1B5;&#xD574; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB2E4;&#xB9CC;, task &#xC774;&#xB984;&#xC774; &#xBA85;&#xD655;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xC11C; &#xAD00;&#xB828;&#xD55C; &#xC774;&#xC288;/PR &#xAE4C;&#xC9C0;&#xB3C4; &#xB0A8;&#xACBC;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><a href="https://github.com/kubernetes-sigs/kubespray/issues/11170?ref=kimsehwan96.com"></a></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes-sigs/kubespray/issues/11170?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Change a task name in preinstall tasks (in 0080-system-configurations.yml ) &#xB7; Issue #11170 &#xB7; kubernetes-sigs/kubespray</div><div class="kg-bookmark-description">What would you like to be added I think that change the task name Ensure kube-bench parameters are set in kubernetes/preinstall/tasks/0080-system-configurations.yml into Ensure kubelet expected par&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes-sigs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/24291f2b8678d8e4efe6be76964dc88eb052023cb753d489eb834a04c7c6520f/kubernetes-sigs/kubespray/issues/11170" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kubernetes-sigs/kubespray/pull/11171?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Change a task name in preinstall/0080-system-configurations.yml by kimsehwan96 &#xB7; Pull Request #11171 &#xB7; kubernetes-sigs/kubespray</div><div class="kg-bookmark-description">What type of PR is this?
/kind documentation
What this PR does / why we need it:
These kernel parameters are the expected values for kubelet to operate(not the kube-bench), so it would be good to c&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kubernetes-sigs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/3c98f963b9e501ce0ca47a308ae41015a8a373fa28a1aa7454a3f925952a837b/kubernetes-sigs/kubespray/pull/11171" alt="kubelet &#xC774; &#xC6D0;&#xD558;&#xB294; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;"></div></a></figure><p></p><h2 id="wrapping-up">Wrapping up</h2><p></p><p>&#xC774;&#xB807;&#xAC8C; &#xD574;&#xC11C; &#xAC00;&#xC0C1;&#xBA38;&#xC2E0;&#xC774; &#xBD80;&#xD305; &#xB41C; &#xC774;&#xD6C4;&#xC5D0; &#xBC1C;&#xC0DD;&#xD558;&#xB294; kubelet &#xC5D0;&#xB7EC;&#xC758; &#xC6D0;&#xC778;&#xC774; &#xBB34;&#xC5C7;&#xC778;&#xC9C0; &#xD655;&#xC778;&#xD588;&#xACE0;, &#xB354; &#xB098;&#xC544;&#xAC00;&#xC11C; kubelet &#xCF54;&#xB4DC; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xC774;&#xAC83;&#xB4E4;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD558;&#xACE0;&#xC788;&#xACE0;, &#xC5B4;&#xB5A4; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB4E4;&#xC744; expect &#xD558;&#xACE0; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>--protect-kernel-defaults=false</code> &#xC635;&#xC158;&#xC744; kubelet &#xC2E4;&#xD589;&#xC778;&#xC790;&#xC5D0; &#xC8FC;&#xBA74; &#xC704; &#xC5D0;&#xB7EC;&#xB294; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xB429;&#xB2C8;&#xB2E4;. &#xD574;&#xB2F9; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB4E4;&#xC744; kubelet &#xC774; &#xB36E;&#xC5B4;&#xC50C;&#xC6B0;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xC8E0;. </p><p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xB418;&#xB294; &#xBB38;&#xC81C;&#xC774;&#xC9C0;&#xB9CC;, &#xADFC;&#xBCF8;&#xC801;&#xC73C;&#xB85C; kubelet &#xC774; &#xC608;&#xC0C1;&#xD558;&#xB294;(expect)&#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xC5D0; &#xBB34;&#xC5C7;&#xC774; &#xC788;&#xC73C;&#xBA70;, &#xC5B4;&#xB5A4; &#xAC12;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB418;&#xC5B4;&#xC57C;&#xD558;&#xB294;&#xC9C0;. &#xB354; &#xB098;&#xC544;&#xAC00;&#xC11C;&#xB294; &#xADF8; &#xCEE4;&#xB110; &#xD30C;&#xB77C;&#xBBF8;&#xD130;, &#xAC12;&#xB4E4;&#xC774; &#xC5B4;&#xB5A4; &#xC758;&#xBBF8;&#xB97C; &#xAC16;&#xB294;&#xC9C0;&#xAE4C;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xB294;&#xAC83;&#xC774; &#xC88B;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[Raft 알고리즘 알아보기]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC628;&#xD504;&#xB808;&#xBBF8;&#xC2A4; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC900;&#xBE44;&#xD558;&#xBA74;&#xC11C; etcd&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACE0;&#xC790; etcd &#xC758; &#xADFC;&#xAC04;&#xC774; &#xB418;&#xB294; Raft &#xD569;&#xC758;</div></div>]]></description><link>https://www.kimsehwan96.com/raft-consensus-algorithm/</link><guid isPermaLink="false">662a80a830749cc47571b5c6</guid><category><![CDATA[Raft]]></category><category><![CDATA[etcd]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Thu, 25 Apr 2024 14:55:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/04/-----------2024-04-26-------1.59.06.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC628;&#xD504;&#xB808;&#xBBF8;&#xC2A4; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC900;&#xBE44;&#xD558;&#xBA74;&#xC11C; etcd&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACE0;&#xC790; etcd &#xC758; &#xADFC;&#xAC04;&#xC774; &#xB418;&#xB294; Raft &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC790;&#xC138;&#xD558;&#xAC8C; &#xC54C;&#xC544;&#xBCF4;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC804;&#xBC18;&#xC801;&#xC73C;&#xB85C; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xBB38;&#xC11C;&#xB97C; &#xBC88;&#xC5ED;&#xD558;&#xACE0; &#xADF8;&#xAC83;&#xC744; &#xC870;&#xAE08; &#xB354; &#xC27D;&#xAC8C; &#xD480;&#xC5B4;&#xB0B4;&#xAE30; &#xC704;&#xD574;&#xC11C; Raftscope &#xB77C;&#xB294; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC2DC;&#xAC01;&#xD654; &#xC624;&#xD508;&#xC18C;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; &#xC2E4;&#xC81C; &#xB3D9;&#xC791;&#xC744; &#xBCF4;&#xAE30;&#xC27D;&#xB3C4;&#xB85D; &#xB0B4;&#xC6A9;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</div></div><img src="https://www.kimsehwan96.com/content/images/2024/04/-----------2024-04-26-------1.59.06.png" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;"><p>Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xB17C;&#xBB38; : <a href="https://raft.github.io/raft.pdf?ref=kimsehwan96.com">https://raft.github.io/raft.pdf</a></p><p>&#xB354; &#xC790;&#xC138;&#xD55C; &#xBC84;&#xC804;&#xC758; &#xB17C;&#xBB38; : <a href="https://web.stanford.edu/~ouster/cgi-bin/papers/OngaroPhD.pdf?ref=kimsehwan96.com">https://web.stanford.edu/~ouster/cgi-bin/papers/OngaroPhD.pdf</a></p><p>Raft&#xB294; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB4E4;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC785;&#xB2C8;&#xB2E4;. <code>Paxos</code> &#xC640; &#xBE44;&#xC2B7;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xB0BC; &#xC218; &#xC788;&#xC73C;&#xBA70;, <code>Paxos</code> &#xB9CC;&#xD07C;&#xC774;&#xB098; &#xD6A8;&#xC728;&#xC801;&#xC778; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC785;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; <code>Paxos</code> &#xBCF4;&#xB2E4;&#xB294; &#xB354; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC26C;&#xC6B4; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. <code>Raft</code> &#xC758; &#xC774;&#xD574;&#xB3C4;&#xB97C; &#xB192;&#xC774;&#xAE30; &#xC704;&#xD574;&#xC11C;, Raft &#xB294; &#xB9AC;&#xB354; &#xC120;&#xCD9C;, &#xB85C;&#xADF8; &#xBCF5;&#xC81C;, &#xC548;&#xC804;&#xACFC; &#xAC19;&#xC740; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xD575;&#xC2EC; &#xC694;&#xC18C;&#xB97C; &#xBD84;&#xB9AC;&#xD558;&#xACE0; &#xACE0;&#xB824;&#xD574;&#xC57C;&#xD558;&#xB294; &#xC0C1;&#xD0DC;&#xC758; &#xC218;&#xB97C; &#xC904;&#xC774;&#xAE30; &#xC704;&#xD574; &#xB354; &#xB192;&#xC740; &#xC218;&#xC900;&#xC758; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xC801;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Raft &#xB294; &#xB2E4;&#xB978; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998; (Oki, Liskov&#x2019;s Viewstamped Replication..)&#xACFC; &#xBE44;&#xC2B7;&#xD558;&#xC9C0;&#xB9CC;, &#xBA87;&#xAC00;&#xC9C0; &#xC8FC;&#xBAA9;&#xD560;&#xB9CC;&#xD55C; &#xAE30;&#xB2A5;&#xB4E4;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li><strong>Strong Leader : </strong>Raft &#xB294; &#xB2E4;&#xB978; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xBE44;&#xD574; &#xB354; &#xAC15;&#xB825;&#xD55C; &#xD615;&#xD0DC;&#xC758; &#xB9AC;&#xB354;&#xC2ED;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC790;&#xBA74; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xC624;&#xC9C1; leader &#xC5D0;&#xC11C; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB85C;&#xB9CC; &#xC804;&#xB2EC;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8; &#xAD00;&#xB9AC;&#xB97C; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xD558;&#xBA70;, Raft &#xB97C; &#xB354; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC26C;&#xC6B4; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC73C;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC90D;&#xB2C8;&#xB2E4;.</li><li><strong>Leader election : </strong>Raft&#xB294; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xAE30; &#xC704;&#xD574; &#xB79C;&#xB364;&#xD654;&#xB41C; &#xD0C0;&#xC774;&#xBA38;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB978; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C; &#xD544;&#xC694;&#xD55C; heaatbeat &#xC5D0; &#xC544;&#xC8FC; &#xC791;&#xC740; &#xBD80;&#xBD84;&#xB9CC; &#xCD94;&#xAC00;&#xD55C;&#xAC83;&#xC774;&#xACE0;, &#xBCF5;&#xC7A1;&#xC131;&#xC744; &#xC904;&#xC774;&#xACE0; &#xC2E0;&#xC18D;&#xD558;&#xAC8C; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xD569;&#xB2C8;&#xB2E4;. </li><li><strong>Membership changes : </strong>&#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC11C;&#xBC84; &#xC9D1;&#xD569;(set)&#xC744; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xC791;&#xB3D9; &#xBC29;&#xC2DD;&#xC740; &#xC0C8;&#xB85C;&#xC6B4; &#xBC29;&#xC2DD;&#xC758; <code>joint consensus</code> &#xBC29;&#xC2DD;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xB450; &#xAC1C;&#xC758; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xAD6C;&#xC131;&#xC774; &#xC804;&#xD658;&#xC911;&#xC774;&#xB354;&#xB77C;&#xB3C4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xAC00; &#xACC4;&#xC18D; &#xC815;&#xC0C1; &#xB3D9;&#xC791; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><h2 id="replicated-state-machine">Replicated state machine</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/ae5ad214-b866-47ad-923c-30b92cbe54c1.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="942" height="526" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/ae5ad214-b866-47ad-923c-30b92cbe54c1.png 600w, https://www.kimsehwan96.com/content/images/2024/04/ae5ad214-b866-47ad-923c-30b92cbe54c1.png 942w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Replicated state machine &#xC544;&#xD0A4;&#xD14D;&#xCC98;. &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC694;&#xCCAD;&#xD55C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0; command &#xB97C; &#xD3EC;&#xD568;&#xD55C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAD00;&#xB9AC;&#xD55C;&#xB2E4;. &#xC774; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC740; &#xB85C;&#xADF8;&#xB85C;&#xBD80;&#xD130; command &#xC2DC;&#xD000;&#xC2A4;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xACE0;, &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAC00;&#xC9C4; &#xBCF5;&#xC81C;&#xB41C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xB4E4;&#xC740; &#xB3D9;&#xC77C;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xC751;&#xB2F5; &#xD560; &#xC218; &#xC788;&#xB2E4;.</span></figcaption></figure><p>&#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; <code>Replicated state machine</code> &#xAC1C;&#xB150;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xCD9C;&#xBC1C;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC811;&#xADFC;&#xBC95;&#xC744; &#xD1B5;&#xD574; &#xC5EC;&#xB7EC; &#xC11C;&#xBC84;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC740; &#xBA85;&#xD655;&#xD558;&#xAC8C; &#xAC19;&#xC740; &#xC0C1;&#xD0DC;&#xB97C; &#xBCF5;&#xC81C;&#xD558;&#xACE0;, &#xC77C;&#xBD80; &#xC11C;&#xBC84;&#xAC00; &#xC911;&#xB2E8;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;.</p><p><code>Replicated state machine</code> &#xB294; &#xBD84;&#xC0B0; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C;&#xC758; &#xB2E4;&#xC591;&#xD55C; &#xB0B4;&#xACB0;&#xD568;&#xC131; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30;&#xC704;&#xD574; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. </p><p><code>Replicated state machine</code> &#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xAD6C;&#xD604;&#xB429;&#xB2C8;&#xB2E4;.(&#xC704; &#xC0AC;&#xC9C4; &#xCC38;&#xC870;)</p><p>&#xAC01; &#xC11C;&#xBC84;&#xB294; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC774; &#xC21C;&#xC11C;&#xD0DC;&#xB85C; &#xCC98;&#xB9AC;&#xD55C; &#xC77C;&#xB828;&#xC758; command &#xB97C; &#xD3EC;&#xD568;&#xD55C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAC16;&#xACE0; &#xC788;&#xACE0;. &#xAC01; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB294; &#xAC19;&#xC740; command &#xB97C; &#xAC19;&#xC740; &#xC21C;&#xC11C;&#xB85C; &#xAC16;&#xACE0; &#xC788;&#xC5B4;&#xC11C; &#xAC01; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC740; &#xAC19;&#xC740; command &#xB4E4;&#xC744; &#xAC19;&#xC740; &#xC21C;&#xC11C;&#xB85C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xAC01; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC740; &#xACB0;&#xC815;&#xB860;&#xC801;&#xC774;&#xBBC0;&#xB85C; &#xAC19;&#xC740; &#xC0C1;&#xD0DC;&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xACE0;, &#xAC19;&#xC740; &#xC21C;&#xC11C;&#xC758; &#xACB0;&#xACFC;&#xB4E4;&#xC744; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xACB0;&#xC815;&#xB860;&#xC801;(deterministic) / &#xACB0;&#xC815;&#xB860;&#xC801; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774;&#xB780; &#xC5B4;&#xB5A4; &#xD2B9;&#xC815;&#xD55C; &#xC785;&#xB825;(input)&#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xBA74; &#xD2B9;&#xC815;&#xD55C; (output)&#xC744; &#xBC18;&#xD658;&#xD558;&#xB294;&#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; Replicated state machine &#xC5D0;&#xC11C; &#xC5EC;&#xB7EC; &#xBCF5;&#xC81C;&#xB41C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xB4E4;&#xC774;, &#xB3D9;&#xC77C;&#xD55C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xD1A0;&#xB300;&#xB85C; &#xC751;&#xB2F5;&#xC744; &#xBC18;&#xD658;&#xD558;&#xAE30; &#xC704;&#xD574; &#xACC4;&#xC0B0;&#xD558;&#xBA74;, &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xC758; &#xB0B4;&#xC6A9;&#xC774; &#xBAA8;&#xB450; &#xAC19;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBAA8;&#xB450; &#xAC19;&#xC740; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658; &#xD560; &#xC218; &#xC788;&#xB294; &#xAC83;</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/fea6de91-648c-4ea6-8bc2-bd8f850d2ca6.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1349" height="628" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/fea6de91-648c-4ea6-8bc2-bd8f850d2ca6.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/fea6de91-648c-4ea6-8bc2-bd8f850d2ca6.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/fea6de91-648c-4ea6-8bc2-bd8f850d2ca6.png 1349w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xAC01; &#xC11C;&#xBC84;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xB4E4;&#xC740; &#xB3D9;&#xC77C;&#xD55C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8; (command &#xB97C; &#xD3EC;&#xD568;&#xD55C;)&#xB97C; &#xAC16;&#xACE0;&#xC788;&#xB2E4;. &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC694;&#xCCAD;&#xC5D0; &#xB3D9;&#xC77C;&#xD55C; &#xC751;&#xB2F5;&#xC744; &#xC904; &#xC218; &#xC788;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/1b9671ea-aa50-45d3-b59f-4c1a135db478.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1349" height="628" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/1b9671ea-aa50-45d3-b59f-4c1a135db478.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/1b9671ea-aa50-45d3-b59f-4c1a135db478.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/1b9671ea-aa50-45d3-b59f-4c1a135db478.png 1349w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Client &#xAC00; z &#x2190; x &#xB77C;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; command &#xB97C; &#xC694;&#xCCAD;&#xD560; &#xB54C; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0; z &#x2190; x &#xB97C; &#xAE30;&#xB85D;&#xD55C;&#xB2E4;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/e25b5eca-61f1-4da9-a0b7-4612fb83434b.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1349" height="628" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/e25b5eca-61f1-4da9-a0b7-4612fb83434b.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/e25b5eca-61f1-4da9-a0b7-4612fb83434b.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/e25b5eca-61f1-4da9-a0b7-4612fb83434b.png 1349w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xD6C4; Consensus &#xBAA8;&#xB4C8;&#xC740; &#xC774; &#xAE30;&#xB85D;(&#xB85C;&#xADF8;)&#xB97C; &#xBAA8;&#xB4E0; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xBCF5;&#xC81C;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/eb611ff5-c728-4d68-8a07-4311790b5ccc.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1349" height="628" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/eb611ff5-c728-4d68-8a07-4311790b5ccc.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/eb611ff5-c728-4d68-8a07-4311790b5ccc.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/eb611ff5-c728-4d68-8a07-4311790b5ccc.png 1349w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xD6C4;&#xC5D0; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC774; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;. </span></figcaption></figure><p>&#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xC77C;&#xAD00;&#xC131; &#xC788;&#xAC8C; &#xC720;&#xC9C0;&#xD558;&#xB294;&#xAC83;&#xC774; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xD558;&#xB294; &#xC77C;&#xC785;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84;&#xC5D0; &#xC788;&#xB294; &#xD569;&#xC758; &#xBAA8;&#xB4C8;(Consensus Module) &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB85C;&#xBD80;&#xD130; command&#xB97C; &#xC218;&#xC2E0;&#xD558;&#xACE0;, &#xADF8;&#xAC83;&#xC744; log &#xC5D0; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xD569;&#xC758; &#xBAA8;&#xB4C8;&#xC740; &#xC774;&#xB8F9; &#xC11C;&#xBC84;&#xAC00; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE30;&#xB354;&#xB77C;&#xB3C4; &#xBAA8;&#xB4E0; &#xB85C;&#xADF8;&#xAC00; &#xAC19;&#xC740; &#xC694;&#xCCAD;&#xC744; &#xAC19;&#xC740; &#xC21C;&#xC11C;&#xB85C; &#xC800;&#xC7A5;&#xD558;&#xB3C4;&#xB85D; &#xBCF4;&#xC7A5;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xC5D0; &#xC788;&#xB294; &#xD569;&#xC758;&#xBAA8;&#xB4C8;&#xACFC; &#xD1B5;&#xC2E0;&#xD569;&#xB2C8;&#xB2E4;. </p><p>command&#xB4E4;&#xC774; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xBCF5;&#xC81C;&#xB418;&#xC5C8;&#xB2E4;&#xBA74;(&#xB85C;&#xADF8;&#xB85C; &#xC798; &#xC313;&#xC600;&#xB2E4;&#xBA74;) &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC740; &#xB85C;&#xADF8;&#xB97C; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB418;&#xACE0;, &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC758; &#xC694;&#xCCAD;&#xC5D0;&#xB300;&#xD55C; &#xACB0;&#xACFC;&#xB294; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xC11C;&#xBC84;&#xB4E4;&#xC740; &#xD558;&#xB098;&#xC758; &#xB9E4;&#xC6B0; &#xC548;&#xC815;&#xC801;&#xC778; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xCC98;&#xB7FC; &#xBCF4;&#xC774;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. (&#xC5B4;&#xB5A4; &#xC11C;&#xBC84;&#xC5D0; &#xC694;&#xCCAD;&#xC744; &#xD574;&#xB3C4; &#xB3D9;&#xC77C;&#xD55C; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xC73C;&#xB2C8;&#xAE4C;, &#xAC8C;&#xB2E4;&#xAC00; &#xADF8; &#xC11C;&#xBC84;&#xB4E4;&#xC911; &#xBA87;&#xAC1C;&#xAC00; &#xC8FD;&#xB354;&#xB77C;&#xB3C4; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC73C;&#xB2C8;&#xAE4C;)</p><p>&#xC2E4;&#xC81C; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xC704;&#xD55C; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xC544;&#xB798;&#xACFC; &#xAC19;&#xC740; &#xC18D;&#xC131;&#xC744; &#xAC16;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB51C;&#xB808;&#xC774;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD328;&#xD0B7; &#xC720;&#xC2E4; &#xACFC; &#xAC19;&#xC740; &#xBAA8;&#xB4E0; &#xBE44;&#xC794;&#xD2F4; &#xC7A5;&#xC560; &#xC870;&#xAC74;&#xC774; &#xC544;&#xB2CC; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xACB0;&#xD568;&#xC774; &#xC5C6;&#xC5B4;&#xC57C;(safety &#xD574;&#xC57C;)&#xD569;&#xB2C8;&#xB2E4;. </li><li>&#xC11C;&#xBC84;&#xC758; &#xB300;&#xBD80;&#xBD84;&#xC774; &#xC791;&#xB3D9;&#xD558;&#xACE0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC11C;&#xB85C; &#xD1B5;&#xC2E0; &#xD560; &#xC218; &#xC788;&#xB294; &#xD55C; &#xAE30;&#xB2A5;&#xC801;&#xC73C;&#xB85C; &#xC644;&#xBCBD;&#xD788; &#xB3D9;&#xC791;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xC77C;&#xBC18;&#xC801;&#xC778; 5&#xB300;&#xC758; &#xC11C;&#xBC84;&#xB85C; &#xAD6C;&#xC131;&#xB41C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xC5B4;&#xB5A4; &#xC11C;&#xBC84;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xB4E0; 2&#xAC1C;&#xC758; &#xC11C;&#xBC84;&#xAE4C;&#xC9C0; &#xC7A5;&#xC560;&#xB294; &#xACAC;&#xB38C; &#xB0BC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84;&#xB294; &#xC911;&#xC9C0;&#xB428;&#xC73C;&#xB85C;&#xC368; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xAC00;&#xC815;&#xB418;&#xACE0;, &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C; &#xC11C;&#xBC84;&#xB4E4;&#xC740; &#xCD94;&#xD6C4;&#xC5D0; &#xC548;&#xC815;&#xC801;&#xC778; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xC5D0;&#xC11C; &#xC0C1;&#xD0DC;&#xB97C; &#xBCF5;&#xAD6C;&#xD558;&#xACE0;, &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xB2E4;&#xC2DC; join &#xD560; &#xC218; &#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </li><li>&#xB85C;&#xADF8;&#xC758; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD0C0;&#xC774;&#xBC0D;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xACE0;&#xC7A5;&#xB09C; &#xD074;&#xB7ED;&#xACFC; &#xC2EC;&#xAC01;&#xD55C; &#xBA54;&#xC2DC;&#xC9C0;&#xC758; &#xC9C0;&#xC5F0;&#xC740; &#xC2EC;&#xAC01;&#xD55C; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xAC00;&#xC6A9;&#xC131; &#xBB38;&#xC81C;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xACFC;&#xBC18;&#xC218;&#xAC00; &#xB2E8;&#xC77C; RPC &#xD638;&#xCD9C;&#xC5D0; &#xC751;&#xB2F5;&#xD558;&#xBA74; command&#xB97C; &#xC644;&#xB8CC; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC18C;&#xC218;&#xC758; &#xB290;&#xB9B0; &#xC11C;&#xBC84;&#xAC00; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC804;&#xCCB4; &#xC131;&#xB2A5;&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE58;&#xC9C0; &#xC54A;&#xC544;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li></ul><h2 id="%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%84%A4%EA%B3%84">&#xC774;&#xD574;&#xD558;&#xAE30; &#xC27D;&#xAC8C; &#xC124;&#xACC4;</h2><p>Raft &#xB97C; &#xC124;&#xACC4;&#xD560; &#xB54C; &#xBA87;&#xAC00;&#xC9C0; &#xBAA9;&#xD45C;&#xAC00; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p> &#xD558;&#xB098;&#xB294; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC774; &#xC124;&#xACC4;&#xB97C; &#xD558;&#xB294;&#xB370; &#xC2DC;&#xAC04;&#xC744; &#xD655;&#xC2E4;&#xD788; &#xC904;&#xC77C; &#xC218; &#xC788;&#xB3C4;&#xB85D;, &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB9CC;&#xB4E4;&#xAE30; &#xC704;&#xD55C; &#xC644;&#xBCBD;&#xD558;&#xACE0; &#xC2E4;&#xC9C8;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xAE30;&#xCD08;(&#xBF08;&#xB300;)&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xAC83;&#xC774;&#xC600;&#xACE0;, &#xB2E4;&#xB978; &#xD558;&#xB098;&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xC6B4;&#xC601; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xBA74;&#xC11C;, &#xBAA8;&#xB4E0; &#xC870;&#xAC74;&#xC5D0;&#xC11C; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xB3D9;&#xC791;&#xD558;&#xACE0;, &#xD2B9;&#xC815;&#xD55C; &#xC870;&#xAC74;&#xC758; &#xC6B4;&#xC601; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB3C4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xB294;&#xAC83;&#xC774; &#xBAA9;&#xD45C;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xAC00;&#xC7A5; &#xD070; &#xBAA9;&#xD45C;&#xB294; (&#xADF8;&#xB9AC;&#xACE0; &#xC81C;&#xC77C; &#xC5B4;&#xB824;&#xC6E0;&#xB358;) &#xBC14;&#xB85C; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC27D;&#xAC8C; &#xB9CC;&#xB4E4;&#xAE30;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB9CE;&#xC740; &#xCCAD;&#xC911;&#xB4E4;&#xC774; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD3B8;&#xC548;&#xD558;&#xAC8C; &#xC774;&#xD574;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC57C; &#xD588;&#xACE0;, &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xAD6C;&#xCD95;&#xD558;&#xB824;&#xB294; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xC2E4;&#xC81C; &#xAD6C;&#xD604;&#xC5D0;&#xC11C; &#xBD88;&#xAC00;&#xD53C;&#xD558;&#xC9C0;&#xB9CC; &#xD544;&#xC694;&#xD55C; &#xD655;&#xC7A5;&#xC744; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D;, &#xC774; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xB300;&#xD55C; &#xC9C1;&#xAD00;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC57C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xACB0;&#xB860;&#xC801;&#xC73C;&#xB85C; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC124;&#xACC4;&#xD558;&#xBA74;&#xC11C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xB450;&#xAC00;&#xC9C0; &#xAE30;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xB370;.</p><ol><li>Problem decomposition (&#xBB38;&#xC81C; &#xBD84;&#xD574;) : Raft &#xC758; &#xC124;&#xACC4;&#xC5D0;&#xC11C; &#xBCF5;&#xC7A1;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xB354; &#xC791;&#xACE0; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xC124;&#xBA85;&#xD558;&#xACE0; &#xD574;&#xACB0; &#xD560; &#xC218; &#xC788;&#xB294; &#xBD80;&#xBD84;&#xB4E4;&#xB85C; &#xB098;&#xB204;&#xC5B4; &#xC811;&#xADFC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C; &#xB9AC;&#xB354; &#xC120;&#xCD9C;, &#xB85C;&#xADF8; &#xBCF5;&#xC81C;, &#xC548;&#xC815;&#xC131; &#xAC80;&#xC99D;, &#xBA64;&#xBC84;&#xC2ED; &#xBCC0;&#xACBD;&#xB4F1;&#xACFC; &#xAC19;&#xC740; &#xBD80;&#xBD84;&#xC744; &#xBCC4;&#xB3C4;&#xC758; &#xAD6C;&#xC131;&#xC694;&#xC18C;(&#xBB38;&#xC81C;)&#xB85C; &#xBD84;&#xD574;&#xD574;&#xC11C; &#xC124;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;.</li><li>Smplify the state space (&#xC0C1;&#xD0DC; &#xACF5;&#xAC04; &#xB2E8;&#xC21C;&#xD654;): &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xB294; &#xAC00;&#xB2A5;&#xD55C; &#xC0C1;&#xD0DC;&#xC758; &#xC218;&#xB97C; &#xC904;&#xC784;&#xC73C;&#xB85C;&#xC368; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB354; &#xC77C;&#xAD00;&#xC131; &#xC788;&#xAC8C; &#xB9CC;&#xB4E4;&#xACE0; &#xBE44;&#xACB0;&#xC815;&#xC131;(nondeterminism)&#xC744; &#xAC00;&#xB2A5;&#xD55C;&#xD55C; &#xC81C;&#xAC70;&#xD569;&#xB2C8;&#xB2E4;. </li></ol><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C; &#xB85C;&#xADF8;&#xB294; &#xBE44;&#xC5B4;&#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC800;&#xC7A5;&#xD560; &#xC218; &#xC5C6;&#xACE0; Raft&#xB294; &#xB85C;&#xADF8;&#xB4E4;&#xC774; &#xC11C;&#xB85C; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xC791;&#xC5C5;/&#xBC29;&#xBC95;&#xC744; &#xC81C;&#xD55C;&#xD569;&#xB2C8;&#xB2E4;.</p><p> &#xD558;&#xC9C0;&#xB9CC; &#xAC00;&#xB054;&#xC740; &#xBE44;&#xACB0;&#xC815;&#xC131;&#xC774; &#xC774;&#xD574;&#xB3C4;&#xB97C; &#xB354; &#xB192;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xB294;&#xB370;. &#xC608;&#xB97C;&#xB4E4;&#xC790;&#xBA74; &#xBB34;&#xC791;&#xC704;&#xD654;(Randomization)&#xAC00; &#xADF8;&#xB7AC;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xBB34;&#xC791;&#xC704;&#xD654;&#xB294; &#xBE44;&#xACB0;&#xC815;&#xC131;&#xC744; &#xC624;&#xD788;&#xB824; &#xB3C4;&#xC785;&#xD558;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC;, &#xBAA8;&#xB4E0; &#xAC00;&#xB2A5;&#xD55C; &#xC120;&#xD0DD;&#xC744; &#xBE44;&#xC2B7;&#xD55C; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC624;&#xD788;&#xB824; &#xC0C1;&#xD0DC;&#xACF5;&#xAC04;&#xC744; &#xC904;&#xC77C; &#xC218; &#xC788;&#xC5C8;&#xB294;&#xB370;.(&#xC544;&#xBB34;&#xAC70;&#xB098; &#xC120;&#xD0DD;&#xD574;&#xB3C4; &#xC0C1;&#xAD00; &#xC5C6;&#xB2E4; &#xB77C;&#xB294; &#xAD00;&#xC810;) Raft &#xC758; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C;&#xC758; &#xBB34;&#xC791;&#xC704;&#xD654;&#xAC00; &#xC0C1;&#xD0DC;&#xACF5;&#xAC04;&#xC744; &#xC904;&#xC77C; &#xC218; &#xC788;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/1c42ecdb-6f2b-4d9a-9eea-7b6a73ead6c4.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1800" height="2155" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/1c42ecdb-6f2b-4d9a-9eea-7b6a73ead6c4.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/1c42ecdb-6f2b-4d9a-9eea-7b6a73ead6c4.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/04/1c42ecdb-6f2b-4d9a-9eea-7b6a73ead6c4.png 1600w, https://www.kimsehwan96.com/content/images/2024/04/1c42ecdb-6f2b-4d9a-9eea-7b6a73ead6c4.png 1800w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xBA64;&#xBC84;&#xC2ED; &#xBCC0;&#xACBD;&#xACFC; &#xB85C;&#xADF8; &#xC555;&#xCD95;&#xC744; &#xC81C;&#xC678;&#xD55C; Raft &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC694;&#xC57D;. </span></figcaption></figure><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">&#xBA64;&#xBC84;&#xC2ED; &#xBCC0;&#xACBD;&#xACFC; &#xB85C;&#xADF8; &#xC555;&#xCD95;&#xC744; &#xC81C;&#xC678;&#xD55C; Raft &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC694;&#xC57D; &#xBC88;&#xC5ED;</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">&#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC720;&#xC9C0;&#xB418;&#xB294; &#xC601;&#xC18D;&#xC801; &#xC0C1;&#xD0DC; (RPC &#xC751;&#xB2F5; &#xC774;&#xC804;&#xC5D0; &#xC548;&#xC815;&#xC801;&#xC778; &#xC800;&#xC7A5;&#xACF5;&#xAC04;&#xC5D0; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB418;&#xB294; &#xC0C1;&#xD0DC;)</span></p><ul><li value="1"><span style="white-space: pre-wrap;">currentTerm: &#xC11C;&#xBC84;&#xAC00; &#xBCF8; &#xCD5C;&#xC2E0; &#xC784;&#xAE30; (0&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xACE0; &#xB2E8;&#xC870;&#xB86D;&#xAC8C; &#xC99D;&#xAC00;)</span></li><li value="2"><span style="white-space: pre-wrap;">votedFor: &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xC5D0; &#xD22C;&#xD45C;&#xD55C; &#xD6C4;&#xBCF4; (null&#xC774;&#xBA74; &#xD22C;&#xD45C;&#xD558;&#xC9C0; &#xC54A;&#xC74C;)</span></li><li value="3"><span style="white-space: pre-wrap;">log[]: &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;; &#xAC01; &#xD56D;&#xBAA9;&#xC740; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0; &#xBA85;&#xB839;&#xACFC; &#xADF8;&#xAC83;&#xC744; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; &#xBC1B;&#xC740; &#xC784;&#xAE30;&#xB97C; &#xD3EC;&#xD568; (&#xCCAB; &#xC778;&#xB371;&#xC2A4;&#xB294; 1)</span></li></ul><p><b><strong style="white-space: pre-wrap;">&#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0;&#xC11C;&#xC758; &#xD718;&#xBC1C;&#xC131; &#xC0C1;&#xD0DC;</strong></b></p><ul><li value="1"><span style="white-space: pre-wrap;">commitIndex: &#xC54C;&#xB824;&#xC9C4; &#xB85C;&#xADF8; &#xD56D;&#xBAA9; &#xC911; &#xCEE4;&#xBC0B;&#xB41C; &#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xB824;&#xC9C4; &#xCD5C;&#xC2E0; &#xC778;&#xB371;&#xC2A4; (0&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xACE0; &#xB2E8;&#xC870;&#xB86D;&#xAC8C; &#xC99D;&#xAC00;)</span></li><li value="2"><span style="white-space: pre-wrap;">lastApplied: &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; &#xC801;&#xC6A9;&#xB41C; &#xB85C;&#xADF8;&#xC758; &#xCD5C;&#xC2E0; &#xC778;&#xB371;&#xC2A4; (0&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xACE0; &#xB2E8;&#xC870;&#xB86D;&#xAC8C; &#xC99D;&#xAC00;)</span></li></ul><p><b><strong style="white-space: pre-wrap;">&#xC120;&#xAC70; &#xD6C4;&#xC5D0; &#xC7AC;&#xCD08;&#xAE30;&#xD654;&#xB418;&#xB294; &#xD718;&#xBC1C;&#xC131; &#xC0C1;&#xD0DC;</strong></b></p><ul><li value="1"><span style="white-space: pre-wrap;">nextIndex[]: &#xB2E4;&#xC74C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4;&#xB97C; &#xAC01; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0BC; &#xB54C; (&#xB9AC;&#xB354;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xACE0; &#xAC01; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD574; 1&#xB85C; &#xC124;&#xC815;)</span></li><li value="2"><span style="white-space: pre-wrap;">matchIndex[]: &#xAC01; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xBCF5;&#xC81C;&#xB41C; &#xAC00;&#xC7A5; &#xB192;&#xC740; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4; (0&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xACE0; &#xB2E8;&#xC870;&#xB86D;&#xAC8C; &#xC99D;&#xAC00;)</span></li></ul><p><span style="white-space: pre-wrap;">RequestVote RPC</span></p><p><span style="white-space: pre-wrap;">&#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC5D0; &#xB300;&#xD55C; &#xD45C;&#xB97C; &#xBAA8;&#xC73C;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xD638;&#xCD9C;</span></p><p><span style="white-space: pre-wrap;">&#xC778;&#xC790;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">term: &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xC784;&#xAE30;</span></li><li value="2"><span style="white-space: pre-wrap;">candidateId: &#xD22C;&#xD45C;&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xC544;&#xC774;&#xB514;</span></li><li value="3"><span style="white-space: pre-wrap;">lastLogIndex: &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4;</span></li><li value="4"><span style="white-space: pre-wrap;">lastLogTerm: &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC784;&#xAE30;</span></li></ul><p><span style="white-space: pre-wrap;">&#xC751;&#xB2F5;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">term: &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD604;&#xC7AC; &#xC784;&#xAE30;</span></li><li value="2"><span style="white-space: pre-wrap;">voteGranted: &#xD6C4;&#xBCF4;&#xC790;&#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xAC00; &#xB418;&#xC5C8;&#xC73C;&#xBA74; true</span></li></ul><p><span style="white-space: pre-wrap;">&#xC218;&#xC2E0;&#xD558;&#xB294;&#xCABD;&#xC758; &#xAD6C;&#xD604;</span></p><ol><li value="1"><span style="white-space: pre-wrap;">&#xD604;&#xC7AC; &#xC784;&#xAE30;&#xAC00; &#xC778;&#xC790;&#xC758; &#xC784;&#xAE30;&#xBCF4;&#xB2E4; &#xD06C;&#xAC70;&#xB098; &#xC774;&#xBBF8; &#xD22C;&#xD45C;&#xD55C; &#xACBD;&#xC6B0; &#xAC70;&#xC9D3;&#xC73C;&#xB85C; &#xC751;&#xB2F5;</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB85C;&#xADF8;&#xAC00; &#xCD5C;&#xC18C;&#xD55C; &#xC218;&#xC2E0;&#xC790;&#xC758; &#xB85C;&#xADF8;&#xB9CC;&#xD07C; &#xCD5C;&#xC2E0;&#xC774;&#xB77C;&#xBA74; true&#xB85C; &#xD22C;&#xD45C;</span></li></ol><p><span style="white-space: pre-wrap;">AppendEntries RPC</span></p><p><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xAC00; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xBCF5;&#xC81C;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xD638;&#xCD9C; + &#xD558;&#xD2B8;&#xBE44;&#xD2B8;&#xB85C; &#xC0AC;&#xC6A9;&#xB428;</span></p><p><span style="white-space: pre-wrap;">&#xC778;&#xC790;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">term: &#xB9AC;&#xB354;&#xC758; &#xC784;&#xAE30;</span></li><li value="2"><span style="white-space: pre-wrap;">prevLogIndex: &#xC774;&#xC804; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4;</span></li><li value="3"><span style="white-space: pre-wrap;">prevLogTerm: &#xC774;&#xC804; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC784;&#xAE30;</span></li><li value="4"><span style="white-space: pre-wrap;">entries[]: &#xBCF5;&#xC81C;&#xD560; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4; (&#xD558;&#xD2B8;&#xBE44;&#xD2B8;&#xC5D0;&#xB294; &#xBE44;&#xC5B4;&#xC788;&#xC744; &#xC218; &#xC788;&#xC74C;)</span></li><li value="5"><span style="white-space: pre-wrap;">leaderCommit: &#xB9AC;&#xB354;&#xC758; commitIndex</span></li></ul><p><span style="white-space: pre-wrap;">&#xC751;&#xB2F5;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">term: &#xC218;&#xC2E0;&#xC790;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD604;&#xC7AC; &#xC784;&#xAE30;</span></li><li value="2"><span style="white-space: pre-wrap;">success: &#xC218;&#xC2E0;&#xC790;&#xAC00; prevLogIndex&#xC640; prevLogTerm&#xC744; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xD56D;&#xBAA9;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;&#xBA74; true</span></li></ul><p><span style="white-space: pre-wrap;">&#xC218;&#xC2E0;&#xCABD; &#xAD6C;&#xD604;</span></p><ol><li value="1"><span style="white-space: pre-wrap;">&#xC778;&#xC790;&#xC758; &#xC784;&#xAE30;&#xBCF4;&#xB2E4; &#xD604;&#xC7AC;&#xC758; &#xC784;&#xAE30;&#xAC00; &#xD06C;&#xB2E4;&#xBA74; false &#xB85C; &#xC751;&#xB2F5;. (&#xC774;&#xAC78; &#xD638;&#xCD9C;&#xD55C; &#xB9AC;&#xB354;&#xB294; &#xC784;&#xAE30;&#xAC00; &#xCD5C;&#xC2E0;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xB9AC;&#xB354;&#xC758; &#xC790;&#xACA9;&#xC774; &#xC5C6;&#xC73C;&#xB2C8;&#xAE4C;)</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xB85C;&#xADF8;&#xAC00; prevLogIndex&#xC5D0;&#xC11C; prevLogTerm&#xACFC; &#xC77C;&#xCE58;&#xD558;&#xB294; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC9C0; &#xC54A;&#xB2E4;&#xBA74; &#xAC70;&#xC9D3;&#xC744; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;</span></li><li value="3"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xAE30;&#xC874; &#xD56D;&#xBAA9;&#xC774; &#xC0C8; &#xD56D;&#xBAA9;&#xACFC; &#xCDA9;&#xB3CC;&#xD55C;&#xB2E4;&#xBA74; (&#xAC19;&#xC740; &#xC778;&#xB371;&#xC2A4;&#xC774;&#xC9C0;&#xB9CC; &#xB2E4;&#xB978; &#xC784;&#xAE30;), &#xAE30;&#xC874; &#xD56D;&#xBAA9;&#xACFC; &#xADF8; &#xB4A4;&#xC758; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC744; &#xC0AD;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;</span></li><li value="4"><span style="white-space: pre-wrap;">&#xB85C;&#xADF8;&#xC5D0; &#xC544;&#xC9C1; &#xC5C6;&#xB294; &#xC0C8; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;</span></li><li value="5"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; leaderCommit&#xC774; commitIndex&#xBCF4;&#xB2E4; &#xD06C;&#xB2E4;&#xBA74;, commitIndex&#xB97C; min(leaderCommit, &#xB9C8;&#xC9C0;&#xB9C9; &#xC0C8; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4;)&#xB85C; &#xC124;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</span></li></ol><p><span style="white-space: pre-wrap;">Rules for Servers&#xBAA8;&#xB4E0; &#xC11C;&#xBC84;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; commitIndex &gt; lastApplied&#xC774;&#xBA74;: lastApplied&#xB97C; &#xC99D;&#xAC00;&#xC2DC;&#xD0A4;&#xACE0;, &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; log[lastApplied]&#xB97C; &#xC801;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; RPC &#xC694;&#xCCAD; &#xB610;&#xB294; &#xC751;&#xB2F5;&#xC774; currentTerm&#xBCF4;&#xB2E4; &#xD070; T&#xB77C;&#xB294; &#xC784;&#xAE30;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xB2E4;&#xBA74;: currentTerm&#xC744; T&#xB85C; &#xC124;&#xC815;&#xD558;&#xACE0;, &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;</span></li></ul><p><span style="white-space: pre-wrap;">&#xD314;&#xB85C;&#xC6CC;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">&#xD6C4;&#xBCF4;&#xC790;&#xC640; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; &#xC628; RPC&#xC5D0; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xC120;&#xAC70;&#xB97C; &#xC704;&#xD55C; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC774; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; AppendEntries RPC(Heatbeat)&#xB97C; &#xBC1B;&#xC9C0; &#xC54A;&#xC740; &#xC0C1;&#xD0DC;&#xB85C; &#xC9C0;&#xB098;&#xAC00;&#xAC70;&#xB098;, &#xD6C4;&#xBCF4;&#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xC0C1;&#xD0DC;&#xB77C;&#xBA74; &#xD6C4;&#xBCF4; &#xC0C1;&#xD0DC;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</span></li></ul><p><span style="white-space: pre-wrap;">&#xD6C4;&#xBCF4;&#xC790;(Candidate)</span></p><ul><li value="1"><span style="white-space: pre-wrap;">&#xD6C4;&#xBCF4;&#xC790;&#xB85C; &#xC804;&#xD658;&#xD558;&#xBA74;, &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;:</span></li><li value="2" class="!list-none"><ul><li value="1"><span style="white-space: pre-wrap;">currentTerm&#xC744; &#xC99D;&#xAC00;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;.</span></li><li value="2"><span style="white-space: pre-wrap;">&#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="3"><span style="white-space: pre-wrap;">&#xC120;&#xAC70; &#xD0C0;&#xC774;&#xBA38;&#xB97C; &#xC7AC;&#xC124;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="4"><span style="white-space: pre-wrap;">&#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; RequestVote RPC&#xB97C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;.</span></li></ul></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xC11C;&#xBC84;&#xC758; &#xACFC;&#xBC18;&#xC218;&#xB85C;&#xBD80;&#xD130; &#xD45C;&#xB97C; &#xBC1B;&#xC73C;&#xBA74;: &#xB9AC;&#xB354;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;.</span></li><li value="3"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; AppendEntries RPC&#xB97C; &#xBC1B;&#xC73C;&#xBA74;: &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="4"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xC120;&#xAC70; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC774; &#xC9C0;&#xB098;&#xBA74;: &#xC0C8;&#xB85C;&#xC6B4; &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</span></li></ul><p><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;</span></p><ul><li value="1"><span style="white-space: pre-wrap;">&#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC;&#xD55C; &#xD6C4;: &#xAC01; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xCD08;&#xAE30; &#xBE48; AppendEntries RPC (&#xD558;&#xD2B8;&#xBE44;&#xD2B8;)&#xB97C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;; &#xC720;&#xD734; &#xC2DC;&#xAC04; &#xB3D9;&#xC548; &#xC774;&#xB97C; &#xBC18;&#xBCF5;&#xD558;&#xC5EC; &#xC120;&#xAC70; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB85C;&#xBD80;&#xD130; &#xBA85;&#xB839;&#xC744; &#xBC1B;&#xC558;&#xB2E4;&#xBA74;: &#xB85C;&#xCEEC; &#xB85C;&#xADF8;&#xC5D0; &#xD56D;&#xBAA9;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xACE0;, &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; &#xD56D;&#xBAA9;&#xC774; &#xC801;&#xC6A9;&#xB41C; &#xD6C4;&#xC5D0; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="3"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4; &gt; &#xD314;&#xB85C;&#xC6CC;&#xC758; nextIndex&#xB77C;&#xBA74;: nextIndex&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD558;&#xB294; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xACFC; &#xD568;&#xAED8; AppendEntries RPC&#xB97C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;.</span></li><li value="4" class="!list-none"><ul><li value="1"><span style="white-space: pre-wrap;">&#xC131;&#xACF5;&#xC801;&#xC774;&#xBA74;: &#xD314;&#xB85C;&#xC6CC;&#xC5D0; &#xB300;&#xD55C; nextIndex&#xC640; matchIndex&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD569;&#xB2C8;&#xB2E4;.</span></li><li value="2"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xB85C;&#xADF8; &#xBD88;&#xC77C;&#xCE58;&#xB85C; &#xC778;&#xD574; AppendEntries&#xAC00; &#xC2E4;&#xD328;&#xD55C;&#xB2E4;&#xBA74;: nextIndex&#xB97C; &#xAC10;&#xC18C;&#xC2DC;&#xD0A4;&#xACE0; &#xB2E4;&#xC2DC; &#xC2DC;&#xB3C4;&#xD569;&#xB2C8;&#xB2E4;.</span></li></ul></li><li value="4"><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; N&#xC774;&#xB77C;&#xB294; &#xC218;&#xAC00; &#xC788;&#xC5B4;&#xC11C; N &gt; commitIndex&#xC774;&#xACE0;, &#xACFC;&#xBC18;&#xC218;&#xC758; matchIndex[i] &gt;= N&#xC774;&#xACE0;, log[N].term == currentTerm&#xC774;&#xB77C;&#xBA74;: commitIndex&#xB97C; N&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</span></li></ul></div>
        </div><p>Raft&#xB294; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC785;&#xB2C8;&#xB2E4;. &#xC6B0;&#xC120; Raft&#xB294; &#xD558;&#xB098;&#xC758; &#xB2E8;&#xC77C; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xACE0;, &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB4E4;&#xC744; &#xAD00;&#xB9AC;&#xD560; &#xCC45;&#xC784;&#xC744; &#xC8FC;&#xB294;&#xAC83;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xAD6C;&#xD604;&#xC744; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB85C;&#xBD80;&#xD130;&#xC758; &#xB85C;&#xADF8; &#xC0DD;&#xC131;&#xC744; &#xD5C8;&#xC6A9;&#xD558;&#xACE0;, &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0;&#xAC8C; &#xB85C;&#xADF8;&#xB97C; &#xBCF5;&#xC81C;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;, &#xADF8;&#xB9AC;&#xACE0; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; &#xC5B8;&#xC81C; &#xB85C;&#xADF8; &#xC0DD;&#xC131;&#xC744; &#xC801;&#xC6A9;&#xD574;&#xC57C; &#xC548;&#xC804;&#xD55C;&#xC9C0;&#xB3C4; &#xC804;&#xB2EC;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294;&#xAC83;&#xC744; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xB9CC;&#xB4ED;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4; &#xB9AC;&#xB354;&#xB294; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xACFC; &#xC758;&#xACAC;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xC744; &#xD544;&#xC694; &#xC5C6;&#xC774; &#xC0C8;&#xB85C;&#xC6B4; &#xB85C;&#xADF8; &#xC0DD;&#xC131;&#xC744; &#xC5B8;&#xC81C;, &#xC5B4;&#xB514;&#xC5D0; &#xD574;&#xC57C;&#xD560;&#xC9C0; &#xC815;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB530;&#xB77C;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB294; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB85C; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xD750;&#xB974;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xAC00; &#xC2E4;&#xD328;&#xD558;&#xAC70;&#xB098; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xACFC;&#xC758; &#xC5F0;&#xACB0;&#xC774; &#xB04A;&#xC5B4; &#xC9C8; &#xC218; &#xC788;&#xB294;&#xB370; &#xC774; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xAC00; &#xC120;&#xCD9C;&#xB429;&#xB2C8;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC815;&#xB9AC;&#xD558;&#xC790;&#xBA74;, &#xC0C8;&#xB85C;&#xC6B4; &#xB85C;&#xADF8; &#xD56D;&#xBAA9; (etcd &#xC5D0;&#xC11C;&#xB294; etcd put &#xB3D9;&#xC791;)&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC740; &#xC624;&#xC9C1; &#xB9AC;&#xB354;&#xB9CC;&#xC774; &#xAD00;&#xC5EC;&#xD558;&#xACE0;, &#xB9AC;&#xB354;&#xAC00; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0;&#xAC8C; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xBAA8;&#xB4E0; &#xCC45;&#xC784;&#xC744; &#xAC16;&#xB294;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xC5D0; &#xB530;&#xB77C; etcd &#xC5D0;&#xC11C;<code spellcheck="false" style="white-space: pre-wrap;">put</code> &#xACFC; &#xAC19;&#xC740; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0C8;&#xB85C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC744; &#xD314;&#xB85C;&#xC6CC; etcd &#xBA64;&#xBC84;&#xAC00; &#xBC1B;&#xB354;&#xB77C;&#xB3C4; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xC774;&#xC720;&#xAC00; &#xBC14;&#xB85C; &#xC774;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</div></div><p>&#xC774;&#xB7EC;&#xD55C; &#xC811;&#xADFC;&#xBC95;&#xC744; &#xD1B5;&#xD574; Raft &#xB294; &#xD569;&#xC758; &#xBB38;&#xC81C;&#xB97C; &#xC544;&#xB798;&#xC640;&#xAC19;&#xC740; &#xC138;&#xAC1C;&#xC758; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xD558;&#xC704; &#xBB38;&#xC81C;&#xB85C; &#xBD84;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. </p><ul><li>&#xB9AC;&#xB354; &#xC120;&#xCD9C; : &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xB294; &#xAE30;&#xC874;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xC2E4;&#xD328;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xC120;&#xCD9C;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xB85C;&#xADF8; &#xBCF5;&#xC81C; : &#xB9AC;&#xB354;&#xB9CC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xB85C;&#xADF8; &#xC0DD;&#xC131;&#xC744; &#xD5C8;&#xC6A9;&#xD558;&#xACE0; &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xAC70;&#xCCD0; &#xB85C;&#xADF8;&#xB97C; &#xBCF5;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xB2E4;&#xB978; &#xB85C;&#xADF8;&#xB4E4;&#xC774; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC640; &#xC77C;&#xCE58;&#xD558;&#xB3C4;&#xB85D; &#xAC15;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xC548;&#xC815;&#xC131; : Raft&#xC5D0; &#xC788;&#xC5B4;&#xC11C; &#xD575;&#xC2EC;&#xC801;&#xC778; &#xC548;&#xC815;&#xC131;&#xC740; &#xBC14;&#xB85C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC774;&#xB77C;&#xB294; &#xC810;&#xC778;&#xB370;, &#xB9CC;&#xC57D; &#xC5B4;&#xB5A4; &#xC11C;&#xBC84;&#xAC00; &#xD2B9;&#xC815; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC790;&#xC2E0;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xC801;&#xC6A9;&#xD588;&#xB2E4;&#xBA74;, &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB294; &#xB3D9;&#xC77C;&#xD55C; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB2E4;&#xB978; command(&#xBA85;&#xB839;/&#xD56D;&#xBAA9;)&#xC744; &#xC801;&#xC6A9; &#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB4B7; &#xBD80;&#xBD84;&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC774;&#xAC83;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xB294;&#xC9C0; &#xC124;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/0871aca5-784e-4c9e-a8e6-24f2f23e4387.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="924" height="680" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/0871aca5-784e-4c9e-a8e6-24f2f23e4387.png 600w, https://www.kimsehwan96.com/content/images/2024/04/0871aca5-784e-4c9e-a8e6-24f2f23e4387.png 924w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Raft&#xB294; &#xC704;&#xC5D0;&#xC788;&#xB294; &#xC18D;&#xC131;&#xB4E4;&#xC744; &#xD56D;&#xC0C1; &#xB9CC;&#xC871;&#xD569;&#xB2C8;&#xB2E4;.</span></figcaption></figure><ul><li>&#xC120;&#xCD9C; &#xC548;&#xC815;&#xC131; : <code>term</code> &#xC744; &#xC784;&#xAE30;&#xB77C;&#xACE0; &#xC55E;&#xC73C;&#xB85C; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB2E8;&#xC77C; &#xC784;&#xAE30;&#xB3D9;&#xC548; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xB9AC;&#xB354;&#xB9CC;&#xC774; &#xC120;&#xCD9C;&#xB429;&#xB2C8;&#xB2E4;.</li><li>&#xB9AC;&#xB354;&#xB294; Append only : &#xB9AC;&#xB354;&#xB294; &#xC808;&#xB300;&#xB85C; &#xB85C;&#xADF8;&#xD56D;&#xBAA9;&#xC744; &#xB36E;&#xC5B4;&#xC4F0;&#xAC70;&#xB098; &#xC0AD;&#xC81C;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC624;&#xC9C1; &#xC0DD;&#xC131;&#xB9CC; &#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xB85C;&#xADF8; &#xC77C;&#xCE58; : &#xB9CC;&#xC57D; &#xB450; &#xB85C;&#xADF8;&#xAC00; &#xB3D9;&#xC77C;&#xD55C; &#xC778;&#xB371;&#xC2A4;&#xC640; &#xD56D;&#xBAA9;&#xC744; &#xAC16;&#xACE0; &#xC788;&#xB2E4;&#xBA74;, &#xADF8; &#xB85C;&#xADF8;&#xB4E4;&#xC740; &#xC8FC;&#xC5B4;&#xC9C4; &#xC778;&#xB371;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC5D0; &#xC788;&#xC5B4;&#xC11C; &#xB3D9;&#xC77C;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xB9AC;&#xB354; Completeness : &#xC5B4;&#xB5A4; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xD2B9;&#xC815; &#xC784;&#xAE30;(&#xC5B4;&#xB5A4; &#xB9AC;&#xB354;&#xAC00; &#xC874;&#xC7AC;&#xD560; &#xB54C;) &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB2E4;&#xBA74;, &#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xB354; &#xB192;&#xC740; &#xBC88;&#xD638;&#xC758; &#xC784;&#xAE30;(term)&#xC744; &#xAC00;&#xC9C4; &#xBAA8;&#xB4E0; &#xB9AC;&#xB354;&#xB4E4;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xC0C1;&#xD0DC; &#xBA38;&#xC2E0; &#xC548;&#xC815;&#xC131; : &#xB9CC;&#xC57D; &#xC11C;&#xBC84;&#xAC00; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xD2B9;&#xC815; &#xC778;&#xB371;&#xC2A4;&#xC5D0;&#xC11C; &#xC790;&#xC2E0;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xC801;&#xC6A9;&#xD588;&#xB2E4;&#xBA74;, &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB294; &#xADF8; &#xC778;&#xB371;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB2E4;&#xB978; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC801;&#xC6A9; &#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xADF8;&#xB7EC;&#xB2C8;&#xAE4C; &#xC560;&#xCD08;&#xC5D0; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xB300;&#xD55C; conflict&#xC774; &#xB098;&#xC9C0; &#xC54A;&#xB294;&#xAC83;)</li></ul><h2 id="raft-%EC%9D%98-%EA%B7%BC%EA%B0%84">Raft &#xC758; &#xADFC;&#xAC04;</h2><p>Raft &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xB294; &#xC5EC;&#xB7EC; &#xC11C;&#xBC84;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xACE0;, &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; 5&#xB300;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0;, &#xC774;&#xB7F0; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; 2&#xB300;&#xC758; &#xC11C;&#xBC84; &#xACE0;&#xC7A5;&#xC744; &#xBC84;&#xD2F8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC18D;&#xC5D0;&#xC11C;&#xB3C4; &#xAC01; &#xC11C;&#xBC84;&#xB294; &#xC138;&#xAC00;&#xC9C0; &#xC0C1;&#xD0DC; &#xC911; &#xD558;&#xB098;&#xC778;&#xB370;, &#xAC01; &#xC0C1;&#xD0DC;&#xB294; &#xB9AC;&#xB354;, &#xD314;&#xB85C;&#xC6CC;, &#xD639;&#xC740; &#xD6C4;&#xBCF4;&#xC790;(candidate)&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC815;&#xC0C1; &#xB3D9;&#xC791;&#xC911;&#xC5D0;&#xB294; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xB9AC;&#xB354;&#xAC00; &#xC788;&#xACE0;, &#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xB294; &#xD314;&#xB85C;&#xC6CC;&#xC785;&#xB2C8;&#xB2E4;. <strong>&#xD314;&#xB85C;&#xC6CC;</strong>&#xB294; &#xC218;&#xB3D9;&#xC801;&#xC774;&#xB77C;&#xC11C; &#xB2E8;&#xC21C;&#xD788; &#xB9AC;&#xB354;&#xC640; &#xD6C4;&#xBCF4;&#xB85C; &#xBD80;&#xD130; &#xC628; &#xC694;&#xCCAD;&#xC5D0;&#xB9CC; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;. <strong>&#xB9AC;&#xB354;</strong>&#xB294; &#xBAA8;&#xB4E0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. (&#xB17C;&#xBB38;&#xC5D0;&#xB294; &#xC774;&#xB807;&#xAC8C; &#xC801;&#xD600;&#xC788;&#xC9C0;&#xB9CC;, etcd &#xC758; &#xACBD;&#xC6B0;&#xB294; &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB354; &#xD655;&#xC778; &#xD574; &#xBCFC; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC74C;) </p><p>&#xC138;&#xBC88;&#xC9F8; &#xC0C1;&#xD0DC;&#xC778; <strong>&#xD6C4;&#xBCF4;&#xC790;</strong>&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xB97C; &#xBF51;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xADF8;&#xB9BC;&#xC740; &#xC774;&#xB7EC;&#xD55C; &#xB9AC;&#xB354;, &#xD314;&#xB85C;&#xC6CC;, &#xD6C4;&#xBCF4; &#xC0C1;&#xD0DC; &#xBCC0;&#xD654;&#xB97C; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xBCF4;&#xC5EC;&#xC90D;&#xB2C8;&#xB2E4;. &#xB4A4;&#xC5D0;&#xC11C; &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC790;&#xC138;&#xD788; &#xB2E4;&#xB8F9;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/71aee1fd-c2c6-4d10-b33d-d12fba6cebdd.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1002" height="376" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/71aee1fd-c2c6-4d10-b33d-d12fba6cebdd.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/71aee1fd-c2c6-4d10-b33d-d12fba6cebdd.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/71aee1fd-c2c6-4d10-b33d-d12fba6cebdd.png 1002w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC11C;&#xBC84;&#xC758; &#xC5EC;&#xB7EC; &#xC0C1;&#xD0DC;. &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB85C;&#xBD80;&#xD130;&#xC758; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC544;&#xBB34;&#xB7F0; &#xD1B5;&#xC2E0;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xC9C0; &#xBABB;&#xD55C;&#xB2E4;&#xBA74;(heatbeat) &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xD6C4;&#xBCF4;&#xC790; &#xC0C1;&#xD0DC;&#xB85C; &#xBC14;&#xB00C;&#xACE0;, &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC744; &#xC2DC;&#xC791;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xD22C;&#xD45C;&#xB97C; &#xBC1B;&#xC740; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xB300;&#xD55C; &#xB9AC;&#xB354;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xB85C; &#xBF51;&#xD78C; &#xC11C;&#xBC84;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAE30; &#xC804;&#xAE4C;&#xC9C0;&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xB9AC;&#xB354;&#xB85C; &#xB3D9;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</span></figcaption></figure><p>&#xC544;&#xB798; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xBCF4;&#xC5EC;&#xC9C0;&#xB294; &#xAC83; &#xCC98;&#xB7FC; &#xC784;&#xC758;&#xC758; &#xAE38;&#xC774;&#xC758; &#xC784;&#xAE30;&#xB85C; &#xC2DC;&#xAC04;&#xC744; &#xB098;&#xB215;&#xB2C8;&#xB2E4;. &#xC774; &#xC784;&#xAE30;&#xB294; &#xC5F0;&#xC18D;&#xC815;&#xC778; &#xC815;&#xC218;&#xB85C; &#xBC88;&#xD638;&#xAC00; &#xB9E4;&#xACA8;&#xC9D1;&#xB2C8;&#xB2E4;. &#xAC01; &#xC784;&#xAE30;&#xB294; &#xC120;&#xAC70;&#xB85C; &#xC2DC;&#xC791;&#xB418;&#xBA70;, &#xD558;&#xB098; &#xC774;&#xC0C1;&#xC758; &#xD6C4;&#xBCF4;&#xAC00; &#xB9AC;&#xB354;&#xAC00; &#xC704;&#xD574;&#xC11C; &#xC11C;&#xB85C; &#xACBD;&#xC7C1;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD55C; &#xD6C4;&#xBCF4;&#xAC00; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1; &#xB4DD;&#xD45C;&#xD558;&#xBA74;, &#xADF8; &#xC784;&#xAE30;&#xB3D9;&#xC548; &#xB9AC;&#xB354;&#xB85C;&#xC11C; &#xC5ED;&#xD560;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xC120;&#xAC70;&#xAC00; &#xC2E4;&#xD328;&#xD558;&#xB294;&#xB370;, &#xC774;&#xB7F0; &#xACBD;&#xC6B0; &#xB9AC;&#xB354; &#xC5C6;&#xC774; &#xD574;&#xB2F9; &#xC784;&#xAE30;&#xB97C; &#xB05D;&#xB0B4;&#xACE0;, &#xC0C8;&#xB85C;&#xC6B4; &#xC784;&#xAE30;(&#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC120;&#xAC70; &#xC2DC;&#xC791;&#xACFC; &#xD568;&#xAED8;)&#xAC00; &#xC2DC;&#xC791;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB807;&#xAC8C; &#xD574;&#xC11C; Raft &#xB294; &#xD55C; &#xC784;&#xAE30;&#xC5D0; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xB9AC;&#xB354;&#xB9CC; &#xC874;&#xC7AC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xBCF4;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/223780ed-25b8-4bfa-8efa-5d00fb38f716.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="902" height="358" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/223780ed-25b8-4bfa-8efa-5d00fb38f716.png 600w, https://www.kimsehwan96.com/content/images/2024/04/223780ed-25b8-4bfa-8efa-5d00fb38f716.png 902w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC2DC;&#xAC04;&#xC740; &#xC784;&#xAE30;&#xB85C; &#xB098;&#xB220;&#xC9C8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAC01; &#xC784;&#xAE30;&#xB294; &#xC120;&#xAC70;&#xC758; &#xC2DC;&#xC791;&#xACFC; &#xD568;&#xAED8; &#xC2DC;&#xC791;&#xB429;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC774; &#xC131;&#xACF5;&#xC801;&#xC73C;&#xB85C; &#xB41C; &#xACBD;&#xC6B0;, &#xD558;&#xB098;&#xC758;(&#xB2E8;&#xC77C;)&#xB9AC;&#xB354;&#xAC00; &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC784;&#xAE30;&#xAC00; &#xB05D;&#xB0A0; &#xB54C; &#xAE4C;&#xC9C0; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xC120;&#xAC70;&#xAC00; &#xC2E4;&#xD328;&#xD558;&#xBA74; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC784;&#xAE30;&#xB97C; &#xB05D;&#xB0C5;&#xB2C8;&#xB2E4;.</span></figcaption></figure><p>&#xAC01; &#xC11C;&#xBC84;&#xB294; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xC99D;&#xAC00;&#xD558;&#xB294; &#xC815;&#xC218;&#xB85C;&#xB41C; &#xC784;&#xAE30; &#xBC88;&#xD638;&#xB97C; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC784;&#xAE30;&#xB294; &#xC11C;&#xBC84;&#xB4E4;&#xC774; &#xD1B5;&#xC2E0; &#xD560; &#xB54C; &#xB9C8;&#xB2E4; &#xC11C;&#xB85C; &#xC815;&#xBCF4;&#xB97C; &#xAD50;&#xD658;&#xD558;&#xBA70;, &#xB9CC;&#xC57D; &#xD55C; &#xC11C;&#xBC84;&#xC758; &#xC784;&#xAE30;&#xAC00; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xC758; &#xC784;&#xAE30;&#xBCF4;&#xB2E4; &#xC791;&#xB2E4;&#xBA74; &#xC791;&#xC740; &#xC784;&#xAE30;&#xB97C; &#xB354; &#xD070; &#xAC12;&#xC73C;&#xB85C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; &#xD6C4;&#xBCF4;&#xC790;&#xB098; &#xB9AC;&#xB354;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30;&#xAC00; &#xAD6C;&#xC2DD;&#xC774;&#xB77C;&#xB294;&#xAC78; &#xBC1C;&#xACAC;&#xD558;&#xBA74; &#xADF8; &#xC989;&#xC2DC; &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xB418;&#xB3CC;&#xC544;&#xAC11;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xAD6C;&#xC2DD; &#xC784;&#xAE30; &#xBC88;&#xD638;&#xB97C; &#xAC00;&#xC9C4; &#xC694;&#xCCAD;&#xC744; &#xBC1B;&#xC73C;&#xBA74; &#xADF8; &#xC694;&#xCCAD;&#xC744; &#xAC70;&#xBD80;&#xD569;&#xB2C8;&#xB2E4;. </p><p>Raft &#xC11C;&#xBC84;&#xB4E4;&#xC740; &#xC6D0;&#xACA9; &#xD504;&#xB85C;&#xC2DC;&#xC800; &#xD638;&#xCD9C;(RPC)&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xD1B5;&#xC2E0;&#xD558;&#xACE0;. &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xC624;&#xC9C1; &#xB450;&#xC885;&#xB958;&#xC758; RPC&#xB9CC;&#xC774; &#xD544;&#xC694;&#xD55C;&#xB370;. RequestVote RPC &#xC640; AppendEntries RPC&#xAC00; &#xADF8;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>RequestVoteRPC &#xB294; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC120;&#xAC70; &#xAE30;&#xAC04; &#xC911;&#xC5D0; &#xD6C4;&#xBCF4;&#xC790;&#xB4E4;&#xC5D0; &#xC758;&#xD574;&#xC11C; &#xBC1C;&#xC0DD;&#xB418;&#xACE0;, AppendEntries RPC&#xB294; &#xB9AC;&#xB354;&#xB4E4;&#xC774; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xBCF5;&#xC81C;&#xD558;&#xACE0; &#xD558;&#xD2B8;&#xBE44;&#xD2B8; &#xD615;&#xD0DC;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC2DC;&#xC791;&#xB429;&#xB2C8;&#xB2E4;.</p><p> InstallSnapshot RPC &#xB77C;&#xB294; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xD655;&#xC7A5; RPC&#xB3C4; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xB370; &#xC774;&#xB294; &#xB4A4;&#xC5D0;&#xC11C; &#xB2E4;&#xB8E8;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC11C;&#xBC84;&#xB4E4;&#xC774; &#xC751;&#xB2F5;&#xC744; &#xBABB;&#xBC1B;&#xB294; &#xACBD;&#xC6B0; RPC&#xB97C; &#xC7AC;&#xC2DC;&#xB3C4;&#xD558;&#xACE0;, &#xC131;&#xB2A5;&#xC744; &#xC704;&#xD574; &#xBCD1;&#xB82C;&#xB85C; &#xC694;&#xCCAD;&#xD569;&#xB2C8;&#xB2E4;. </p><h2 id="%EB%A6%AC%EB%8D%94-%EC%84%A0%EC%B6%9C">&#xB9AC;&#xB354; &#xC120;&#xCD9C;</h2><p>Raft&#xB294; &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xAE30; &#xC704;&#xD574;&#xC11C; heatbeat &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84;&#xB4E4;&#xC774; &#xCD5C;&#xCD08;&#xC5D0; &#xC2DC;&#xC791;&#xB418;&#xC5C8;&#xC744; &#xB54C;, &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC11C;&#xBC84;&#xB294; &#xC720;&#xD6A8;&#xD55C; RPC&#xB97C; &#xB9AC;&#xB354;&#xB098; &#xD6C4;&#xBCF4;&#xC790;&#xB85C;&#xBD80;&#xD130; &#xC218;&#xC2E0;&#xD558;&#xAE30; &#xC804;&#xAE4C;&#xC9C0; &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xB0A8;&#xC544;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; heatbeat(&#xC815;&#xD655;&#xD788;&#xB294; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xC9C0; &#xC54A;&#xB294; AppendEntries RPC&#xB97C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;)&#xB97C; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC774; &#xADF8;&#xB4E4;&#xC758; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xB97C; &#xC720;&#xC9C0;&#xD558;&#xB3C4;&#xB85D; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xB9AC;&#xB354;&#xB294; &#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; heatbeat &#xC744; &#xBCF4;&#xB0B4;&#xACE0;. &#xD314;&#xB85C;&#xC6CC;&#xB294; election timeout &#xC804;&#xAE4C;&#xC9C0; heatbeat&#xB97C; &#xBC1B;&#xC73C;&#xBA74; timeout &#xCE74;&#xC6B4;&#xD130;&#xB97C; &#xCD08;&#xAE30;&#xD654;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; heatbeat &#xC744; &#xBC1B;&#xC73C;&#xBA74; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC740; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xC720;&#xC9C0;&#xB418;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</div></div><p>&#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xAC00; <code>election timeout</code> &#xC774; &#xB05D;&#xB098;&#xAE30; &#xC804;&#xAE4C;&#xC9C0; &#xC544;&#xBB34; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC9C0; &#xBABB;&#xD55C;&#xB2E4;&#xBA74;, &#xC0B4;&#xC544;&#xC788;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xC5C6;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xACE0; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xC790;&#xC2E0;&#xC758; &#xD604;&#xC7AC; &#xC784;&#xAE30;(term) &#xC22B;&#xC790;&#xB97C; &#xC99D;&#xAC00;&#xC2DC;&#xD0A4;&#xACE0;(1 &#xC99D;&#xAC00;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;) &#xC790;&#xC2E0;&#xC744; &#xD6C4;&#xBCF4;&#xC790; &#xC0C1;&#xD0DC;&#xB85C; &#xBC14;&#xAFC9;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xD574;&#xB2F9; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xD558;&#xACE0;, RequestVote RPC &#xB97C; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB9AC;&#xACE0; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xC544;&#xB798; &#xC138;&#xAC1C;&#xC758; &#xC77C;&#xC911; &#xD558;&#xB098;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAE30; &#xC804;&#xAE4C;&#xC9C0; &#xC790;&#xC2E0;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xC720;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. </p><ol><li>&#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC;(&#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1; &#xB4DD;&#xD45C;)</li><li>&#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xAC00; &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xB294; &#xACBD;&#xC6B0;</li><li>&#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC5D0;&#xC11C; &#xC544;&#xBB34;&#xB3C4; &#xC2B9;&#xB9AC;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xACE0; &#xD2B9;&#xC815; &#xC2DC;&#xAC04;&#xC774; &#xC9C0;&#xB09C; &#xACBD;&#xC6B0;</li></ol><p>&#xB9CC;&#xC57D; &#xAC19;&#xC740; &#xC784;&#xAE30;(term)&#xC5D0;&#xC11C; &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC744; &#xB4DD;&#xD45C;&#xD558;&#xBA74; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xB4E4;&#xC740; &#xAC19;&#xC740; &#xC784;&#xAE30; &#xB0B4;&#xC5D0;&#xC11C; &#xC120;&#xCC29;&#xC21C;&#xC73C;&#xB85C; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xD6C4;&#xBCF4;&#xC790;&#xC5D0;&#xAC8C;&#xB9CC; &#xD22C;&#xD45C;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB9AC;&#xACE0; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1; &#xB4DD;&#xD45C;&#xD574;&#xC57C; &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC;&#xD558;&#xB294; &#xADDC;&#xCE59;&#xC740; &#xC801;&#xC5B4;&#xB3C4; &#xD558;&#xB098;&#xC758; &#xD6C4;&#xBCF4;&#xC790;&#xB9CC; &#xD2B9;&#xC815; &#xC784;&#xAE30; &#xB0B4;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xC74C;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. </p><p> &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC2B9;&#xB9AC;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0;&#xAC8C; &#xC790;&#xC2E0;&#xB4E4;&#xC758; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xB97C; &#xC124;&#xC815;&#xD558;&#xB3C4;&#xB85D;(&#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xC720;&#xC9C0;&#xD558;&#xB77C;&#xACE0;), &#xADF8;&#xB9AC;&#xACE0; &#xC0C8;&#xB85C;&#xC6B4; &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; heartbeat &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xB0A8;&#xC740; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;.</p><p>&#xD22C;&#xD45C;&#xB97C; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xB3D9;&#xC548;, &#xD6C4;&#xBCF4;&#xC790;&#xB294; AppendEntries RPC &#xB97C; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB85C;&#xBD80;&#xD130; &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xAC00; &#xB9AC;&#xB354;&#xB77C;&#xACE0; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xB294; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC744;&#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; RPC&#xC5D0; &#xB4E4;&#xC5B4;&#xC788;&#xB294; &#xD574;&#xB2F9; &#xB9AC;&#xB354;&#xC758; &#xC784;&#xAE30;(term)&#xAC00; &#xC790;&#xC2E0;&#xC758; term &#xBCF4;&#xB2E4; &#xC801;&#xC5B4;&#xB3C4; &#xAC19;&#xAC70;&#xB098;, &#xD06C;&#xB2E4;&#xBA74; &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xD574;&#xB2F9; &#xB9AC;&#xB354;&#xB97C; &#xC815;&#xC0C1;&#xC801;&#xC778; &#xB9AC;&#xB354;&#xB77C;&#xACE0; &#xC778;&#xC9C0;&#xD558;&#xACE0; &#xD314;&#xB85C;&#xC6CC; &#xC0C1;&#xD0DC;&#xB85C; &#xBCC0;&#xD658;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; RPC &#xC548;&#xC5D0; &#xC788;&#xB294; &#xC784;&#xAE30;(term)&#xC774; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xD604;&#xC7AC; &#xC784;&#xAE30;(term)&#xBCF4;&#xB2E4; &#xC791;&#xB2E4;&#xBA74;, &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xADF8; RPC &#xB97C; &#xAC70;&#xBD80;&#xD558;&#xACE0; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xD6C4;&#xBCF4;&#xC790; &#xC0C1;&#xD0DC;&#xB97C; &#xC720;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC544;&#xB798;&#xB294; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xAC00; &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xB294; &#xC0C1;&#xD669;&#xC744; &#xD45C;&#xD604;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/f413a7ae-890b-4795-a27b-511cf4f77246.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="851" height="441" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/f413a7ae-890b-4795-a27b-511cf4f77246.png 600w, https://www.kimsehwan96.com/content/images/2024/04/f413a7ae-890b-4795-a27b-511cf4f77246.png 851w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S1 &#xC774; &#xB9AC;&#xB354;&#xC778; &#xC0C1;&#xD0DC;&#xB85C; AppendEntries RPC &#xB97C; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0; &#xBCF4;&#xB0B8;&#xB2E4;. &#xC774; &#xB54C; S4 &#xB294; term&#xC774; &#xB9AC;&#xB354;&#xC758; 13&#xBCF4;&#xB2E4; &#xB192;&#xC740; &#xC0C1;&#xD0DC;&#xC774;&#xBBC0;&#xB85C;, &#xD574;&#xB2F9; RPC&#xB97C; &#xAC70;&#xC808;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/cb29fcce-82e0-4887-9c01-eddb55f3fc32.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="851" height="441" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/cb29fcce-82e0-4887-9c01-eddb55f3fc32.png 600w, https://www.kimsehwan96.com/content/images/2024/04/cb29fcce-82e0-4887-9c01-eddb55f3fc32.png 851w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S4 &#xAC00; S1 &#xCABD;&#xC73C;&#xB85C; &#xBCF4;&#xB0B4;&#xB294; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>-</span></code><span style="white-space: pre-wrap;"> &#xD45C;&#xC2DC;&#xB294;, AppendEntries &#xB97C; reject &#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xB2E4;. &#xBC18;&#xBA74; S5 &#xC640; S2&#xB294; S1 &#xC774; &#xBCF4;&#xB0B8; term &#xC758; &#xC790;&#xC2E0;&#xACFC; &#xAC19;&#xAC70;&#xB098; &#xD070; &#xC870;&#xAC74;&#xC5D0; &#xBD80;&#xD569;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>accept</span></code><span style="white-space: pre-wrap;"> &#xD55C;&#xB2E4;. &#xC774; &#xC640;&#xC911;&#xC5D0; S4 &#xC758; RequestVoteRPC&#xAC00; S1, S2, S5&#xC5D0; &#xC804;&#xB2EC;&#xB418;&#xACE0; &#xC5EC;&#xAE30;&#xC5D0;&#xB294; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>term</span></code><span style="white-space: pre-wrap;"> &#xC815;&#xBCF4;&#xAC00; &#xB4E4;&#xC5B4;&#xC788;&#xB2E4;. S1 &#xB9AC;&#xB354;&#xB97C; &#xD3EC;&#xD568;&#xD55C; S2, S5 &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC740; RequestVoteRPC &#xC5D0; &#xB2F4;&#xACA8;&#xC788;&#xB294; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>term</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC774; &#xC790;&#xC2E0;&#xC774; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xAC12;&#xBCF4;&#xB2E4; &#xD06C;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xC81C; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>term</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC744; 14&#xB85C; &#xC124;&#xC815;&#xD558;&#xACE0;, </span><code spellcheck="false" style="white-space: pre-wrap;"><span>S4</span></code><span style="white-space: pre-wrap;"> &#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xB97C; &#xD558;&#xAC8C;&#xB41C;&#xB2E4;. </span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/b7d2f700-a98f-4748-86c9-66e652109530.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="851" height="441" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/b7d2f700-a98f-4748-86c9-66e652109530.png 600w, https://www.kimsehwan96.com/content/images/2024/04/b7d2f700-a98f-4748-86c9-66e652109530.png 851w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S2&#xC640; S5&#xB294; &#xAE30;&#xC874; &#xB9AC;&#xB354; S1&#xC774; &#xC774;&#xBBF8; &#xBCF4;&#xB0C8;&#xB358; AppendEntriesRPC&#xC5D0; &#xB300;&#xD574;&#xC11C; true &#xC751;&#xB2F5;&#xC744; &#xBCF4;&#xB0B4;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;, &#xADF8; &#xBC14;&#xB85C; &#xC9C1;&#xD6C4; S4&#xC758; RequestVoteRPC&#xAC00; &#xB97C; &#xC218;&#xC2E0;&#xD558;&#xC790; &#xB9C8;&#xC790; S4&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xD22C;&#xD45C;&#xB97C; &#xD558;&#xACE0;, S1&#xC740; S5, S2&#xC758; true &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC9C0;&#xB9CC; , &#xD574;&#xB2F9; RPC response &#xC5D0;&#xB294; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>term</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC774; 13&#xC774;&#xC600;&#xC744; &#xB54C;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xB2F4;&#xACA8;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBCC4;&#xB2E4;&#xB978; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/61eb4c11-c08f-4e7d-8eb3-df75fa7881d3.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="851" height="441" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/61eb4c11-c08f-4e7d-8eb3-df75fa7881d3.png 600w, https://www.kimsehwan96.com/content/images/2024/04/61eb4c11-c08f-4e7d-8eb3-df75fa7881d3.png 851w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xD6C4; S4&#xAC00; &#xB9AC;&#xB354;&#xAC00; &#xB41C;&#xB2E4;. </span></figcaption></figure><p>&#xC138;&#xBC88;&#xC9F8; &#xAC00;&#xB2A5;&#xD55C; &#xACB0;&#xACFC;&#xB294;, &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC774;&#xAE30;&#xC9C0;&#xB3C4;, &#xC9C0;&#xC9C0;&#xB3C4; &#xC54A;&#xB294; &#xC0C1;&#xD669;&#xC785;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xB9CE;&#xC740; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC774; &#xB3D9;&#xC2DC;&#xC5D0; &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xB41C;&#xB2E4;&#xBA74; &#xC5B4;&#xB5A4; &#xD6C4;&#xBCF4;&#xC790;&#xB3C4; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1; &#xB4DD;&#xD45C;&#xB97C; &#xD560; &#xC218; &#xC5C6;&#xC744;&#xAC81;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xC0C1;&#xD669;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; &#xAC01; &#xD6C4;&#xBCF4;&#xC790;&#xB294; timeout &#xC0C1;&#xD0DC;&#xAC00; &#xB418;&#xACE0;, &#xD604;&#xC7AC; &#xC784;&#xAE30; &#xAC12;&#xC744; 1 &#xB298;&#xB9AC;&#xACE0; &#xB09C; &#xB4A4; &#xC0C8;&#xB85C;&#xC6B4; &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xACE0;, RequestVote RPC &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xCA0C;&#xB4E0; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xC870;&#xCE58; &#xC5C6;&#xC774;&#xB294; &#xC774;&#xB7F0; &#xC0C1;&#xD669;&#xC774; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xBC1C;&#xC0DD; &#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xB9CC;&#xC57D; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC758; &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xC124;&#xC815;&#xC774; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;&#xBA74; ..)</p><p>Raft&#xB294; &#xB79C;&#xB364;&#xD654;&#xB41C; election timeout &#xC744; &#xD1B5;&#xD574; &#xC774;&#xB7F0; &#xD45C;&#xAC00; &#xBD84;&#xC0B0;&#xB418;&#xB294; &#xC0C1;&#xD669;&#xC744; &#xAC70;&#xC758; &#xC5C6;&#xC560;&#xACE0;, &#xADF8;&#xB7F0; &#xC77C;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xBE60;&#xB974;&#xAC8C; &#xD574;&#xACB0;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xB4DD;&#xD45C; &#xBD84;&#xC0B0;&#xC0C1;&#xD669;&#xC744; &#xB9C9;&#xAE30;&#xC704;&#xD574;&#xC11C; election timeout&#xC740; &#xACE0;&#xC815;&#xB41C; &#xBC94;&#xC704;&#xC758; &#xC2DC;&#xAC04;&#xB300; &#xC548;&#xC5D0;&#xC11C; &#xB79C;&#xB364;&#xD558;&#xAC8C; &#xACB0;&#xC815;&#xB429;&#xB2C8;&#xB2E4;. (&#xC608;&#xB97C;&#xB4E4;&#xC5B4; 150 ~ 300ms). </p><p>&#xC774;&#xB7F0; &#xC870;&#xCE58;&#xB294; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xC11C;&#xBC84;&#xB9CC; &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xC0C1;&#xD0DC;&#xAC00; &#xB418;&#xB3C4;&#xB85D; &#xD560; &#xC218; &#xC788;&#xACE0;. &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xC0C1;&#xD0DC;&#xAC00; &#xB41C; &#xC11C;&#xBC84;&#xAC00; &#xBE60;&#xB974;&#xAC8C; &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xACE0; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xAC00; timeout&#xC774; &#xB418;&#xAE30;&#xC804;&#xC5D0; heartbeat&#xC744; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xAC8C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xC640; &#xB3D9;&#xC77C;&#xD55C; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774; &#xB4DD;&#xD45C; &#xBD84;&#xC0B0;&#xC744; &#xB9C9;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xBAA8;&#xB4E0; &#xD6C4;&#xBCF4;&#xC790;&#xB4E4;&#xC740; &#xC120;&#xAC70;&#xAC00; &#xC2DC;&#xC791;&#xB418;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xB79C;&#xB364;&#xD654;&#xB41C; election timeout &#xC744; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC7AC;&#xC2DC;&#xC791;&#xD558;&#xACE0;, &#xB2E4;&#xC74C; &#xC120;&#xAC70;&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; timeout &#xAE4C;&#xC9C0; &#xACBD;&#xACFC;&#xB97C; &#xC9C0;&#xCF1C;&#xBD05;&#xB2C8;&#xB2E4;.</p><p></p><h2 id="%EB%A1%9C%EA%B7%B8-%EB%B3%B5%EC%A0%9C">&#xB85C;&#xADF8; &#xBCF5;&#xC81C;</h2><p>&#xB9AC;&#xB354;&#xAC00; &#xD55C;&#xBC88; &#xC120;&#xCD9C;&#xB418;&#xACE0; &#xB098;&#xBA74;, &#xB9AC;&#xB354;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;. &#xAC01; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC694;&#xCCAD;&#xC740; &#xBAA8;&#xB4E0; &#xBCF5;&#xC81C;&#xB41C; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xB418;&#xC5B4;&#xC57C; &#xD558;&#xB294; command &#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xB17C;&#xBB38;&#xC5D0;&#xC11C;&#xB294; command&#xB85C; &#xC9C0;&#xCE6D;&#xD558;&#xC9C0;&#xB9CC;, &#xB2E8;&#xC801;&#xC73C;&#xB85C; etcd&#xB97C; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;&#xBA74; &#xC800;&#xC7A5;&#xD560; &#xB370;&#xC774;&#xD130;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD574;&#xB3C4; &#xBB34;&#xBC29;&#xD569;&#xB2C8;&#xB2E4;.)</p><p>&#xB9AC;&#xB354;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xD56D;&#xBAA9;&#xC73C;&#xB85C; &#xD574;&#xB2F9; command &#xB97C; append &#xD558;&#xACE0;, AppendEntries RPC&#xB97C; &#xAC01; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xD574;&#xC11C; &#xD574;&#xB2F9; &#xD56D;&#xBAA9;&#xC744; &#xBCF5;&#xC81C;&#xD558;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xD574;&#xB2F9; &#xD56D;&#xBAA9;&#xC774; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xBCF5;&#xC81C;&#xB418;&#xC5C8;&#xB2E4;&#xBA74;, &#xB9AC;&#xB354;&#xB294; &#xD574;&#xB2F9; &#xD56D;&#xBAA9;&#xC744; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xBC18;&#xC601;&#xD558;&#xACE0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xAC8C; &#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xCDA9;&#xB3CC;&#xC774; &#xB098;&#xAC70;&#xB098; &#xB290;&#xB9AC;&#xAC8C; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xACBD;&#xC6B0;, &#xD639;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD328;&#xD0B7;&#xC774; &#xC720;&#xC2E4;&#xB418;&#xB294; &#xACBD;&#xC6B0; &#xB9AC;&#xB354;&#xB294; &#xBAA8;&#xB4E0; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xBAA8;&#xB4E0; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC800;&#xC7A5;&#xD560; &#xB54C; &#xAE4C;&#xC9C0; AppendEntries RPC&#xB97C; &#xBB34;&#xD55C;&#xD788; &#xC7AC;&#xC2DC;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. (&#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xAC00; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC751;&#xB2F5;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xD558;&#xB354;&#xB77C;&#xB3C4;)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/96573eb3-432e-4ac0-8e8a-bb408bcbafe2.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="481" height="322"><figcaption><span style="white-space: pre-wrap;">&#xB85C;&#xADF8;&#xB294; &#xD56D;&#xBAA9;&#xB4E4;&#xC758; &#xC870;&#xD569;&#xC73C;&#xB85C;, &#xAC01; &#xD56D;&#xBAA9;&#xB4E4;&#xC740; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xC22B;&#xC790;&#xAC00; &#xBD80;&#xC5EC;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.(index) &#xAC01; &#xD56D;&#xBAA9;&#xB4E4;&#xC740; &#xD574;&#xB2F9; &#xD56D;&#xBAA9;&#xC774; &#xC0DD;&#xC131;&#xB420; &#xC2DC;&#xC810;&#xC758; &#xC784;&#xAE30;(term)&#xAC12;&#xACFC; command &#xB97C; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC744; &#xC704;&#xD574; &#xAC16;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </span><code spellcheck="false" style="white-space: pre-wrap;"><span>committed</span></code><span style="white-space: pre-wrap;"> &#xB77C;&#xACE0; &#xAC04;&#xC8FC;&#xB418;&#xB294; &#xD56D;&#xBAA9;&#xB4E4;&#xC740; &#xBAA8;&#xB4E0; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xBC18;&#xC601;&#xB418;&#xAE30;&#xC5D0; &#xC548;&#xC804;&#xD55C;&#xAC83;&#xB4E4;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. (&#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0; &#xC798; &#xBCF5;&#xC81C;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xC0C1;&#xD0DC;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;)</span></figcaption></figure><p>&#xB85C;&#xADF8;&#xB294; &#xC704; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xBCF4;&#xB294; &#xAC83; &#xCC98;&#xB7FC; &#xC815;&#xB9AC;&#xB429;&#xB2C8;&#xB2E4;. &#xAC01; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xB9AC;&#xB354;&#xB85C;&#xBD80;&#xD130; &#xC804;&#xB2EC;&#xBC1B;&#xC740; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC758; command&#xB97C; &#xC784;&#xAE30;(term)&#xC22B;&#xC790;&#xC640; &#xD568;&#xAED8; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. &#xAC01; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xB85C;&#xADF8;&#xC548;&#xC5D0;&#xC11C;&#xC758; &#xC704;&#xCE58;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC815;&#xC218;&#xD615;&#xD0DC;&#xC758; index&#xB97C; &#xAC16;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB9AC;&#xB354;&#xB294; &#xC5B8;&#xC81C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; &#xBC18;&#xC601;&#xD574;&#xC57C; &#xC548;&#xC804;&#xD55C;&#xC9C0; &#xACB0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7F0; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; <code>committed</code> &#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xBD80;&#xB974;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. Raft&#xB294; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xC774; &#xC548;&#xC815;&#xC801;&#xC774;&#xACE0;, &#xACB0;&#xAD6D;&#xC5D0;&#xB294; &#xBAA8;&#xB4E0; &#xAC00;&#xC6A9;&#xD55C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xB4E4;&#xC5D0; &#xC758;&#xD574; &#xC2E4;&#xD589;&#xB420; &#xAC83;&#xC784;&#xC744; &#xBCF4;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC5D0; &#xBCF5;&#xC81C;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xB9AC;&#xB354;&#xAC00; &#xD55C;&#xBC88; &#xCEE4;&#xBC0B;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xC804; &#xB9AC;&#xB354;&#xC5D0; &#xC758;&#xD574; &#xC0DD;&#xC131;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xC5EC; &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC788;&#xB294; &#xBAA8;&#xB4E0; &#xC120;&#xD589; &#xD56D;&#xBAA9;&#xB3C4; &#xBAA8;&#xB450; &#xCEE4;&#xBC0B;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xCEE4;&#xBC0B;&#xB418;&#xC5B4;&#xC57C;&#xD560; &#xAC00;&#xC7A5; &#xCD5C;&#xC2E0;(&#xB192;&#xC740;)&#xAC12;&#xC758; index&#xB97C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xCD94;&#xC801;&#xD569;&#xB2C8;&#xB2E4;, &#xADF8;&#xB9AC;&#xACE0; &#xC774; &#xAC12;&#xC740; AppendEntries RPC (hearthbeat &#xD3EC;&#xD568;)&#xB0B4;&#xC5D0; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC11C; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xC774; &#xC54C; &#xC218; &#xC788;&#xAC8C; &#xD569;&#xB2C8;&#xB2E4;. &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB2E4;&#xB294;&#xAC78; &#xC54C;&#xAC8C; &#xB418;&#xBA74;, &#xD314;&#xB85C;&#xC6CC; &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xCEEC; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC5D0; &#xD574;&#xB2F9; &#xD56D;&#xBAA9;&#xC744; &#xBC18;&#xC601;&#xD569;&#xB2C8;&#xB2E4;. (&#xC21C;&#xC11C;&#xB300;&#xB85C;)</p><p>Raft&#xB294; &#xC544;&#xB798;&#xC758; &#xC18D;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li>&#xB9CC;&#xC57D; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xB85C;&#xADF8;&#xC5D0;&#xC11C;&#xC758; &#xB450;&#xAC1C;&#xC758; &#xD56D;&#xBAA9;&#xC774; &#xAC19;&#xC740; index &#xC640; &#xAC19;&#xC740; term &#xC744; &#xAC16;&#xACE0;&#xC788;&#xB2E4;&#xBA74;, &#xADF8;&#xAC83;&#xB4E4;&#xC740; &#xAC19;&#xC740; command&#xB97C; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xB9CC;&#xC57D; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xB85C;&#xADF8;&#xC5D0;&#xC11C;&#xC758; &#xB450;&#xAC1C;&#xC758; &#xD56D;&#xBAA9;&#xC774; &#xAC19;&#xC740; index&#xC640; term &#xC744; &#xAC16;&#xACE0;&#xC788;&#xB2E4;&#xBA74;, &#xADF8;&#xAC83;&#xB4E4;&#xC740; &#xBAA8;&#xB4E0; &#xC120;&#xD589; &#xD56D;&#xBAA9;&#xC5D0;&#xC11C; &#xB3D9;&#xC77C;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><p>&#xCCAB;&#xBC88;&#xC9F8; &#xC18D;&#xC131;&#xC740; &#xB9AC;&#xB354;&#xAC00; &#xC8FC;&#xC5B4;&#xC9C4; &#xB85C;&#xADF8; index&#xC640; term&#xC5D0;&#xC11C; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; &#xD56D;&#xBAA9;&#xB9CC; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xD1B5;&#xD574; &#xC774;&#xB904;&#xC9C0;&#xACE0;, &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xC808;&#xB300;&#xB85C; &#xB85C;&#xADF8; &#xC548;&#xC5D0;&#xC11C;&#xC758; &#xC704;&#xCE58;(index)&#xB97C; &#xBC14;&#xAFB8;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB450;&#xBC88;&#xC9F8; &#xC18D;&#xC131;&#xC740; AppendEntires RPC&#xB97C; &#xD1B5;&#xD574; &#xC774;&#xB904;&#xC9C0;&#xB294; &#xAC04;&#xB2E8;&#xD55C; &#xC77C;&#xAD00;&#xC131; &#xCCB4;&#xD06C;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBCF4;&#xC7A5;&#xB429;&#xB2C8;&#xB2E4;. AppendEntries RPC&#xAC00; &#xBCF4;&#xB0B4;&#xC9C8; &#xB54C;, &#xB9AC;&#xB354;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xD56D;&#xBAA9;&#xB4E4; &#xBC14;&#xB85C; &#xC55E;&#xC5D0; &#xC788;&#xB294; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8; &#xB0B4; &#xD56D;&#xBAA9;&#xC758; index&#xC640; term &#xC744; &#xD3EC;&#xD568;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xAC19;&#xC740; index&#xC640; term&#xC744; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xD574;&#xB2F9; &#xB85C;&#xADF8;&#xC758; &#xD56D;&#xBAA9;&#xC744; &#xCC3E;&#xC9C0; &#xBABB;&#xD558;&#xB294; &#xACBD;&#xC6B0;, &#xC0C8;&#xB85C;&#xC6B4; &#xD56D;&#xBAA9;&#xC744; &#xAC70;&#xBD80;&#xD569;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC544;&#xB798;&#xB294; &#xC77C;&#xAD00;&#xC131; &#xAC80;&#xC0AC;&#xC5D0; &#xB300;&#xD55C; Raftscope &#xAE30;&#xBC18;&#xC758; &#xC124;&#xBA85;&#xC785;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/ad37b109-6a19-4064-a0e3-ead5e132324f.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="425" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/ad37b109-6a19-4064-a0e3-ead5e132324f.png 600w, https://www.kimsehwan96.com/content/images/2024/04/ad37b109-6a19-4064-a0e3-ead5e132324f.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xD604;&#xC7AC; &#xB9AC;&#xB354;&#xB294; S5&#xC774;&#xB2E4;. S1&#xC740; term &#xAC12;&#xC774; 18&#xC778; &#xC0C1;&#xD0DC;&#xC774;&#xB2E4;(&#xC7A5;&#xC560;&#xB97C; &#xACAA;&#xC74C;). S1&#xC740; &#xC778;&#xB371;&#xC2A4; 6,7,8 &#xC5D0; &#xB300;&#xD55C; &#xAC12;&#xC774; &#xC5C6;&#xB2E4;. &#xD604;&#xC7AC; &#xB9AC;&#xB354;&#xB294; S1&#xC758; nextIndex &#xAC12;&#xC744; 8&#xB85C; &#xC54C;&#xACE0;&#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; S5&#xB294; S1&#xCABD;&#xC73C;&#xB85C; AppendEntries RPC &#xC5D0; term 19, prevIndex7 &#xB85C; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;. S1&#xC740; &#xADF8;&#xAC83;&#xC744; &#xBC1B;&#xC558;&#xC744; &#xB54C; &#xC790;&#xC2E0;&#xC758; term &#xACFC; &#xC790;&#xC2E0;&#xC758; commitedIndex(5), nextIndex(6) &#xACFC;&#xB294; &#xB9DE;&#xC9C0; &#xC54A;&#xB294; &#xC694;&#xCCAD;&#xC774;&#xB77C; reject &#xD574;&#xC57C; &#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/1ac1210e-3952-4d13-8c58-1251461668a6.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="425" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/1ac1210e-3952-4d13-8c58-1251461668a6.png 600w, https://www.kimsehwan96.com/content/images/2024/04/1ac1210e-3952-4d13-8c58-1251461668a6.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AppendEntries RPC &#xAC00; &#xC131;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xACE0; &#xBC18;&#xD658;&#xD558;&#xBA74;&#xC11C;, S1&#xC740; &#xC790;&#xC2E0;&#xC758; term &#xC744; 19&#xB85C; &#xBC14;&#xAFB8;&#xBA74;&#xC11C; matchIndex 0 (&#xC778;&#xB371;&#xC2A4;&#xAC00; &#xB9DE;&#xC9C0; &#xC54A;&#xC74C;) &#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/77f8f6aa-4187-4cb6-b3cd-d084ac909f36.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="425" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/77f8f6aa-4187-4cb6-b3cd-d084ac909f36.png 600w, https://www.kimsehwan96.com/content/images/2024/04/77f8f6aa-4187-4cb6-b3cd-d084ac909f36.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC778;&#xB371;&#xC2A4;&#xAC00; &#xC77C;&#xCE58; &#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC740; &#xB9AC;&#xB354;&#xB294; &#xB2E4;&#xC2DC; S1 &#xCABD;&#xC5D0; prevIndex&#xB97C; 6&#xC73C;&#xB85C; (&#xAE30;&#xC874; 7&#xBCF4;&#xB2E4; &#xB0AE;&#xC740; &#xAC12;) &#xC804;&#xB2EC;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/be711c31-e72a-498a-bab1-1d86c536e79a.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="425" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/be711c31-e72a-498a-bab1-1d86c536e79a.png 600w, https://www.kimsehwan96.com/content/images/2024/04/be711c31-e72a-498a-bab1-1d86c536e79a.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC5EC;&#xC804;&#xD788; &#xC790;&#xC2E0;&#xC758; index&#xC640; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC2E4;&#xD328;&#xD588;&#xB2E4;&#xACE0; &#xBCF4;&#xB0B4;&#xBA74;&#xC11C; &#xC5EC;&#xC804;&#xD788; matchIndex 0 &#xC73C;&#xB85C; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/cc5ed012-2fc5-4bcc-8387-ab8f19dc7cf1.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="430" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/cc5ed012-2fc5-4bcc-8387-ab8f19dc7cf1.png 600w, https://www.kimsehwan96.com/content/images/2024/04/cc5ed012-2fc5-4bcc-8387-ab8f19dc7cf1.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xAC00; &#xADF8;&#xB7FC; prevIndex 5 &#xC778; &#xC815;&#xBCF4;&#xB97C; &#xB2F4;&#xACE0; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/074f8753-a11a-46f8-9951-7ea0bd15a0eb.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="430" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/074f8753-a11a-46f8-9951-7ea0bd15a0eb.png 600w, https://www.kimsehwan96.com/content/images/2024/04/074f8753-a11a-46f8-9951-7ea0bd15a0eb.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xC81C;&#xB294; &#xC790;&#xC2E0;&#xC758; prevIndex&#xAC00; 5&#xAC00; &#xB9DE;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, matchIndex 5&#xB97C; &#xB123;&#xACE0; &#xC131;&#xACF5;&#xD588;&#xB2E4;&#xACE0; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/c51c1425-0884-4edf-aad5-2d6eaf9d8d55.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="430" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/c51c1425-0884-4edf-aad5-2d6eaf9d8d55.png 600w, https://www.kimsehwan96.com/content/images/2024/04/c51c1425-0884-4edf-aad5-2d6eaf9d8d55.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xAC00; S1&#xC5D0;&#xAC8C; &#xC774;&#xC81C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xB2F4;&#xC544;&#xC11C; &#xC804;&#xB2EC;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/bf92413a-1b84-43ce-8f0e-881c0925e379.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="430" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/bf92413a-1b84-43ce-8f0e-881c0925e379.png 600w, https://www.kimsehwan96.com/content/images/2024/04/bf92413a-1b84-43ce-8f0e-881c0925e379.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC751;&#xB2F5;&#xD558;&#xBA74;&#xC11C;, matchIndex 6&#xC744; &#xD3EC;&#xD568;&#xD574; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/aaa13163-ef56-4416-8c07-996d19b682e0.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="789" height="430" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/aaa13163-ef56-4416-8c07-996d19b682e0.png 600w, https://www.kimsehwan96.com/content/images/2024/04/aaa13163-ef56-4416-8c07-996d19b682e0.png 789w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xC81C; &#xADF8; &#xB2E4;&#xC74C; &#xD56D;&#xBAA9;. 7&#xBC88; index&#xC5D0; &#xB123;&#xC744; &#xD56D;&#xBAA9;&#xC744; &#xB9AC;&#xB354;&#xAC00; &#xC804;&#xB2EC;&#xD574;&#xC900;&#xB2E4;. &#xC774;&#xC640; &#xAC19;&#xC740; &#xACFC;&#xC815;&#xC744; &#xD604;&#xC7AC; &#xB9AC;&#xB354;&#xC758; commitIndex &#xAC12;&#xC778; 8&#xC774; &#xB420; &#xB54C; &#xAE4C;&#xC9C0; &#xBC18;&#xBCF5;&#xD55C;&#xB2E4;. </span></figcaption></figure><p>&#xC774;&#xB7F0; &#xC77C;&#xAD00;&#xC131; &#xAC80;&#xC0AC;&#xB294; &#xADC0;&#xB0A9;&#xC801;&#xC73C;&#xB85C; &#xC791;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xB85C;&#xADF8;&#xC758; &#xCD08;&#xAE30; &#xBE48; &#xC0C1;&#xD0DC;&#xB294; &#xB85C;&#xADF8; &#xC77C;&#xCE58; &#xC18D;&#xC131;&#xC744; &#xB9CC;&#xC871;&#xC2DC;&#xD0A4;&#xACE0;, &#xC77C;&#xAD00;&#xC131; &#xAC80;&#xC0AC;&#xB294; &#xB85C;&#xADF8;&#xAC00; &#xD655;&#xC7A5; &#xB420; &#xB54C; &#xB9C8;&#xB2E4; &#xB85C;&#xADF8; &#xC77C;&#xCE58; &#xC18D;&#xC131;&#xC744; &#xBCF4;&#xC874;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8; &#xACB0;&#xACFC;&#xB85C; AppendEntries &#xAC00; &#xC131;&#xACF5;&#xC801;&#xC73C;&#xB85C; &#xBC18;&#xD658; &#xB420; &#xB54C; &#xB9C8;&#xB2E4; &#xB9AC;&#xB354;&#xB294; &#xD314;&#xB85C;&#xC6CC;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xC0C8; &#xD56D;&#xBAA9;&#xC744; &#xD1B5;&#xD574; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC640; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC54C;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/3feb3597-2264-49cf-9260-8c375567636f.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="514" height="290"><figcaption><span style="white-space: pre-wrap;">&#xAC00;&#xC7A5; &#xC704;&#xCABD;&#xC5D0; &#xC788;&#xB294; &#xBC15;&#xC2A4;&#xB4E4;&#xC774; &#xD604;&#xC7AC; &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; a-f &#xD314;&#xB85C;&#xC6CC;&#xB4E4; &#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xB97C; &#xC0DD;&#xAC01; &#xD574; &#xBCFC; &#xC218; &#xC788;&#xB294;&#xB370;. &#xAC01; &#xBC15;&#xC2A4;&#xB294; &#xD558;&#xB098;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774;&#xBA70;, &#xBC15;&#xC2A4; &#xC548;&#xC758; &#xC22B;&#xC790;&#xB294; &#xADF8; &#xD56D;&#xBAA9;&#xC758; term &#xC785;&#xB2C8;&#xB2E4;. &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xC77C;&#xBD80; &#xD56D;&#xBAA9;&#xC744; &#xB204;&#xB77D; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (a-b), &#xB610;&#xD55C; &#xCEE4;&#xBC0B; &#xB418;&#xC9C0; &#xC54A;&#xB294; &#xCD94;&#xAC00; &#xD56D;&#xBAA9;&#xC744; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (c-d), &#xB610;&#xB294; &#xB458; &#xB2E4;&#xC785;&#xB2C8;&#xB2E4;.(&#xB204;&#xB77D;&#xB3C4;&#xD558;&#xACE0;, &#xCD94;&#xAC00;&#xD56D;&#xBAA9;&#xB3C4; &#xAC00;&#xC9C0;&#xB294;) (e-f). &#xC608;&#xB97C;&#xB4E4;&#xC5B4; f &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xAC00; term 2 &#xC5D0;&#xC11C; &#xB9AC;&#xB354;&#xC600;&#xACE0;, &#xB85C;&#xADF8;&#xC5D0; &#xC5EC;&#xB7EC; &#xD56D;&#xBAA9;&#xC744; &#xCD94;&#xAC00; &#xD55C; &#xD6C4; &#xADF8; &#xC5B4;&#xB5A4; &#xD56D;&#xBAA9;&#xC744; &#xCEE4;&#xBC0B;&#xD558;&#xAE30;&#xB3C4; &#xC804;&#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;&#xBA74; &#xB098;&#xD0C0;&#xB0A0; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; f &#xB9AC;&#xB354;&#xAC00; timeout &#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xACE0; &#xB610; &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC744; &#xD1B5;&#xD574; term3&#xC758; &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xC5C8;&#xACE0;, &#xC774;&#xB54C;&#xB3C4; &#xC5EC;&#xB7EC;&#xAC1C;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xCD94;&#xAC00;&#xD588;&#xC9C0;&#xB9CC;, &#xC5ED;&#xC2DC;&#xB098; &#xC5B4;&#xB5A4;&#xAC83;&#xB3C4; &#xCEE4;&#xBC0B; &#xB418;&#xAE30; &#xC804;&#xC5D0; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC2DC; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xB098;&#xACE0;, &#xADF8; &#xC774;&#xD6C4; &#xC5EC;&#xB7EC; &#xC784;&#xAE30;&#xB3D9;&#xC548; &#xB2E4;&#xC6B4;&#xC774; &#xB418;&#xC5C8;&#xB2E4;&#xBA74; &#xC774;&#xB807;&#xAC8C; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC544;&#xB798;&#xB294; &#xC704; &#xC0C1;&#xD669;&#xC5D0; &#xB300;&#xD55C; &#xC124;&#xBA85;&#xC744; Raftscope &#xAE30;&#xBC18;&#xC758; &#xC124;&#xBA85;&#xC785;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/f1934be3-eea0-425a-96ce-93761e7cb66f.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/f1934be3-eea0-425a-96ce-93761e7cb66f.png 600w, https://www.kimsehwan96.com/content/images/2024/04/f1934be3-eea0-425a-96ce-93761e7cb66f.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xBAA8;&#xC885;&#xC758; &#xC774;&#xC720;&#xB85C; &#xAE30;&#xC874; &#xB9AC;&#xB354;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xACE0;, S2 &#xC11C;&#xBC84;&#xAC00; &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xC5C8;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/dd8c5bd8-100a-490a-83f1-3e3008832ff8.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/dd8c5bd8-100a-490a-83f1-3e3008832ff8.png 600w, https://www.kimsehwan96.com/content/images/2024/04/dd8c5bd8-100a-490a-83f1-3e3008832ff8.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; S2 &#xCABD;&#xC5D0; 3&#xAC1C;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xB354; &#xC313;&#xC600;&#xB294;&#xB370;, S2&#xAC00; timeout &#xC744; &#xC77C;&#xC73C;&#xD0A4;&#xACE0; &#xB2E4;&#xC2DC; &#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC744; &#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/1b06e94e-4a74-4d58-8e15-04b39d289009.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/1b06e94e-4a74-4d58-8e15-04b39d289009.png 600w, https://www.kimsehwan96.com/content/images/2024/04/1b06e94e-4a74-4d58-8e15-04b39d289009.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">term 4&#xC5D0;&#xC11C; &#xB9AC;&#xB354;&#xC778; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; 2&#xAC1C;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xB354; &#xC800;&#xC7A5;&#xD588;&#xB2E4;&#xAC00;, &#xC11C;&#xBC84;&#xAC00; &#xBED7;&#xC5B4;&#xBC84;&#xB838;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/e690a353-50a9-4600-b70b-5e586723fe38.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/e690a353-50a9-4600-b70b-5e586723fe38.png 600w, https://www.kimsehwan96.com/content/images/2024/04/e690a353-50a9-4600-b70b-5e586723fe38.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xD6C4; &#xB2E4;&#xB978; &#xB9AC;&#xB354;/&#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC740; S2&#xAC00; &#xC800;&#xC7A5;&#xD55C; &#xB85C;&#xADF8;&#xB4E4;&#xACFC; &#xB2E4;&#xB978; &#xB85C;&#xADF8;&#xB4E4;&#xC744; commit &#xD588;&#xB2E4;.</span></figcaption></figure><p>&#xC815;&#xC0C1;&#xC801;&#xC778; &#xC6B4;&#xC601; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xB9AC;&#xB354;&#xC640; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xC77C;&#xAD00;&#xC131; &#xC788;&#xAC8C; &#xC720;&#xC9C0;&#xB418;&#xBBC0;&#xB85C;, AppendEntries &#xC758; &#xC77C;&#xAD00;&#xC131; &#xCCB4;&#xD06C;&#xB294; &#xC808;&#xB300;&#xB85C; &#xC2E4;&#xD328;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xB9AC;&#xB354;&#xC758; crash &#xB294; &#xB85C;&#xADF8; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xAE70; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC774;&#xC804; &#xB9AC;&#xB354;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC788;&#xB294; &#xD56D;&#xBAA9;&#xC744; &#xBAA8;&#xB450; &#xBCF5;&#xC81C; &#xBABB;&#xD588;&#xB2E4;&#xBA74;). </p><p>&#xC774;&#xB7F0; &#xBE44;&#xC77C;&#xAD00;&#xC131;&#xC740; &#xC5EC;&#xB7EC;&#xCC28;&#xB840;&#xC758; &#xB9AC;&#xB354;&#xC640; &#xD314;&#xB85C;&#xC6CC;&#xC758; crash &#xB85C; &#xBC1C;&#xC0DD; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C;&#xB294; &#xC788;&#xB294;&#xB370; &#xC790;&#xC2E0;&#xC5D0;&#xAC8C; &#xC5C6;&#xB294; &#xD56D;&#xBAA9;&#xC744; &#xB204;&#xB77D; &#xD560; &#xC218;&#xB3C4; &#xC788;&#xACE0;, &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xC5C6;&#xB294; &#xCD94;&#xAC00; &#xD56D;&#xBAA9;&#xC744; &#xAC00;&#xC9C8; &#xC218; &#xB3C4; &#xC788;&#xACE0;, &#xB458;&#xB2E4; &#xADF8;&#xB7F4;&#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC704; &#xADF8;&#xB9BC;&#xB4E4; &#xCC38;&#xACE0;)</p><p>Raft &#xC5D0;&#xC11C;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xBCF5;&#xC81C;&#xD558;&#xB3C4;&#xB85D; &#xAC15;&#xC81C;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC774;&#xB7F0; &#xC77C;&#xAD00;&#xC131;&#xC774; &#xAE68;&#xC9C0;&#xB294; &#xBB38;&#xC81C;&#xB97C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC989;, &#xD314;&#xB85C;&#xC6CC; &#xB85C;&#xADF8;&#xC758; &#xCDA9;&#xB3CC;&#xD558;&#xB294; &#xD56D;&#xBAA9;&#xB4E4;&#xC740; &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xB85C; &#xB36E;&#xC5EC;&#xC4F0;&#xC5EC;&#xC9C4;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD314;&#xB85C;&#xC6CC;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xC640; &#xC77C;&#xCE58;&#xC2DC;&#xD0A4;&#xAE30; &#xC704;&#xD574;&#xC11C;, &#xB9AC;&#xB354;&#xB294; &#xD314;&#xB85C;&#xC6CC;&#xC640; &#xC790;&#xC2E0;&#xC774; &#xC77C;&#xCE58;&#xD558;&#xB294; &#xAC00;&#xC7A5; &#xCD5C;&#xADFC;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xCC3E;&#xC544;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xADF8; &#xC9C0;&#xC810; &#xC774;&#xD6C4;&#xC758; &#xD314;&#xB85C;&#xC6CC;&#xC758; &#xB85C;&#xADF8;&#xC758; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC744; &#xC0AD;&#xC81C;&#xD558;&#xACE0;, &#xD314;&#xB85C;&#xC6CC;&#xC5D0;&#xAC8C; &#xADF8; &#xC2DC;&#xC810; &#xC774;&#xD6C4;&#xC758; &#xBAA8;&#xB4E0; &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xBCF4;&#xB0B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB7F0; &#xBAA8;&#xB4E0; &#xC77C;&#xB4E4;&#xC740; AppendEntries RPC&#xC758; &#xC77C;&#xAD00;&#xC131; &#xCCB4;&#xD06C;&#xAC00; &#xC218;&#xD589;&#xB428;&#xC73C;&#xB85C;&#xC368; &#xC774;&#xB8E8;&#xC5B4; &#xC9D1;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xAC01; &#xD314;&#xB85C;&#xC6CC;&#xC758; <code>nextIndex</code> &#xB97C; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xAC12;&#xC740; &#xD314;&#xB85C;&#xC6CC;&#xC5D0;&#xAC8C; &#xB9AC;&#xB354;&#xAC00; &#xBCF4;&#xB0B4;&#xC57C;&#xD558;&#xB294; &#xB2E4;&#xC74C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; index &#xAC12;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xAC00; &#xCC98;&#xC74C;&#xC73C;&#xB85C; &#xBCF8;&#xC778;&#xC758; &#xC784;&#xAE30;&#xAC00; &#xC2DC;&#xC791;&#xB418;&#xC5C8;&#xC744; &#xB54C;, &#xBAA8;&#xB4E0; &#xD314;&#xB85C;&#xC6CC;&#xC758; <code>nextIndex</code> &#xAC12; (&#xB9AC;&#xB354; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xAC01; &#xC11C;&#xBC84;&#xB4E4;&#xC5D0; &#xB300;&#xD55C; &#xBA54;&#xD0C0; &#xB370;&#xC774;&#xD130;&#xC785;&#xB2C8;&#xB2E4;.) &#xC744; &#xC790;&#xC2E0;&#xC758; &#xB9C8;&#xC9C1; &#xB85C;&#xADF8; index&#xC758; &#xB2E4;&#xC74C; &#xAC12;&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xB9AC;&#xB354;&#xC758; &#xAC83;&#xACFC; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; AppendEntries RPC &#xC5D0;&#xC11C;&#xC758; &#xC77C;&#xAD00;&#xC131; &#xCCB4;&#xD06C;&#xAC00; &#xC2E4;&#xD328;&#xD560; &#xAC83;&#xC774;&#xACE0;. &#xD314;&#xB85C;&#xC6CC;&#xAC00; AppendEntries RPC &#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC744; &#xAC70;&#xBD80;&#xD558;&#xACE0;, matchIndex 0 &#xC744; &#xC804;&#xB2EC;&#xD558;&#xBA74;, &#xB9AC;&#xB354;&#xB294; &#xD574;&#xB2F9; &#xD314;&#xB85C;&#xC6CC;&#xC758; <code>nextIndex</code> &#xAC12;&#xC744; &#xAC10;&#xC18C;&#xC2DC;&#xD0A4;&#xACE0; AppendEntries RPC &#xB97C; &#xC7AC;&#xC2DC;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xACFC;&#xC815;&#xC774; &#xBC18;&#xBCF5;&#xB418;&#xBA74; &#xACB0;&#xAD6D;&#xC5D0; &#xB9AC;&#xB354;&#xC640; &#xD314;&#xB85C;&#xC6CC;&#xC758; <code>nextIndex</code> &#xAC12;&#xC774; &#xC77C;&#xCE58;&#xD558;&#xB294; &#xC9C0;&#xC810;&#xC5D0; &#xB3C4;&#xB2EC;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xACB0;&#xAD6D; &#xC774;&#xB807;&#xAC8C; <code>nextIndex</code> &#xAC12;&#xC774; &#xC77C;&#xCE58;&#xD558;&#xB294; &#xC9C0;&#xC810;&#xC5D0;&#xC11C; &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xCDA9;&#xB3CC;&#xB418;&#xB294; &#xBAA8;&#xB4E0; &#xD574;&#xB2F9; &#xC2DC;&#xC810; &#xC774;&#xD6C4;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xC81C;&#xAC70;&#xD558;&#xACE0;, &#xB9AC;&#xB354;&#xC758; &#xB85C;&#xADF8;&#xC5D0;&#xC11C; &#xC0C8;&#xB85C;&#xC6B4; &#xD56D;&#xBAA9;&#xB4E4;&#xC744;(&#xC788;&#xB2E4;&#xBA74;) &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xD1B5;&#xD574; &#xB9AC;&#xB354;&#xAC00; &#xBD80;&#xC784;&#xB418;&#xC5C8;&#xC744; &#xB54C; &#xB85C;&#xADF8; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xBCF5;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD2B9;&#xBCC4;&#xD55C; &#xC870;&#xCE58;&#xB97C; &#xD560; &#xAC8C; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. AppendEntries&#xC758; &#xC77C;&#xAD00;&#xC131; &#xAC80;&#xC0AC;&#xC758; &#xC2E4;&#xD328;&#xAC00; &#xB204;&#xC801;&#xB418;&#xB2E4; &#xBCF4;&#xBA74;, &#xBD88;&#xC77C;&#xCE58; &#xC9C0;&#xC810;&#xC744; &#xCC3E;&#xACE0;, &#xBCF5;&#xC6D0;&#xD558;&#xB294; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; &#xB85C;&#xADF8;&#xB4E4;&#xC774; &#xC218;&#xB834;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xB9AC;&#xB354;&#xB294; &#xC808;&#xB300;&#xB85C; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0;&#xC11C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xB36E;&#xC5B4;&#xC4F0;&#xAC70;&#xB098; &#xC0AD;&#xC81C;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xB85C;&#xADF8; &#xBCF5;&#xC81C; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC740; &#xC11C;&#xBC84;&#xC758; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC774; &#xC791;&#xB3D9;&#xC911;&#xC778; &#xD55C; Raft &#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xB85C;&#xADF8;&#xB97C; &#xC218;&#xB77D;&#xD558;&#xACE0;, &#xBCF5;&#xC81C;&#xD558;&#xBA70;, &#xBC18;&#xC601; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC815;&#xC0C1;&#xC801;&#xC778; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xC11C;&#xBC84;&#xC5D0; &#xB2E8; &#xD55C;&#xBC88;&#xC758; RPC&#xB85C; &#xC0C8; &#xD56D;&#xBAA9;&#xC744; &#xBCF5;&#xC81C; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xB2E8; &#xD558;&#xB098;&#xC758; &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC131;&#xB2A5;&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE58;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xB9AC;&#xB354;&#xB294; &#xC815;&#xC871;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xC11C;&#xBC84;&#xC5D0; &#xB85C;&#xADF8;&#xAC00; &#xBCF5;&#xC81C;&#xB418;&#xBA74; commit &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; !!!)</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC544;&#xB798;&#xB294; AppendEntries &#xC758; &#xB85C;&#xADF8; &#xBCF5;&#xC81C; &#xC218;&#xB834;&#xC5D0; &#xB300;&#xD55C; Raftscope &#xAE30;&#xBC18;&#xC758; &#xC124;&#xBA85;&#xC785;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/6e1445ec-158b-4d71-b62b-c7221f44e557.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/6e1445ec-158b-4d71-b62b-c7221f44e557.png 600w, https://www.kimsehwan96.com/content/images/2024/04/6e1445ec-158b-4d71-b62b-c7221f44e557.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; S2&#xB294; &#xB2E4;&#xB978; &#xC11C;&#xBC84;&#xB4E4;&#xACFC; &#xB2E4;&#xB978; &#xB85C;&#xADF8;&#xD56D;&#xBAA9;&#xC744; &#xAC16;&#xACE0; &#xC788;&#xB2E4;. &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xBC15;&#xC2A4; &#xC544;&#xB798;&#xCABD; &#xD654;&#xC0B4;&#xD45C;&#xAC00; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC758; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>nextIndex</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;. S2&#xB294; &#xD604;&#xC7AC; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>nextIndex</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC774; 6 &#xC778; &#xC0C1;&#xD0DC;&#xC774;&#xB2E4; (&#xB9AC;&#xB354;&#xAC00; &#xBCF4;&#xAE30;&#xC5D0;) &#xB610;&#xD55C; &#xC784;&#xAE30; &#xAC12;&#xB3C4; 4&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xB418;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/43dd61a8-fdd1-4ce6-ac5f-b2a088a45b47.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/43dd61a8-fdd1-4ce6-ac5f-b2a088a45b47.png 600w, https://www.kimsehwan96.com/content/images/2024/04/43dd61a8-fdd1-4ce6-ac5f-b2a088a45b47.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xC758; heatbeat(AppendEntries RPC)&#xC5D0; &#xBC18;&#xC751;&#xD574;&#xC11C;, &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xACE0;, matchIndex&#xAC00; 0 (&#xC77C;&#xCE58;&#xD558;&#xB294;&#xAC83;&#xC774; &#xC5C6;&#xB2E4;)&#xACE0; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/0937aaf6-75f5-4b40-b6fd-ff5f1aad44e6.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/0937aaf6-75f5-4b40-b6fd-ff5f1aad44e6.png 600w, https://www.kimsehwan96.com/content/images/2024/04/0937aaf6-75f5-4b40-b6fd-ff5f1aad44e6.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xADF8;&#xB7EC;&#xBA74; &#xB9AC;&#xB354;&#xB294; S2&#xC758; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>nextIndex</span></code><span style="white-space: pre-wrap;"> &#xAC12;&#xC740; 5 &#xB77C;&#xACE0; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xACE0; (</span><code spellcheck="false" style="white-space: pre-wrap;"><span>prevIndex4</span></code><span style="white-space: pre-wrap;">) &#xADF8;&#xB9AC;&#xACE0; &#xD574;&#xB2F9; &#xC778;&#xB371;&#xC2A4;&#xC5D0;&#xC11C;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC804;&#xB2EC;&#xD574;&#xC11C; &#xC77C;&#xCE58;&#xD558;&#xB294;&#xC9C0; &#xCCB4;&#xD06C;&#xD574;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. (AppendEntries RPC)</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/613c1eb5-2b8e-491d-ab80-eebced210a98.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/613c1eb5-2b8e-491d-ab80-eebced210a98.png 600w, https://www.kimsehwan96.com/content/images/2024/04/613c1eb5-2b8e-491d-ab80-eebced210a98.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC5EC;&#xC804;&#xD788; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC2E4;&#xD328;&#xD588;&#xB2E4;&#xB294; &#xC751;&#xB2F5;&#xC744; S2&#xAC00; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/bbfb4887-5ba9-47a7-84cd-4e9f272285e1.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/bbfb4887-5ba9-47a7-84cd-4e9f272285e1.png 600w, https://www.kimsehwan96.com/content/images/2024/04/bbfb4887-5ba9-47a7-84cd-4e9f272285e1.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xB294; S2&#xC758; nextIndex &#xAC12;&#xC744; 4&#xB85C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xACE0;, &#xB2E4;&#xC2DC; AppendEntries RPC&#xB97C; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/db95fb21-9e33-4ef7-a083-09840e814f37.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/db95fb21-9e33-4ef7-a083-09840e814f37.png 600w, https://www.kimsehwan96.com/content/images/2024/04/db95fb21-9e33-4ef7-a083-09840e814f37.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC9C0;&#xAE08; &#xC774; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294;S2 &#xAC00; 3&#xBC88; &#xC778;&#xB371;&#xC2A4;&#xC758; &#xB85C;&#xADF8; &#xAC12;&#xC744; &#xCEE4;&#xBC0B;&#xC744; &#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB358; &#xC0C1;&#xD669;&#xC774;&#xB77C;&#xC11C; &#xCEE4;&#xBC0B;&#xD558;&#xACE0; 3&#xBC88; &#xC778;&#xB371;&#xC2A4;&#xBD80;&#xD130; &#xB85C;&#xADF8;&#xAC00; &#xC77C;&#xCE58;&#xD55C;&#xB2E4;&#xACE0; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/b7184ab5-4780-4a49-9a60-87363417e6d9.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/b7184ab5-4780-4a49-9a60-87363417e6d9.png 600w, https://www.kimsehwan96.com/content/images/2024/04/b7184ab5-4780-4a49-9a60-87363417e6d9.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC5EC;&#xAE30;&#xC11C; &#xB9AC;&#xB354;&#xB294; 4&#xBC88;&#xC9F8; &#xC778;&#xB371;&#xC2A4;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC08; &#xAC12;&#xC744; &#xC804;&#xB2EC;&#xD574;&#xC900;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/fcacf58b-b09d-4e27-8a96-e1a70ab7604d.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/fcacf58b-b09d-4e27-8a96-e1a70ab7604d.png 600w, https://www.kimsehwan96.com/content/images/2024/04/fcacf58b-b09d-4e27-8a96-e1a70ab7604d.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">4&#xBC88;&#xC9F8; &#xC778;&#xB371;&#xC2A4;&#xC5D0; &#xC774;&#xC81C; &#xB9AC;&#xB354;&#xAC00; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xAC12;&#xC744; S2&#xB294; &#xCEE4;&#xBC0B;&#xD588;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/4bfbf155-c8a2-4dfd-a716-df3f4653844b.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/4bfbf155-c8a2-4dfd-a716-df3f4653844b.png 600w, https://www.kimsehwan96.com/content/images/2024/04/4bfbf155-c8a2-4dfd-a716-df3f4653844b.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">5&#xBC88;&#xC9F8; &#xC778;&#xB371;&#xC2A4; &#xCEE4;&#xBC0B;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/e97668ac-16ba-4525-9051-dc985586b0ea.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/e97668ac-16ba-4525-9051-dc985586b0ea.png 600w, https://www.kimsehwan96.com/content/images/2024/04/e97668ac-16ba-4525-9051-dc985586b0ea.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">6&#xBC88;&#xC9F8; &#xC778;&#xB371;&#xC2A4; &#xCEE4;&#xBC0B;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/1241fd6d-77cc-44b3-a9ee-b1cf033ac199.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="846" height="414" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/1241fd6d-77cc-44b3-a9ee-b1cf033ac199.png 600w, https://www.kimsehwan96.com/content/images/2024/04/1241fd6d-77cc-44b3-a9ee-b1cf033ac199.png 846w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">7&#xBC88;&#xC9F8; &#xC778;&#xB371;&#xC2A4; &#xCEE4;&#xBC0B;, &#xC774;&#xB807;&#xAC8C; AppendEntries RPC &#xC694;&#xCCAD;/&#xC751;&#xB2F5;&#xC744; S1, S2&#xAC00; &#xACC4;&#xC18D; &#xC8FC;&#xACE0;&#xBC1B;&#xC73C;&#xBA74;&#xC11C; &#xACB0;&#xAD6D; &#xB3D9;&#xC77C;&#xD55C; &#xC0C1;&#xD0DC; &#xBA38;&#xC2E0;&#xC774; &#xB41C;&#xB2E4;. </span></figcaption></figure><h2 id="%EC%95%88%EC%A0%95%EC%84%B1">&#xC548;&#xC815;&#xC131;</h2><p>&#xC55E;&#xC120; &#xC139;&#xC158;&#xB4E4;&#xC5D0;&#xC11C;&#xB294; Raft&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xACE0;, &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xBCF5;&#xC81C;&#xD558;&#xB294;&#xC9C0; &#xC124;&#xBA85;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; <strong>&#xC9C0;&#xAE08;&#xAE4C;&#xC9C0; &#xC124;&#xBA85;&#xD55C; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;</strong>&#xB9CC;&#xC73C;&#xB85C;&#xB294; <strong>&#xAC01; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;</strong>&#xC774; &#xC815;&#xD655;&#xD788; <strong>&#xAC19;&#xC740; command &#xB4E4;&#xC744; &#xAC19;&#xC740; &#xC21C;&#xC11C;&#xB85C; &#xC2E4;&#xD589;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xCDA9;&#xBD84;&#xD788; &#xBCF4;&#xC7A5;&#xD558;&#xC9C4; &#xBABB;&#xD569;&#xB2C8;&#xB2E4;.</strong> </p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C;, &#xB9AC;&#xB354;&#xAC00; &#xC5EC;&#xB7EC; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xCEE4;&#xBC0B;&#xD558;&#xB294; &#xB3D9;&#xC548; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC5C6;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;&#xAC00;, &#xADF8; &#xD6C4;&#xC5D0; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C;&#xB418;&#xC5B4; &#xC774; &#xD56D;&#xBAA9;&#xC744; &#xC0C8;&#xB85C;&#xC6B4; &#xAC83;&#xB4E4;&#xB85C; &#xB36E;&#xC5B4; &#xC4F8; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xB2E4;&#xB978; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xB4E4;&#xC740; &#xB2E4;&#xB978; &#xC2DC;&#xD000;&#xC2A4;&#xC758; command&#xB97C; &#xC218;&#xD589;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xC81C; &#xBD80;&#xD130;&#xB294; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C; &#xB420; &#xC218; &#xC788;&#xB294; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; &#xC81C;&#xD55C;&#xC744; &#xCD94;&#xAC00;&#xD568;&#xC73C;&#xB85C;&#xC368; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC644;&#xC131;&#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC744; &#xC124;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC8FC;&#xC5B4;&#xC9C4; term &#xC758; &#xB9AC;&#xB354;&#xAC00; &#xC774;&#xC804; term&#xC5D0;&#xC11C; &#xCEE4;&#xBC0B;&#xB41C; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC74C;&#xC744; &#xBCF4;&#xC7A5;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xC81C;&#xD55C;&#xC744; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC81C;&#xD55C;&#xC744; &#xACE0;&#xB824;&#xD574;&#xC11C; &#xCEE4;&#xBC0B; &#xADDC;&#xCE59;&#xC744; &#xB354; &#xC815;&#xD655;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="%EC%84%A0%EA%B1%B0-%EC%A0%9C%ED%95%9C">&#xC120;&#xAC70; &#xC81C;&#xD55C;</h2><p>&#xB9AC;&#xB354; &#xAE30;&#xBC18;&#xC758; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C;, &#xB9AC;&#xB354;&#xB294; &#xACB0;&#xAD6D;&#xC5D0;&#xB294; &#xBAA8;&#xB4E0; &#xCEE4;&#xBC0B;&#xB41C; &#xB85C;&#xADF8;&#xC758; &#xD56D;&#xBAA9;&#xC744; &#xBC18;&#xB4DC;&#xC2DC; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. Viewstamped Replication &#xAC19;&#xC740; &#xC77C;&#xBD80; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C;&#xB294;, &#xBAA8;&#xB4E0; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xAC16;&#xACE0;&#xC788;&#xC9C0; &#xC54A;&#xB354;&#xB77C;&#xB3C4; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7EC;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xB4E4;&#xC740; &#xC120;&#xAC70; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC9C4;&#xD589;&#xC911;&#xC774;&#xAC70;&#xB098;, &#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xBC14;&#xB85C; &#xC9C1;&#xD6C4;&#xC5D0; &#xB204;&#xB77D;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xD30C;&#xC545;&#xD558;&#xACE0;, &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBD88;&#xD589;&#xD788;&#xB3C4;, &#xC774;&#xB7F0;&#xAC83;&#xB4E4;&#xC740; &#xBCF5;&#xC7A1;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Raft&#xB294; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xC9C0;&#xB9CC; &#xB204;&#xB77D;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0BC; &#xD544;&#xC694; &#xC5C6;&#xC774;, &#xC774;&#xC804; &#xC784;&#xAE30;&#xC5D0;&#xC11C; &#xCEE4;&#xBC0B;&#xB41C; &#xBAA8;&#xB4E0; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xC0C8;&#xB85C;&#xC6B4; &#xC120;&#xAC70; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB9AC;&#xB354;&#xB9CC; &#xC120;&#xCD9C;&#xD558;&#xB3C4;&#xB85D; &#xBCF4;&#xC7A5;&#xD558;&#xB294; &#xB354; &#xC26C;&#xC6B4; &#xC811;&#xADFC;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xAC74;, &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xC624;&#xC9C1; &#xD55C; &#xBC29;&#xD5A5;&#xC73C;&#xB85C;, &#xB9AC;&#xB354;&#xC5D0;&#xC11C; &#xD314;&#xB85C;&#xC6CC;&#xB85C;&#xB9CC; &#xD750;&#xB974;&#xB294;&#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xACE0;, &#xB9AC;&#xB354;&#xB294; &#xC808;&#xB300;&#xB85C; &#xC790;&#xC2E0;&#xC774; &#xAE30;&#xC874;&#xC5D0; &#xAC16;&#xACE0;&#xC788;&#xB358; &#xD56D;&#xBAA9;&#xC744; &#xB36E;&#xC5B4;&#xC4F0;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294;&#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Raft&#xB294; &#xBAA8;&#xB4E0; &#xCEE4;&#xBC0B;&#xB41C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xAC16;&#xACE0;&#xC788;&#xC9C0; &#xC54A;&#xC740; &#xD6C4;&#xBCF4;&#xC790;&#xAC00; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC774;&#xAE30;&#xB294;&#xAC83;&#xC744; &#xB9C9;&#xB294; &#xC120;&#xAC70; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xBC18;&#xB4DC;&#xC2DC; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC758; &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xACFC; &#xD1B5;&#xC2E0;&#xD558;&#xC5EC;&#xC11C; &#xBF51;&#xD799;&#xB2C8;&#xB2E4;. </p><p>&#xADF8; &#xB73B;&#xC740; &#xBAA8;&#xB4E0; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xC740; &#xBC18;&#xB4DC;&#xC2DC; &#xC5F0;&#xB77D;&#xD588;&#xB358; &#xC774; &#xC11C;&#xBC84;&#xB4E4;&#xC911; &#xCD5C;&#xC18C;&#xD55C; &#xD558;&#xB098;&#xC5D0;&#xB294; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. (&#xCD94;&#xAC00;: &#xB85C;&#xADF8;&#xC758; &#xCEE4;&#xBC0B;&#xC740; &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBA64;&#xBC84;&#xC5D0;&#xAC8C; &#xBCF5;&#xC81C;&#xB418;&#xC5C8;&#xC744; &#xB54C; &#xC218;&#xD589;&#xB428;)</p><p>&#xB9CC;&#xC57D; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xACFC;&#xBC18;&#xC218; &#xBA64;&#xBC84;&#xB4E4; &#xC911; &#xC5B4;&#xB5A4; &#xB85C;&#xADF8;&#xBCF4;&#xB2E4; &#xCD5C;&#xC2E0;&#xC774;&#xB77C;&#xBA74;, &#xADF8;&#xAC74; &#xBAA8;&#xB4E0; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD588;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC785;&#xB2C8;&#xB2E4;. RequestVote RPC&#xB294; &#xC774;&#xB7EC;&#xD55C; &#xC81C;&#xD55C;&#xC744; &#xAD6C;&#xD604;&#xD569;&#xB2C8;&#xB2E4;. </p><p>RequestVote RPC &#xB294; &#xD6C4;&#xBCF4;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0;, &#xD22C;&#xD45C;&#xC790;&#xB294; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xAC00; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xAC83;&#xBCF4;&#xB2E4; &#xB354; &#xCD5C;&#xC2E0;&#xC774;&#xB77C;&#xBA74; &#xD574;&#xB2F9; &#xD22C;&#xD45C; &#xC694;&#xCCAD;&#xC744; &#xAC70;&#xC808;&#xD569;&#xB2C8;&#xB2E4;. </p><p>Raft&#xB294; &#xB450; &#xB85C;&#xADF8; &#xC911; &#xC5B4;&#xB290;&#xAC83;&#xC774; &#xB354; &#xCD5C;&#xC2E0;&#xC778;&#xC9C0;&#xB97C; &#xB85C;&#xADF8;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4;&#xC640; &#xC784;&#xAE30;&#xB97C; &#xBE44;&#xAD50;&#xD574;&#xC11C; &#xACB0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xB85C;&#xADF8;&#xAC00; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xC784;&#xAE30;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xD56D;&#xBAA9;&#xC744; &#xAC16;&#xACE0;&#xC788;&#xB2E4;&#xBA74;, &#xB354; &#xB192;&#xC740; &#xC22B;&#xC790;&#xC758; &#xC784;&#xAE30;&#xAC00; &#xB354; &#xCD5C;&#xC2E0; &#xB85C;&#xADF8;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xB85C;&#xADF8;&#xAC00; &#xAC19;&#xC740; &#xC784;&#xAE30;&#xB85C; &#xB05D;&#xB098;&#xBA74;, &#xB354; &#xAE34; &#xB85C;&#xADF8;&#xAC00; &#xB354; &#xCD5C;&#xC2E0;&#xC785;&#xB2C8;&#xB2E4;. (&#xAC19;&#xC740; &#xC784;&#xAE30;&#xC5D0; &#xB300;&#xD55C; &#xB85C;&#xADF8;&#xAC00; &#xB354; &#xB9CE;&#xC740;&#xCABD;&#xC774; &#xB354; &#xCD5C;&#xC2E0; &#xB85C;&#xADF8;&#xAE4C;&#xC9C0; &#xAC16;&#xACE0; &#xC788;&#xB294;&#xAC83;)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/48487a10-9b6e-498c-bb1b-d83fee8c69de.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="452" height="226"><figcaption><span style="white-space: pre-wrap;">&#xB9AC;&#xB354;&#xAC00; &#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCEE4;&#xBC0B;&#xC744; &#xACB0;&#xC815;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xC774;&#xC720;&#xB97C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xC2DC;&#xAC04; &#xC21C;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;. (a)&#xC5D0;&#xC11C;S1&#xC740; &#xB9AC;&#xB354;&#xACE0;, &#xC778;&#xB371;&#xC2A4; 2 &#xC5D0; &#xC788;&#xB294; &#xB85C;&#xADF8;&#xB97C; S2&#xAE4C;&#xC9C0;&#xB9CC; &#xBCF5;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; S1&#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC5EC; (b)&#xC5D0;&#xC11C;&#xC640;&#xAC19;&#xC774; S5&#xAC00; S3, S4, S5(&#xC790;&#xAE30;&#xC790;&#xC2E0;) &#xC73C;&#xB85C;&#xBD80;&#xD130; &#xD45C;&#xB97C; &#xBC1B;&#xC544;&#xC11C; (S1, S2&#xB294; S5 &#xC758; &#xD22C;&#xD45C;&#xB97C; &#xAC70;&#xC808;&#xD55C;&#xB2E4;. &#xB354; &#xCD5C;&#xC2E0; &#xB85C;&#xADF8;&#xAE4C;&#xC9C0; &#xAC16;&#xACE0; &#xC788;&#xC73C;&#xB2C8;&#xAE4C;) &#xB9AC;&#xB354;&#xAC00; &#xB418;&#xACE0; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4; 2&#xC5D0;&#xC11C; &#xB2E4;&#xB978; &#xD56D;&#xBAA9;&#xC744; &#xC218;&#xB77D;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; S5&#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xACE0; S1 &#xC774; &#xC7AC;&#xC2DC;&#xC791;&#xB418;&#xC5B4;&#xC11C; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C;&#xB418;&#xACE0; &#xB85C;&#xADF8;&#xC778;&#xB371;&#xC2A4;2&#xC758; &#xD56D;&#xBAA9;&#xC744; S3 &#xAE4C;&#xC9C0; &#xBCF5;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;. &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xC11C;&#xBC84;&#xC5D0; &#xBCF5;&#xC81C; &#xB418;&#xC5C8;&#xC9C0;&#xB9CC; &#xC544;&#xC9C1; &#xCEE4;&#xBC0B;&#xB418;&#xC9C0;&#xB294; &#xC54A;&#xC740; &#xC0C1;&#xD0DC;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xCEE4;&#xBC0B;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; S1&#xC774; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xACE0;, S5&#xAC00; &#xB2E4;&#xC2DC; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C;&#xB418;&#xC5C8;&#xC744; &#xB54C; (d) &#xADF8;&#xB9BC;&#xCC98;&#xB7FC; &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30; 3 &#xD56D;&#xBAA9;&#xC73C;&#xB85C; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC744; &#xB36E;&#xC5B4;&#xC4F8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; S1 &#xC774; &#xD06C;&#xB798;&#xC2DC;&#xD558;&#xAE30;&#xC804;&#xC5D0; (c)&#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30; 4 &#xC5D0;&#xC11C;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;(&#xB85C;&#xADF8;&#xC778;&#xB371;&#xC2A4; 3) &#xAC12;&#xC744; &#xC11C;&#xBC84; &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC5D0; &#xBCF5;&#xC81C;&#xD588;&#xB2E4;&#xBA74;, &#xC774; &#xD56D;&#xBAA9;&#xC740; &#xCEE4;&#xBC0B;&#xB429;&#xB2C8;&#xB2E4;. (S5&#xB294; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xB294; &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xC808;&#xB300; &#xC774;&#xAE38; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;). &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xC120;&#xD589; &#xD56D;&#xBAA9;(&#xC778;&#xB371;&#xC2A4;2&#xC5D0; &#xC788;&#xB358; &#xB85C;&#xADF8;)&#xB3C4; &#xCEE4;&#xBC0B;&#xB429;&#xB2C8;&#xB2E4;.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC544;&#xB798;&#xB294; &#xC704; &#xC0C1;&#xD669;&#xC5D0; &#xB300;&#xD55C; Raftscope &#xAE30;&#xBC18;&#xC758; &#xC124;&#xBA85;&#xC785;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/8f7fd307-92a2-482c-a2ba-638cc623da11.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/8f7fd307-92a2-482c-a2ba-638cc623da11.png 600w, https://www.kimsehwan96.com/content/images/2024/04/8f7fd307-92a2-482c-a2ba-638cc623da11.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S1 &#xC774; term 2 &#xC778; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xB9AC;&#xB354;&#xC774;&#xB2E4;. &#xC774; &#xB54C; S1 &#xC740; S2 &#xAE4C;&#xC9C0;&#xB9CC; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xBCF5;&#xC81C; &#xC131;&#xACF5;&#xD588;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xCEE4;&#xBC0B;&#xB418;&#xC9C4; &#xC54A;&#xC558;&#xC73C;&#xBA70;(&#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC5D0; &#xBCF5;&#xC81C;&#xB418;&#xC9C0; &#xC54A;&#xC558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;) &#xC774; &#xB54C; S1&#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xACE0; &#xD574;&#xBCF4;&#xC790;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/85b89c19-0532-474d-9df7-31d4de25aabe.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/85b89c19-0532-474d-9df7-31d4de25aabe.png 600w, https://www.kimsehwan96.com/content/images/2024/04/85b89c19-0532-474d-9df7-31d4de25aabe.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S1 &#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xACE0; S5&#xAC00; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC5D0; &#xC774;&#xC5B4; RequestVote RPC &#xB97C; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xC5D0; &#xBCF4;&#xB0C8;&#xB2E4;&#xACE0; &#xD574;&#xBCF4;&#xC790;. S1, S2 &#xB294; S5&#xAC00; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30; &#xAC12;&#xC774; &#xC790;&#xC2E0;&#xC774; &#xAC16;&#xACE0; &#xC788;&#xB294; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30;&#xAC12;&#xBCF4;&#xB2E4; &#xB0AE;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD22C;&#xD45C;&#xB97C; &#xAC70;&#xC808;&#xD558;&#xC9C0;&#xB9CC;, S5 &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC744; &#xD3EC;&#xD568;&#xD55C; S3, S4&#xB294; &#xC784;&#xAE30;&#xAC12;&#xC774; &#xAC19;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD22C;&#xD45C;&#xD574;&#xC900;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/30fc9eab-24b2-4852-a31f-d97450be5a0c.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/30fc9eab-24b2-4852-a31f-d97450be5a0c.png 600w, https://www.kimsehwan96.com/content/images/2024/04/30fc9eab-24b2-4852-a31f-d97450be5a0c.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S5 &#xAC00; term3 &#xC778; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xB9AC;&#xB354;&#xC774;&#xB2E4;. &#xC774; &#xB54C; S5 &#xB294; &#xB85C;&#xADF8;&#xC778;&#xB371;&#xC2A4; 3&#xC5D0; &#xB85C;&#xADF8;&#xB97C; &#xBC18;&#xC601;&#xD588;&#xC9C0;&#xB9CC;, &#xACE7;&#xBC14;&#xB85C; &#xD06C;&#xB798;&#xC2DC; &#xD588;&#xB2E4;&#xACE0; &#xD558;&#xC790;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/2622d40d-154a-4a00-b41a-3b665929f9ae.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/2622d40d-154a-4a00-b41a-3b665929f9ae.png 600w, https://www.kimsehwan96.com/content/images/2024/04/2622d40d-154a-4a00-b41a-3b665929f9ae.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S1 &#xC774; &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xC774;&#xD6C4; RequestVote RPC &#xB97C; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xC5D0; &#xBCF4;&#xB0C8;&#xC744; &#xB54C;. S5&#xB294; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30;&#xAC12;&#xC774; S1&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30;&#xAC12;&#xBCF4;&#xB2E4; &#xB192;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC70;&#xC808;&#xD558;&#xC9C0;&#xB9CC;, &#xB098;&#xBA38;&#xC9C0; &#xBA64;&#xBC84;&#xB4E4;&#xC740; &#xD22C;&#xD45C;&#xD574;&#xC900;&#xB2E4;. &#xC774; &#xB54C; &#xC5ED;&#xC2DC; S1 &#xC774; &#xD06C;&#xB798;&#xC2DC;&#xB0AC;&#xB2E4;&#xACE0; &#xD574;&#xBCF4;&#xC790;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/83e99c82-2d9f-474f-b3f2-35ee09fff2a6.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/83e99c82-2d9f-474f-b3f2-35ee09fff2a6.png 600w, https://www.kimsehwan96.com/content/images/2024/04/83e99c82-2d9f-474f-b3f2-35ee09fff2a6.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">S1&#xC758; &#xD06C;&#xB798;&#xC2DC; &#xC774;&#xD6C4; S5&#xAC00; &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xBC0F; RequestVote RPC &#xB97C; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xB4E4;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0C8;&#xC744; &#xB54C;. S1 &#xC744; &#xC81C;&#xC678;&#xD55C; &#xBA64;&#xBC84;&#xB4E4;&#xC740; &#xD22C;&#xD45C;&#xC5D0; &#xC751;&#xD55C;&#xB2E4;. S5 &#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30;&#xAC12;&#xC774; S1&#xC744; &#xC81C;&#xC678;&#xD55C; &#xBA64;&#xBC84;&#xB4E4;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30;&#xAC12;&#xBCF4;&#xB2E4; &#xB192;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. </span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/d597e0b4-b0b1-47a6-bd64-05842e86ff22.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/d597e0b4-b0b1-47a6-bd64-05842e86ff22.png 600w, https://www.kimsehwan96.com/content/images/2024/04/d597e0b4-b0b1-47a6-bd64-05842e86ff22.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xD6C4; &#xB9AC;&#xB354;&#xC758; AppendEntries RPC &#xAC00; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xB4E4;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xB418;&#xACE0;, S1, S2, S3 &#xB294; &#xCEE4;&#xBC0B;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xB85C;&#xADF8;&#xC778;&#xB371;&#xC2A4; 2&#xBC88;&#xC758; &#xAC12;&#xC744; S5&#xC758; &#xB85C;&#xADF8; &#xC815;&#xBCF4;&#xB85C; &#xB36E;&#xC5B4;&#xC50C;&#xC6B4;&#xB2E4;. (&#xCEE4;&#xBC0B;&#xB41C; &#xB85C;&#xADF8;&#xB294; &#xB36E;&#xC5B4;&#xC4F8; &#xC218; &#xC5C6;&#xC9C0;&#xB9CC;, &#xCEE4;&#xBC0B; &#xB418;&#xC9C0; &#xC54A;&#xC740; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xB36E;&#xC5B4; &#xC4F8; &#xC218; &#xC788;&#xB2E4;.)</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/e91dcb07-dab1-4017-b867-b38429270809.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/e91dcb07-dab1-4017-b867-b38429270809.png 600w, https://www.kimsehwan96.com/content/images/2024/04/e91dcb07-dab1-4017-b867-b38429270809.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xACB0;&#xAD6D; S5 &#xB9AC;&#xB354;&#xC758; &#xC815;&#xBCF4;&#xB85C; &#xBAA8;&#xB450; &#xB3D9;&#xAE30;&#xD654; &#xB41C;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/15fb180c-eb43-4376-b750-ff15d01e0c5b.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/15fb180c-eb43-4376-b750-ff15d01e0c5b.png 600w, https://www.kimsehwan96.com/content/images/2024/04/15fb180c-eb43-4376-b750-ff15d01e0c5b.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; &#xC784;&#xAE30; 4&#xC5D0;&#xC11C;&#xC758; S1 &#xC774; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4; 3 &#xC758; &#xD56D;&#xBAA9;&#xAE4C;&#xC9C0; &#xBAA8;&#xB450; &#xCEE4;&#xBC0B; &#xD588;&#xB2E4;&#xBA74;. S5 &#xB294; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xC808;&#xB300;&#xB85C; &#xD22C;&#xD45C;&#xC5D0;&#xC11C; &#xC774;&#xAE38; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. S5 &#xAC00; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xACE0; RequestVote RPC &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB354;&#xB77C;&#xB3C4;, &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xBA64;&#xBC84;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xB85C;&#xADF8;&#xC758; &#xC784;&#xAE30; &#xAC12;&#xBCF4;&#xB2E4; &#xB192;&#xC740; &#xC784;&#xAE30;&#xAC12;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xCEE4;&#xBC0B;&#xD574;&#xB450;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. </span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/9be7f9e8-61c2-4bf4-9e4c-d084f2b67520.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="782" height="406" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/9be7f9e8-61c2-4bf4-9e4c-d084f2b67520.png 600w, https://www.kimsehwan96.com/content/images/2024/04/9be7f9e8-61c2-4bf4-9e4c-d084f2b67520.png 782w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC790;&#xAE30; &#xC790;&#xC2E0;(S5)&#xACFC; S4 &#xB97C; &#xC81C;&#xC678;&#xD558;&#xACE0;&#xB294;, &#xC120;&#xAC70;&#xC5D0;&#xC11C; &#xBF51;&#xC544;&#xC8FC;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</span></figcaption></figure><h2 id="%EC%9D%B4%EC%A0%84-%EC%9E%84%EA%B8%B0%EC%9D%98-%ED%95%AD%EB%AA%A9%EB%93%A4%EC%9D%84-%EC%BB%A4%EB%B0%8B">&#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xCEE4;&#xBC0B;</h2><p> &#xB9AC;&#xB354;&#xB294; &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xC758; &#xD56D;&#xBAA9;&#xC774; &#xC11C;&#xBC84; &#xACFC;&#xBC18;&#xC218;&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xBA74; &#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xC54C;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xAC00; &#xD56D;&#xBAA9;&#xC744; &#xCEE4;&#xBC0B;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xD06C;&#xB798;&#xC2DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xBA74;, &#xBBF8;&#xB798;&#xC758; &#xB9AC;&#xB354;&#xB4E4;&#xC740; &#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xBCF5;&#xC81C;&#xB97C; &#xC644;&#xB8CC;&#xD558;&#xB824;&#xACE0; &#xC2DC;&#xB3C4;&#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB7EC;&#xB098;, &#xB9AC;&#xB354;&#xB294; &#xD56D;&#xBAA9;&#xC774;<strong> &#xC11C;&#xBC84; &#xACFC;&#xBC18;&#xC218;&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xD574;&#xC11C; &#xACE7;&#xBC14;&#xB85C; &#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xD56D;&#xBAA9;&#xC774; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xACB0;&#xB860;&#xC9C0;&#xC744; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</strong> &#xC55E;&#xC11C; &#xD45C;&#xD604;&#xD55C; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C;&#xB294; &#xC624;&#xB798;&#xB41C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xC11C;&#xBC84; &#xACFC;&#xBC18;&#xC218;&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5C8;&#xC9C0;&#xB9CC;, &#xC5EC;&#xC804;&#xD788; &#xBBF8;&#xB798;&#xC758; &#xB9AC;&#xB354;&#xC5D0; &#xC758;&#xD574; &#xB36E;&#xC5B4;&#xC4F0;&#xC5EC;&#xC9C8; &#xC218; &#xC788;&#xB294; &#xC0C1;&#xD669;&#xC744; &#xBCF4;&#xC5EC;&#xC90D;&#xB2C8;&#xB2E4;.</p><p>Raft&#xB294; &#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xBCF5;&#xC81C; &#xC218;&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xC5EC; &#xC808;&#xB300; &#xCEE4;&#xBC0B;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC624;&#xC9C1; &#xB9AC;&#xB354;&#xC758; &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xC5D0;&#xC11C; &#xC628; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB9CC;&#xC774; &#xBCF5;&#xC81C; &#xC218;&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xC5EC; &#xCEE4;&#xBC0B;&#xB429;&#xB2C8;&#xB2E4;. &#xD604;&#xC7AC; &#xC784;&#xAE30;&#xC5D0;&#xC11C; &#xC628; &#xD56D;&#xBAA9;&#xC774; &#xC774;&#xB7F0; &#xC2DD;&#xC73C;&#xB85C; &#xCEE4;&#xBC0B;&#xB418;&#xBA74;, &#xADF8; &#xC774;&#xC804;&#xC758; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xB4E4;&#xC740; &#xB85C;&#xADF8; &#xC77C;&#xCE58; &#xC18D;&#xC131; &#xB54C;&#xBB38;&#xC5D0; &#xAC04;&#xC811;&#xC801;&#xC73C;&#xB85C; &#xCEE4;&#xBC0B;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xC624;&#xB798;&#xB41C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xACB0;&#xB860;&#xC9C0;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;(&#xC608;&#xB97C; &#xB4E4;&#xC5B4;, &#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5B4; &#xC788;&#xB294; &#xACBD;&#xC6B0;), &#xADF8;&#xB7EC;&#xB098; Raft&#xB294; &#xB2E8;&#xC21C;&#xD568;&#xC744; &#xC704;&#xD574; &#xBCF4;&#xB2E4; &#xBCF4;&#xC218;&#xC801;&#xC778; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC744; &#xCDE8;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Raft&#xB294; &#xCEE4;&#xBC0B; &#xADDC;&#xCE59;&#xC5D0;&#xC11C; &#xC774; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xBCF5;&#xC7A1;&#xC131;&#xC744; &#xAC10;&#xC218;&#xD558;&#xB294;&#xB370;, &#xC774;&#xB294; &#xB9AC;&#xB354;&#xAC00; &#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xBCF5;&#xC81C;&#xD560; &#xB54C;, &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xC6D0;&#xB798;&#xC758; &#xC784;&#xAE30; &#xBC88;&#xD638;&#xB97C; &#xC720;&#xC9C0;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. </p><p>Raft&#xC758; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC740; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;&#xC774; &#xC2DC;&#xAC04;&#xC774; &#xC9C0;&#xB098;&#xB3C4; &#xAC19;&#xC740; &#xC784;&#xAE30; &#xBC88;&#xD638;&#xB97C; &#xC720;&#xC9C0;&#xD558;&#xACE0; &#xB85C;&#xADF8; &#xC804;&#xCCB4;&#xC5D0;&#xC11C; &#xC720;&#xC9C0;&#xB418;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC5D0; &#xB300;&#xD574; &#xCD94;&#xB860;&#xD558;&#xAE30;&#xAC00; &#xB354; &#xC27D;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB610;&#xD55C;, Raft&#xC758; &#xC0C8;&#xB85C;&#xC6B4; &#xB9AC;&#xB354;&#xB4E4;&#xC740; &#xB2E4;&#xB978; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xBCF4;&#xB2E4; &#xC774;&#xC804; &#xC784;&#xAE30;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xB354; &#xC801;&#xAC8C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;(&#xB2E4;&#xB978; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xCEE4;&#xBC0B;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xC7AC;&#xBC88;&#xD638;&#xB97C; &#xB9E4;&#xAE30;&#xAE30; &#xC704;&#xD574; &#xC911;&#xBCF5; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xBCF4;&#xB0B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/f3f6d270-6ad4-40b3-905a-1c885d75616b.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="452" height="189"><figcaption><span style="white-space: pre-wrap;">&#xB9CC;&#xC57D; S1(&#xC784;&#xAE30; T&#xC758; &#xB9AC;&#xB354;)&#xC774; &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30;&#xC5D0;&#xC11C; &#xC0C8;&#xB85C;&#xC6B4; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xCEE4;&#xBC0B;&#xD558;&#xACE0;, &#xB098;&#xC911;&#xC758; &#xC784;&#xAE30; U&#xC5D0; S5&#xAC00; &#xB9AC;&#xB354;&#xB85C; &#xC120;&#xCD9C;&#xB41C;&#xB2E4;&#xBA74;, &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC218;&#xB77D;&#xD588;&#xB358; &#xC801;&#xC5B4;&#xB3C4; &#xD558;&#xB098;&#xC758; &#xC11C;&#xBC84;(S3)&#xAC00; S5&#xC5D0;&#xAC8C; &#xD22C;&#xD45C;&#xD588;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</span></figcaption></figure><h2 id="%ED%8C%94%EB%A1%9C%EC%9B%8C%EC%99%80-%ED%9B%84%EB%B3%B4%EC%9E%90%EC%9D%98-%EC%B6%A9%EB%8F%8C">&#xD314;&#xB85C;&#xC6CC;&#xC640; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xCDA9;&#xB3CC;</h2><p>&#xC9C0;&#xAE08;&#xAE4C;&#xC9C0;&#xB294; &#xB9AC;&#xB354;&#xC758; &#xC2E4;&#xD328;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xC124;&#xBA85;&#xD588;&#xB294;&#xB370;, &#xD314;&#xB85C;&#xC6CC;&#xC640; &#xD6C4;&#xBCF4;&#xC790;&#xC758; &#xCDA9;&#xB3CC;&#xC740; &#xB354; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xAC04;&#xB2E8;&#xD558;&#xACE0;, &#xB458; &#xB2E4; &#xAC19;&#xC740; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCC98;&#xB9AC; &#xB429;&#xB2C8;&#xB2E4;. &#xD314;&#xB85C;&#xC6CC;&#xC640; &#xD6C4;&#xBCF4;&#xAC00; &#xCDA9;&#xB3CC;&#xD55C;&#xB2E4;&#xBA74; &#xADF8;&#xAC83;&#xB4E4;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0B4;&#xC9C4; &#xBBF8;&#xB798;&#xC758; RequestVote RPC , AppendEntires RPC &#xBAA8;&#xB450; &#xC2E4;&#xD328; &#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>Raft &#xB294; &#xC774;&#xB7EC;&#xD55C; &#xC2E4;&#xD328;&#xB97C; &#xBB34;&#xD55C;&#xD788; &#xC7AC;&#xC2DC;&#xB3C4; &#xD568;&#xC73C;&#xB85C;&#xC368; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xD06C;&#xB798;&#xC2DC;&#xD55C; &#xC11C;&#xBC84;&#xAC00; &#xC7AC;&#xC2DC;&#xC791; &#xB418;&#xBA74; RPC &#xB294; &#xC131;&#xACF5;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC; &#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC774;&#xBBF8; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xB294; AppendEntries RPC &#xC694;&#xCCAD;&#xC744; &#xBC1B;&#xB294;&#xB2E4;&#xBA74;, &#xC0C8; &#xC694;&#xCCAD;&#xC5D0;&#xC11C; &#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xBB34;&#xC2DC;&#xD569;&#xB2C8;&#xB2E4;. </p><h2 id="%ED%83%80%EC%9D%B4%EB%B0%8D-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B0%80%EC%9A%A9%EC%84%B1">&#xD0C0;&#xC774;&#xBC0D; &#xADF8;&#xB9AC;&#xACE0; &#xAC00;&#xC6A9;&#xC131;</h2><p>Raft &#xC758; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC911; &#xD558;&#xB098;&#xB294; &#xD0C0;&#xC774;&#xBC0D;&#xC5D0; &#xC758;&#xC874;&#xD574;&#xC11C;&#xB294; &#xC548;&#xB41C;&#xB2E4;&#xB294; &#xC810;&#xC785;&#xB2C8;&#xB2E4;. &#xBA87;&#xBA87; &#xC774;&#xBCA4;&#xD2B8;&#xAC00; &#xC608;&#xC0C1;&#xBCF4;&#xB2E4; &#xBE60;&#xB974;&#xAC70;&#xB098;, &#xB290;&#xB9AC;&#xAC8C; &#xCC98;&#xB9AC;&#xB41C;&#xB2E4;&#xACE0; &#xD574;&#xC11C; &#xC62C;&#xBC14;&#xB974;&#xC9C0; &#xC54A;&#xC740; &#xACB0;&#xACFC;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xBA74; &#xC548;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC5B4;&#xCA0C;&#xB4E0; &#xAC00;&#xC6A9;&#xC131;&#xC740; &#xD0C0;&#xC774;&#xBC0D;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xAC8C; &#xB420; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;&#xC11C;, &#xBA54;&#xC2DC;&#xC9C0; &#xAD50;&#xD658;&#xC774; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xC11C;&#xBC84; &#xD06C;&#xB798;&#xC2DC; &#xC2DC;&#xAC04;&#xBCF4;&#xB2E4; &#xAE38;&#xAC8C; &#xAC78;&#xB9B0;&#xB2E4;&#xBA74;, &#xD6C4;&#xBCF4;&#xC790;&#xB294; &#xC120;&#xAC70;&#xC5D0; &#xC774;&#xAE30;&#xAE30;&#xC5D0; &#xCDA9;&#xBD84;&#xD55C; &#xC2DC;&#xAC04;&#xB3D9;&#xC548; &#xC720;&#xC9C0;&#xB418;&#xC9C0; &#xBABB; &#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. (&#xC548;&#xC815;&#xC801;&#xC778; &#xB9AC;&#xB354; &#xC5C6;&#xC774; Raft&#xB294; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC9C4;&#xD589; &#xB420; &#xC218; &#xC5C6;&#xC74C;)</p><p>&#xB9AC;&#xB354; &#xC120;&#xCD9C;&#xC740; Raft &#xC5D0;&#xC11C; &#xD0C0;&#xC774;&#xBC0D;&#xC774; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD55C; &#xBD80;&#xBD84;&#xC778;&#xB370;. &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xB2E4;&#xC74C; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xBA74; &#xC548;&#xC815;&#xC801;&#xC778; &#xB9AC;&#xB354;&#xB97C; &#xC120;&#xCD9C;&#xD558;&#xACE0; &#xC720;&#xC9C0; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>broadcastTime &lt;&lt; electionTimeout &lt;&lt; MTBF</code></p><p>&#xC774; &#xBD80;&#xB4F1;&#xC2DD;&#xC5D0;&#xC11C; broadcastTime &#xC740; &#xC11C;&#xBC84;&#xAC00; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC758; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xBCD1;&#xB82C;&#xB85C; RPC &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xACE0;, &#xADF8;&#xB4E4;&#xC758; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xB294;&#xB370; &#xAC78;&#xB9AC;&#xB294; &#xD3C9;&#xADE0; &#xC2DC;&#xAC04;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; MTBF &#xB294; &#xB2E8;&#xC77C; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; &#xD3C9;&#xADE0; &#xACE0;&#xC7A5; &#xC0AC;&#xC774; &#xC2DC;&#xAC04;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/e2040fc7-0601-4f53-a1dd-0fcb57a7c472.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1800" height="943" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/e2040fc7-0601-4f53-a1dd-0fcb57a7c472.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/e2040fc7-0601-4f53-a1dd-0fcb57a7c472.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/04/e2040fc7-0601-4f53-a1dd-0fcb57a7c472.png 1600w, https://www.kimsehwan96.com/content/images/2024/04/e2040fc7-0601-4f53-a1dd-0fcb57a7c472.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">&#xC704; &#xCEA1;&#xCCD0;&#xB294; Raftscope &#xC758; &#xCF54;&#xB4DC; &#xBC0F; &#xADF8;&#xAC83;&#xC744; &#xB744;&#xC6B4; &#xC0AC;&#xC9C4;&#xC785;&#xB2C8;&#xB2E4;. RPC &#xC694;&#xCCAD;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xC740; &#xB808;&#xC774;&#xD134;&#xC2DC;&#xB97C; broadcastTime &#xC73C;&#xB85C; &#xBCFC; &#xC218; &#xC788;&#xACE0;, election time out &#xC740; ELECTION_TIMEOUT &#xC73C;&#xB85C; &#xBCC0;&#xC218;&#xB85C; &#xC124;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84;&#xC758; &#xC7A5;&#xC560;&#xB294; &#xC6B0;&#xB9AC;&#xAC00; &#xC784;&#xC758;&#xB85C; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB17C;&#xC678;&#xB85C; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC704; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-video-card kg-width-wide kg-card-hascaption" data-kg-thumbnail="https://www.kimsehwan96.com/content/media/2024/04/output1_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://www.kimsehwan96.com/content/media/2024/04/output1.mp4" poster="https://img.spacergif.org/v1/1076x678/0a/spacer.png" width="1076" height="678" playsinline preload="metadata" style="background: transparent url(&apos;https://www.kimsehwan96.com/content/media/2024/04/output1_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:26</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</span></p></figcaption>
        </figure><p>&#xB9CC;&#xC57D; RPC &#xB808;&#xC774;&#xD134;&#xC2DC; (broadcastTime)&#xC744; election timeout &#xBCF4;&#xB2E4; &#xD06C;&#xAC8C; &#xC7A1;&#xB294;&#xB2E4;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xB420;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/6adfe74e-241c-4cb0-aaa6-7890af2491e5.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1077" height="679" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/6adfe74e-241c-4cb0-aaa6-7890af2491e5.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/6adfe74e-241c-4cb0-aaa6-7890af2491e5.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/6adfe74e-241c-4cb0-aaa6-7890af2491e5.png 1077w"><figcaption><span style="white-space: pre-wrap;">broadcastTime &#xC774; electionTimeout &#xBCF4;&#xB2E4; &#xD06C;&#xAC8C; &#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</span></figcaption></figure><figure class="kg-card kg-video-card kg-width-wide kg-card-hascaption" data-kg-thumbnail="https://www.kimsehwan96.com/content/media/2024/04/output2_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://www.kimsehwan96.com/content/media/2024/04/output2.mp4" poster="https://img.spacergif.org/v1/1066x612/0a/spacer.png" width="1066" height="612" playsinline preload="metadata" style="background: transparent url(&apos;https://www.kimsehwan96.com/content/media/2024/04/output2_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:12</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">RPC &#xC694;&#xCCAD;&#xC774; &#xC8FC;&#xACE0; &#xBC1B;&#xC544;&#xC9C0;&#xB294; &#xC2DC;&#xAC04;&#xBCF4;&#xB2E4; &#xAC01; &#xC11C;&#xBC84;&#xC758; electionTimeout&#xC774; &#xB354; &#xD06C;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB9AC;&#xB354;&#xAC00; &#xC120;&#xCD9C;&#xB418;&#xAE30; &#xC804;&#xC5D0; &#xACC4;&#xC18D;&#xD574;&#xC11C; timeout&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xACE0; &#xB9AC;&#xB354;&#xAC00; &#xC120;&#xCD9C;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xBC1C;&#xC0DD;&#xD569;&#xB2C8;&#xB2E4;.</span></p></figcaption>
        </figure><p>&#xC5EC;&#xAE30;&#xC11C; broadcastTime &#xACFC; MTBF &#xB294; &#xC6B0;&#xB9AC;&#xAC00; &#xC124;&#xC815; &#xD560; &#xC218; &#xC788;&#xB294; &#xC18D;&#xC131;&#xC774; &#xC544;&#xB2CC;, &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xAC00;&#xC9C4; &#xAE30;&#xBCF8; &#xC18D;&#xC131;&#xC785;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; electionTimeout &#xC744; &#xC124;&#xC815; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC77C;&#xBC18;&#xC801;&#xC778; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; MTBF(&#xD3C9;&#xADE0; &#xACE0;&#xC7A5; &#xAC04; &#xC2DC;&#xAC04;)&#xC740; &#xBA87;&#xB2EC; &#xC774;&#xC0C1;&#xC774;&#xACE0;, broadcastTime &#xC740; &#xD658;&#xACBD;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB974;&#xC9C0;&#xB9CC; &#xBA87;ms &#xC5D0;&#xC11C; &#xAE38;&#xAC8C;&#xB294; &#xC218;&#xC2ED; ms &#xC77C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. (&#xB9CC;&#xC57D; etcd &#xBA64;&#xBC84;&#xAC00; &#xB300;&#xB959;&#xAC04;&#xC73C;&#xB85C; &#xBA40;&#xB9AC; &#xB5A8;&#xC5B4;&#xC838;&#xC788;&#xB2E4;&#xBA74; &#xC218;&#xBC31;ms &#xAC00; &#xB118;&#xC744; &#xC218; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;).</p><p>&#xC77C;&#xBC18;&#xC801;&#xC778; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; electionTimeout &#xC740; &#xC544;&#xB9C8;&#xB3C4; 10ms ~ 500ms &#xC0AC;&#xC774;&#xAC00; &#xB420; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xB192;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC774; &#xD0C0;&#xC774;&#xBC0D; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xB294;&#xAC83;&#xC740; &#xD06C;&#xAC8C; &#xC5B4;&#xB824;&#xC6B4; &#xC77C;&#xC740; &#xC544;&#xB2D0; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xB9CC;&#xC57D; etcd &#xBA64;&#xBC84;&#xAC00; &#xB300;&#xB959;&#xAC04;&#xC73C;&#xB85C; &#xBA40;&#xB9AC; &#xB5A8;&#xC5B4;&#xC838;&#xC788;&#xACE0;, &#xADF8;&#xAC83;&#xC5D0; &#xB300;&#xD55C; latency &#xAC00; 500ms &#xB77C;&#xACE0; &#xD558;&#xBA74;, electionTimeout&#xC740; 500ms &#xC774;&#xC0C1;, &#xBB50; 1&#xCD08; &#xC774;&#xC0C1;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xB294;&#xAC8C; &#xB0AB;&#xACA0;&#xC8E0;? etcd &#xC5D0;&#xC11C;&#xB294; <a href="https://etcd.io/docs/v3.5/tuning/?ref=kimsehwan96.com">Tuning</a> &#xC774; &#xBB38;&#xC11C;&#xC5D0;&#xC11C; &#xAD00;&#xB828; &#xB0B4;&#xC6A9;&#xC744; &#xB2E4;&#xB8F9;&#xB2C8;&#xB2E4;.</div></div><h2 id="%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EB%A9%A4%EB%B2%84%EC%89%BD-%EB%B3%80%EA%B2%BD-%EB%A9%A4%EB%B2%84-%EC%B6%94%EA%B0%80-%EC%A0%9C%EA%B1%B0">&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBA64;&#xBC84;&#xC27D; &#xBCC0;&#xACBD; (&#xBA64;&#xBC84; &#xCD94;&#xAC00; / &#xC81C;&#xAC70;)</h2><p></p><p>&#xC9C0;&#xAE08;&#xAE4C;&#xC9C0; &#xC6B0;&#xB9AC;&#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; configuration (&#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xCC38;&#xC5EC;&#xD558;&#xACE0;&#xC788;&#xB294; &#xC11C;&#xBC84;&#xC758; &#xC9D1;&#xD569;)&#xC774; &#xACE0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC2E4;&#xBB34;&#xC5D0;&#xC11C;&#xB294;, &#xC124;&#xC815;&#xC744; &#xBCC0;&#xACBD; &#xD560;&#xB294;&#xAC83;&#xC774; &#xC885;&#xC885; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;&#xC11C; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C; &#xC11C;&#xBC84;&#xB97C; &#xB300;&#xCCB4;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB098;, &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xCC38;&#xC5EC;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xBCC0;&#xACBD;&#xD560; &#xB54C; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xC791;&#xC5C5;&#xC740; &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC624;&#xD504;&#xB77C;&#xC778;&#xC73C;&#xB85C; &#xB9CC;&#xB4E4;&#xACE0;, configuration(&#xC124;&#xC815;)&#xC744; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xACE0;, &#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC7AC;&#xC2DC;&#xC791;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C;&#xB3C4; &#xB3D9;&#xC791; &#xD560; &#xC218; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;, &#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC804;&#xCCB4;&#xB97C; &#xC0AC;&#xC6A9; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xC2DC;&#xC810;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xAC8C;&#xB2E4;&#xAC00; &#xADF8;&#xB7F0; &#xC791;&#xC5C5;&#xC5D0; &#xC218;&#xB3D9; &#xC791;&#xC5C5; &#xC808;&#xCC28;&#xAC00; &#xC788;&#xB2E4;&#xBA74;, &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;(&#xC6B4;&#xC601;&#xC790;)&#xAC00; &#xC5D0;&#xB7EC;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0AC; &#xB9AC;&#xC2A4;&#xD06C;&#xB97C; &#xB192;&#xC774;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB97C;&#xC744; &#xD53C;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;, Raft &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xC790;&#xB3D9;&#xD654;&#xB41C; &#xC124;&#xC815; &#xBC29;&#xC2DD;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xAE30;&#xB85C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC124;&#xC815;&#xC744; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xBCC0;&#xACBD;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294;, &#xC124;&#xC815;&#xC744; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xBC18;&#xB4DC;&#xC2DC; &#xAC19;&#xC740; &#xC784;&#xAE30;&#xC5D0; &#xB450; &#xB9AC;&#xB354;&#xAC00; &#xC120;&#xCD9C;&#xB418;&#xB294; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xC5C6;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xBD88;&#xD589;&#xD558;&#xAC8C;&#xB3C4;, &#xACFC;&#xAC70; &#xC124;&#xC815;&#xC5D0;&#xC11C; &#xC0C8;&#xB85C;&#xC6B4; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xC11C;&#xBC84;&#xAC00; &#xC9C1;&#xC811; &#xC124;&#xC815;&#xC744; &#xBC14;&#xAFB8;&#xB294; &#xC811;&#xADFC;&#xBC95;&#xC5D0;&#xC11C;&#xB294; &#xC548;&#xC804;&#xD55C; &#xBC29;&#xBC95;&#xC774; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xB97C; &#xC6D0;&#xC790;&#xC801;&#xC73C;&#xB85C; &#xC804;&#xD658; &#xD560; &#xC218; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xC804;&#xD658;&#xC911;&#xC5D0; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xB450;&#xAC1C;&#xC758; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xACFC;&#xBC18;&#xC218;&#xB85C; &#xBD84;&#xB9AC;&#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC548;&#xC815;&#xC131;&#xC744; &#xD655;&#xBCF4;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC124;&#xC815;&#xC758; &#xBCC0;&#xACBD;&#xC740; &#xB450;&#xB2E8;&#xACC4; &#xC808;&#xCC28;&#xB97C; &#xD1B5;&#xD55C; &#xC811;&#xADFC;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;&#xC11C;, &#xC77C;&#xBD80; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xACFC;&#xAC70; &#xC124;&#xC815;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xC704;&#xD574; &#xCCAB;&#xBC88;&#xC9F8; &#xC808;&#xCC28; &#xB4E4;&#xC5B4;&#xAC00;&#xACE0;, &#xADF8; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xC9C0; &#xBABB;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xD6C4;&#xC5D0; &#xB450;&#xBC88;&#xC9F8; &#xC808;&#xCC28;&#xC5D0;&#xC11C;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xC124;&#xC815;&#xC744; &#xD65C;&#xC131;&#xD654;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;. </p><p>Raft&#xC5D0;&#xC11C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xB77C;&#xACE0; &#xBD80;&#xB974;&#xB294; &#xC804;&#xD658; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xAC00; &#xCEE4;&#xBC0B;&#xB418;&#xBA74;, &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xC0C8;&#xB85C;&#xC6B4; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xB294; &#xC624;&#xB798;&#xB41C; &#xC124;&#xC815;&#xACFC; &#xC0C8; &#xC124;&#xC815;&#xC744; &#xBAA8;&#xB450; &#xACB0;&#xD569;&#xD569;&#xB2C8;&#xB2E4;. </p><ul><li>&#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC740; &#xB450; &#xC124;&#xC815;&#xC758; &#xBAA8;&#xB4E0; &#xC11C;&#xBC84;&#xC5D0; &#xBCF5;&#xC81C;&#xB429;&#xB2C8;&#xB2E4;. </li><li>&#xC5B4;&#xB290; &#xC124;&#xC815;&#xC758; &#xC11C;&#xBC84;&#xB4E0; &#xB9AC;&#xB354;&#xAC00; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD569;&#xC758;(&#xB9AC;&#xB354; &#xC120;&#xCD9C; &#xBC0F; &#xD56D;&#xBAA9; &#xCEE4;&#xBC0B;)&#xB294; &#xACFC;&#xAC70; &#xC124;&#xC815;&#xACFC; &#xC0C8;&#xB85C;&#xC6B4; &#xC124;&#xC815; &#xBAA8;&#xB4E0; &#xCABD;&#xC5D0;&#xC11C; &#xAC01;&#xAC01; &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC758; &#xD569;&#xC758;&#xAC00; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/742c24f4-59ca-4a37-adc8-fad335d319ec-1.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="1164" height="558" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/742c24f4-59ca-4a37-adc8-fad335d319ec-1.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/04/742c24f4-59ca-4a37-adc8-fad335d319ec-1.png 1000w, https://www.kimsehwan96.com/content/images/2024/04/742c24f4-59ca-4a37-adc8-fad335d319ec-1.png 1164w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC810;&#xC120;&#xC740; &#xC0DD;&#xC131;&#xB418;&#xC5C8;&#xC9C0;&#xB9CC; &#xC544;&#xC9C1; &#xCEE4;&#xBC0B;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC124;&#xC815;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xACE0;, &#xC2E4;&#xC120;&#xC740; &#xAC00;&#xC7A5; &#xCD5C;&#xADFC;&#xC5D0; &#xCEE4;&#xBC0B;&#xB41C; &#xAD6C;&#xC131; &#xD56D;&#xBAA9;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xB294; &#xBA3C;&#xC800; C_old,new &#xAD6C;&#xC131; &#xD56D;&#xBAA9;&#xC744; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC774;&#xB97C; C_old,new(C_old &#xC758; &#xACFC;&#xBC18;&#xC218;&#xC640;, C_new&#xC758; &#xACFC;&#xBC18;&#xC218;&#xC5D0;)&#xC5D0; &#xCEE4;&#xBC0B;&#xD569;&#xB2C8;&#xB2E4;. C_old,new &#xAC00; &#xCEE4;&#xBC0B;&#xB41C; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xB294; C_old &#xB3C4;, C_new &#xB3C4; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xACB0;&#xC815;&#xC744; &#xB0B4;&#xB9B4; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xD6C4; C_new &#xD56D;&#xBAA9;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC2DC;&#xC810; &#xBD80;&#xD130;&#xB294; C_new&#xB294; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xACB0;&#xC815;&#xC744; &#xB0B4;&#xB9B4; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0DD;&#xC131;&#xB41C; C_new &#xAC00; C_new &#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC5D0; &#xCEE4;&#xBC0B;&#xB418;&#xBA74; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; C_new &#xC5D0; &#xC5C6;&#xB294; &#xB9AC;&#xB354;&#xB294; &#xC790;&#xC2E0;&#xC758; &#xC784;&#xAE30;&#xB97C; &#xB9C8;&#xCE69;&#xB2C8;&#xB2E4;. </span><b><strong style="white-space: pre-wrap;">C_new , C_old &#xAC00; &#xB3D9;&#xC2DC;&#xC5D0; &#xAC01;&#xAC01; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xACB0;&#xC815;&#xC744; &#xB0B4;&#xB9B4; &#xC218; &#xC788;&#xB294; &#xC2DC;&#xC810;&#xC774; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC124;&#xC815; &#xC804;&#xD658; &#xAC04; &#xC548;&#xC815;&#xC131;&#xC774; &#xBCF4;&#xC7A5;&#xB429;&#xB2C8;&#xB2E4;.</strong></b></figcaption></figure><p>&#xC774;&#xB7EC;&#xD55C; &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xB294; &#xAC01;&#xAC01;&#xC758; &#xC11C;&#xBC84;&#xB4E4;&#xC774; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xC2DC;&#xAC04;&#xC5D0; &#xC124;&#xC815; &#xC804;&#xD658;&#xC744; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xD568;&#xC73C;&#xB85C;&#xC368; &#xC548;&#xC804;&#xC131;&#xC744; &#xD574;&#xCE58;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAC8C;&#xB2E4;&#xAC00;, &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xB294; &#xC774;&#xB7F0; &#xC124;&#xC815;&#xC774; &#xC804;&#xD658;&#xB418;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C;&#xB3C4; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC694;&#xCCAD;&#xC744; &#xC9C0;&#xC18D;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xAD6C;&#xC131;&#xC740; &#xBCF5;&#xC81C;&#xB41C; &#xB85C;&#xADF8;&#xC5D0; &#xD2B9;&#xBCC4;&#xD55C; &#xD56D;&#xBAA9;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC800;&#xC7A5;&#xB418;&#xACE0; &#xD1B5;&#xC2E0;&#xB429;&#xB2C8;&#xB2E4;.  &#xC704; &#xADF8;&#xB9BC;&#xC740; &#xC124;&#xC815; &#xBCC0;&#xACBD; &#xACFC;&#xC815;&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xADF8;&#xB9BC;&#xC785;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xAC00;  C_old &#xC5D0;&#xC11C; C_new&#xB85C; &#xC124;&#xC815;&#xC744; &#xBC14;&#xAFB8;&#xB77C;&#xB294; &#xC694;&#xCCAD;&#xC744; &#xBC1B;&#xC558;&#xC744; &#xB54C;, &#xB9AC;&#xB354;&#xB294; &#xACF5;&#xB3D9; &#xD569;&#xC758;&#xB97C; &#xC704;&#xD574; &#xC124;&#xC815;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xACE0;(C_old,new) &#xC774; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xBCF5;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xD2B9;&#xC815; &#xC11C;&#xBC84;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8;&#xC5D0; &#xC0C8;&#xB85C;&#xC6B4; &#xC124;&#xC815; &#xD56D;&#xBAA9;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xBA74;, &#xD5A5;&#xD6C4;&#xC758; &#xBAA8;&#xB4E0; &#xACB0;&#xC815;&#xC5D0; &#xB300;&#xD574; &#xD574;&#xB2F9; &#xC124;&#xC815;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. (&#xC11C;&#xBC84;&#xB294; &#xD56D;&#xC0C1; &#xB85C;&#xADF8;&#xC5D0;&#xC788;&#xB294; &#xCD5C;&#xC2E0; &#xC124;&#xC815;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0;, &#xC124;&#xC815; &#xC815;&#xBCF4;&#xAC00; &#xCEE4;&#xBC0B;&#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xC5D0; &#xC0C1;&#xAD00;&#xC5C6;&#xC774; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.) &#xC774;&#xB294; &#xB9AC;&#xB354;&#xAC00;  C_old,new &#xADDC;&#xCE59;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC5B8;&#xC81C; C_old,new &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC774; &#xCEE4;&#xBC0B; &#xB420; &#xC9C0;&#xB97C; &#xC815;&#xD55C;&#xB2E4;&#xB294;&#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC27D;&#xAC8C; &#xC815;&#xB9AC;&#xD558;&#xC790;&#xBA74;, &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC124;&#xC815;(&#xAD6C;&#xC131;) &#xC815;&#xBCF4;&#xAC00; &#xBCC0;&#xACBD; &#xB420; &#xB54C;, &#xAD6C;&#xC131; &#xC815;&#xBCF4; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; &#xC77C;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xBD84;&#xB9AC;(C_old,new)&#xB418;&#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xAC00; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xAC01;&#xAC01; &#xACB0;&#xC815;&#xAD8C;&#xC744; &#xAC16;&#xB294; &#xC2DC;&#xC810;&#xC774; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xC758; &#xBD84;&#xB9AC;&#xB41C;(C_old,new) &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xAC04; &#xB370;&#xC774;&#xD130;&#xAC00; &#xBD88;&#xC77C;&#xCE58;&#xD558;&#xB294; &#xBB38;&#xC81C;&#xAC19;&#xC740;&#xAC74; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xC785;&#xB2C8;&#xB2E4;.  </p><h2 id="%EB%A1%9C%EA%B7%B8-%EC%95%95%EC%B6%95compaction">&#xB85C;&#xADF8; &#xC555;&#xCD95;(Compaction)</h2><p>Raft&#xC758; &#xB85C;&#xADF8;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC694;&#xCCAD;&#xC774; &#xD3EC;&#xD568;&#xB41C; &#xC815;&#xC0C1;&#xC801;&#xC778; &#xC6B4;&#xC601; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xB298;&#xC5B4;&#xB098;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p> &#xD558;&#xC9C0;&#xB9CC; &#xC2E4;&#xC81C; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C;&#xB294; &#xACBD;&#xACC4;(&#xD55C;&#xACC4;)&#xC5C6;&#xC774; &#xB298;&#xC5B4;&#xB0A0; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB85C;&#xADF8;&#xAC00; &#xB354; &#xAE38;&#xC5B4;&#xC9C0;&#xBA74; &#xAE38;&#xC5B4;&#xC9C8;&#xC218;&#xB85D;, &#xB354; &#xB9CE;&#xC740; &#xACF5;&#xAC04;&#xC744; &#xCC28;&#xC9C0;&#xD558;&#xAC8C; &#xB418;&#xACE0;, &#xC751;&#xB2F5;&#xC744; &#xD558;&#xAE30;&#xC704;&#xD574; &#xB354; &#xB9CE;&#xC740; &#xC2DC;&#xAC04;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC4F8;&#xBAA8;&#xC5C6;&#xB294; &#xC815;&#xBCF4;&#xAC00; &#xB85C;&#xADF8;&#xC5D0; &#xACC4;&#xC18D; &#xB204;&#xC801;&#xB418;&#xC5C8;&#xB2E4;&#xB294;&#xAC83;&#xC744; &#xC778;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774; &#xB530;&#xB85C; &#xC5C6;&#xB2E4;&#xBA74; &#xACB0;&#xAD6D; &#xAC00;&#xC6A9;&#xC131; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p> Snapshotting(&#xC2A4;&#xB0C5;&#xC0F7;)&#xC740; &#xC555;&#xCD95;&#xC744; &#xC704;&#xD55C; &#xAC00;&#xC7A5; &#xC26C;&#xC6B4; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;. &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xCC0D;&#xAC8C;&#xB418;&#xBA74; &#xD604;&#xC7AC;&#xC758; &#xBAA8;&#xB4E0; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xC0C1;&#xD0DC;&#xAC00; &#xC548;&#xC815;&#xC801;&#xC778; &#xC800;&#xC7A5;&#xACF5;&#xAC04;&#xC5D0; &#xC2A4;&#xB0C5;&#xC0F7; &#xD615;&#xD0DC;&#xB85C; &#xC800;&#xC7A5;&#xB418;&#xACE0;, &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xCC0D;&#xB294; &#xC2DC;&#xC810; &#xC774;&#xC804;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xBC84;&#xB9BD;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/05b18ad0-5c2e-42c9-b487-9515ad43d87e.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="794" height="456" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/05b18ad0-5c2e-42c9-b487-9515ad43d87e.png 600w, https://www.kimsehwan96.com/content/images/2024/04/05b18ad0-5c2e-42c9-b487-9515ad43d87e.png 794w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC11C;&#xBC84;&#xB294; &#xB85C;&#xADF8;&#xC5D0; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xB4E4; (&#xC778;&#xB371;&#xC2A4; 1&#xBD80;&#xD130; 5&#xAE4C;&#xC9C0;)&#xC744; &#xC0C8;&#xB85C;&#xC6B4; &#xC2A4;&#xB0C5;&#xC0F7;&#xC73C;&#xB85C; &#xB300;&#xCCB4;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xC2A4;&#xB0C5;&#xC0F7;&#xC740; &#xD604;&#xC7AC; &#xC0C1;&#xD0DC;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC2A4;&#xB0C5;&#xC0F7;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xC778;&#xB371;&#xC2A4;&#xC640; &#xC784;&#xAE30;&#xB294; &#xC778;&#xB371;&#xC2A4; 6&#xBC88; &#xD56D;&#xBAA9; &#xC774;&#xC804;&#xC758; &#xC2A4;&#xB0C5;&#xC0F7;&#xC758; &#xC704;&#xCE58;&#xB97C; &#xACB0;&#xC815;&#xD558;&#xB294;&#xB370; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.</span></figcaption></figure><p>&#xC704; &#xADF8;&#xB9BC;&#xC740; Raft &#xC5D0;&#xC11C; &#xC2A4;&#xB0C5;&#xC0F7; &#xC0DD;&#xC131;&#xC758; &#xAE30;&#xBCF8; &#xAC1C;&#xB150;&#xC744; &#xBCF4;&#xC5EC;&#xC90D;&#xB2C8;&#xB2E4;. &#xAC01; &#xC11C;&#xBC84;&#xB294; &#xB85C;&#xADF8;&#xC5D0; &#xCEE4;&#xBC0B;&#xB41C; &#xD56D;&#xBAA9;&#xB4E4;&#xB9CC; &#xD3EC;&#xD568;&#xD558;&#xC5EC; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. Raft &#xB294; &#xC2A4;&#xB0C5;&#xC0F7;&#xC5D0; &#xC18C;&#xB7C9;&#xC758; &#xBA54;&#xD0C0;&#xB370;&#xC774;&#xD130;&#xB3C4; &#xD3EC;&#xD568;&#xD558;&#xB294;&#xB370;, &#xC2A4;&#xB0C5;&#xC0F7;&#xC774; &#xB300;&#xCCB4;&#xD558;&#xB294; &#xB85C;&#xADF8;&#xC758; &#xB9C8;&#xC9C0;&#xB9C9; &#xD56D;&#xBAA9;&#xC758; &#xC778;&#xB371;&#xC2A4;, &#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC784;&#xAE30;(&#xB9C8;&#xC9C0;&#xB9C9; &#xC784;&#xAE30;)&#xB97C; &#xD3EC;&#xD568;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774; &#xC815;&#xBCF4;&#xB294; &#xC2A4;&#xB0C5;&#xC0F7; &#xB2E4;&#xC74C;&#xC5D0; &#xC624;&#xB294; &#xCCAB;&#xBC88;&#xC9F8; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC5D0; &#xB300;&#xD55C; AppendEntries RPC&#xC758; &#xC77C;&#xAD00;&#xC131; &#xAC80;&#xC0AC;&#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xBCF4;&#xC874;&#xB418;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBA64;&#xBC84;&#xC2ED; &#xBCC0;&#xACBD;&#xB610;&#xD55C; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xB9C8;&#xC9C0;&#xB9C9; &#xC11C;&#xBC84; &#xAD6C;&#xC131;&#xB3C4; &#xD3EC;&#xD568;&#xD569;&#xB2C8;&#xB2E4;. &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xB098;&#xBA74; &#xADF8; &#xC774;&#xC804; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xC0AD;&#xC81C; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/4abda513-63f7-48b8-91c0-ac2f1edae210.png" class="kg-image" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;" loading="lazy" width="920" height="1228" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/4abda513-63f7-48b8-91c0-ac2f1edae210.png 600w, https://www.kimsehwan96.com/content/images/2024/04/4abda513-63f7-48b8-91c0-ac2f1edae210.png 920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">InstallSnapshot RPC</span></figcaption></figure><p>&#xB9AC;&#xB354;&#xB294; InstallSnapshot RPC&#xB97C; &#xB108;&#xBB34; &#xBA40;&#xB9AC; &#xB4A4;&#xB5A8;&#xC5B4;&#xC9C4; &#xD314;&#xB85C;&#xC6CC;&#xB4E4;&#xC5D0;&#xAC8C; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBCF4;&#xB0B4;&#xAE30; &#xC704;&#xD574; &#xC694;&#xCCAD;&#xD569;&#xB2C8;&#xB2E4;. &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC774; RPC &#xB97C; &#xC218;&#xC2E0;&#xD588;&#xC744; &#xB54C;, &#xAE30;&#xC874; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xC9C0; &#xACB0;&#xC815;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xBCF4;&#xD1B5;&#xC740; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xBCF4;&#xB2E4; &#xC2A4;&#xB0C5;&#xC0F7;&#xC5D0; &#xC788;&#xB294; &#xC815;&#xBCF4;&#xAC00; &#xB354; &#xCD5C;&#xC2E0; &#xC815;&#xBCF4;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; &#xD314;&#xB85C;&#xC6CC;&#xB294; &#xC790;&#xC2E0;&#xC758; &#xAE30;&#xC874; &#xB85C;&#xB4DC; &#xD56D;&#xBAA9;&#xC744; &#xBAA8;&#xB450; &#xBC84;&#xB9BD;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC55E;&#xBD80;&#xBD84;&#xC744; &#xC124;&#xBA85;&#xD558;&#xB294; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBC1B;&#xAC8C; &#xB41C;&#xB2E4;&#xBA74; (&#xC7AC;&#xC804;&#xC1A1;, &#xD639;&#xC740; &#xC2E4;&#xC218;&#xB85C; &#xC778;&#xD574;), &#xC2A4;&#xB0C5;&#xC0F7;&#xC73C;&#xB85C; &#xCEE4;&#xBC84;&#xB418;&#xB294; &#xC55E;&#xC120; &#xB85C;&#xADF8;&#xD56D;&#xBAA9;&#xC740; &#xC0AD;&#xC81C;&#xB418;&#xB354;&#xB77C;&#xB3C4;, &#xADF8; &#xC774;&#xD6C4;&#xC5D0; &#xB530;&#xB974;&#xB294; &#xD56D;&#xBAA9;&#xC740; &#xC5EC;&#xC804;&#xD788; &#xBCF4;&#xC874;&#xB418;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xC2A4;&#xB0C5;&#xC0F7; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC740; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xB9AC;&#xB354;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4; &#xC5C6;&#xC774; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xC0DD;&#xC131; &#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Raft &#xC758; &#xAC15;&#xD55C; &#xB9AC;&#xB354; &#xC6D0;&#xCE59;&#xC744; &#xBC97;&#xC5B4;&#xB0A9;&#xB2C8;&#xB2E4;. </p><p>&#xD558;&#xC9C0;&#xB9CC;, &#xC774;&#xB7EC;&#xD55C; &#xBD80;&#xBD84;&#xC740; &#xC815;&#xB2F9;&#xD654;&#xAC00; &#xB41C;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;. &#xB9AC;&#xB354;&#xB97C; &#xB450;&#xB294;&#xAC83;&#xC740; &#xD569;&#xC758;&#xC5D0; &#xB3C4;&#xB2EC;&#xD560; &#xB54C;&#xC5D0; &#xCDA9;&#xB3CC;&#xD558;&#xB294; &#xACB0;&#xC815;&#xC744; &#xD53C;&#xD558;&#xB294;&#xB370;&#xC5D0; &#xB3C4;&#xC6C0;&#xC740; &#xB418;&#xC9C0;&#xB9CC;, &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xCC0D;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xBBF8; &#xD569;&#xC758;&#xAC00; &#xB41C; &#xC0C1;&#xD0DC;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC5B4;&#xB5A4; &#xACB0;&#xC815;&#xB3C4; &#xCDA9;&#xB3CC;&#xB418;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB370;&#xC774;&#xD130;&#xB294; &#xC5EC;&#xC804;&#xD788; &#xB9AC;&#xB354;&#xC5D0;&#xC11C; &#xD314;&#xB85C;&#xC6CC;&#xB85C; &#xD55C; &#xBC29;&#xD5A5;&#xC73C;&#xB85C;&#xB9CC; &#xD750;&#xB985;&#xB2C8;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC5EC;&#xAE30;&#xC11C; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xB294; Snapshot &#xC740; etcd &#xC5D0;&#xC11C;&#xC758; backup &amp; store &#xC758; snapshot &#xC774; &#xC544;&#xB2CC;, Log Compaction &#xB2E8;&#xACC4;&#xC5D0;&#xC11C; &#xD544;&#xC694;&#xD55C; snapshot &#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. <a href="https://etcd.io/docs/v3.5/op-guide/maintenance/?ref=kimsehwan96.com">Maintenance</a> &#xC774; &#xBB38;&#xC11C;&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF;&#xC774;. <code spellcheck="false" style="white-space: pre-wrap;">etcd</code> &#xC758; <code spellcheck="false" style="white-space: pre-wrap;">--snapshot-count</code> &#xB294; compaction &#xC218;&#xD589; &#xC804;&#xC5D0; in-memory &#xC5D0; &#xB4E4;&#xACE0;&#xC788;&#xC744; Raft &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294; &#xC635;&#xC158;&#xC785;&#xB2C8;&#xB2E4;. <code spellcheck="false" style="white-space: pre-wrap;">etcdctl backup</code> &#xC744; &#xD1B5;&#xD574; &#xB9CC;&#xB4DC;&#xB294; snapshot &#xACFC;&#xB294; &#xBCC4;&#xAC1C;&#xC758; &#xAC1C;&#xB150;&#xC785;&#xB2C8;&#xB2E4;. </div></div><p></p><h2 id="wrapping-up">Wrapping up</h2><p>&#xC774;&#xB807;&#xAC8C;&#xD574;&#xC11C; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xC9C0; &#xB17C;&#xBB38;&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p> &#xC774;&#xD574;&#xD558;&#xAE30; &#xC26C;&#xC6B0;&#xBA74;&#xC11C;&#xB3C4;(?) &#xC798; &#xB3D9;&#xC791;&#xD558;&#xB294; &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC5B4;&#xB5A4; &#xC694;&#xC18C;&#xB4E4;&#xC774; &#xD544;&#xC694;&#xD558;&#xACE0; &#xC77C;&#xBD80; &#xBA38;&#xC2E0;&#xC5D0; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC744; &#xB54C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC7A5;&#xC560;&#xB97C; &#xADF9;&#xBCF5;&#xD558;&#xB294;&#xC9C0; &#xC54C;&#xC544; &#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://raft.github.io/?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Raft Consensus Algorithm</div><div class="kg-bookmark-description">Raft is a consensus algorithm that is designed to be easy to understand.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://raft.github.io/logo/favicon.ico" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;"></div></div><div class="kg-bookmark-thumbnail"><img src="https://raft.github.io/logo/solo.svg" alt="Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC54C;&#xC544;&#xBCF4;&#xAE30;"></div></a></figure><p>&#xC704; &#xC0AC;&#xC774;&#xD2B8;&#xC758; &#xB9E8; &#xC544;&#xB798;&#xCABD; &#xBD80;&#xBD84;&#xC5D0;&#xB294; &#xC5B4;&#xB5A4; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xB4E4;&#xC774; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &quot;&#xAD6C;&#xD604;&quot; &#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xC911;&#xC778;&#xC9C0; &#xD655;&#xC778; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[etcd 의 snapshot 과 WAL이 무엇일까요? (etcd backup snapshot이 아닌)]]></title><description><![CDATA[etcd 의 snapshot 그리고 WAL 에 대해서 알아봅니다. etcd 는 raft 합의 알고리즘을 기반으로 구현된 key-values 저장소로. raft 알고리즘에서 snapshot 에 대한 내용이 존재합니다. 그것을 etcd 는 어떻게 구현했는지 알아봅니다. (etcdctl snapshot save 를 통해 생성하는 스냅샷과는 조금은 다른 내용입니다)]]></description><link>https://www.kimsehwan96.com/etcd-snapshot-and-wal/</link><guid isPermaLink="false">660d472530749cc47571b58f</guid><category><![CDATA[etcd]]></category><category><![CDATA[K8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Raft]]></category><category><![CDATA[wal]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Wed, 03 Apr 2024 12:21:28 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/04/-----------2024-04-03------9.19.51.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">etcd &#xB294; Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC2B5;&#xB2C8;&#xB2E4;. Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C;&#xB294; Log Compaction &#xB2E8;&#xB77D;&#xC5D0;&#xC11C; Snapshot &#xAC1C;&#xB150;&#xC744; &#xC774;&#xC57C;&#xAE30;&#xD569;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C;&#xC758; Snapshot &#xC740; &#xC804;&#xCCB4; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC758; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC544;&#xB2CC;, &#xC2A4;&#xB0C5;&#xC0F7;&#xC758; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4;&#xC640;, Raft term (&#xC784;&#xAE30;)&#xB97C; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. &#xBC18;&#xBA74; etcd backup / restore &#xC2DC;&#xC5D0; &#xC0AC;&#xC6A9;&#xD558;&#xB294; snapshot &#xC740; &#xC9C4;&#xC9DC; db &#xD30C;&#xC77C;&#xC744; &#xBCF5;&#xC81C;&#xD55C;&#xAC83;&#xC774;&#xB77C;&#xACE0; &#xBCF4;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://etcd.io/docs/v3.5/op-guide/maintenance/?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Maintenance</div><div class="kg-bookmark-description">Periodic etcd cluster maintenance guide</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://etcd.io/favicons/apple-touch-icon-180x180.png" alt="etcd &#xC758; snapshot &#xACFC; WAL&#xC774; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;? (etcd backup snapshot&#xC774; &#xC544;&#xB2CC;)"><span class="kg-bookmark-author">.cls-1{fill:#419eda}etcd</span><span class="kg-bookmark-publisher">Terms</span></div></div></a></figure><img src="https://www.kimsehwan96.com/content/images/2024/04/-----------2024-04-03------9.19.51.png" alt="etcd &#xC758; snapshot &#xACFC; WAL&#xC774; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;? (etcd backup snapshot&#xC774; &#xC544;&#xB2CC;)"><p>etcd &#xC5D0;&#xC11C;&#xB294; compaction &#xC744; &#xC9C4;&#xD589;&#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0;, &#xC778;&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xBCF4;&#xAD00;&#xD560; Raft &#xD56D;&#xBAA9;&#xC758; &#xC218;&#xB97C; <code>--snapshot-count</code> &#xB77C;&#xB294; &#xC778;&#xC790;&#xB85C; &#xC9C0;&#xC815; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC218;&#xAC00; <code>snapshot-count</code> &#xC5D0; &#xB3C4;&#xB2EC;&#xD558;&#xBA74;, &#xC11C;&#xBC84;&#xB294; &#xC2A4;&#xB0C5;&#xC0F7; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB514;&#xC2A4;&#xD06C;&#xC5D0; &#xC800;&#xC7A5;&#xD55C; &#xB2E4;&#xC74C;, &#xC624;&#xB798;&#xB41C; &#xD56D;&#xBAA9;&#xC744; &#xC798;&#xB77C;&#xB0B4;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;(&#xB799;)&#xAC00; &#xC555;&#xCD95;&#xB41C; &#xC774;&#xC804;&#xC758; &#xB85C;&#xADF8;&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xBA74; &#xB9AC;&#xB354;&#xB294; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xC0C1;&#xD0DC;&#xB97C; &#xB36E;&#xC5B4;&#xC4F0;&#xB3C4;&#xB85D; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBCF4;&#xB0B4;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xC2A4;&#xB0C5;&#xC0F7;&#xC740; &#xC778;&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xC800;&#xC7A5;&#xD560; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; &#xC218;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xB294;&#xAC83;&#xC73C;&#xB85C;, &#xC774; &#xAC12;&#xC774; &#xD06C;&#xBA74; &#xD074;&#xC218;&#xB85D; &#xB354; &#xB9CE;&#xC740; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC778;&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xAE30;&#xB54C;&#xBB38;&#xC5D0;, &#xBA54;&#xBAA8;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC774; &#xBC18;&#xBCF5;&#xC801;&#xC73C;&#xB85C; &#xC99D;&#xAC00;&#xD558;&#xAC8C;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; <code>snapshot-count</code> &#xB294; &#xBA54;&#xBAA8;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC758; &#xC99D;&#xAC00;&#xC640;, &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xC758; &#xAC00;&#xC6A9;&#xC131; &#xC0AC;&#xC774;&#xC5D0;&#xC11C; &#xC808;&#xCDA9;&#xC548;&#xC744; &#xCC3E;&#xC544; &#xC124;&#xC815;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.<code>v3.2</code> &#xC774;&#xD6C4;&#xBD80;&#xD130;&#xB294; &#xAE30;&#xBCF8; &#xAC12;&#xC774; 100,000 &#xC73C;&#xB85C; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC778;&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; 100,000 &#xAC1C;&#xC758; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB3C4;&#xB85D;)</p><p>&#xC5EC;&#xAE30;&#xC11C; <code>DefaultSnapshotCatchupEntries</code> &#xB77C;&#xB294; &#xAC12;&#xC774; 5000 &#xC73C;&#xB85C; &#xD558;&#xB4DC;&#xCF54;&#xB529; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-go">const (
	DefaultSnapshotCount = 10000
	// DefaultSnapshotCatchUpEntries is the number of entries for a slow follower
	// to catch-up after compacting the raft storage entries.
	// We expect the follower has a millisecond level latency with the leader.
	// The max throughput is around 10K. Keep a 5K entries is enough for helping
	// follower to catch up.
	DefaultSnapshotCatchUpEntries uint64 = 5000
	...
	)</code></pre><p>(<a href="https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/etcdserver/server.go?ref=kimsehwan96.com#L75-L83">https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/etcdserver/server.go#L75-L83</a>)</p><p>&#xC774; &#xAC12;&#xC740;, Raft &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xC758; &#xD56D;&#xBAA9;&#xC744; &#xC555;&#xCD95; &#xD55C; &#xC774;&#xD6C4;&#xC5D0;, &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xAC00; &#xB530;&#xB77C;&#xC7A1;&#xC744; &#xC218; &#xC788;&#xB294; &#xD56D;&#xBAA9;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xC758;&#xBBF8;&#xD558;&#xB294;&#xB370;. &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xCC0D;&#xC740; &#xC774;&#xD6C4;&#xC5D0; &#xC778;&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xC6B0;&#xC120; 5000&#xAC1C;&#xC758; &#xD56D;&#xBAA9;&#xB9CC;&#xC744; &#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xB4E4;&#xACE0;&#xC788;&#xACE0;, &#xB9CC;&#xC57D; &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xAC00; 5&#xCC9C;&#xAC1C; &#xC774;&#xC0C1; Lag&#xC744; &#xAC16;&#xACE0;&#xC788;&#xB2E4;&#xBA74; &#xB9AC;&#xB354;&#xAC00; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBCF4;&#xB0B4;&#xC11C; &#xB530;&#xB77C;&#xC624;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xC124;&#xC815;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-go">// etcd/server/storage/storage.go
// SaveSnap saves the snapshot file to disk and writes the WAL snapshot entry.
func (st *storage) SaveSnap(snap raftpb.Snapshot) error {
	st.mux.RLock()
	defer st.mux.RUnlock()
	walsnap := walpb.Snapshot{
		Index:     snap.Metadata.Index,
		Term:      snap.Metadata.Term,
		ConfState: &amp;snap.Metadata.ConfState,
	}
	// save the snapshot file before writing the snapshot to the wal.
	// This makes it possible for the snapshot file to become orphaned, but prevents
	// a WAL snapshot entry from having no corresponding snapshot file.
	err := st.s.SaveSnap(snap)
	if err != nil {
		return err
	}
	// gofail: var raftBeforeWALSaveSnaphot struct{}
	return st.w.SaveSnapshot(walsnap)
}</code></pre><p>(<a href="https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/storage/storage.go?ref=kimsehwan96.com#L58-L77">https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/storage/storage.go#L58-L77</a>)</p><pre><code class="language-go">// etcd/server/storage/wal/wal.go
func (w *WAL) SaveSnapshot(e walpb.Snapshot) error {
	if err := walpb.ValidateSnapshotForWrite(&amp;e); err != nil {
		return err
	}
	b := pbutil.MustMarshal(&amp;e)
	w.mu.Lock()
	defer w.mu.Unlock()
	rec := &amp;walpb.Record{Type: SnapshotType, Data: b}
	if err := w.encoder.encode(rec); err != nil {
		return err
	}
	// update enti only when snapshot is ahead of last index
	if w.enti &lt; e.Index {
		w.enti = e.Index
	}
	return w.sync()
}</code></pre><p>(<a href="https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/storage/wal/wal.go?ref=kimsehwan96.com#L964-L983">https://github.com/etcd-io/etcd/blob/e513b1a6b759a75d077f2d52f1429035697ceb52/server/storage/wal/wal.go#L964-L983</a>)</p><p>&#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C; etcd &#xB294; &#xB450;&#xAC00;&#xC9C0;&#xC758; &#xB3D9;&#xC791;&#xC744; &#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. (&#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xC54C;&#xACA0;&#xC9C0;&#xB9CC;)</p><ol><li>&#xD604;&#xC7AC;&#xC758; &#xBA54;&#xD0C0; &#xB370;&#xC774;&#xD130;&#xB97C; <code>.snap</code> &#xD30C;&#xC77C;&#xB85C; &#xC800;&#xC7A5;</li><li>1&#xBC88; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD3EC;&#xD568;&#xD55C; &#xD604;&#xC7AC; &#xC0C1;&#xD0DC;(state)&#xB97C; <code>wal</code> &#xD30C;&#xC77C;&#xC5D0; &#xC800;&#xC7A5;&#xA0;</li></ol><p>&#xB530;&#xB77C;&#xC11C; <code>.snap</code> &#xD30C;&#xC77C;&#xC740; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xAC00; &#xC5BC;&#xB9C8;&#xB098; &#xD06C;&#xAC74;, &#xC5BC;&#xB9C8;&#xB098; &#xB9CE;&#xC774; &#xB9CC;&#xB4E4;&#xC5C8;&#xAC74;&#xC5D0; &#xAD00;&#xB828; &#xC5C6;&#xC774; &#xC77C;&#xC815;&#xD55C; &#xD06C;&#xAE30;&#xB97C; &#xAC16;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB9AC;&#xACE0; &#xBA54;&#xBAA8;&#xB9AC;&#xC5D0;&#xC11C; &#xC81C;&#xAC70;&#xD55C; &#xB370;&#xC774;&#xD130;(&#xC2A4;&#xB0C5;&#xC0F7;)&#xB294; <code>wal</code> &#xD30C;&#xC77C;&#xC5D0; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x26A0;&#xFE0F;</div><div class="kg-callout-text">etcd v3 store &#xC758; &#xB3D9;&#xC791;&#xC758; &#xD2B9;&#xC131;&#xC73C;&#xB85C; &#xC778;&#xD574;, &#xC2E4;&#xC81C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC798;&#xB77C;&#xC11C; &#xC5B4;&#xB518;&#xAC00;&#xC5D0; Disk &#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C;, Snapshot &#xC815;&#xBCF4;&#xB97C; &#xD1A0;&#xB300;&#xB85C; bbolt &#xD30C;&#xC77C;(db &#xD30C;&#xC77C;)&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xD55C; &#xC554;&#xC2DC;&#xC801;&#xC778; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;.</div></div><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Raft &#xC5D0;&#xC11C;&#xC758; Compaction / etcd &#xC5D0;&#xC11C;&#xC758; Compaction &#xC740; &#xB3D9;&#xC77C;&#xD55C; &#xC6A9;&#xC5B4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0;&#xB9CC; &#xC138;&#xBD80;&#xC801;&#xC778; &#xC6A9;&#xB3C4;&#xAC00; &#xB610; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. Raft &#xC5D0;&#xC11C;&#xC758; Compaction&#xC740; Snapshot &#xC744; &#xC0DD;&#xC131;&#xD558;&#xBA74;&#xC11C;, &#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xB300;&#xD55C; &#xAE30;&#xB85D;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xCC0D;&#xB294; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xC758; &#xC784;&#xAE30;&#xC758; &#xC0C1;&#xD0DC;&#xBA38;&#xC2E0;&#xC758; &#xC0C1;&#xD0DC; &#xAC12;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xAC1C;&#xB150;&#xC785;&#xB2C8;&#xB2E4;. (&#xC55E;&#xC5D0; &#xC5B4;&#xB5A4; &#xAE30;&#xB85D;&#xC73C;&#xB85C; &#xAC12;&#xB4E4;&#xC774; &#xBC14;&#xB00C;&#xC5EC; &#xC654;&#xAC74; &#xBB34;&#xC2DC;)</div></div><p>&#xB530;&#xB77C;&#xC11C; &#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xAC00; <code>compact-index</code> - <code>snapshot-index</code> &#xC0AC;&#xC774;&#xC5D0; <code>last-applied-index</code> &#xB97C; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBC1B;&#xC544;&#xC11C; &#xB9AC;&#xB354;&#xB97C; &#xB530;&#xB77C;&#xAC00;&#xB294;&#xAC8C; &#xC544;&#xB2C8;&#xB77C;, &#xB9AC;&#xB354;&#xC640; AppendEntries RPC &#xB97C; &#xC8FC;&#xACE0; &#xBC1B;&#xC73C;&#xBA74;&#xC11C; &#xB530;&#xB77C;&#xAC00;&#xACE0;, &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xC740; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xBC1B;&#xC544;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; <code>snapshot-index</code> - <code>compact-index</code> &#xC758; &#xAC12;&#xC758; &#xCC28;&#xC774;&#xB294; 5000&#xC73C;&#xB85C; &#xACE0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. </p><h2 id="wal-%EC%97%90-%EC%A0%80%EC%9E%A5%EB%90%98%EB%8A%94-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%93%A4-write-ahead-log">WAL &#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xB294; &#xB370;&#xC774;&#xD130;&#xB4E4; (Write Ahead Log)</h2><p>&#xC55E;&#xC11C;&#xC11C;, Raft Snapshot &#xB3C4; &#xAD81;&#xADF9;&#xC801;&#xC73C;&#xB85C; WAL &#xC5D0; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;&#xACE0; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C;&#xB294; WAL &#xC5D0; &#xC5B4;&#xB5A4; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC774; &#xC5B4;&#xB5A4; &#xD615;&#xC2DD;&#xC73C;&#xB85C; &#xC800;&#xC7A5;&#xB418;&#xB294;&#xC9C0; &#xC124;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EB%AC%BC%EB%A6%AC%EC%A0%81-%EC%9A%94%EC%86%8C">&#xBB3C;&#xB9AC;&#xC801; &#xC694;&#xC18C;</h3><p>WAL &#xB85C;&#xADF8; &#xD30C;&#xC77C;&#xC740; <code>&#xD504;&#xB808;&#xC784;</code> &#xC758; &#xC5F0;&#xC18D;&#xC801;&#xC778; &#xB0B4;&#xC6A9;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294;&#xB370;, &#xAC01; &#xD504;&#xB808;&#xC784;&#xC740; &#xC544;&#xB798;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li>LittleEndian : &#xC778;&#xCF54;&#xB529;&#xB41C; uint64 &#xD615;&#xD0DC;&#xC758; &#xB9C8;&#xC0EC;&#xB9C1;&#xB41C;(&#xC9C1;&#xB82C;&#xD654;&#xC640; &#xBE44;&#xC2B7;&#xD55C; &#xAC1C;&#xB150;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;) <code>walpb.Record</code> &#xC758; &#xAE38;&#xC774;</li><li>Padding : &#xC804;&#xCCB4; &#xD504;&#xB808;&#xC784;&#xC774; &#xC815;&#xB82C;&#xB41C; &#xD06C;&#xAE30;&#xAC00; &#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB294; 0 &#xBC14;&#xC774;&#xD2B8;&#xC758; &#xD328;&#xB529;</li><li>&#xB9C8;&#xC0EC;&#xB9C1;&#xB41C; <code>walpb.Record</code> &#xC758; &#xB370;&#xC774;&#xD130;</li></ul><p>&#xC774; &#xD30C;&#xC77C;&#xC740; 64*10^6 &#xBC14;&#xC774;&#xD2B8;(64MB) &#xB9C8;&#xB2E4; &#xC798;&#xB77C;&#xC9D1;&#xB2C8;&#xB2E4;.</p><h3 id="%EB%85%BC%EB%A6%AC%EC%A0%81%EC%9D%B8-%EC%9A%94%EC%86%8C">&#xB17C;&#xB9AC;&#xC801;&#xC778; &#xC694;&#xC18C;</h3><p>WAL &#xB85C;&#xADF8; &#xD30C;&#xC77C;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xB17C;&#xB9AC;&#xC801; &#xACC4;&#xCE35;&#xC758; &#xB0B4;&#xC6A9;&#xC744; &#xD3EC;&#xD568;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li><code>Raftpb.Entry</code> : Raft &#xC758; &#xB9AC;&#xB354;&#xC5D0; &#xC758;&#xD574; &#xBCF5;&#xC81C;&#xB41C; &#xC81C;&#xC548;(&#xB85C;&#xADF8; &#xD56D;&#xBAA9; &#xCD94;&#xAC00;&#xD558;&#xB77C;&#xB294; &#xC81C;&#xC548;). &#xC77C;&#xBD80; &#xC81C;&#xC548;&#xC740; &#xCEE4;&#xBC0B;&#xB41C;&#xAC83;&#xC73C;&#xB85C; &#xAC04;&#xC8FC;&#xB429;&#xB2C8;&#xB2E4;.</li><li><code>Raftpb.HardState(term,commit,vote)</code> : &#xCEE4;&#xBC0B;&#xB418;&#xC5B4;(&#xACFC;&#xBC18;&#xC218; &#xC774;&#xC0C1;&#xC5D0; &#xBCF5;&#xC81C;&#xB418;&#xC5B4;&#xC11C; &#xCEE4;&#xBC0B;&#xB41C;) &#xBCC0;&#xACBD;/&#xC7AC;&#xC815;&#xC758; &#xB418;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xBCF4;&#xC7A5;&#xB418;&#xACE0;, &#xBC31;&#xC5D4;&#xB4DC;&#xC5D0; &#xC801;&#xC6A9; &#xB420; &#xC218; &#xC788;&#xB294; &#xB85C;&#xADF8; &#xD56D;&#xBAA9;&#xC758; index &#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;,  term &#xC815;&#xBCF4;, &#xD22C;&#xD45C; &#xC815;&#xBCF4;</li><li><code>walpb.Snapshot(term, index)</code> : Raft &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD55C; &#xC8FC;&#xAE30;&#xC801;&#xC778; &#xC2A4;&#xB0C5;&#xC0F7; (DB &#xB0B4;&#xC6A9;&#xC740; &#xD558;&#xB098;&#xB3C4; &#xC5C6;&#xACE0;, &#xC2A4;&#xB0C5;&#xC0F7; &#xB85C;&#xADF8; &#xC778;&#xB371;&#xC2A4;&#xC640; Raft &#xC784;&#xAE30; &#xC815;&#xBCF4;&#xB9CC; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.) etcd v3 store &#xC758; &#xACBD;&#xC6B0; &#xB370;&#xC774;&#xD130;&#xB294; bbolt &#xD30C;&#xC77C;&#xC5D0; &#xC720;&#xC9C0;&#xB418;&#xACE0;, Snapshot &#xC5D0; &#xC784;&#xAE30;/&#xC778;&#xB371;&#xC2A4; &#xC815;&#xBCF4;&#xAC00; &#xBC18;&#xC601;&#xB418;&#xBA74; &#xC554;&#xC2DC;&#xC801;&#xC778; &#xC2A4;&#xB0C5;&#xC0F7;&#xC774; &#xB429;&#xB2C8;&#xB2E4;. (&#xB370;&#xC774;&#xD130;&#xC5D0; &#xB300;&#xD55C; &#xC2A4;&#xB0C5;&#xC0F7; &#xD30C;&#xC77C;&#xC744; &#xB530;&#xB85C; &#xB9CC;&#xB4DC;&#xB294;&#xAC8C; &#xC544;&#xB2D8;)</li><li><code>crc32 &#xCCB4;&#xD06C;&#xC12C;</code></li><li><code>etcdserverpb.Metadata(node_id, cluster_id)</code> : &#xB85C;&#xADF8;&#xAC00; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBC0F; &#xBCF5;&#xC81C;&#xB97C; &#xD45C;&#xD604;&#xA0;</li></ul><p></p><p>&#xAC01;&#xAC01;&#xC758; WAL-log &#xD30C;&#xC77C;&#xC740; &#xC544;&#xB798; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xBE4C;&#xB4DC;&#xB429;&#xB2C8;&#xB2E4;.</p><ol><li>CRC-32 &#xD504;&#xB808;&#xC784;</li><li>&#xBA54;&#xD0C0;&#xB370;&#xC774;&#xD130; &#xD504;&#xB808;&#xC784;(&#xD074;&#xB7EC;&#xC2A4;&#xD130;, &#xBCF5;&#xC81C;&#xBCF8; IDs)</li><li>&#xCD5C;&#xCD08;&#xC758; WAL &#xD30C;&#xC77C;&#xC778; &#xACBD;&#xC6B0;<ol><li>&#xBE48; Snapshot &#xD504;&#xB808;&#xC784; (&#xC778;&#xB371;&#xC2A4;, &#xC784;&#xAE30; &#xBAA8;&#xB450; 0 &#xC778;)</li></ol></li><li>&#xCD5C;&#xCD08;&#xAC00; &#xC544;&#xB2CC; WAL &#xD30C;&#xC77C;<ol><li>Hardstate &#xD504;&#xB808;&#xC784; (&#xC784;&#xAE30;, &#xCEE4;&#xBC0B;, &#xD22C;&#xD45C; &#xC815;&#xBCF4;)</li></ol></li><li>&#xD56D;&#xBAA9;, hard-state, snapshot record &#xC758; &#xC870;&#xD569;</li></ol><p>&#xA0;</p><p>WAL &#xB85C;&#xADF8;&#xC758; &#xC778;&#xB371;&#xC2A4;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC0DD;&#xC131;, &#xC720;&#xC9C0;&#xB429;&#xB2C8;&#xB2E4;.</p><ol><li>snapshot &#xC758; &#xC778;&#xB371;&#xC2A4;&#xB85C;&#xBD80;&#xD130; &#xC2DC;&#xC791;</li><li>&#xAC19;&#xC740; &#xC784;&#xAE30;(term)&#xC5D0; &#xC788;&#xB294; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; &#xC2A4;&#xB0C5;&#xC0F7; &#xC774;&#xD6C4;&#xB85C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xC99D;&#xAC00;</li><li>&#xC784;&#xAE30;&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xBA74; &#xC778;&#xB371;&#xC2A4;&#xAC00; &#xAC10;&#xC18C; &#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xCD5C;&#xC2E0; Hardstate.commit &#xBCF4;&#xB2E4; &#xB192;&#xC740; &#xC0C8;&#xB85C;&#xC6B4; &#xAC12;&#xC73C;&#xB85C; &#xBCC0;&#xACBD; &#xAC00;&#xB2A5;</li><li>&#xC0C8; &#xC2A4;&#xB0C5;&#xC0F7;&#xC740; &#xBC18;&#xB4DC;&#xC2DC;  index &gt;= Hardstate.commit &#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD574;&#xC57C; &#xD558;&#xBA70;, &#xC778;&#xB371;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; &#xC0C8;&#xB85C;&#xC6B4; &#xC2DC;&#xD000;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/04/0e0ed9bf-b20b-4a2e-ac1e-d63cd3d7b61b.png" class="kg-image" alt="etcd &#xC758; snapshot &#xACFC; WAL&#xC774; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;? (etcd backup snapshot&#xC774; &#xC544;&#xB2CC;)" loading="lazy" width="703" height="605" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/04/0e0ed9bf-b20b-4a2e-ac1e-d63cd3d7b61b.png 600w, https://www.kimsehwan96.com/content/images/2024/04/0e0ed9bf-b20b-4a2e-ac1e-d63cd3d7b61b.png 703w"><figcaption><span style="white-space: pre-wrap;">WAL &#xB85C;&#xADF8;&#xC758; &#xCD94;&#xC0C1;&#xD654;&#xB41C; &#xADF8;&#xB9BC;. *.snap.db &#xD30C;&#xC77C;&#xC740; &#xB9AC;&#xB354; &lt;-&gt; &#xD314;&#xB85C;&#xC6CC;&#xAC04; &#xC2A4;&#xB0C5;&#xC0F7; &#xAE30;&#xBC18;&#xC758; &#xB3D9;&#xAE30;&#xD654;&#xAC00; &#xC9C4;&#xD589; &#xB420; &#xB54C;, &#xB9AC;&#xB354;&#xAC00; &#xBFCC;&#xB824;&#xC8FC;&#xB294; &#xD30C;&#xC77C;&#xC774;&#xB2E4;. (&#xC2E4;&#xC81C; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4; &#xCEE8;&#xD150;&#xCE20;&#xAC00; &#xB4E4;&#xC5B4;&#xC788;&#xC74C;)</span></figcaption></figure><h2 id="%EC%A0%95%EB%A6%AC">&#xC815;&#xB9AC;</h2><p>WAL &#xD30C;&#xC77C;&#xC740; Write Ahead Log &#xC758; &#xC57D;&#xC790;&#xB85C;, B-Tree &#xC5D0;&#xC11C;&#xC758; &#xBCF4;&#xD1B5; &#xC4F0;&#xAE30; &#xC804; &#xC784;&#xC2DC;&#xB85C; &#xC800;&#xC7A5;&#xD558;&#xC5EC; &#xC4F0;&#xAE30; &#xC2E4;&#xD328;&#xC2DC; &#xBCF5;&#xAD6C;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC6A9;&#xB3C4;&#xB85C; &#xC0AC;&#xC6A9;&#xB418;&#xB294;&#xB370;, etcd &#xB294; &#xD55C; &#xB2E8;&#xACC4; &#xB354; &#xD655;&#xC7A5;&#xD574;&#xC11C;, Raft &#xB85C; &#xBD80;&#xD130; &#xC81C;&#xC548;&#xB41C; &#xB85C;&#xADF8; &#xD56D;&#xBAA9; &#xC784;&#xC2DC; &#xC800;&#xC7A5; + Snapshot &#xC815;&#xBCF4; &#xC800;&#xC7A5;, &#xAE30;&#xD0C0; &#xBA54;&#xD0C0;&#xB370;&#xC774;&#xD130; &#xC800;&#xC7A5;(&#xC784;&#xAE30;, &#xCEE4;&#xBC0B;, &#xC778;&#xB371;&#xC2A4;) &#xC6A9;&#xB3C4;&#xB85C; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xD30C;&#xC77C;&#xC785;&#xB2C8;&#xB2E4;. </p><p>etcd &#xC758; <code>--snapshot-count</code> &#xB3C4;&#xB2EC;&#xC2DC; &#xC0DD;&#xAE30;&#xB294; <code>000000-000000.snap</code> &#xD615;&#xD0DC;&#xC758; &#xC2A4;&#xB0C5; &#xD30C;&#xC77C;&#xC740; &#xC77C;&#xC885;&#xC758; &#xBA54;&#xD0C0;&#xB370;&#xC774;&#xD130;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB294; &#xD30C;&#xC77C;&#xC774;&#xACE0;, &#xC2E4;&#xC81C;&#xB85C;&#xB294; WAL&#xC5D0;&#xB3C4; &#xC800;&#xC7A5;&#xB418;&#xBA70;, &#xC774; &#xC2DC;&#xC810;&#xC5D0;&#xC11C;&#xC758; DB &#xC5D0; &#xB300;&#xD55C; &#xC2A4;&#xB0C5;&#xC0F7; &#xD30C;&#xC77C;&#xC744; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xB9CC;&#xB4DC;&#xB294;&#xAC83;&#xC774; &#xC544;&#xB2CC;(&#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; Disk &#xC5D0; &#xBCC4;&#xB3C4;&#xB85C; &#xC800;&#xC7A5;&#xD558;&#xB294;&#xAC8C; &#xC544;&#xB2C8;&#xB77C;) &#xC554;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC2A4;&#xB0C5;&#xC0F7; &#xC2DC;&#xC810;&#xC758; &#xC784;&#xAE30;, &#xC778;&#xB371;&#xC2A4; &#xAC12;&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xB17C;&#xB9AC;&#xC801;&#xC73C;&#xB85C; &#xAC16;&#xACE0;&#xC788;&#xB294; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC2E4;&#xC81C;&#xB85C; &#xC2A4;&#xB0C5;&#xC0F7;&#xC774; &#xD544;&#xC694;&#xD55C; &#xC2DC;&#xC810; (&#xB290;&#xB9B0; &#xD314;&#xB85C;&#xC6CC;&#xC758; &#xB3D9;&#xAE30;&#xD654;&#xB97C; &#xC704;&#xD574;&#xC11C;)&#xC5D0;&#xC11C;&#xB294; &#xC554;&#xC2DC;&#xC801;&#xC778; &#xC2A4;&#xB0C5;&#xC0F7;&#xC744; &#xC2E4;&#xC81C; &#xBB3C;&#xB9AC;&#xC801;&#xC778; &#xD30C;&#xC77C; &#xD615;&#xD0DC;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; (<code>*.snap.db</code>) &#xD314;&#xB85C;&#xC6CC;&#xC5D0;&#xAC8C; &#xD30C;&#xC77C;&#xC744; &#xC804;&#xB2EC;&#xD558;&#xACE0; &#xB3D9;&#xAE30;&#xD654; &#xB41C; &#xC774;&#xD6C4;&#xC5D0;&#xB294; &#xC0AD;&#xC81C;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[RR DNS 를 통한 kube-apiserver 앞단의 LB 대체 테스트]]></title><description><![CDATA[이 글에서는 Round Robin DNS 를 통해 HA k8s 클러스터 앞단의 kube-apiserver를 위한 로드밸런서를 대체 할 수 있는지 테스트를 해보는 글입니다. 결론부터 이야기 하면 어느정도는 가능하다입니다. DNS 로는 Route53 을 사용하고, 상태검사등의 기능까지 사용해서 어느정도 구현이 가능합니다.]]></description><link>https://www.kimsehwan96.com/can-rr-dns-replace-load-balancer-in-front-of-kube-apiserver/</link><guid isPermaLink="false">660584e530749cc47571b513</guid><category><![CDATA[HA]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[kube-apiserver]]></category><category><![CDATA[ControlPlane]]></category><category><![CDATA[AWS]]></category><category><![CDATA[K8s]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Thu, 28 Mar 2024 15:19:56 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-29-------12.17.08.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">HA Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xC11C;, kube-apiserver &#xC55E;&#xB2E8;&#xC5D0; LB &#xAC00; &#xC788;&#xC5B4;&#xC57C; &#xB2E8;&#xC77C; &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB85C; &#xC5EC;&#xB7EC; kube-apiserver&#xB97C; &#xC811;&#xADFC; &#xD560; &#xC218; &#xC788;&#xACE0;. &#xBCF4;&#xD1B5;&#xC740; &#xADF8; LB &#xB610;&#xD55C; HA &#xAD6C;&#xC131;&#xC744; &#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xBCF4;&#xD1B5; HAProxy + Keepalived &#xC870;&#xD569;&#xC744; &#xD1B5;&#xD574; LB &#xC790;&#xCCB4;&#xB294; Active-Standby &#xB85C;. kube-apiserver &#xB4E4;&#xC740; &#xBAA8;&#xB450; Active-Active &#xC0C1;&#xD0DC;&#xB85C; &#xAD6C;&#xCD95;&#xD558;&#xB294;&#xAC8C; &#xBCF4;&#xD3B8;&#xC801;&#xC778; &#xAD6C;&#xCD95; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;. &#xC774; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xB294; LB &#xC5C6;&#xC774; RR DNS &#xB97C; &#xD1B5;&#xD574;&#xC11C; HA Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xAD6C;&#xCD95;, &#xD2B9;&#xD788; kube-apiserver &#xC640; kubelet &#xC0AC;&#xC774;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE30;&#xC9C0; &#xC54A;&#xC744;&#xC9C0; &#xB4F1;&#xC744; &#xC5FC;&#xB450;&#xC5D0; &#xB450;&#xACE0; &#xB0B4;&#xC6A9;&#xC744; &#xC791;&#xC131;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</div></div><h2 id="%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-%ED%86%A0%ED%8F%B4%EB%A6%AC%EC%A7%80-etcd">&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xACE0;&#xAC00;&#xC6A9;&#xC131; &#xD1A0;&#xD3F4;&#xB9AC;&#xC9C0; (etcd)</h2><img src="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-29-------12.17.08.png" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;"><p><a href="https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/ha-topology/?ref=kimsehwan96.com"></a></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/ha-topology/?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xACE0;&#xAC00;&#xC6A9;&#xC131; &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0; &#xC120;&#xD0DD;</div><div class="kg-bookmark-description">&#xC774; &#xD398;&#xC774;&#xC9C0;&#xB294; &#xACE0;&#xAC00;&#xC6A9;&#xC131;(HA) &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xD1A0;&#xD50C;&#xB85C;&#xC9C0;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xB450; &#xAC00;&#xC9C0; &#xC120;&#xD0DD; &#xC0AC;&#xD56D;&#xC744; &#xC124;&#xBA85;&#xD55C;&#xB2E4;.
&#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; HA &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;.
etcd &#xB178;&#xB4DC;&#xC640; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xB97C; &#xD568;&#xAED8; &#xC704;&#xCE58;&#xC2DC;&#xD0A4;&#xB294; &#xC911;&#xCCA9;&#xB41C;(stacked) &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC; &#xBC29;&#xC2DD; etcd&#xC640; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC774; &#xBD84;&#xB9AC;&#xB41C; &#xB178;&#xB4DC;&#xC5D0;&#xC11C; &#xC6B4;&#xC601;&#xB418;&#xB294; &#xC678;&#xBD80; etcd &#xB178;&#xB4DC; &#xBC29;&#xC2DD; HA &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xAC01; &#xD1A0;&#xD50C;&#xB85C;&#xC9C0;&#xC758; &#xC7A5;&#xB2E8;&#xC810;&#xC744; &#xC8FC;&#xC758; &#xAE4A;&#xAC8C; &#xACE0;&#xB824;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.
&#xCC38;&#xACE0;: kubeadm&#xC740; etcd &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC815;&#xC801;&#xC73C;&#xB85C; &#xBD80;&#xD2B8;&#xC2A4;&#xD2B8;&#xB7A9;&#xD55C;&#xB2E4;. &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; etcd &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xAD6C;&#xC131; &#xAC00;&#xC774;&#xB4DC; &#xB97C; &#xC77D;&#xB294;&#xB2E4;. &#xC911;&#xCCA9;&#xB41C; etcd &#xD1A0;&#xD50C;&#xB85C;&#xC9C0; &#xC911;&#xCCA9;&#xB41C; HA &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; etcd&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xBD84;&#xC0B0; &#xB370;&#xC774;&#xD130; &#xC800;&#xC7A5;&#xC18C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C;, &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xAD6C;&#xC131; &#xC694;&#xC18C;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; kubeadm&#xC73C;&#xB85C; &#xAD00;&#xB9AC;&#xB418;&#xB294; &#xB178;&#xB4DC;&#xC5D0; &#xC758;&#xD574;&#xC11C; &#xD615;&#xC131;&#xB41C; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC0C1;&#xB2E8;&#xC5D0; &#xC911;&#xCCA9;&#xD558;&#xB294; &#xD1A0;&#xD50C;&#xB85C;&#xC9C0;&#xC774;&#xB2E4;.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://kubernetes.io/favicons/apple-touch-icon-180x180.png" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;"><span class="kg-bookmark-author">Kubernetes</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://kubernetes.io/images/kubernetes-horizontal-color.png" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;"></div></a></figure><p>&#xC704; &#xBB38;&#xC11C;&#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xACF5;&#xC2DD; &#xBB38;&#xC11C;&#xC5D0;&#xC11C; &#xACE0;&#xAC00;&#xC6A9;&#xC131;&#xC774; &#xD655;&#xBCF4;&#xB41C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xB294; &#xB450;&#xAC00;&#xC9C0; &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC11C;&#xC220;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC704; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xC758; &#xCD08;&#xC810;&#xC740; <code>etcd</code> &#xC774;&#xBA70;. <code>etcd</code> &#xB97C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;(&#xBA38;&#xC2E0;)&#xACFC; &#xC911;&#xCCA9;&#xC2DC;&#xCF1C;&#xC11C; &#xAD6C;&#xCD95;&#xD560;&#xC9C0;, &#xC544;&#xB2C8;&#xBA74; &#xC678;&#xBD80; &#xB2E4;&#xB978; &#xB178;&#xB4DC;(&#xBA38;&#xC2E0;)&#xC5D0; &#xAD6C;&#xCD95;&#xD560;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xB0B4;&#xC6A9;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774; &#xBB38;&#xC11C;&#xB294; <code>etcd</code> &#xB97C; &#xCD08;&#xC810;&#xC73C;&#xB85C; &#xD55C; &#xBB38;&#xC11C;&#xB294; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xC694;&#xC57D;&#xD558;&#xC790;&#xBA74;. </p><h3 id="stacked-etcd-%ED%86%A0%ED%8F%B4%EB%A1%9C%EC%A7%80">Stacked etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/71d93c83-edf1-41a5-975a-8a272b940aba.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1281" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/71d93c83-edf1-41a5-975a-8a272b940aba.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/71d93c83-edf1-41a5-975a-8a272b940aba.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/71d93c83-edf1-41a5-975a-8a272b940aba.png 1281w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Stacked etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</span></figcaption></figure><p><code>Stacked</code> etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;&#xC758; &#xACBD;&#xC6B0; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;(&#xBA38;&#xC2E0;)&#xC5D0; etcd &#xB97C; &#xAC19;&#xC774; &#xC124;&#xCE58;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C;. </p><p><code>kube-apiserver</code> &#xC640; <code>etcd</code> &#xAC04;&#xC5D0; <code>Network I/O</code> &#xAC00; &#xC5C6;&#xB2E4;&#xB294; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xC9C0;&#xB9CC;. RAFT &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code>etcd</code> &#xC758; &#xD2B9;&#xC131;, &#xADF8;&#xB9AC;&#xACE0; &#xADF8; <code>etcd</code> &#xB97C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC5D0; &#xAC19;&#xC774; &#xC124;&#xCE58;&#xD55C;&#xB2E4;&#xB294; &#xAD6C;&#xC131;&#xC0C1;&#xC758; &#xD2B9;&#xC9D5;&#xC73C;&#xB85C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC758; &#xAC1C;&#xC218;&#xB294; <code>etcd</code> &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBA64;&#xBC84;&#xC758; &#xAC1C;&#xC218;&#xC640; &#xB3D9;&#xC77C;&#xD558;&#xBA70;. &#xADF8;&#xC5D0; &#xB530;&#xB77C;&#xC11C; &#xACE0;&#xAC00;&#xC6A9;&#xC131; &#xC720;&#xC9C0;&#xB97C; &#xC704;&#xD55C; <code>Quorum</code> &#xAC1C;&#xC218;&#xB97C; &#xB9DE;&#xCD94;&#xB824;&#xACE0; &#xD560; &#xB54C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC758; &#xAC1C;&#xC218;&#xB3C4; <code>etcd</code> &#xC640; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xB9DE;&#xCDB0;&#xC918;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xB2E8;&#xC810;&#xC774; &#xC788;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>etcd</code> &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; <code>etcd</code> &#xBA64;&#xBC84;&#xB97C; 3&#xB300; &#xC774;&#xC0C1; &#xC720;&#xC9C0;&#xD588;&#xC744; &#xB54C; 1&#xAC1C;&#xC758; <code>etcd</code> &#xBA64;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#xC815;&#xC0C1; &#xB3D9;&#xC791;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xACE0;, 5&#xB300;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xB294;&#xACBD;&#xC6B0; &#xCD5C;&#xB300; 2&#xAC1C;&#xC758; &#xBA64;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#xC815;&#xC0C1; &#xB3D9;&#xC791;&#xC774; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.  </p><p>&#xCC38;&#xC870; : <a href="https://etcd.io/docs/v3.5/faq/?ref=kimsehwan96.com#what-is-failure-tolerance">https://etcd.io/docs/v3.5/faq/#what-is-failure-tolerance</a></p><p>&#xB530;&#xB77C;&#xC11C; &#xACE0;&#xAC00;&#xC6A9;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD574; <code>etcd</code> &#xB97C; 5&#xAC1C;&#xB97C; &#xC124;&#xCE58;&#xD558;&#xAE30;&#xB85C; &#xC120;&#xD0DD; &#xD588;&#xC744; &#xB54C;, &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC758; &#xAC1C;&#xC218; &#xC790;&#xCCB4;&#xB3C4; 5&#xAC1C;&#xAC00; &#xB418;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;&#xB294;&#xAC83;&#xC774; &#xB2E8;&#xC810;&#xC774; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="external-etcd-%ED%86%A0%ED%8F%B4%EB%A1%9C%EC%A7%80">External etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/aae19bd1-e380-4d66-9bf0-00116512e302.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1281" height="930" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/aae19bd1-e380-4d66-9bf0-00116512e302.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/aae19bd1-e380-4d66-9bf0-00116512e302.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/aae19bd1-e380-4d66-9bf0-00116512e302.png 1281w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">External etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</span></figcaption></figure><p><code>External</code> etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;&#xC758; &#xACBD;&#xC6B0; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC640; &#xBCC4;&#xB3C4;&#xB85C; <code>etcd</code> &#xB97C; &#xC124;&#xCE58;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xB85C;. <code>kube-apiserver</code> &#xC640; <code>etcd</code> &#xAC00; &#xBB3C;&#xB9AC;&#xC801;&#xC73C;&#xB85C; &#xB2E4;&#xB978; &#xBA38;&#xC2E0;&#xC5D0; &#xC124;&#xCE58;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xACBD;&#xC6B0; <code>Network I/O</code> &#xB97C; &#xC5FC;&#xB450;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; &#xC774; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC758; &#xAC1C;&#xC218;&#xB294; <code>etcd</code> &#xC758; &#xAC1C;&#xC218;&#xC640; &#xC804;&#xD600; &#xC0C1;&#xAD00;&#xC5C6;&#xC774; &#xAD6C;&#xC131;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xC7A5;&#xC810;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xB294; 2&#xB300;, <code>etcd</code> &#xBA64;&#xBC84;&#xB294; 5&#xAC1C;&#xB85C; &#xC124;&#xCE58;&#xD558;&#xAC70;&#xB098;, &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC740; 3&#xB300; , etcd &#xBA64;&#xBC84;&#xB294; 3&#xAC1C; &#xB4F1;&#xC73C;&#xB85C;&#xB3C4; &#xC124;&#xCE58; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC758; &#xAC1C;&#xC218;&#xC640; <code>etcd</code> &#xAC1C;&#xC218;&#xAC04;&#xC758; &#xB514;&#xD39C;&#xB358;&#xC2DC;&#xAC00; &#xC5C6;&#xB294;&#xAC83;&#xC774; &#xC7A5;&#xC810;&#xC774; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; <code>etcd</code> &#xBA64;&#xBC84; &#xC218; &#xB9CC;&#xD07C; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xB178;&#xB4DC;(&#xBA38;&#xC2E0;)&#xC774; &#xD544;&#xC694; &#xD55C; &#xAC83;&#xC774; &#xB2E8;&#xC810;&#xC774; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="kube-apiserver-%EC%95%9E%EB%8B%A8%EC%9D%98-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C-software-lb">kube-apiserver &#xC55E;&#xB2E8;&#xC758; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC11C; (software LB)</h2><p>&#xC55E;&#xC11C;&#xC11C; HA &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xB450;&#xAC00;&#xC9C0; &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;&#xB97C; &#xBCF4;&#xBA74;&#xC11C; &#xD655;&#xC778; &#xAC00;&#xB2A5;&#xD588;&#xACA0;&#xC9C0;&#xB9CC;. &#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xB4E4;&#xC774; <code>kube-apiserver</code> &#xC5D0; &#xC811;&#xADFC; &#xD560; &#xB54C; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC11C;&#xB97C; &#xD1B5;&#xD574; &#xC811;&#xADFC;&#xD558;&#xB294;&#xAC83;&#xC740; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>kubeadm</code> &#xC744; &#xD1B5;&#xD574; HA &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xB3C4; <code>kube-apsierver</code> &#xC6A9; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC11C;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB77C;&#xB294; &#xC774;&#xC57C;&#xAE30;&#xAC00; &#xB098;&#xC640;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/?ref=kimsehwan96.com#first-steps-for-both-methods">Creating Highly Available Clusters with kubeadm</a> </p><p>&#xB610;&#xD55C; &#xC704; &#xBB38;&#xC11C;&#xC5D0;&#xC11C; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xB97C; &#xD1B5;&#xD55C; &#xBD80;&#xD558; &#xBD84;&#xC0B0;&#xC5D0; &#xB300;&#xD55C; &#xB0B4;&#xC6A9;&#xC774; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xB9C1;&#xD06C; &#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370;&#xC694;.</p><p><a href="https://github.com/kubernetes/kubeadm/blob/main/docs/ha-considerations.md?ref=kimsehwan96.com#options-for-software-load-balancing">https://github.com/kubernetes/kubeadm/blob/main/docs/ha-considerations.md#options-for-software-load-balancing</a> </p><p>&#xC704; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xB294; VIP(Virtual IP)&#xB97C; &#xD1B5;&#xD574; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC2F1;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294; keepalived + haproxy &#xC870;&#xD569;&#xC774; &#xC624;&#xB798;&#xB3D9;&#xC548; &#xC0AC;&#xC6A9;&#xB418;&#xC5B4;&#xC654;&#xACE0;, &#xCDA9;&#xBD84;&#xD55C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xAC70;&#xCE5C; &#xC870;&#xD569;&#xC774;&#xB77C;&#xACE0; &#xC124;&#xBA85;&#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/b769d6ce-36a6-4e14-b677-c5871d579acf.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="794" height="549" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/b769d6ce-36a6-4e14-b677-c5871d579acf.png 600w, https://www.kimsehwan96.com/content/images/2024/03/b769d6ce-36a6-4e14-b677-c5871d579acf.png 794w"><figcaption><span style="white-space: pre-wrap;">Keepalived + HAProxy &#xC870;&#xD569;&#xC758; HA &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xAD6C;&#xC131;</span></figcaption></figure><p>&#xC704; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C;&#xC758; IP &#xC8FC;&#xC18C;&#xB294; &#xC774;&#xD574;&#xB97C; &#xB3D5;&#xAE30;&#xC704;&#xD574; &#xC784;&#xC758;&#xB85C; &#xC124;&#xC815;&#xD55C; &#xC8FC;&#xC18C;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC544;&#xB798;&#xCABD;&#xC758; &#xAC01; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xB294; &#xAC01;&#xAC01; <code>192.168.100.2</code> , <code>192.168.100.3</code> , <code>192.168.100.4</code> &#xC8FC;&#xC18C;&#xB97C; &#xAC16;&#xACE0; &#xC788;&#xB2E4;&#xACE0; &#xD560; &#xB54C;. <code>kube-apiserver</code> &#xB294; &#xAC01; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC5D0;&#xC11C; <code>6443(&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB418;&#xB294; &#xD3EC;&#xD2B8;&#xC774;&#xBA70; &#xBCC0;&#xACBD;&#xB420; &#xC218; &#xC788;&#xC74C;)</code> &#xD3EC;&#xD2B8;&#xB85C; listen &#xD558;&#xACE0; &#xC788;&#xB294; &#xC0C1;&#xD0DC;&#xC77C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7EC;&#xD55C; <code>kube-apiserver</code> &#xB4E4;&#xC5D0; &#xBD80;&#xD558;&#xB97C; &#xBD84;&#xC0B0;&#xD574;&#xC11C;, &#xADF8;&#xB9AC;&#xACE0; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACBC;&#xC744;&#xB54C; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xB294; &#xC11C;&#xBC84;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD2C0;&#xC5B4;&#xC8FC;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>HAProxy</code> &#xB97C; &#xD1B5;&#xD574; &#xAC01; <code>kube-apiserver</code> &#xC5D0; round-robin &#xD615;&#xD0DC;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD2C0;&#xC5B4;&#xC8FC;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD558;&#xACE0;. &#xC774; &#xB54C; &#xAC01; <code>HAProxy</code> &#xB294; <code>192.168.100.10</code> , <code>192.168.100.20</code> &#xC8FC;&#xC18C;&#xB97C; &#xAC16;&#xACE0; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB54C; &#xAC01; <code>LB(HAProxy)</code> &#xAC04;&#xC758; HA &#xAD6C;&#xC131;&#xC744; &#xC704;&#xD574; <code>Keepalived</code> &#xB97C; &#xB450;&#xACE0;. <code>VIP</code> &#xB97C; <code>192.168.100.100</code> &#xC73C;&#xB85C; &#xB450;&#xACE0;. &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574; &#xD55C;&#xCABD; LB&#xB97C; &#xB9C8;&#xC2A4;&#xD130;, &#xD55C;&#xCABD; LB &#xB97C; &#xBC31;&#xC5C5;&#xC73C;&#xB85C; &#xB450;&#xB294; <code>Active-Standby</code> &#xC870;&#xD569;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xBA74;</p><p>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB098; &#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xB294; <code>192.168.100.100:6443</code> &#xD639;&#xC740; &#xB3C4;&#xBA54;&#xC778;&#xC744; <code>192.168.100.100</code> &#xC5D0; &#xC5F0;&#xACB0;&#xD588;&#xB2E4;&#xACE0; &#xD558;&#xACE0;, &#xADF8; &#xB3C4;&#xBA54;&#xC778;&#xC774; <code>foo.bar.com</code> &#xC774;&#xB77C;&#xACE0; &#xD558;&#xBA74; <code>https://foo.bar.com:6443</code> &#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xAC8C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xBA74; <code>Keepalived</code> &#xB97C; &#xD1B5;&#xD574; &#xD55C;&#xCABD; <code>LB</code> &#xB85C; &#xC694;&#xCCAD;&#xC774; &#xB118;&#xC5B4;&#xAC00;&#xACE0;. &#xD574;&#xB2F9; LB &#xB294; round-robin &#xD615;&#xD0DC;&#xB85C; &#xC138; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC758; <code>kube-apiserver</code> &#xC911; &#xD558;&#xB098;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD2C0;&#xC5B4;&#xC8FC;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xAC83;&#xC774; &#xC77C;&#xBC18;&#xC801;&#xC778; <code>Keepalived</code> + <code>HAProxy</code> &#xC870;&#xD569;&#xC758; HA &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xAD6C;&#xC131;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xAC8C; &#xB418;&#xBA74; <code>kube-apiserver</code> , <code>LB(HAProxy)</code> &#xC911; &#xD558;&#xB098;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xC0DD;&#xAE30;&#xB354;&#xB77C;&#xB3C4; &#xC815;&#xC0C1;&#xC801;&#xC778; <code>kube-apiserver</code>, <code>LB</code>  &#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD2C0;&#xC5B4; &#xC904; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xACE0;&#xAC00;&#xC6A9;&#xC131;&#xC774; &#xD655;&#xBCF4;&#xB418;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xBB3C;&#xB860; &#xB4B7;&#xB2E8;&#xC758; <code>Control Plane Node</code> &#xB97C; <code>Stacked etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</code> &#xB85C; &#xD588;&#xB0D0;, <code>External etcd &#xD1A0;&#xD3F4;&#xB85C;&#xC9C0;</code> &#xB85C; &#xD588;&#xB0D0;&#xC5D0; &#xB530;&#xB77C;&#xC11C; &#xACE0;&#xAC00;&#xC6A9;&#xC131; &#xD655;&#xBCF4; &#xC5EC;&#xBD80;&#xAC00; &#xB2EC;&#xB77C;&#xC9C8; &#xC218; &#xC788;&#xACE0;. <code>Keepalived</code> &#xC5D0; &#xC7A5;&#xC560;&#xAC00; &#xC0DD;&#xACBC;&#xB0D0;&#xC5D0; &#xB530;&#xB77C;&#xC11C;&#xB3C4; &#xACE0;&#xAC00;&#xC6A9;&#xC131; &#xD655;&#xBCF4; &#xC5EC;&#xBD80;&#xAC00; &#xB2EC;&#xB77C; &#xC9C8; &#xC218;&#xB294; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C;&#xB294; &#xB2E8;&#xD3B8;&#xC801;&#xC778; &#xCF00;&#xC774;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xC124;&#xBA85;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC704; &#xAD6C;&#xC131;&#xC5D0;&#xC11C; <code>VIP(Virtual IP)</code> &#xADF8;&#xB9AC;&#xACE0; <code>Keepalived</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; <code>LB(HAProxy)</code> &#xC5D0; &#xB300;&#xD55C; &#xACE0;&#xAC00;&#xC6A9;&#xC131;&#xC744; &#xD655;&#xBCF4;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB450; <code>LB(HAProxy)</code> &#xC911; &#xD558;&#xB098;&#xB294; &#xC720;&#xD734;&#xC0C1;&#xD0DC;(<code>Standby</code>) &#xC0C1;&#xD0DC;&#xB85C; &#xB0A8;&#xC544;&#xC788;&#xAC8C; &#xB418;&#xB294; &#xAC83; &#xB2E8;&#xC810;&#xC73C;&#xB85C; &#xB0A8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC704; &#xBD80;&#xBD84;&#xC744; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xBCC4;&#xB3C4;&#xC758; <code>Keepalived</code> &#xB97C; &#xD558;&#xB098; &#xB354; &#xCD94;&#xAC00;&#xD558;&#xACE0;. 2&#xAC1C;&#xC758; <code>VIP(Virtual IP)</code> &#xB97C; &#xAD6C;&#xC131;&#xD558;&#xACE0;. <code>Round Robin DNS</code> , &#xADF8;&#xB9AC;&#xACE0; <code>Health Check</code> &#xAE4C;&#xC9C0; &#xACB8;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAC70;&#xB098;, &#xB450;&#xAC1C;&#xC758; <code>LB</code> &#xC5D0; &#xB300;&#xD574;&#xC11C; <code>Round Robin DNS</code> &#xADF8;&#xB9AC;&#xACE0; <code>Health Check</code> &#xB97C; &#xACB8;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB4F1;&#xC758; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><h2 id="round-robin-dns-%EB%A1%9C-%ED%95%B4%EB%B3%B4%EC%9E%90">Round-Robin DNS &#xB85C; &#xD574;&#xBCF4;&#xC790;!</h2><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xB77C;&#xC6B4;&#xB4DC; &#xB85C;&#xBE48; DNS&#xB294; &#xAD6C;&#xD604;&#xD558;&#xAE30;&#xB294; &#xC27D;&#xC9C0;&#xB9CC; DNS &#xACC4;&#xCE35; &#xAD6C;&#xC870; &#xC790;&#xCCB4;&#xC758; &#xB808;&#xCF54;&#xB4DC; &#xCE90;&#xC2F1;&#xACFC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCE21; &#xC8FC;&#xC18C; &#xCE90;&#xC2F1; &#xBC0F; &#xC7AC;&#xC0AC;&#xC6A9;&#xC73C;&#xB85C; &#xC778;&#xD574; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0; &#xB2E8;&#xC810;&#xC774; &#xC788;&#xC73C;&#xBA70;, &#xC774;&#xB7EC;&#xD55C; &#xC870;&#xD569;&#xC740; &#xAD00;&#xB9AC;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6B8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC11C;&#xBE44;&#xC2A4; &#xAC00;&#xC6A9;&#xC131;&#xC744; &#xC704;&#xD574; &#xB77C;&#xC6B4;&#xB4DC; &#xB85C;&#xBE48; DNS&#xC5D0;&#xB9CC; &#xC758;&#xC874;&#xD574;&#xC11C;&#xB294; &#xC548; &#xB429;&#xB2C8;&#xB2E4;. &#xBAA9;&#xB85D;&#xC5D0; &#xC788;&#xB294; &#xC8FC;&#xC18C; &#xC911; &#xD558;&#xB098;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; DNS&#xB294; &#xD574;&#xB2F9; &#xC8FC;&#xC18C;&#xB97C; &#xACC4;&#xC18D; &#xC804;&#xB2EC;&#xD558;&#xACE0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB294; &#xC5EC;&#xC804;&#xD788; &#xC791;&#xB3D9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xC5F0;&#xACB0;&#xD558;&#xB824;&#xACE0; &#xC2DC;&#xB3C4;&#xD569;&#xB2C8;&#xB2E4;.</div></div><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xB77C;&#xC6B4;&#xB4DC; &#xB85C;&#xBE48; DNS&#xB294; &#xB124;&#xC784; &#xC11C;&#xBC84;&#xB97C; &#xCFFC;&#xB9AC;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xC8FC;&#xC18C; &#xB808;&#xCF54;&#xB4DC;&#xC758; &#xC21C;&#xC11C;&#xB97C; &#xBC88;&#xAC08;&#xC544; &#xAC00;&#xBA70; &#xCFFC;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xADF8; &#xC790;&#xCCB4;&#xB85C;&#xB294; <a href="https://en.wikipedia.org/wiki/Load_balancing_(computing)?ref=kimsehwan96.com" title="https://en.wikipedia.org/wiki/Load_balancing_(computing)">&#xBD80;&#xD558; &#xBD84;&#xC0B0;&#xC5D0;</a> &#xAC00;&#xC7A5; &#xC801;&#xD569;&#xD55C; &#xC120;&#xD0DD;&#xC774; &#xC544;&#xB2D0; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD2B8;&#xB79C;&#xC7AD;&#xC158; &#xC2DC;&#xAC04;, &#xC11C;&#xBC84; &#xBD80;&#xD558;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD63C;&#xC7A1;&#xC744; &#xACE0;&#xB824;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB3D9;&#xC77C;&#xD55C; &#xC6A9;&#xB7C9;&#xC758; &#xC11C;&#xBC84;&#xC5D0; &#xADE0;&#xC77C;&#xD558;&#xAC8C; &#xBD84;&#xC0B0;&#xB41C; &#xB9CE;&#xC740; &#xC218;&#xC758; &#xC5F0;&#xACB0;&#xC774; &#xC788;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xAC00;&#xC7A5; &#xC801;&#xD569;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; <a href="https://en.wikipedia.org/wiki/Load_distribution?ref=kimsehwan96.com" title="https://en.wikipedia.org/wiki/Load_distribution">&#xBD80;&#xD558; &#xBD84;&#xC0B0;&#xB9CC;</a> &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.<a href="https://en.wikipedia.org/wiki/Round-robin_DNS?ref=kimsehwan96.com#cite_note-RFC_1794-9" title="https://en.wikipedia.org/wiki/Round-robin_DNS#cite_note-RFC_1794-9"><sup style="white-space: pre-wrap;">[9]</sup></a></div></div><p>Round-robin DNS &#xB294; DNS &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; IP &#xC8FC;&#xC18C;&#xB4E4;&#xC758; &#xC751;&#xB2F5;&#xC744; &#xC5EC;&#xB7EC; &#xC8FC;&#xC18C;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xACE0; &#xADF8;&#xC640; &#xB354;&#xBD88;&#xC5B4;&#xC11C; &#xCCAB;&#xBC88;&#xC9F8; &#xB808;&#xCF54;&#xB4DC;&#xB97C; &#xC21C;&#xD68C;(round-robin)&#xD558;&#xBA74;&#xC11C; DNS &#xC751;&#xB2F5;&#xC744; &#xD558;&#xB294; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC77C;&#xBC18;&#xC801;&#xC778; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; S/W , H/W LB &#xB97C; &#xB450;&#xC9C0; &#xC54A;&#xACE0; &#xAC00;&#xC7A5; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xBD80;&#xD558; &#xBD84;&#xC0B0;&#xC744; &#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xADF8; &#xC774;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; &#xACE0;&#xB824;&#xD574;&#xC57C;&#xD560; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xB2E8;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>DNS &#xCFFC;&#xB9AC; &#xC815;&#xBCF4;&#xB97C; &#xCE90;&#xC2F1;&#xD558;&#xB294; &#xC8FC;&#xCCB4;&#xAC00; &#xB2E4;&#xC591;&#xD558;&#xB2E4;. (OS, &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;, &#xAE30;&#xD0C0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB4F1;&#xB4F1;)</li><li>DNS &#xCFFC;&#xB9AC; &#xCE90;&#xC2F1; &#xBB38;&#xC81C;&#xB85C; &#xC778;&#xD574; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC744; &#xB54C; &#xBC14;&#xB85C; &#xBC18;&#xC601;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xAE30;&#xC874; &#xCFFC;&#xB9AC;&#xD574;&#xC11C; &#xBC1B;&#xC740; IP &#xC8FC;&#xC18C;&#xB85C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;/&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB4F1;&#xC774; &#xD638;&#xCD9C;&#xC744; &#xD558;&#xB824; &#xD560; &#xAC83;&#xC774;&#xB2E4;.</li><li>DNS &#xC11C;&#xBC84;&#xC5D0; Health Check &#xAE30;&#xB2A5;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xBE44;&#xC815;&#xC0C1;&#xC801;&#xC778; IP &#xC8FC;&#xC18C;&#xB97C; &#xACC4;&#xC18D; &#xB2F4;&#xC544;&#xC11C; &#xBCF4;&#xB0B4;&#xC904; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</li></ol><p>&#xC6B0;&#xC120; 1, 2&#xBC88; &#xBB38;&#xC81C;&#xB97C; &#xC81C;&#xC678;&#xD558;&#xACE0; 3&#xBC88; &#xBD80;&#xBD84;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>AWS Route53</code> &#xC758; &#xB2E4;&#xC911; &#xC751;&#xB2F5; &#xAE30;&#xB2A5; + &#xC0C1;&#xD0DC; &#xAC80;&#xC0AC; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD574;&#xBCF4;&#xAE30;&#xB85C; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%99%98%EA%B2%BD">&#xD14C;&#xC2A4;&#xD2B8; &#xD658;&#xACBD;</h3><p>&#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xD658;&#xACBD; &#xAD6C;&#xC131;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/03/70c524f4-27c5-43cc-9f37-17af65062167.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="1289" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/70c524f4-27c5-43cc-9f37-17af65062167.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/70c524f4-27c5-43cc-9f37-17af65062167.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/70c524f4-27c5-43cc-9f37-17af65062167.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/70c524f4-27c5-43cc-9f37-17af65062167.png 1800w" sizes="(min-width: 1200px) 1200px"></figure><p>2&#xAC1C;&#xC758; Control Plane Node (<code>172.xx.xx.31</code> , <code>172.xx.xx.32</code>) &#xC640; 1&#xAC1C;&#xC758; Worker Node (<code>172.xx.xx.33</code>) &#xC774; &#xC874;&#xC7AC;&#xD558;&#xACE0;. &#xC774; &#xB178;&#xB4DC;&#xB4E4;&#xC740; &#xBAA8;&#xB450; &#xC0AC;&#xC124; &#xB300;&#xC5ED;&#xB300;&#xC5D0; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xC0AC;&#xC124;&#xB9DD;&#xACFC; &#xC5F0;&#xACB0;&#xB41C; &#xAC8C;&#xC774;&#xD2B8;&#xC6E8;&#xC774;&#xB294; <code>xx.xx.xx.xx</code> &#xB77C;&#xB294; &#xACF5;&#xC778; ip &#xC8FC;&#xC18C;&#xB97C; &#xAC16;&#xACE0; &#xC788;&#xACE0; <code>Route53</code> &#xC758; &#xD5EC;&#xC2A4;&#xCCB4;&#xD06C; &#xC694;&#xCCAD;&#xC774; &#xB3C4;&#xB2EC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD3EC;&#xD2B8;&#xD3EC;&#xC6CC;&#xB529;&#xC744; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><code>xx.xx.xx.xx:16443</code> &#x2192; <code>172.xx.xx.31:6443</code> (kube-apiserver)</p><p><code>xx.xx.xx.xx:26443</code> &#x2192; <code>172.xx.xx.32:6443</code> (kube-apiserver)</p><p><code>xx.xx.xx.xx</code> &#xB97C; <code>public_ip</code> &#xB77C;&#xACE0; &#xC9C0;&#xCE6D;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="route53-%EC%84%A4%EC%A0%95">Route53 &#xC124;&#xC815;</h3><p>&#xA0;</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/03/a4dd7c57-4437-4297-9da5-4a7842b4366d.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1261" height="1186" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/a4dd7c57-4437-4297-9da5-4a7842b4366d.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/a4dd7c57-4437-4297-9da5-4a7842b4366d.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/a4dd7c57-4437-4297-9da5-4a7842b4366d.png 1261w" sizes="(min-width: 1200px) 1200px"></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>public_ip:16443</code> , <code>public_ip:26443</code> &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC0C1;&#xD0DC;&#xAC80;&#xC0AC;&#xB97C; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/03/d71dec53-a60c-448c-a68b-f0fc98a4066f.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1303" height="670" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/d71dec53-a60c-448c-a68b-f0fc98a4066f.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/d71dec53-a60c-448c-a68b-f0fc98a4066f.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/d71dec53-a60c-448c-a68b-f0fc98a4066f.png 1303w" sizes="(min-width: 1200px) 1200px"></figure><p>&#xC774;&#xD6C4; <code>A Record</code> &#xC5D0; &#xC704;&#xC640; &#xAC19;&#xC774; &#xB2E4;&#xC911;&#xAC12; &#xC751;&#xB2F5; &#xBC0F; &#xC0C1;&#xD0DC;&#xD655;&#xC778;&#xC744; &#xC5F0;&#xACB0;&#xD558;&#xC5EC; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xA0;</p><p><code>172.xx.xx.31:6443</code> , <code>172.xx.xx.32:6443</code> &#xC73C;&#xB85C; &#xB5A0;&#xC788;&#xB294; &#xAC01; <code>kube-apiserver</code> &#xAC00; &#xC815;&#xC0C1; &#xC0C1;&#xD0DC;&#xB77C;&#xBA74; &#xB450; &#xC0C1;&#xD0DC; &#xAC80;&#xC0AC;&#xB3C4; &#xC815;&#xC0C1;&#xC774;&#xACE0;, &#xC774;&#xC5D0; &#xB530;&#xB77C;&#xC11C; DNS &#xCFFC;&#xB9AC;&#xC2DC; &#xB450; IP &#xC8FC;&#xC18C;&#xB97C; &#xBC88;&#xAC08;&#xC544;&#xAC00;&#xBA74;&#xC11C; &#xC751;&#xB2F5;&#xD574;&#xC8FC;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><h3 id="dns-%ED%85%8C%EC%8A%A4%ED%8A%B8">DNS &#xD14C;&#xC2A4;&#xD2B8;</h3><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/f7b3320a-0121-428e-b560-7602ce7ce468.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1786" height="2102" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/f7b3320a-0121-428e-b560-7602ce7ce468.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/f7b3320a-0121-428e-b560-7602ce7ce468.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/f7b3320a-0121-428e-b560-7602ce7ce468.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/f7b3320a-0121-428e-b560-7602ce7ce468.png 1786w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">&#xB9E8; &#xC704;&#xCABD;&#xC774; 172.xx.xx.31 , &#xC911;&#xAC04;&#xC774; 172.xx.xx.32 , &#xC544;&#xB798;&#xB294; &#xB85C;&#xCEEC; &#xBA38;&#xC2E0;(&#xB9E5;&#xBD81;)</span></figcaption></figure><p><code>kube-apiserver</code> &#xB294; static pod &#xB85C; &#xB744;&#xC6CC;&#xC838;&#xC788;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; ,&#xD55C;&#xBC88; <code>172.xx.xx.31</code> &#xCABD;&#xC5D0; &#xC788;&#xB294; <code>kube-apiserver</code> &#xB97C; &#xC81C;&#xAC70;&#xD574;&#xBCF4;&#xACE0; <code>DNS</code> &#xC751;&#xB2F5;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xB098;&#xC624;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD574;&#xBD05;&#xB2C8;&#xB2E4;. </p><p>&#xA0;</p><p><code>$ mv /etc/kubernetes/manifests/kube-apiserver.yaml /root/kube-apiserver.yaml</code> </p><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>kube-apiserver.yaml</code> &#xC744; &#xC7A0;&#xC2DC; <code>/etc/kubernetes/manifests</code> &#xACBD;&#xB85C;&#xC5D0;&#xC11C; &#xBE7C;&#xB0B4;&#xC90D;&#xB2C8;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">kubelet&#xC740; static pod yaml &#xD30C;&#xC77C; &#xACBD;&#xB85C;&#xB97C; &#xC9C0;&#xC815;&#xD574;&#xB193;&#xACE0;, &#xD574;&#xB2F9; &#xACBD;&#xB85C;&#xC5D0; &#xC788;&#xB294; yaml &#xD30C;&#xC77C;&#xC744; static pod&#xB85C; &#xB744;&#xC6C1;&#xB2C8;&#xB2E4;. </div></div><pre><code>cat /etc/kubernetes/kubelet-config.yaml | grep staticPodPath
staticPodPath: /etc/kubernetes/manifests</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/03/afa02f67-7aad-41c2-a192-b804654c0a21.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1794" height="712" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/afa02f67-7aad-41c2-a192-b804654c0a21.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/afa02f67-7aad-41c2-a192-b804654c0a21.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/afa02f67-7aad-41c2-a192-b804654c0a21.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/afa02f67-7aad-41c2-a192-b804654c0a21.png 1794w" sizes="(min-width: 1200px) 1200px"></figure><p>&#xC7A0;&#xC2DC; &#xAE30;&#xB2E4;&#xB9AC;&#xBA74; <code>kubelet</code> &#xC774; <code>kube-apiserver.yaml</code> &#xD30C;&#xC77C;&#xC774; &#xC81C;&#xAC70;&#xB428;&#xC744; &#xC778;&#xC9C0;&#xD558;&#xACE0;, <code>kube-apsierver</code> static pod &#xB97C; &#xC81C;&#xAC70;&#xD569;&#xB2C8;&#xB2E4;. &#xC704; &#xC0AC;&#xC9C4;&#xCC98;&#xB7FC; <code>node1 (172.xx.xx.31)</code> &#xC5D0;&#xB294; <code>kube-apiserver</code> &#xAC00; &#xC81C;&#xAC70;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/eb9a5444-3370-4bd6-afbe-b7ccf258a332.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="639" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/eb9a5444-3370-4bd6-afbe-b7ccf258a332.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/eb9a5444-3370-4bd6-afbe-b7ccf258a332.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/eb9a5444-3370-4bd6-afbe-b7ccf258a332.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/eb9a5444-3370-4bd6-afbe-b7ccf258a332.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">kube1 &#xC0C1;&#xD0DC; &#xAC80;&#xC0AC;&#xAC00; &#xBE44;&#xC815;&#xC0C1; &#xC0C1;&#xD0DC;&#xB85C; &#xBCF4;&#xC784;</span></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/42ba262e-a181-432c-b4a1-5964ebb38644.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="697" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/42ba262e-a181-432c-b4a1-5964ebb38644.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/42ba262e-a181-432c-b4a1-5964ebb38644.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/42ba262e-a181-432c-b4a1-5964ebb38644.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/42ba262e-a181-432c-b4a1-5964ebb38644.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">dig &#xACB0;&#xACFC; &#xBE44;&#xC815;&#xC0C1;&#xC801;&#xC778; 172.xx.xx.31 &#xC740; &#xBC18;&#xD658;&#xB418;&#xC9C0; &#xC54A;&#xACE0; 172.xx.xx.32 &#xB9CC; &#xBC18;&#xD658; &#xB428;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xB2E4;.</span></figcaption></figure><p>&#xC774;&#xB807;&#xAC8C; &#xC0C1;&#xD0DC; &#xAC80;&#xC0AC; + Rotue53 &#xB2E4;&#xC911; &#xC751;&#xB2F5;(Round Robin DNS)&#xC744; &#xB3D9;&#xC791;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;. <code>172.xx.xx.31</code> &#xC5D0;&#xC11C; &#xC7A0;&#xAE50; &#xC81C;&#xAC70;&#xD55C; <code>kube-apiserver.yaml</code> &#xC744; &#xB2E4;&#xC2DC; &#xC544;&#xB798; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; &#xC815;&#xC0C1;&#xD654; &#xD55C;&#xB2E4;.</p><p><code>$ mv /root/kube-apiserver.yaml /etc/kubernetes/manifests/</code></p><h3 id="kube-apiserver-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%9E%AC%EB%B0%9C%EA%B8%89">&#xA0;kube-apiserver &#xC778;&#xC99D;&#xC11C; &#xC7AC;&#xBC1C;&#xAE09;</h3><p>&#xC774;&#xC81C; <code>kube.xxx.com</code> &#xACFC; &#xAC19;&#xC740; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C;(host header) <code>kube-apiserver</code>&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xCC98;&#xB9AC;&#xAC00; &#xB418;&#xB3C4;&#xB85D; &#xAE30;&#xC874;&#xC5D0; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xB41C; <code>kube-apiserver</code> &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xC7AC;&#xBC1C;&#xAE09; &#xD574;&#xC918;&#xC57C;&#xD55C;&#xB2E4;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC774; &#xD14C;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xC758; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; kubespray &#xB97C; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xB418;&#xC5C8;&#xACE0;, kubespray&#xB294; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; kubeadm &#xC744; &#xD1B5;&#xD574; &#xC778;&#xC99D;&#xC11C; &#xC0DD;&#xC131; , &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC870;&#xC778; &#xB4F1;&#xC758; &#xC791;&#xC5C5;&#xC744; &#xC9C4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC778;&#xC99D;&#xC11C; &#xC7AC;&#xBC1C;&#xAE09;&#xB4F1;&#xC758; &#xC791;&#xC5C5;&#xB3C4; <code spellcheck="false" style="white-space: pre-wrap;">kubeadm</code> &#xC744; &#xD1B5;&#xD574; &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. </div></div><p><code>172.xx.xx.31</code> &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; <code>kube-apiserver</code> &#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAE30;&#xC874; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xC790;.</p><p> <code>$ openssl x509 -text -noout -in /etc/kubernetes/ssl/apiserver.crt</code></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/38e450c0-051e-4fd3-b8f4-d216bbeffc07.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="2096" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/38e450c0-051e-4fd3-b8f4-d216bbeffc07.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/38e450c0-051e-4fd3-b8f4-d216bbeffc07.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/38e450c0-051e-4fd3-b8f4-d216bbeffc07.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/38e450c0-051e-4fd3-b8f4-d216bbeffc07.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">&#xB178;&#xB780;&#xC0C9; &#xBC15;&#xC2A4; &#xBD80;&#xBD84;&#xC744; &#xC798; &#xBCF4;&#xC790;(Subject Alternative Names). &#xC5EC;&#xAE30;&#xC5D0; &#xC6B0;&#xB9AC;&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB824;&#xB294; &#xB3C4;&#xBA54;&#xC778; &#xC8FC;&#xC18C;&#xAC00; &#xC5C6;&#xB2E4;&#xBA74; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>kube-apsierver</span></code><span style="white-space: pre-wrap;"> &#xC5D0;&#xC11C; ssl termination &#xC744; &#xD560; &#xB54C; &#xC624;&#xB958;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. </span></figcaption></figure><p><code>kubeadm</code> &#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xC2DC; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xBC1C;&#xAE09;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC6B0;&#xC120; <code>/etc/kubernetes/kubeadm-config.yaml</code> &#xD30C;&#xC77C;&#xC758; <code>certSANs</code> &#xD56D;&#xBAA9;&#xC5D0; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xCD94;&#xAC00;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.</p><p><code>$ vi /etc/kubernetes/kubeadm-config.yaml</code></p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/0cada5d141bb022a34de9c9142cffe7d.js"></script>
<!--kg-card-end: html-->
<p>&#xC704;&#xB294; <code>kubeadm-config.yaml</code> &#xD30C;&#xC77C;&#xC758; <code>certSANS</code> &#xD56D;&#xBAA9;&#xC758; &#xC77C;&#xBD80;&#xC774;&#xB2E4;. &#xD574;&#xB2F9; &#xBD80;&#xBD84;&#xC758; &#xC544;&#xBB34; &#xB77C;&#xC778;&#xC5D0;&#xC11C; <code>kube.xxx.com</code> &#xACFC; &#xAC19;&#xC740; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xCD94;&#xAC00;&#xD574;&#xC918;&#xC57C; &#xD55C;&#xB2E4;. </p><p>&#xC774;&#xD6C4; &#xAE30;&#xC874; <code>kube-apiserver</code> &#xC778;&#xC99D;&#xC11C;, &#xD0A4;&#xD30C;&#xC77C;&#xC744; &#xC81C;&#xAC70;&#xD55C;&#xB2E4;.</p><p><code>$ rm -rf /etc/kubernetes/ssl/{apiserver.crt,apiserver.key}</code></p><p>&#xC774;&#xD6C4; <code>kubeadm</code> &#xC744; &#xD1B5;&#xD574; <code>kube-apiserver</code> &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB41C; <code>kubeadm-config.yaml</code> &#xD30C;&#xC77C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC7AC;&#xC0DD;&#xC131;&#xD55C;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x26A0;&#xFE0F;</div><div class="kg-callout-text"><code spellcheck="false" style="white-space: pre-wrap;">kubeadm</code> &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xB97C; &#xD638;&#xCD9C;&#xD574;&#xC11C; &#xC2E4;&#xD589;&#xD558;&#xBA74; &#xB41C;&#xB2E4;. <code spellcheck="false" style="white-space: pre-wrap;">kubespray</code>&#xB85C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD55C; &#xACBD;&#xC6B0; <code spellcheck="false" style="white-space: pre-wrap;">kubeadm</code> &#xC774; <code spellcheck="false" style="white-space: pre-wrap;">/usr/local/bin</code> &#xC5D0; &#xC124;&#xCE58;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</div></div><p><code>$ /usr/local/bin/kubeadm init phase certs apiserver --config=/etc/kubernetes/kubeadm-config.yaml</code></p><p>&#xC704; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC218;&#xD589;&#xD558;&#xBA74; <code>apiserver.crt</code> , <code>apiserver.key</code> &#xAC00; &#xC0C8;&#xB86D;&#xAC8C; <code>/etc/kubernetes/ssl</code> &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xC0DD;&#xC131;&#xB41C;&#xB2E4;.</p><p>&#xC774;&#xD6C4; &#xC81C;&#xB300;&#xB85C; &#xC0DD;&#xC131;&#xC774; &#xB418;&#xC5C8;&#xB294;&#xC9C0; <code>$ openssl x509 -text -noout -in /etc/kubernetes/ssl/apiserver.crt</code> &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; &#xD655;&#xC778;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/6a22169a-316d-4d76-a8c3-054088fb595d-1.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="2096" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/6a22169a-316d-4d76-a8c3-054088fb595d-1.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/6a22169a-316d-4d76-a8c3-054088fb595d-1.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/6a22169a-316d-4d76-a8c3-054088fb595d-1.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/6a22169a-316d-4d76-a8c3-054088fb595d-1.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><a href="http://kube.xxx.com/?ref=kimsehwan96.com" title="http://kube.xxx.com"><span style="white-space: pre-wrap;">kube.xxx.com</span></a><span style="white-space: pre-wrap;"> &#xACFC; &#xAC19;&#xC740; &#xB3C4;&#xBA54;&#xC778;&#xC774; SAN &#xC5D0; &#xCD94;&#xAC00;&#xB41C;&#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xB2E4;.</span></figcaption></figure><p>&#xC774;&#xD6C4; <code>172.xx.xx.31</code> &#xC5D0;&#xC11C; &#xC0DD;&#xC131;&#xB41C; &#xC778;&#xC99D;&#xC11C;&#xB97C; &#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xCEE8;&#xD2B8;&#xB864;&#xD50C;&#xB808;&#xC778;(&#xD604;&#xC7AC; &#xD14C;&#xC2A4;&#xD2B8; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; <code>172.xx.xx.32</code>)&#xC5D0;&#xB3C4; &#xBC18;&#xC601;&#xD574;&#xC900;&#xB2E4;. (&#xAE30;&#xC874; &#xC778;&#xC99D;&#xC11C; &#xC81C;&#xAC70; &#xBC0F; <code>172.xx.xx.31</code> &#xC5D0;&#xC11C; &#xC0DD;&#xC131;&#xD55C; &#xC778;&#xC99D;&#xC11C; &#xBCF5;&#xC0AC;)</p><h3 id="%EC%9B%8C%EC%BB%A4%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%EC%9D%98-kubelet-%EC%84%A4%EC%A0%95">&#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xC5D0;&#xC11C;&#xC758; kubelet &#xC124;&#xC815;</h3><p>&#xC774;&#xC81C; <code>172.xx.xx.33</code> (&#xC6CC;&#xCEE4;&#xB178;&#xB4DC;) &#xC5D0;&#xC11C; &#xBCF8;&#xACA9;&#xC801;&#xC778; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD574;&#xBCF4;&#xC790;. </p><p>&#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xC5D0;&#xC11C; <code>$ vi /etc/kubernetes/kubelet.conf</code> &#xC744; &#xD1B5;&#xD574; <code>kubelet</code> &#xC774; &#xC0AC;&#xC6A9;&#xD560; <code>kubeconfig</code> &#xD30C;&#xC77C;&#xC744; &#xC5F4;&#xC5B4;&#xBD05;&#xB2C8;&#xB2E4;.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><code spellcheck="false" style="white-space: pre-wrap;">kubelet</code> , <code spellcheck="false" style="white-space: pre-wrap;">kube-scheduler</code> , <code spellcheck="false" style="white-space: pre-wrap;">kube-controller-manager</code> &#xC640; &#xAC19;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC740; <code spellcheck="false" style="white-space: pre-wrap;">kubeconfig</code> &#xD615;&#xD0DC;&#xC758; &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xC5B4;&#xB5A4; &#xC11C;&#xBC84; &#xC8FC;&#xC18C;&#xB85C; &#xC811;&#xADFC;&#xD558;&#xACE0;, &#xC5B4;&#xB5A4; &#xC778;&#xC99D;&#xC11C;&#xB85C; API &#xC11C;&#xBC84;&#xC5D0; &#xC778;&#xC99D;&#xD560;&#xC9C0; &#xB4F1;&#xC744; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xAC00; &#xB85C;&#xCEEC; &#xBA38;&#xC2E0;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code spellcheck="false" style="white-space: pre-wrap;">kubectl</code> &#xC758; &#xACBD;&#xC6B0;&#xB3C4; &#xB3D9;&#xC77C;&#xD55C; &#xD30C;&#xC77C; &#xD3EC;&#xB9F7;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</div></div><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.kimsehwan96.com/content/images/2024/03/36da176c-20c1-4d87-9c81-b2782a283917.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="1095" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/36da176c-20c1-4d87-9c81-b2782a283917.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/36da176c-20c1-4d87-9c81-b2782a283917.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/36da176c-20c1-4d87-9c81-b2782a283917.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/36da176c-20c1-4d87-9c81-b2782a283917.png 1800w" sizes="(min-width: 1200px) 1200px"></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>server</code> &#xD56D;&#xBAA9;&#xC5D0; &#xB3C4;&#xBA54;&#xC778;(<a href="http://kube.xxx.com:6443/?ref=kimsehwan96.com">kube.xxx.com:6443</a>) &#xC744; &#xC785;&#xB825;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB85C;&#xC368; &#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xC758;<code>kubelet</code> &#xC740; <code>kube.xxx.com</code> &#xB3C4;&#xBA54;&#xC778; &#xB124;&#xC784;&#xC744; resolve &#xD558;&#xAE30; &#xC704;&#xD574; DNS Query&#xB97C; &#xD558;&#xAC8C; &#xB418;&#xACE0;. &#xADF8; &#xC751;&#xB2F5;&#xC73C;&#xB85C; &#xB3CC;&#xC544;&#xC624;&#xB294; IP &#xC8FC;&#xC18C;&#xB97C; &#xD1B5;&#xD574; <code>kube-apiserver</code> &#xC5D0; &#xD638;&#xCD9C;&#xD558;&#xAC8C;&#xB429;&#xB2C8;&#xB2E4;. </p><p><code>kubelet</code> &#xC758; &#xB3D9;&#xC791;&#xC744; &#xC790;&#xC138;&#xD558;&#xAC8C; &#xD655;&#xC778;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>kubelet</code> &#xC758; &#xB85C;&#xADF8;&#xB808;&#xBCA8;&#xC744; &#xC7A0;&#xC2DC; &#xC62C;&#xB824;&#xBD05;&#xB2C8;&#xB2E4;. <code>kubelet</code> &#xC740; <code>systemd</code> &#xC11C;&#xBE44;&#xC2A4;&#xB85C; &#xC124;&#xCE58;&#xB418;&#xC5C8;&#xACE0;. &#xB85C;&#xADF8;&#xB294; <code>journald</code> &#xC5D0; &#xAE30;&#xB85D;&#xB418;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; &#xB85C;&#xADF8;&#xB97C; &#xD655;&#xC778;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294;</p><p><code>$ journalctl -xeu kubelet -f</code> &#xD615;&#xD0DC;&#xB85C; &#xD655;&#xC778; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB85C;&#xADF8; &#xB808;&#xBCA8; &#xBCC0;&#xACBD;&#xC740; <code>$ vi /etc/kubernetes/kubelet.env</code> &#xC744; &#xD1B5;&#xD574; <code>kubelet.env</code> &#xD30C;&#xC77C;&#xC744; &#xC218;&#xC815;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/3655c13cc6048a8ddcccbf10b355a539.js"></script>
<!--kg-card-end: html-->
<p>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC704;&#xC640; &#xAC19;&#xC774; <code>KUBE_LOG_LEVEL</code> &#xC740; <code>--v=2</code> &#xB85C; &#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xAC83;&#xC744; &#xC7A0;&#xC2DC; <code>9</code>&#xB85C; &#xC62C;&#xB824;&#xBD05;&#xB2C8;&#xB2E4;. </p><p>&#xC704; &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; &#xBC18;&#xC601;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>$ systemctl restart kubelet</code> &#xC73C;&#xB85C; <code>kubelet</code> &#xC744; &#xC7AC;&#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. </p><h3 id="%EC%9B%8C%EC%BB%A4%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%EC%9D%98-%ED%85%8C%EC%8A%A4%ED%8A%B8">&#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xC5D0;&#xC11C;&#xC758; &#xD14C;&#xC2A4;&#xD2B8;</h3><p>&#xD604;&#xC7AC; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; 2&#xAC1C;&#xC758; <code>kube-apiserver</code> &#xAC00; &#xC788;&#xB294;&#xB370;. &#xB450; <code>kube-apiserver</code> &#xB97C; &#xC8FD;&#xC5EC;&#xBD05;&#xB2C8;&#xB2E4;. &#xAC01;&#xAC01;&#xC758; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778;&#xC5D0;&#xC11C; </p><p><code>$ mv /etc/kubernetes/manifests/kube-apiserver.yaml /root/kube-apiserver.yaml</code> &#xB97C; &#xD1B5;&#xD574; <code>kube-apiserver</code> static pod &#xB97C; &#xC81C;&#xAC70;&#xD574;&#xBD05;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/8b6cecfb-8ebd-44d3-bd80-3a4136713d66.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="1342" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/8b6cecfb-8ebd-44d3-bd80-3a4136713d66.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/8b6cecfb-8ebd-44d3-bd80-3a4136713d66.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/8b6cecfb-8ebd-44d3-bd80-3a4136713d66.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/8b6cecfb-8ebd-44d3-bd80-3a4136713d66.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">static pod manifest &#xACBD;&#xB85C;&#xC5D0;&#xC11C; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>kube-apiserver.yaml</span></code><span style="white-space: pre-wrap;"> &#xC744; &#xC81C;&#xAC70;&#xD558;&#xACE0;. &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xB5A0;&#xC788;&#xC9C0; &#xC54A;&#xACE0; 6443 &#xD3EC;&#xD2B8;&#xAC00; &#xC5F4;&#xB824;&#xC788;&#xC9C0; &#xC54A;&#xC74C;&#xC744; &#xD655;&#xC778;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/ede04682-d51f-4bf9-8c2f-f838bd972f97.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="707" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/ede04682-d51f-4bf9-8c2f-f838bd972f97.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/ede04682-d51f-4bf9-8c2f-f838bd972f97.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/ede04682-d51f-4bf9-8c2f-f838bd972f97.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/ede04682-d51f-4bf9-8c2f-f838bd972f97.png 1800w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Route53 &#xC0C1;&#xD0DC; &#xAC80;&#xC0AC;&#xC5D0;&#xC11C;&#xB3C4; &#xBAA8;&#xB450; &#xBE44;&#xC815;&#xC0C1;&#xC73C;&#xB85C; &#xD655;&#xC778;</span></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xC0C1;&#xD669;&#xC77C;&#xB54C;. <code>Route53</code> &#xC740; <code>kube.xxx.com</code> &#xC5D0; &#xB300;&#xD55C; DNS &#xCFFC;&#xB9AC; &#xC751;&#xB2F5;&#xC73C;&#xB85C;. <code>kube.xxx.com</code> &#xC5D0; &#xB4F1;&#xB85D;&#xD55C; &#xBAA8;&#xB4E0; <code>A Record</code> &#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/c91b6bc8-2136-47c6-9ef3-6f5ea2e1f5b5.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1798" height="696" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/c91b6bc8-2136-47c6-9ef3-6f5ea2e1f5b5.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/c91b6bc8-2136-47c6-9ef3-6f5ea2e1f5b5.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/c91b6bc8-2136-47c6-9ef3-6f5ea2e1f5b5.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/c91b6bc8-2136-47c6-9ef3-6f5ea2e1f5b5.png 1798w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">&#xBAA8;&#xB4E0; &#xB808;&#xCF54;&#xB4DC;&#xB97C; &#xBC18;&#xD658;</span></figcaption></figure><p>&#xD604;&#xC7AC; <code>172.xx.xx.31</code> , <code>172.xx.xx.32</code> &#xB450; &#xCEE8;&#xD2B8;&#xB864; &#xD50C;&#xB808;&#xC778; &#xB178;&#xB4DC;&#xC5D0; &#xB5A0;&#xC788;&#xB294; <code>kube-apiserver</code> &#xAC00; &#xBAA8;&#xB450; &#xC5C6;&#xB294; &#xC0C1;&#xD669;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xB54C; &#xC6CC;&#xCEE4;&#xB178;&#xB4DC;&#xC758; <code>kubelet</code> &#xC740; &#xC5B4;&#xB5A4;&#xC9C0; &#xB85C;&#xADF8;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; (<code>$ journalctl -xeu kubelet -f</code>) </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/9317cc90-61dc-48ab-a34b-dc924a2caa69.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1083" height="496" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/9317cc90-61dc-48ab-a34b-dc924a2caa69.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/9317cc90-61dc-48ab-a34b-dc924a2caa69.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/9317cc90-61dc-48ab-a34b-dc924a2caa69.png 1083w"><figcaption><span style="white-space: pre-wrap;">kubelet &#xC758; &#xB85C;&#xADF8;.</span></figcaption></figure><p>&#xB178;&#xB780;&#xC0C9; &#xBC15;&#xC2A4; &#xCE5C; &#xBD80;&#xBD84;&#xC744; &#xBCF4;&#xBA74; <code>round_trippers</code> &#xCF54;&#xB4DC; &#xBD80;&#xBD84;&#xC5D0;&#xC11C; DNS Loookup &#xC744; &#xC9C4;&#xD589;&#xD574;&#xC11C; &#xB450;&#xAC1C;&#xC758; IP &#xC8FC;&#xC18C;&#xB97C; &#xBC1B;&#xC544;&#xC624;&#xACE0;. &#xC774;&#xD6C4; &#xC55E;&#xCABD;&#xC5D0; &#xC788;&#xB294; IP &#xC8FC;&#xC18C;&#xC5D0; &#xBA3C;&#xC800; TCP &#xCEE4;&#xB125;&#xC158; &#xB9FA;&#xAE30;&#xB97C; &#xC2DC;&#xB3C4;&#xD574;&#xBCF4;&#xACE0;, &#xC774;&#xD6C4; &#xB2E4;&#xB978; IP &#xC8FC;&#xC18C;&#xB85C;&#xB3C4; TCP &#xCEE4;&#xB125;&#xC158;&#xC744; &#xB9FA;&#xC5B4;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. &#xC774; <code>round_trippers</code> &#xB294; DNS &#xCFFC;&#xB9AC; &#xACB0;&#xACFC;&#xC5D0; &#xB530;&#xB978; IP &#xC8FC;&#xC18C;&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC131;&#xACF5;&#xD558;&#xB294; IP &#xC8FC;&#xC18C;&#xB85C; DNS Query &#xACB0;&#xACFC;&#xB97C; <code>kubelet</code> &#xC774; &#xCE90;&#xC2F1;&#xD574;&#xC11C; &#xD574;&#xB2F9; IP &#xC8FC;&#xC18C;&#xB85C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xB85C;&#xC9C1;&#xC785;&#xB2C8;&#xB2E4;.</p><p><a href="https://github.com/kubernetes/client-go/blob/7ebe0ea60e0a6bea3e8280871c1241d0405cdb32/transport/round_trippers.go?ref=kimsehwan96.com#L459-L586">https://github.com/kubernetes/client-go/blob/7ebe0ea60e0a6bea3e8280871c1241d0405cdb32/transport/round_trippers.go#L459-L586</a> </p><p>&#xC2E4;&#xC81C; kubernetes &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC758; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xBAA8;&#xB4C8;&#xC778; <code>client-go</code> &#xB808;&#xD3EC; &#xB0B4;&#xC758; <code>round_trippers</code> &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xB3C4;&#xBA54;&#xC778;&#xC744; DNS Query &#xD558;&#xACE0;, IP &#xC8FC;&#xC18C;&#xB85C; &#xCEE4;&#xB125;&#xC158;&#xC744; &#xB9FA;&#xC5B4;&#xBCF4;&#xB824;&#xACE0; &#xC2DC;&#xB3C4;&#xD558;&#xB294; &#xB85C;&#xC9C1;&#xB4E4;&#xC774; &#xB4E4;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xA0;</p><p>&#xC5EC;&#xAE30;&#xC11C; <code>172.xx.xx.31</code> &#xC11C;&#xBC84;&#xC758; <code>kube-apiserver</code> &#xB97C; &#xBCF5;&#xAD6C;&#xD558;&#xACE0; <code>kubelet</code> &#xB85C;&#xADF8;&#xB97C; &#xB2E4;&#xC2DC; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/4539f7e9-00b9-4279-9224-84289127e12b.png" class="kg-image" alt="RR DNS &#xB97C; &#xD1B5;&#xD55C; kube-apiserver &#xC55E;&#xB2E8;&#xC758; LB &#xB300;&#xCCB4; &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1800" height="997" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/4539f7e9-00b9-4279-9224-84289127e12b.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/4539f7e9-00b9-4279-9224-84289127e12b.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/4539f7e9-00b9-4279-9224-84289127e12b.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/4539f7e9-00b9-4279-9224-84289127e12b.png 1800w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">172.xx.xx.31 &#xC758; kube-apiserver&#xB97C; &#xBCF5;&#xAD6C;&#xD55C; &#xC774;&#xD6C4;&#xC758; kubelet &#xB85C;&#xADF8;</span></figcaption></figure><p><code>172.xx.xx.31</code> &#xC5D0; &#xB5A0;&#xC788;&#xB294; <code>kube-apiserver</code> &#xB85C;&#xC758; TCP &#xCEE4;&#xB125;&#xC158; &#xB9FA;&#xAE30;&#xAC00; &#xC131;&#xACF5;&#xD588;&#xB2E4;&#xB294; &#xB85C;&#xADF8;&#xB97C; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xB85C;&#xADF8;&#xAC00; &#xC0DD;&#xAE34; &#xC2DC;&#xC810; &#xC774;&#xD6C4;&#xB85C;&#xB294; <code>kube.xxx.com</code> &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C; <code>kube-apiserver</code> &#xC811;&#xADFC; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xB354;&#xB77C;&#xB3C4; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; <code>172.xx.xx.31</code> &#xB85C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xCD94;&#xAC00;&#xC801;&#xC73C;&#xB85C;<code>172.xx.xx.32</code> &#xC758; <code>kube-apiserver</code> &#xB97C; &#xBCF5;&#xAD6C;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xB354;&#xC774;&#xC0C1; DNS Query &#xB97C; &#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xAE30;&#xC874;&#xC5D0; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xD638;&#xCD9C;&#xD588;&#xB358; <code>172.xx.xx.31</code> &#xCABD;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xB294;&#xAC83;&#xB3C4; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%EA%B7%B8%EB%9F%BC-%EC%9E%98-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B1%B0-%EC%95%84%EB%8B%8C%EA%B0%80%EC%9A%94-kube-apiserver-%EC%95%9E%EB%8B%A8%EC%97%90-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C-%EC%9D%B4%EC%A0%9C-%EA%B1%B7%EC%96%B4%EB%82%B4%EB%8F%84-%EB%90%98%EB%82%98%EC%9A%94">&#xADF8;&#xB7FC; &#xC798; &#xB3D9;&#xC791;&#xD558;&#xB294;&#xAC70; &#xC544;&#xB2CC;&#xAC00;&#xC694;? kube-apiserver &#xC55E;&#xB2E8;&#xC5D0; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC11C; &#xC774;&#xC81C; &#xAC77;&#xC5B4;&#xB0B4;&#xB3C4; &#xB418;&#xB098;&#xC694;?</h3><p>&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xD588;&#xC744;&#xB54C;&#xB294; <code>kube-apiserver</code>&#xC758; &#xC77C;&#xBD80;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB354;&#xB77C;&#xB3C4;, &#xC815;&#xC0C1;&#xC801;&#xC778; <code>kube-apiserver</code> &#xB85C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;(kubelet &#xD3EC;&#xD568;&#xD55C; kube-scheduler, kube-controller-manager &#xB4F1;)&#xC774; Round Robin DNS &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xB294; &#xAC83; &#xCC98;&#xB7FC; &#xBCF4;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xC810;&#xC740;, <code>kubelet</code> &#xC744; &#xD3EC;&#xD568;&#xD55C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC740; &#xC544;&#xAE4C; <code>kubelet</code> &#xC774; &#xC0AC;&#xC6A9;&#xD588;&#xB358; <code>kubernetes/client-go</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370;. &#xC774; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCF54;&#xB4DC;&#xB294; <code>DNS</code> &#xCFFC;&#xB9AC;&#xB97C; &#xD558;&#xACE0;, &#xBC18;&#xD658;&#xB41C; IP &#xC8FC;&#xC18C;&#xC5D0; TCP &#xCEE4;&#xB125;&#xC158;&#xC744; &#xB9FA;&#xC5B4;&#xBCF4;&#xACE0; &#xC131;&#xACF5;&#xD55C; <code>IP:Port</code> &#xC870;&#xD569;&#xC73C;&#xB85C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xB294; &#xCF54;&#xB4DC;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; <code>172.xx.xx.31</code> , <code>172.xx.xx.32</code> &#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xB450;&#xAC1C;&#xC758; <code>kube-apiserver</code> &#xAC00; &#xBAA8;&#xB450; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;&#xAC00;, &#xD55C;&#xCABD;&#xC774; &#xBCF5;&#xAD6C;&#xB418;&#xC5C8;&#xC744; &#xB54C;, &#xBCF5;&#xAD6C;&#xB41C; &#xD55C; &#xCABD;&#xC73C;&#xB85C; <code>kubelet</code> &#xAC19;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;, &#xADF8;&#xB9AC;&#xACE0; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB4E4;&#xC774; &#xC798; &#xD638;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCF54;&#xB4DC;&#xCABD;&#xC758; DNS &#xCE90;&#xC2F1;&#xC815;&#xCC45;&#xC73C;&#xB85C; &#xC778;&#xD574;&#xC11C;, &#xC7A5;&#xC560;&#xAC00; &#xC788;&#xC5C8;&#xB358; &#xB098;&#xBA38;&#xC9C0; &#xD55C;&#xCABD;&#xC774; &#xBCF5;&#xAD6C;&#xAC00; &#xB418;&#xB354;&#xB77C;&#xB3C4; &#xD2B8;&#xB798;&#xD53D;&#xC774; Load Balancing &#xB418;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C;, &#xC5EC;&#xC804;&#xD788; &#xD55C;&#xCABD;&#xC73C;&#xB85C;&#xB9CC; &#xD758;&#xB7EC;&#xAC00;&#xAC8C; &#xB418;&#xB294; &#xD604;&#xC0C1;&#xC744; &#xACAA;&#xC744; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB294; <code>Round Robin DNS</code> &#xC790;&#xCCB4;&#xC758; &#xBB38;&#xC81C;&#xC810;&#xC73C;&#xB85C;, &#xBD88;&#xD2B9;&#xC815; &#xB2E4;&#xC218;&#xC758; &#xB2E4;&#xC591;&#xD55C;, &#xC218;&#xB9CE;&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xB3D9;&#xC77C; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C; &#xC811;&#xC18D;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xC5B4;&#xB290;&#xC815;&#xB3C4;&#xC758; Load Balancing &#xC774; &#xAC00;&#xB2A5;&#xD558;&#xC9C0;&#xB9CC;. &#xC18C;&#xC218;&#xC758; &#xC77C;&#xBD80; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC9C0;&#xC18D;&#xD574;&#xC11C; &#xC811;&#xC18D;&#xD574;&#xC57C;&#xD558;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; &#xC801;&#xC808;&#xD55C; Load Balancing &#xC744; &#xAE30;&#xB300;&#xD558;&#xAE34; &#xC5B4;&#xB835;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xA0;</p><h2 id="wrapping-up">Wrapping up</h2><p>Round Robin DNS &#xB97C; &#xD1B5;&#xD574; <code>kube-apiserver</code> &#xC55E;&#xB2E8;&#xC758; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC11C;&#xB97C; &#xB300;&#xCCB4; &#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xBCF4;&#xC558;&#xB294;&#xB370; &#xACB0;&#xB860;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xBC18;&#xC740; &#xB418;&#xACE0; &#xBC18;&#xC740; &#xC548;&#xB418;&#xB294; &#xAD6C;&#xC131;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><code>kube-apiserver</code> &#xC758; &#xC55E;&#xB2E8; LB &#xB97C; &#xB300;&#xCCB4; &#xD560; &#xC218; &#xC788;&#xB294; &#xBD80;&#xBD84;&#xC740; &#xC77C;&#xBD80; <code>kube-apiserver</code> &#xC7A5;&#xC560;&#xC2DC; &#xC7A5;&#xC560;&#xC5D0; &#xB300;&#xD55C; &#xBCF5;&#xAD6C;(fail over)&#xB294; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xAC00;&#xB2A5;&#xD558;&#xC9C0;&#xB9CC; &#xB300;&#xCCB4; &#xD560; &#xC218; &#xC5C6;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC77C;&#xBD80; &#xC874;&#xC7AC;&#xD574; &#xC815;&#xB9D0; &#xC9C4;&#xC815;&#xD55C; <code>Load Balancing</code> &#xC744; &#xC218;&#xD589;&#xD558;&#xAE30;&#xB294; &#xC5B4;&#xB835;&#xB2E4;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC77C;&#xBC18;&#xC801;&#xC778; LB&#xC758; &#xACBD;&#xC6B0; &#xB4E4;&#xC5B4;&#xC628; &#xC694;&#xCCAD;&#xC744; &#xC790;&#xC2E0;&#xC774; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xB4B7;&#xB2E8;&#xC758; &#xBC31;&#xC5D4;&#xB4DC; &#xC11C;&#xBC84;&#xB4E4;&#xB85C; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC2F1; &#xC815;&#xCC45;&#xC5D0; &#xB9DE;&#xCDB0; &#xBD80;&#xD558;&#xB97C; &#xBD84;&#xC0B0;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;. </p><p>&#xD558;&#xC9C0;&#xB9CC; &#xC9C0;&#xAE08;&#xACFC; &#xAC19;&#xC740; &#xC124;&#xC815; &#xCF00;&#xC774;&#xC2A4;(RR-DNS)&#xB294; &#xBCC4;&#xB3C4;&#xC758; &#xC11C;&#xBC84;&#xAC00; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC911;&#xACC4;(proxy)&#xD574;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xAC00; &#xC544;&#xB2CC;. &#xAC01;&#xAC01;&#xC758; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB4E4;&#xC774; Domain &#xC5D0; &#xB300;&#xD55C; IP &#xC8FC;&#xC18C;&#xB97C; Resolve&#xD558;&#xACE0;. &#xADF8; IP &#xC8FC;&#xC18C;&#xAC00; &#xC5EC;&#xB7EC;&#xB300;&#xC758; &#xBC31;&#xC5D4;&#xB4DC; &#xC11C;&#xBC84;(&#xBA38;&#xC2E0;)&#xC8FC;&#xC18C; &#xC77C; &#xB54C; &#xC9C4;&#xC815;&#xD55C; &#xBD80;&#xD558; &#xBD84;&#xC0B0;&#xC774; &#xB418;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC5EC;&#xAE30;&#xC11C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; DNS Query &#xCE90;&#xC2F1; &#xB3D9;&#xC791;&#xC73C;&#xB85C; &#xC778;&#xD574;, &#xC5EC;&#xB7EC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB4E4;&#xC774; &#xC5EC;&#xB7EC; IP&#xC8FC;&#xC18C;&#xC758; &#xBC31;&#xC5D4;&#xB4DC;&#xB85C; &#xD638;&#xCD9C;&#xD558;&#xACE0; &#xC788;&#xB2E4;&#xAC00;, &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD574;&#xC11C; &#xC77C;&#xBD80; &#xBC31;&#xC5D4;&#xB4DC;&#xB85C; &#xD638;&#xCD9C;&#xD558;&#xACE0;, &#xB2E4;&#xC2DC; &#xBAA8;&#xB4E0; &#xBC31;&#xC5D4;&#xB4DC; &#xC11C;&#xBC84;&#xAC00; &#xC815;&#xC0C1;&#xC774; &#xB418;&#xC5B4;&#xC11C; &#xC5EC;&#xB7EC; IP &#xC8FC;&#xC18C;&#xC758; &#xBC31;&#xC5D4;&#xB4DC;&#xB85C; &#xD638;&#xCD9C;&#xD558;&#xB294; (&#xBD80;&#xD558;&#xBD84;&#xC0B0;) &#xD615;&#xD0DC;&#xAC00; &#xC544;&#xB2CC;&#xC810;&#xC774; &#xBB38;&#xC81C;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB4E4;&#xC740; &#xD55C;&#xBC88; DNS Query &#xB97C; &#xD558;&#xACE0; &#xC815;&#xC0C1; &#xB3D9;&#xC791;&#xC911;&#xC774;&#xB77C;&#xBA74; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xB3D9;&#xC77C;&#xD55C; IP&#xC8FC;&#xC18C;&#xC758; &#xBC31;&#xC5D4;&#xB4DC;&#xC5D0; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B8;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xBB38;&#xC81C;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC7A5;&#xC560; &#xBC1C;&#xC0DD; &#xD6C4; &#xBCF5;&#xAD6C;&#xAC00; &#xB418;&#xC5C8;&#xB354;&#xB77C;&#xB3C4;, &#xC7A5;&#xC560; &#xBC1C;&#xC0DD;&#xC2DC; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD588;&#xB358; &#xBC31;&#xC5D4;&#xB4DC;&#xC5D0;&#xB9CC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xAC8C; &#xB418;&#xB294;&#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB807;&#xAC8C; &#xB418;&#xBA74; &#xC77C;&#xBD80; &#xC11C;&#xBC84;&#xC5D0;&#xB9CC; &#xBD80;&#xD558;&#xAC00; &#xBAB0;&#xB9AC;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xBB3C;&#xB860; <code>kubelet</code> &#xAC19;&#xC740; &#xAC83;&#xB4E4;&#xC744; &#xC784;&#xC758;&#xB85C; &#xC7AC;&#xC2DC;&#xC791;&#xD574;&#xC11C;(kubelet &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xC7AC;&#xC2DC;&#xC791;&#xC5D0; &#xC758;&#xBBF8;&#xAC00; &#xC788;&#xB294; &#xAC74; &#xC544;&#xB2C8;&#xACE0; DNS &#xCE90;&#xC2F1;&#xC744; &#xCD08;&#xAE30;&#xD654; &#xD558;&#xB294; &#xBD80;&#xBD84;&#xC5D0; &#xC758;&#xBBF8;&#xAC00; &#xC788;&#xC74C;) Round Robin DNS &#xB97C; &#xD1B5;&#xD574; &#xC5B4;&#xB290;&#xC815;&#xB3C4;&#xC758; &#xAC15;&#xC81C;&#xC801;&#xC778; &#xB85C;&#xB4DC;&#xBC38;&#xB7F0;&#xC2F1;&#xC744; &#xC218;&#xD589; &#xD560; &#xC218;&#xB3C4; &#xC788;&#xACA0;&#xC9C0;&#xB9CC; &#xADF8;&#xB807;&#xAC8C; &#xD558;&#xB294;&#xAC83;&#xC774; &#xACFC;&#xC5F0; H/W, S/W LB &#xB97C; <code>kube-apiserver</code> &#xC55E;&#xB2E8;&#xC5D0; &#xB450;&#xB294;&#xAC83;&#xBCF4;&#xB2E4; &#xC5BC;&#xB9C8;&#xB098; &#xB354; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xC744;&#xC9C0;&#xB97C; &#xACE0;&#xB824;&#xD574;&#xBCF4;&#xACE0;, &#xC0AC;&#xC6A9; &#xC790;&#xCCB4;&#xB294; &#xD574;&#xBCFC; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC73C;&#xB85C; &#xD310;&#xB2E8;&#xC740; &#xB429;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[K8s 오퍼레이터]]></title><description><![CDATA[쿠버네티스 오퍼레이터가 무엇인지에 대해서 알아봅니다. 우선 오퍼레이터라는 말 자체는 소프트웨어 디자인 패턴에서 나오는 하나의 용어로 이해를 하면 됩니다. 오퍼레이터 패턴이란 운영 노하우, 도메인 지식등을 갖고있는 운영자의 역할을 소프트웨어에 새긴 개념으로 볼 수 있습니다. 쿠버네티스의 오퍼레이터도 그런 관점에서 동일한 컨셉을 갖고 있습니다.]]></description><link>https://www.kimsehwan96.com/k8s-operator/</link><guid isPermaLink="false">66002e4530749cc47571b4d1</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Operator]]></category><category><![CDATA[K8s]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Sun, 24 Mar 2024 14:07:25 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-24------11.06.27.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">K8s &#xC758; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;(&#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;, &#xD639;&#xC740; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xD328;&#xD134;)&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xB294; &#xBB38;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;. K8s &#xC758; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xCEE8;&#xC149;&#xC744; &#xC774;&#xD574;&#xD574;&#xBCF4;&#xACE0;, &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xAC04;&#xC758; &#xBBF8;&#xBB18;&#xD55C; &#xCC28;&#xC774;&#xB3C4; &#xC54C;&#xC544;&#xBD05;&#xB2C8;&#xB2E4;. (Custom Resource &#xB97C; &#xC774;&#xC6A9;&#xD55C; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;, &#xC815;&#xB9D0; Pure &#xD55C; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;) </div></div><h2 id="%EC%98%A4%ED%8D%BC%EB%A0%88%EC%9D%B4%ED%84%B0-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4">&#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;</h2><img src="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-24------11.06.27.png" alt="K8s &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;"><p>&#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB294; <a href="https://cloud.redhat.com/blog/introducing-operators-putting-operational-knowledge-into-software?ref=kimsehwan96.com">Introducing Operators: Putting Operational Knowledge into Software</a> CoreOS &#xBE14;&#xB85C;&#xADF8;&#xC5D0;&#xC11C; &#xACF5;&#xAC1C;&#xB41C; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xC73C;&#xB85C; &#xC6B4;&#xC601;&#xC790;&#xC758; &#xC5ED;&#xD560;&#xC744; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xC5D0; &#xC0C8;&#xAE34; &#xAC1C;&#xB150;&#xC785;&#xB2C8;&#xB2E4;. SRE / DevOps &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC6B4;&#xC601;&#xD558;&#xB294; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xB85C;&#xC11C; &#xC6B4;&#xC601; &#xB178;&#xD558;&#xC6B0;, &#xB3C4;&#xBA54;&#xC778; &#xC9C0;&#xC2DD;&#xB4F1;&#xC774; &#xC218;&#xBC18;&#xB418;&#xC5B4;&#xC57C; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xAC1C;&#xBC1C;/&#xC6B4;&#xC601;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xB370;. &#xC774;&#xB7EC;&#xD55C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC6B4;&#xC6A9;&#xC5D0; &#xC788;&#xC5B4;&#xC11C; &#xAC00;&#xC6A9;&#xC131;&#xC774; &#xC720;&#xC9C0;&#xB418;&#xB3C4;&#xB85D; &#xD560; &#xB54C; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xAC00; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC791;&#xC5C5;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xAF64;&#xB098; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><a href="https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md?ref=kimsehwan96.com">https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md</a>  </p><p>CNCF&#xC5D0;&#xC11C; &#xC18C;&#xAC1C;&#xD55C; &#xC704; &#xC790;&#xB8CC;&#xC5D0;&#xC11C;&#xB294; &#xC0C1;&#xD0DC;&#xB97C; &#xC218;&#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xAD00;&#xB9AC;&#xD574;&#xC8FC;&#xC5B4;&#xC57C; &#xD558;&#xB294; &#xD55C;&#xACC4;&#xB97C; &#xADF9;&#xBCF5;&#xD558;&#xAE30; &#xC704;&#xD574; &#xACE0;&#xC548;&#xB41C; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xD328;&#xD134;&#xC758; &#xC5ED;&#xD560;&#xACFC; &#xAE30;&#xB2A5;&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD558;&#xAC8C; &#xC124;&#xBA85;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/4ae4cea8-286d-47a2-b1df-91db11f7f8f0.png" class="kg-image" alt="K8s &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;" loading="lazy" width="1280" height="409" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/4ae4cea8-286d-47a2-b1df-91db11f7f8f0.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/4ae4cea8-286d-47a2-b1df-91db11f7f8f0.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/4ae4cea8-286d-47a2-b1df-91db11f7f8f0.png 1280w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xD328;&#xD134;&#xC740; &#xC138; &#xAC00;&#xC9C0;&#xC758; &#xAD6C;&#xC131;&#xC694;&#xC18C;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xB294;&#xB370;</p><ul><li>&#xAD00;&#xB9AC;&#xD558;&#xB824;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xB610;&#xB294; &#xC778;&#xD504;&#xB77C;</li><li>&#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC120;&#xC5B8;&#xC801; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD0DC;&#xB85C; &#xC9C0;&#xC815;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; &#xB3C4;&#xBA54;&#xC778; &#xD2B9;&#xD654; &#xC5B8;&#xC5B4;</li><li>&#xC9C0;&#xC18D;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xB418;&#xB294; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;<ul><li>&#xC0C1;&#xD0DC;&#xB97C; &#xC77D;&#xACE0; &#xC778;&#xC2DD;</li><li>&#xC790;&#xB3D9;&#xD654;&#xB41C; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0; &#xB300;&#xD55C; &#xC791;&#xC5C5;&#xC744; &#xC2E4;&#xD589;</li><li>&#xC120;&#xC5B8;&#xC801; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xBCF4;&#xACE0;</li></ul></li></ul><h2 id="%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4%EC%9D%98-%EC%98%A4%ED%8D%BC%EB%A0%88%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C">&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xAD6C;&#xC131;&#xC694;&#xC18C;</h2><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/262ecd0b-d63c-403b-95a6-60a28d1a0dc4.png" class="kg-image" alt="K8s &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;" loading="lazy" width="1763" height="540" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/262ecd0b-d63c-403b-95a6-60a28d1a0dc4.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/262ecd0b-d63c-403b-95a6-60a28d1a0dc4.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/262ecd0b-d63c-403b-95a6-60a28d1a0dc4.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/262ecd0b-d63c-403b-95a6-60a28d1a0dc4.png 1763w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;</li><li>Custom Resource / Custom Resource Definition</li><li>&#xCEE8;&#xD2B8;&#xB864; &#xB8E8;&#xD504;</li></ul><p><strong>&#xCEE8;&#xD2B8;&#xB864;&#xB7EC;</strong>&#xB294; &#xD558;&#xB098; &#xC774;&#xC0C1;&#xC758; &#xC5EC;&#xB7EC; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xAC10;&#xC2DC; &#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xC774; &#xAC1D;&#xCCB4;&#xB294; Deployment, Service &#xAC19;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; &#xAE30;&#xBCF8; &#xC694;&#xC18C;&#xC77C; &#xC218;&#xB3C4; &#xC788;&#xACE0;, &#xAC00;&#xC0C1;&#xBA38;&#xC2E0;, &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC640; &#xAC19;&#xC740; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xC678;&#xBD80;&#xC5D0; &#xC788;&#xB294; &#xAC1D;&#xCCB4;&#xC77C;&#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB294; &#xAC10;&#xC2DC;&#xC911;&#xC778; &#xAC1D;&#xCCB4;&#xAC00; &#xC815;&#xC758;&#xB41C; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD0DC;(Desired State)&#xB85C; &#xC804;&#xD658;&#xB418;&#xB3C4;&#xB85D; &#xBCF4;&#xC7A5;&#xD558;&#xB294; <strong>&#xCEE8;&#xD2B8;&#xB864; &#xB8E8;&#xD504;</strong>&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD0DC;&#xB97C; &#xD604;&#xC7AC; &#xC0C1;&#xD0DC;&#xC640; &#xC9C0;&#xC18D;&#xC801;&#xC73C;&#xB85C; &#xBE44;&#xAD50;&#xD569;&#xB2C8;&#xB2E4;. Desired state&#xB294; &#xD558;&#xB098; &#xC774;&#xC0C1;&#xC758; <strong>Kubernetes Custom Resource Definition</strong>&#xC5D0; &#xCEA1;&#xC290;&#xD654; &#xB418;&#xACE0;, &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xC5D0;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; Desired state&#xB85C; &#xB9CC;&#xB4DC;&#xB294; &#xC6B4;&#xC601; &#xC9C0;&#xC2DD;&#xC774; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC">&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;</h3><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB294; &#xD2B9;&#xC815; &#xB9AC;&#xC18C;&#xC2A4; &#xC720;&#xD615;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xB418;&#xB294; Desired state&#xB85C; &#xC2E4;&#xC81C;(&#xD604;&#xC7AC;)&#xC0C1;&#xD0DC;&#xAC00; &#xC77C;&#xCE58;&#xB418;&#xB3C4;&#xB85D; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC790;&#xBA74; Deployment &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB294; &#xD558;&#xB098;&#xC758; &#xD30C;&#xB4DC;&#xAC00; &#xC0AD;&#xC81C;&#xB418;&#xAC70;&#xB098; &#xC2E4;&#xD328; &#xD560; &#xB54C; &#xC6D0;&#xD558;&#xB294; &#xC591;&#xC758; &#xD30C;&#xB4DC; &#xBCF5;&#xC81C;&#xBCF8;&#xC774; &#xC2E4;&#xD589;&#xB418;&#xACE0; &#xC0C8; &#xD30C;&#xB4DC;&#xAC00; &#xAC00;&#xB3D9;&#xB418;&#xB3C4;&#xB85D; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. </p><h3 id="custom-resource-custom-resource-definition">Custom Resource / Custom Resource Definition</h3><p>Custom Resource&#xB294;  Kubernetes API &#xB97C; &#xD655;&#xC7A5;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;. Kubernetes API &#xC5D0;&#xC11C; &#xB9AC;&#xC18C;&#xC2A4;&#xB294; &#xD2B9;&#xC815; &#xC885;&#xB958;&#xC758; API &#xC624;&#xBE0C;&#xC81D;&#xD2B8; &#xBAA8;&#xC74C;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB77C;&#xACE0; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4;&#xC11C; Kuberentes &#xC5D0; &#xB0B4;&#xC7A5;&#xB41C; Pod &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0;&#xB294; Pod &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xBAA8;&#xC74C;&#xC774; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>Custom Resource Definition&#xC740; &#xACE0;&#xC720;&#xD55C; &#xAC1D;&#xCCB4; &#xC885;&#xB958;&#xB97C; &#xC815;&#xC758;&#xD558;&#xACE0;, API &#xC11C;&#xBC84;&#xAC00; &#xC804;&#xCCB4; &#xB77C;&#xC774;&#xD504; &#xC0AC;&#xC774;&#xD074;&#xC744; &#xCC98;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. (&#xD30C;&#xB4DC;&#xC758; &#xB77C;&#xC774;&#xD504;&#xC0AC;&#xC774;&#xD074;&#xC744; API &#xC11C;&#xBC84;&#xAC00; &#xAD00;&#xB9AC;&#xD558;&#xB4EF;)</p><p>&#xC774;&#xAC83;&#xC744; &#xD1B5;&#xD574; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC815;&#xC758;&#xD55C; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; Desired State(&#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD0DC;)&#xB97C; &#xC120;&#xC5B8; &#xD560; &#xC218; &#xC788;&#xACE0;, Operator &#xD328;&#xD134;&#xACFC; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; Desired State &#xB85C; &#xC720;&#xC9C0;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xB294;&#xAC83;&#xC774; &#xBCF4;&#xD1B5;&#xC758; &#xC720;&#xC988;&#xCF00;&#xC774;&#xC2A4;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%BB%A8%ED%8A%B8%EB%A1%A4-%EB%A3%A8%ED%94%84">&#xCEE8;&#xD2B8;&#xB864; &#xB8E8;&#xD504;</h3><p>&#xCEE8;&#xD2B8;&#xB864; &#xB8E8;&#xD504;&#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC; &#xB0B4;&#xC5D0;&#xC11C; &#xC6B4;&#xC601; &#xC9C0;&#xC2DD;&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xC790; &#xC815;&#xC758; &#xB9AC;&#xC18C;&#xC2A4;, &#xD639;&#xC740; &#xAE30;&#xC874; K8s &#xB9AC;&#xC18C;&#xC2A4;, &#xD639;&#xC740; &#xC774;&#xBCA4;&#xD2B8;&#xB4F1;&#xC744; &#xAC10;&#xC9C0;&#xD574;&#xC11C; Desired State &#xB85C; &#xB9CC;&#xB4DC;&#xB294; &#xBC18;&#xBCF5;&#xB418;&#xB294; &#xB8E8;&#xD504;&#xB77C;&#xACE0; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h2 id="%EC%A0%95%EB%A6%AC">&#xC815;&#xB9AC;</h2><p>&#xA0;</p><p>&#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB294; &#xC6B4;&#xC601; &#xC9C0;&#xC2DD;&#xC744; &#xB2F4;&#xC544; &#xC6B4;&#xC601;&#xC744; &#xC790;&#xB3D9;&#xD654;&#xD558;&#xB294; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xC758; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xACE0;. &#xD30C;&#xB4DC;&#xB97C; &#xC7AC;&#xBC30;&#xCE58;&#xD558;&#xAC70;&#xB098;, &#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD0DC;&#xB85C; &#xB418;&#xB3C4;&#xB85D; &#xC870;&#xC815;&#xD558;&#xACE0;, Custom Resource Definition &amp; Custom Resource &#xB97C; &#xD1B5;&#xD574; &#xB3C4;&#xBA54;&#xC778;&#xC9C0;&#xC2DD;/&#xC6B4;&#xC601;&#xC9C0;&#xC2DD;&#xC744; &#xB2F4;&#xC544;&#xC11C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; API&#xB97C; &#xD655;&#xC7A5;&#xD558;&#xACE0;, Custom Controller (CRD / CR &#xC744; &#xAC10;&#xC2DC;&#xD558;&#xACE0;, &#xB3D9;&#xC791;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xAE30; &#xC704;&#xD55C; &#xAD6C;&#xC131;&#xC694;&#xC18C;)&#xB294; &#xADF8;&#xAC83;&#xB4E4;&#xC744; &#xBCF4;&#xACE0; &#xC2E4;&#xC81C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xBC30;&#xCE58;&#xD558;&#xAC70;&#xB098;, &#xAC01;&#xC885; &#xC870;&#xC791;&#xB4F1;&#xC744;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xB2E4;&#xB9CC; <code>Keel</code> &#xAC19;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB294; CRD / CR &#xBC0F; Custom Controller&#xB97C; &#xB530;&#xB85C; &#xB450;&#xC9C0; &#xC54A;&#xACE0; primitive &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;(Deployment / Stateful Set / Daemon Set)&#xB4F1;&#xC744; &#xAD00;&#xB9AC;&#xD574;&#xC8FC;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB7EC;&#xB2C8;&#xAE4C; CRD/CR , Custom Controller &#xB294; &#xD544;&#xC218; &#xC0AC;&#xD56D;&#xC740; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC;, &#xB300;&#xBD80;&#xBD84;&#xC758; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;(Datadog Operator, ECK operator, Istiod&#xADF8;&#xC678; &#xB2E4;&#xC591;&#xD55C; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB4E4;)&#xB4E4;&#xC740; CRD/CR &#xC744; &#xD1B5;&#xD574; Kubenernets API &#xB97C; &#xD655;&#xC7A5;&#xD558;&#xACE0;, CR &#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC120;&#xC5B8;&#xD55C; Deisred State &#xB85C; &#xC720;&#xC9C0;&#xD558;&#xB3C4;&#xB85D; &#xB3D9;&#xC791;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xC608;&#xB97C; &#xB4E4;&#xC790;&#xBA74; Datadog &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xACBD;&#xC6B0; Helm&#xC744; &#xD1B5;&#xD574; &#xD639;&#xC740; &#xC9C1;&#xC811; Deployment, ConfigMap, Service Object, Service Account &#xB4F1;&#xC744;(primitive k8s object)&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC11C; &#xAD6C;&#xC131;&#xD574;&#xC57C;&#xACA0;&#xC9C0;&#xB9CC;, Datadog &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; Datadog &#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; CR &#xC744; &#xD1B5;&#xD574; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xAD6C;&#xC131;&#xC744; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-code-card"><pre><code class="language-yaml">apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    credentials:
      apiSecret:
        secretName: datadog-secret
        keyName: api-key
      appSecret:
        secretName: datadog-secret
        keyName: app-key
  features:
    apm:
      enabled: true
    logCollection:
      enabled: true
</code></pre><figcaption><p><span style="white-space: pre-wrap;">&#xC704;&#xC640; &#xAC19;&#xC774; CR &#xC744; &#xD1B5;&#xD574; &#xCD94;&#xC0C1;&#xD654;&#xB41C; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9; &#xD560; &#xC218; &#xC788;&#xB2E4;.</span></p></figcaption></figure><p>&#xAC1C;&#xC778;&#xC801;&#xC778; &#xC758;&#xACAC;&#xC73C;&#xB85C;&#xB294;, &#xC124;&#xC815;&#xC774; &#xBCF5;&#xC7A1;&#xD55C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xACBD;&#xC6B0; &#xB300;&#xBD80;&#xBD84; Operator &#xB3C4; &#xC81C;&#xACF5;&#xD574;&#xC8FC;&#xACE0; &#xC788;&#xACE0; &#xD574;&#xB2F9; Operator &#xAC00; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xAC00; &#xC798; &#xB418;&#xACE0; &#xC788;&#xB2E4;&#xBA74; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370; &#xD06C;&#xAC8C; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xC774; &#xB4E4;&#xAE34; &#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB807;&#xC9C0;&#xB9CC; &#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; Operator &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xAD6C;&#xC131; &#xD560; &#xC218; &#xC788;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; Operator &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xAD6C;&#xC131;&#xD558;&#xB294;&#xAC83;&#xC774; &#xC7A5;&#xC560;&#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xD55C;&#xB2E8;&#xACC4; &#xB0AE;&#xCD94;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xB41C;&#xB2E4;&#xACE0;&#xB3C4; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; Operator &#xD328;&#xD134;&#xC744; &#xAC70;&#xC758; &#xBB34;&#xC870;&#xAC74; &#xC368;&#xC57C;&#xD55C;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xC774; &#xB4E4; &#xB54C;&#xAC00; &#xC788;&#xB294;&#xB370;, <code>Istiod</code> &#xCC98;&#xB7FC; <code>Istio</code> &#xC758; &#xD655;&#xC7A5; API (Istio &#xC5D0;&#xC11C;&#xB294; Gateway, VirtualSerice, DestionationRule &#xB4F1;&#xB4F1;)&#xB97C; &#xC218;&#xB3C4; &#xC5C6;&#xC774; &#xB9CE;&#xC774; &#xC368;&#xC57C; &#xD560; &#xACBD;&#xC6B0;&#xC640;, primitive k8s &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB85C; &#xCEE4;&#xBC84; &#xD560; &#xC218; &#xC5C6;&#xB294; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0;, &#xADF8; &#xC815;&#xBCF4;&#xB97C; &#xD1A0;&#xB300;&#xB85C; &#xC624;&#xD37C;&#xB808;&#xC774;&#xD130;&#xAC00; &#xB3D9;&#xC791;&#xD574;&#xC57C;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xADF8; &#xACBD;&#xC6B0;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.(&#xBB3C;&#xB860; ConfigMap, Secrets &#xAC19;&#xC740;&#xAC83;&#xB4E4;&#xB85C; &#xC815;&#xBCF4; &#xC790;&#xCCB4;&#xB97C; &#xB118;&#xACA8; &#xC904; &#xC218;&#xC57C; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;, &#xAC00;&#xB3C5;&#xC131; &#xCE21;&#xBA74;&#xC5D0;&#xC11C; CR&#xC774; &#xB354; &#xB0AB;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;&#xC694;?) </p><p>&#xC608;&#xC2DC;&#xB85C; Istio &#xB97C; &#xB4E4;&#xAE34; &#xD588;&#xC9C0;&#xB9CC; &#xD574;&#xB2F9; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C;, &#xD574;&#xB2F9; &#xC2DC;&#xC2A4;&#xD15C; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;(&#xCD94;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xC57C;&#xAE30;&#xD588;&#xC9C0;&#xB9CC;..)&#xC548;&#xC5D0;&#xC11C; &#xB3CC;&#xC544;&#xAC00;&#xC57C;&#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xB9E4;&#xC6B0;&#xB9E4;&#xC6B0; &#xB9CE;&#xC740; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC624;&#xD788;&#xB824; primitive k8s &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xB97C; &#xC4F0;&#xB294;&#xAC83;&#xBCF4;&#xB2E4; &#xB098;&#xC744;&#xAC70;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;. (ArgoCD &#xB3C4; &#xC774;&#xB7F0; &#xCF00;&#xC774;&#xC2A4;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xB429;&#xB2C8;&#xB2E4;.)</p><p>&#xC798;&#xBABB; &#xB41C; &#xC815;&#xBCF4;&#xB97C; &#xC218;&#xC815;&#xD574;&#xC8FC;&#xC2DC;&#xAC70;&#xB098; &#xD53C;&#xB4DC;&#xBC31;&#xC744; &#xC8FC;&#xC2E4; &#xAC83;&#xC774; &#xC788;&#xC73C;&#xBA74; &#xB313;&#xAE00;&#xC740; &#xC5B8;&#xC81C;&#xB4E0; &#xD658;&#xC601;&#xC785;&#xB2C8;&#xB2E4;.  </p>]]></content:encoded></item><item><title><![CDATA[How to increase pod number limit in eks (with terraform-aws-modules)]]></title><description><![CDATA[This article shows how can we increase the limit of pod number in eks cluster by adding some environment variable in terraform-aws-modules.]]></description><link>https://www.kimsehwan96.com/how-to-increase-eks-pod-number-limit-with-eks-terraform-module/</link><guid isPermaLink="false">65f9bfaa30749cc47571b4b3</guid><category><![CDATA[eks]]></category><category><![CDATA[terraform-aws-modules]]></category><category><![CDATA[K8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[AWS]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Tue, 19 Mar 2024 14:41:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-29-------1.02.39.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-29-------1.02.39.png" alt="How to increase pod number limit in eks (with terraform-aws-modules)"><p>You can increase pod number limit in eks worker node by adding environment variable in <code>terraform-aws-modules</code>.</p><p>In <code>terraform-aws-modules</code> you can use <code>cluster-addons</code> for installing cluster addons for your eks cluster, and you can inject some environment variable in <code>cluster-addons</code> member object. </p><p>So we can inject environment variable in <code>vpc-cni</code> addon like following code snippet. You should read the attached <code>amazon-vpc-cni-k8s</code> link and you need to decide <code>WARM_PREFIX_TARGET</code> <code>WARM_IP_TARGET</code>, <code>MINIMUM_IP_TARGET</code> values. </p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/kimsehwan96/3d0e2be34b5bc1963aba23fd2084e83f.js"></script>
<!--kg-card-end: html-->
<p>amazon-vpc-cni-k8s document : <a href="https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md?ref=kimsehwan96.com">https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md</a></p><p></p><hr><p>cluster-addons &#xC5D0;&#xC11C;&#xC758; <code>vpc-cni</code> &#xC601;&#xC5ED;&#xC5D0; &#xD658;&#xACBD;&#xBCC0;&#xC218; &#xC124;&#xC815;&#xC744; &#xC8FC;&#xC785;&#xD574;&#xC11C; <code>ENABLE_PREFIX_DELEGATION=true</code> &#xB85C;, <code>WARM_IP_TARGET</code> , <code>MINIMUM_IP_TARGET</code> &#xB4F1;&#xC740; &#xAC01;&#xC790; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C; (<a href="https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md?ref=kimsehwan96.com">https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md</a> &#xCC38;&#xACE0;)</p>]]></content:encoded></item><item><title><![CDATA[Secrets of Running Etcd (번역)]]></title><description><![CDATA[2023 북미 KubeCon 에서 etcd 메인테이너가 발표한 자료를 번역한 글입니다. etcd 를 사용하면서 고려해야 할 점에 대해 자세히 다루고 있습니다. 특히 Kubernetes Event 리소스를 별도의 etcd 클러스터에 저장하는 내용과, Compaction / Defragmentation 자동화 과정에서 권장되는 내용등도 포함되어있습니다. ]]></description><link>https://www.kimsehwan96.com/secrets-of-running-etcd-korean-translation/</link><guid isPermaLink="false">65f96f8530749cc47571b480</guid><category><![CDATA[etcd]]></category><category><![CDATA[K8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Raft]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Tue, 19 Mar 2024 11:03:27 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-19------8.01.21.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#xC774; &#xBB38;&#xC11C;&#xB294; etcd &#xBA54;&#xC778;&#xD14C;&#xB2C8;&#xC5B4;&#xC774;&#xC790;, &#xAD6C;&#xAE00; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xC778; Marek Siarkowicz &#xC774; 2023 &#xBD81;&#xBBF8; KubeCon | CloudNativeCon &#xC5D0;&#xC11C; &#xBC1C;&#xD45C;&#xD55C; &#xB0B4;&#xC6A9;&#xC744; &#xC815;&#xB9AC;&#xD55C; &#xB0B4;&#xC6A9;&#xC785;&#xB2C8;&#xB2E4;. </div></div><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/aJVMWcVZOPQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Secrets of Running Etcd - Marek Siarkowicz, Google"></iframe></figure><h2 id="failures-in-distributed-systems-%EB%B6%84%EC%82%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C%EC%9D%98-failures">Failures in distributed systems (&#xBD84;&#xC0B0; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C;&#xC758; Failures)</h2><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/28490609-ada9-49c7-aa73-2e550f178c74.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/28490609-ada9-49c7-aa73-2e550f178c74.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/28490609-ada9-49c7-aa73-2e550f178c74.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/28490609-ada9-49c7-aa73-2e550f178c74.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/28490609-ada9-49c7-aa73-2e550f178c74.png 1860w" sizes="(min-width: 720px) 720px"></figure><img src="https://www.kimsehwan96.com/content/images/2024/03/-----------2024-03-19------8.01.21.png" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)"><p>etcd &#xB294; Raft &#xD569;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB9C1; &#xB41C; etcd &#xC911; &#xD558;&#xB098;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xCD5C;&#xC18C;&#xD55C;&#xC758; Quorum(&#xC815;&#xC871;&#xC218;)&#xC774;&#xC0C1;&#xC758; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBA64;&#xBC84;&#xAC00; &#xC815;&#xC0C1;&#xC801;&#xC774;&#xB77C;&#xBA74; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/76c360ab-0ee8-4be6-8e38-2bf56ef5c49b.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/76c360ab-0ee8-4be6-8e38-2bf56ef5c49b.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/76c360ab-0ee8-4be6-8e38-2bf56ef5c49b.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/76c360ab-0ee8-4be6-8e38-2bf56ef5c49b.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/76c360ab-0ee8-4be6-8e38-2bf56ef5c49b.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;</span></figcaption></figure><p>Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xC5EC;&#xB7EC; concurrent request &#xB97C; &#xD558;&#xB098;&#xC758; &#xC870;&#xC9C1;&#xD654;&#xB41C; &#xC0C1;&#xD0DC;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xADF8;&#xAC83;&#xC744; &#xBAA8;&#xB4E0; Cluster &#xBA64;&#xBC84;&#xC5D0;&#xAC8C; &#xB3D9;&#xAE30;&#xD654; &#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774;&#xB77C;&#xACE0; &#xC774;&#xC57C;&#xAE30; &#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD1B5;&#xD574; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xB294; &#xB3D9;&#xC77C;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC16;&#xACE0;, &#xB3D9;&#xC77C;&#xD55C; &#xC0C1;&#xD0DC;&#xB85C; &#xC720;&#xC9C0;&#xD558;&#xB3C4;&#xB85D; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/8aa2dfdb-3a7c-42fc-a686-c8331360fbd3.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/8aa2dfdb-3a7c-42fc-a686-c8331360fbd3.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/8aa2dfdb-3a7c-42fc-a686-c8331360fbd3.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/8aa2dfdb-3a7c-42fc-a686-c8331360fbd3.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/8aa2dfdb-3a7c-42fc-a686-c8331360fbd3.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Raft &#xC5D0;&#xC11C;&#xC758; failure</span></figcaption></figure><p>Raft &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xD2B9;&#xC131;&#xC73C;&#xB85C;, &#xD558;&#xB098;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774;&#xB098; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xC11C; &#xB4E4;&#xC5B4;&#xC624;&#xB294; &#xC798;&#xBABB;&#xB41C; &#xC694;&#xCCAD;&#xC774;&#xB098;, &#xC608;&#xAE30;&#xCE58;&#xC54A;&#xACE0; &#xBB38;&#xC81C;&#xAC00; &#xB418;&#xB294; &#xB370;&#xC774;&#xD130;&#xB098;, &#xD589;&#xB3D9;&#xB4E4;(&#xB9CE;&#xC740; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBBF8;&#xCE5C;&#xB4EF;&#xC774; &#xBC15;&#xC544;&#xB123;&#xB294;&#xB2E4;&#xB358;&#xC9C0;) &#xC5ED;&#xC2DC;&#xB098; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xC5D0;&#xAC8C; &#xADF8;&#xB7F0; &#xC798;&#xBABB;&#xB41C; &#xB370;&#xC774;&#xD130;&#xB098;, &#xB9CE;&#xC740; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC774; &#xBFCC;&#xB824;&#xC9C0;&#xAC8C; &#xB418;&#xC5B4;&#xC11C; &#xBAA8;&#xB4E0; &#xBA64;&#xBC84;&#xC5D0;&#xAC8C; &#xC601;&#xD5A5;&#xC744; &#xB07C;&#xCE60;&#xC218;&#xB3C4; &#xC788;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="kubernetes-events-explosion-k8s-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8%EC%9D%98-%ED%8F%AD%EB%B0%9C%EC%A0%81%EC%9D%B8-%EB%B0%9C%EC%83%9D%EC%9C%BC%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EB%AC%B8%EC%A0%9C%EB%9D%BC%EA%B3%A0-%EC%83%9D%EA%B0%81%ED%95%98%EC%8B%9C%EB%A9%B4-%EB%90%98%EB%8A%94">Kubernetes events explosion (K8s &#xC774;&#xBCA4;&#xD2B8; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xD3ED;&#xBC1C;&#xC801;&#xC778; &#xBC1C;&#xC0DD;&#xC73C;&#xB85C; &#xC778;&#xD55C; &#xBB38;&#xC81C;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xC2DC;&#xBA74; &#xB418;&#xB294;..)</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/ff68aca6-4e5b-486b-964d-e655143e6151.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/ff68aca6-4e5b-486b-964d-e655143e6151.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/ff68aca6-4e5b-486b-964d-e655143e6151.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/ff68aca6-4e5b-486b-964d-e655143e6151.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/ff68aca6-4e5b-486b-964d-e655143e6151.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd &#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC758; objects &#xC640; events &#xB97C; &#xC800;&#xC7A5;(&#xB610;&#xB294; lease)&#xD55C;&#xB2E4;.</span></figcaption></figure><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB294; 2&#xAC00;&#xC9C0; &#xD0C0;&#xC785;&#xC758; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; etcd&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xB294;&#xB370;, &#xD558;&#xB098;&#xB294; <code>Objects</code> &#xC774;&#xACE0; &#xD558;&#xB098;&#xB294; <code>Events</code> &#xC785;&#xB2C8;&#xB2E4;.</p><p><code>Objects</code> &#xB294; &#xC6B0;&#xB9AC;&#xAC00; &#xC798; &#xC54C;&#xACE0;&#xC788;&#xB294; Pod / Deplyoment / StatefulSet / Secret / ConfigMap &#xACFC; &#xAC19;&#xC740; &#xB9AC;&#xC18C;&#xC2A4;&#xB4E4;&#xB85C;&#xC11C;, &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xB0B4;&#xC758; &#xC6CC;&#xD06C;&#xB85C;&#xB4DC;&#xB4E4;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xD45C;&#xD604;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC0DD;&#xAC01; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xAC00; <code>Pod</code> &#xB97C; &#xC120;&#xC5B8;&#xC801;&#xC73C;&#xB85C;&#xB4E0;, &#xBA85;&#xB839;&#xC801;&#xC73C;&#xB85C;&#xB4E0; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; <code>apply</code> &#xC694;&#xCCAD;&#xC744;&#xD558;&#xBA74; &#xC6B0;&#xB9AC;&#xB294; <code>Desired State</code> &#xB97C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xC5D0; &#xC54C;&#xB824;&#xC900;&#xC148;&#xC785;&#xB2C8;&#xB2E4;. &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB294; <code>Desired State</code> &#xB97C; &#xC720;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>kube-schedueler</code> , <code>kube-controller-manager</code> , <code>kubelet</code> &#xB4F1;&#xC758; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB4E4;&#xC774; &#xC5F4;&#xC2EC;&#xD788; &#xC77C;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xB530;&#xB77C;&#xC11C; <code>Objects</code> &#xB4E4;&#xC740; &#xB9E4;&#xC6B0; &#xB9E4;&#xC6B0; &#xC911;&#xC694;&#xD558;&#xBA70; (&#xADF8;&#xAC83;&#xB4E4; &#xC790;&#xCCB4;&#xAC00; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC6CC;&#xD06C;&#xB85C;&#xB4DC;&#xC640; &#xBC00;&#xC811;&#xD55C; &#xAD00;&#xB828;&#xC774; &#xC788;&#xC73C;&#xB2C8;&#xAE4C;), &#xC0AD;&#xC81C; &#xD558;&#xC9C0; &#xC54A;&#xB294; &#xD55C; <code>etcd</code> &#xC5D0; &#xC601;&#xAD6C;&#xD788; &#xB0A8;&#xC544;&#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xC774;&#xB7EC;&#xD55C; <code>Objects</code> &#xB4E4;&#xC740; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xAD00;&#xB9AC;&#xC790; / &#xBC31;&#xC5D4;&#xB4DC; &#xAC1C;&#xBC1C;&#xC790; &#xB4F1; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB97C; &#xC811;&#xADFC;&#xD558;&#xB294; &#xAD00;&#xB9AC;&#xC790;&#xB4E4;&#xC774; &#xC120;&#xC5B8;&#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xB2C8;&#xAE4C; &#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4; &#xC608;&#xCE21; &#xAC00;&#xB2A5;&#xD55C; &#xC0AC;&#xC774;&#xC988;&#xB85C; &#xC874;&#xC7AC;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. (&#xBD07;/&#xC624;&#xD37C;&#xB808;&#xC774;&#xD130; &#xAC19;&#xC740; &#xC790;&#xB3D9;&#xD654; &#xB41C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC694;&#xC18C;&#xAC00; &#xAC11;&#xC790;&#xAE30; Pod &#xB098; ConfigMap &#xC744; 1000&#xAC1C;, 10000&#xAC1C; &#xC529; &#xB9CC;&#xB4DC;&#xB294; &#xC774;&#xC0C1;&#xD55C; &#xC77C;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC774;&#xC0C1;)</p><p><code>Events</code> &#xB294; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC758; &#xC0C1;&#xD0DC; &#xBCC0;&#xD654;&#xB97C; &#xAE30;&#xB85D;&#xD55C;&#xAC83;&#xC73C;&#xB85C;, API &#xB97C; &#xD1B5;&#xD55C; &#xB85C;&#xADF8;&#xB610;&#xD55C; &#xD655;&#xC778;&#xC774; &#xAC00;&#xB2A5;&#xD55C; &#xB9AC;&#xC18C;&#xC2A4;&#xC785;&#xB2C8;&#xB2E4;. Best effort &#xB85C; &#xC0DD;&#xC131;&#xB418;&#xBA70;, &#xD574;&#xB2F9; &#xC774;&#xBCA4;&#xD2B8;&#xAC00; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xAD00;&#xB9AC;&#xC790;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xB418;&#xC5C8;&#xB4E0;&#xC9C0;, &#xC548;&#xB418;&#xC5C8;&#xB4E0;&#xC9C0;&#xB4F1;&#xC744; &#xD310;&#xB2E8;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC0C1;&#xD0DC;&#xAC00; &#xBCC0;&#xD560; &#xB54C; &#xB9C8;&#xB2E4; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC0DD;&#xC131;&#xB418;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xC785;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xC774; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC740; <code>etcd Leases</code> &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; 1&#xC2DC;&#xAC04; &#xB4A4;&#xC5D0;&#xB294; &#xC0AD;&#xC81C;&#xB418;&#xB294; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. &#xBCF4;&#xD1B5; &#xC124;&#xC815;&#xC758; &#xC624;&#xB958;&#xB098; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC77C;&#xBD80; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xC124;&#xC815; &#xC624;&#xB958;&#xB85C; &#xC778;&#xD574;&#xC11C; failures &#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/f86153ad-a16b-404e-9493-f1bf7098b9a6.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/f86153ad-a16b-404e-9493-f1bf7098b9a6.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/f86153ad-a16b-404e-9493-f1bf7098b9a6.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/f86153ad-a16b-404e-9493-f1bf7098b9a6.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/f86153ad-a16b-404e-9493-f1bf7098b9a6.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd leases. &#xB370;&#xC774;&#xD130;&#xB97C; &#xC784;&#xC2DC;&#xB85C; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xAC1C;&#xB150;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xB2E4;.</span></figcaption></figure><p>etcd &#xC758; leases &#xAE30;&#xB2A5;&#xC740; &#xC9E7;&#xC740; &#xC2DC;&#xAC04; &#xC800;&#xC7A5;&#xD560; &#xB370;&#xC774;&#xD130; (Time To Live &#xAE30;&#xBC18;)&#xB97C; &#xC704;&#xD574; &#xC124;&#xACC4;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><ul><li>&#xC624;&#xC9C1; etcd &#xB9AC;&#xB354;&#xB9CC;&#xC774; TTL &#xB9CC;&#xB8CC; &#xCE74;&#xC6B4;&#xD2B8;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xACE0;</li><li>TTL &#xCE74;&#xC6B4;&#xD2B8;&#xC758; &#xC9C4;&#xD589;&#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xBA64;&#xBC84;&#xAC04;&#xC5D0; &#xACF5;&#xC720;&#xB418;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. </li><li>&#xC774; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xB9AC;&#xB354;&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xBA74; &#xCC98;&#xC74C;&#xBD80;&#xD130; &#xB2E4;&#xC2DC; TTL &#xCC98;&#xB9AC;&#xB97C; &#xC704;&#xD55C; &#xCE74;&#xC6B4;&#xD2B8;&#xAC00; &#xC7AC;&#xC2DC;&#xC791;&#xB429;&#xB2C8;&#xB2E4;.(&#xCD08;&#xAE30;&#xD654;)</li></ul><p>&#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4;&#xB294; <code>Events</code> &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; TTL &#xC744; 1&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD574;&#xB450;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. (PPT &#xC5D0;&#xB294; 2&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370;. <code>kube-apiserver</code> &#xC758; <code>--event-ttl</code> &#xAC12;&#xC744; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC8FC;&#xC9C0; &#xC54A;&#xC744; &#xACBD;&#xC6B0; Default &#xAC00; 1&#xC2DC;&#xAC04;&#xC785;&#xB2C8;&#xB2E4;. / <a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/?ref=kimsehwan96.com">kube-apiserver</a>  &#xCC38;&#xC870;)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/fe53106c-55ac-40d0-a32a-dc8f709fce8b.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/fe53106c-55ac-40d0-a32a-dc8f709fce8b.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/fe53106c-55ac-40d0-a32a-dc8f709fce8b.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/fe53106c-55ac-40d0-a32a-dc8f709fce8b.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/fe53106c-55ac-40d0-a32a-dc8f709fce8b.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xAC00; &#xCD94;&#xCC9C;&#xD558;&#xB294; &#xAC83;&#xB4E4;</span></figcaption></figure><ul><li>Event &#xB97C; &#xC704;&#xD55C; etcd &#xC778;&#xC2A4;&#xD134;&#xC2A4;(&#xD074;&#xB7EC;&#xC2A4;&#xD130;)&#xB97C; &#xBD84;&#xB9AC;&#xD558;&#xB294; &#xAC83;. (kubespray &#xC5D0;&#xC11C; &#xC774;&#xAC83;&#xC744; &#xC27D;&#xAC8C; &#xD65C;&#xC131;&#xD654;&#xD574;&#xC11C; event &#xC6A9; etcd &#xB97C; &#xBD84;&#xB9AC;&#xD574;&#xC11C; &#xD504;&#xB85C;&#xBE44;&#xC800;&#xB2DD; &#xD560; &#xC218; &#xC788;&#xC74C;. &#xC9C1;&#xC811;&#xD558;&#xB294;&#xAC83;&#xB3C4; &#xD06C;&#xAC8C; &#xBB38;&#xC81C; &#xB420; &#xC694;&#xC18C;&#xAC00; &#xC544;&#xB2D8;. kube-apiserver &#xC5D0; event &#xC6A9; etcd &#xC11C;&#xBC84;&#xB97C; <code>--etcd-servers-overrides</code> &#xC778;&#xC790;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBCC4;&#xB3C4; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xB428;.)</li><li><code>etcd</code> &#xC774;&#xBCA4;&#xD2B8;&#xB97C; persistent &#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC9C0; &#xB9D0;&#xACE0; &#xBCC4;&#xB3C4;&#xC758; &#xB85C;&#xAE45; &#xBC31;&#xC5D4;&#xB4DC;&#xB85C; &#xC804;&#xB2EC;&#xD558;&#xAE30;. (e.g Loki / ElasticSearch, etcs..)</li><li>&#xB9CC;&#xC57D; Event &#xB9AC;&#xC18C;&#xC2A4;&#xB54C;&#xBB38;&#xC5D0; etcd &#xB85C;&#xB4DC;&#xAC00; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xB298;&#xC5B4;&#xB09C;&#xB2E4;&#xBA74; TTL &#xC744; &#xC904;&#xC774;&#xAE30;. (<code>kube-apiserver</code>)</li><li>&#xB9AC;&#xB354;&#xC758; TTL &#xB9CC;&#xB8CC;&#xB97C; &#xD655;&#xC778;&#xD558;&#xAE30; &#xC704;&#xD55C; count &#xCCB4;&#xD06C;&#xB97C; &#xC544;&#xB798; &#xB450;&#xAC00;&#xC9C0; &#xC778;&#xC790;&#xB97C; &#xD65C;&#xC131;&#xD654;&#xD574;&#xC11C; &#xB354; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xAE30;. (&#xCE74;&#xC6B4;&#xD2B8; &#xB9AC;&#xC14B;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xAE30;)<ul><li><code>-experimental-enable-lease-checkpoint</code> &#x2192; &#xB9AC;&#xB354; &#xBCC0;&#xACBD;&#xC2DC; TTL &#xB9AC;&#xC14B;&#xC744; &#xBC29;&#xC9C0;</li><li><code>-experimental-enable-lease-checkpoint-persist</code> &#x2192; &#xC7AC;&#xC2DC;&#xC791;&#xC2DC; TTL &#xB9AC;&#xC14B; &#xBC29;&#xC9C0;</li></ul></li></ul><p>(<a href="https://github.com/etcd-io/etcd/issues/9888?ref=kimsehwan96.com">Leases may be auto-renewed indefinitely due to leader elections &#xB7; Issue #9888 &#xB7; etcd-io/etcd</a> )</p><h2 id="%08etcd-quota-deadlock">etcd quota deadlock</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/7691724b-67e3-47e7-b973-3301bc46eb21.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/7691724b-67e3-47e7-b973-3301bc46eb21.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/7691724b-67e3-47e7-b973-3301bc46eb21.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/7691724b-67e3-47e7-b973-3301bc46eb21.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/7691724b-67e3-47e7-b973-3301bc46eb21.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd quota</span></figcaption></figure><p>etcd&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740;&#xAC83;&#xC744; &#xC800;&#xC7A5;</p><ul><li>&#xD2B9;&#xC815; &#xD0A4;&#xC5D0; &#xB300;&#xD55C; &#xCD5C;&#xC2E0; &#xC0C1;&#xD0DC;</li><li>compaction(&#xC555;&#xCD95;) &#xC774;&#xD6C4;&#xC758; &#xD0A4;&#xC758; &#xBAA8;&#xB4E0; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D; (revision)</li></ul><p>etcd &#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; quota &#xC874;&#xC7AC;</p><ul><li>Disk &#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xB294; db &#xD30C;&#xC77C; &#xC0AC;&#xC774;&#xC988;&#xC758; limit (&#xB514;&#xD3F4;&#xD2B8; 2GB)</li><li>db &#xD30C;&#xC77C;&#xC0AC;&#xC774;&#xC988; &#xB9AC;&#xBC0B;&#xC5D0; &#xB3C4;&#xB2EC;&#xD558;&#xBA74; etcd member &#xB294; &#xC54C;&#xB78C;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0B4;</li><li>&#xC774; &#xC54C;&#xB78C;&#xC740; etcd &#xAD00;&#xB9AC;&#xC790;&#xC758; &#xAC1C;&#xC785;&#xC774; &#xD544;&#xC694;&#xD568; (<code>compaction</code> and <code>Defragmentation</code>)</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/60781d03-981e-4c86-897a-2e0828233b6f.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/60781d03-981e-4c86-897a-2e0828233b6f.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/60781d03-981e-4c86-897a-2e0828233b6f.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/60781d03-981e-4c86-897a-2e0828233b6f.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/60781d03-981e-4c86-897a-2e0828233b6f.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Compaction(&#xC555;&#xCD95;)&#xC774;&#xB780; &#xD2B9;&#xC815; &#xC2DC;&#xC810;&#xC758; Revision &#xC774;&#xC804;&#xC758; &#xBAA8;&#xB4E0; Revision &#xC744; &#xC81C;&#xAC70;&#xD558;&#xB294;&#xAC83;. &#xC774;&#xB807;&#xAC8C;&#xD574;&#xC11C; &#xC6A9;&#xB7C9; &#xD655;&#xBCF4;&#xAC00; &#xAC00;&#xB2A5;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/f61bbcaa-d908-4def-a4ce-de0aacda5821.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/f61bbcaa-d908-4def-a4ce-de0aacda5821.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/f61bbcaa-d908-4def-a4ce-de0aacda5821.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/f61bbcaa-d908-4def-a4ce-de0aacda5821.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/f61bbcaa-d908-4def-a4ce-de0aacda5821.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Compaction &#xC774;&#xD6C4;&#xC5D0;&#xB294; Defragmentation &#xC744; &#xD1B5;&#xD574; &#xC2E4;&#xC81C; &#xBB3C;&#xB9AC;&#xC801;&#xC778; &#xC6A9;&#xB7C9; &#xD655;&#xBCF4;&#xAC00; &#xD544;&#xC694;&#xD568;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/909e393a-2004-43a9-bab4-66afa8891a7d.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/909e393a-2004-43a9-bab4-66afa8891a7d.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/909e393a-2004-43a9-bab4-66afa8891a7d.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/909e393a-2004-43a9-bab4-66afa8891a7d.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/909e393a-2004-43a9-bab4-66afa8891a7d.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kube-apiserver &#xC758; </span><code spellcheck="false" style="white-space: pre-wrap;"><span>--etcd-compaction-interval</span></code><span style="white-space: pre-wrap;"> &#xC635;&#xC158;&#xC5D0; &#xB300;&#xD55C; &#xC124;&#xBA85;. Default &#xB294; 5m0s &#xB85C; &#xB418;&#xC5B4;&#xC788;&#xC74C;.</span></figcaption></figure><p><code>kube-apiserver</code> &#xC758; <code>--etcd-compaction-interval</code> &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xB300;&#xD55C; &#xAC04;&#xB2E8;&#xD55C; &#xC124;&#xBA85;&#xC778;&#xB370;. &#xAC00;&#xC7A5; &#xD070; &#xBB38;&#xC81C;&#xB294; <code>etcd</code> &#xAC00; <code>out of quota</code> &#xC0C1;&#xD669;&#xC77C; &#xACBD;&#xC6B0; &#xB3D9;&#xC791;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xB2E4;&#xB294; &#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/9c340cb3-9687-4d37-bfa2-6713e1344bda.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1860" height="1055" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/9c340cb3-9687-4d37-bfa2-6713e1344bda.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/9c340cb3-9687-4d37-bfa2-6713e1344bda.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/9c340cb3-9687-4d37-bfa2-6713e1344bda.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/9c340cb3-9687-4d37-bfa2-6713e1344bda.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd Compaction and Defragmentation &#xC5D0; &#xAD00;&#xD55C; &#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xC758; &#xAD8C;&#xC7A5; &#xC0AC;&#xD56D;</span></figcaption></figure><ul><li>Compaction(&#xC555;&#xCD95;)<ul><li>etcd &#xC758; &#xBE4C;&#xD2B8;&#xC778; compaction &#xB9E4;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xAE30; (<code>--auto-compaction-retention=5m</code>)<ul><li>etcd &#xAC00; &#xD560;&#xB2F9;&#xB7C9;(db &#xD30C;&#xC77C; &#xC0AC;&#xC774;&#xC988; &#xB9AC;&#xBC0B;)&#xC744; &#xB118;&#xC5B4;&#xC130;&#xC744; &#xB54C;&#xB3C4; &#xB3D9;&#xC791; &#xD568;</li><li>Reduces overhead of window<ul><li><code>kube-apiserver</code> &#xC758; <code>--etcd-compaction-interval</code> &#xC635;&#xC158;&#xBCF4;&#xB2E4; <code>etcd</code> &#xC758; <code>--auto-compaction-retention</code> &#xC774; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xC801;&#xB2E4;&#xB294; &#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xC758; &#xBC1C;&#xC5B8;&#xC774; &#xC788;&#xC74C;. &#xC989; <code>kube-apiserver</code> &#xC758; <code>--etcd-compaction-interval</code> &#xC744; 0&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xC5EC; &#xBE44;&#xD65C;&#xC131;&#xD654;&#xD558;&#xACE0;, <code>etcd</code> &#xCE21;&#xC5D0;&#xC11C; <code>--auto-compaction-retention</code> &#xC744; &#xC124;&#xC815;&#xD558;&#xB294; &#xD3B8;&#xC774; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xD6E8;&#xC52C; &#xC801;&#xB2E4;&#xACE0; &#xD568;. <code>kube-apiserver</code> &#xC758; &#xB85C;&#xC9C1;&#xC740; &#xD544;&#xC694;&#xD55C; etcd &#xB370;&#xC774;&#xD130; &#xC6A9;&#xB7C9;&#xC758; 2&#xBC30;&#xC815;&#xB3C4;&#xB97C; &#xC0C1;&#xC6A9;&#xD558;&#xB294; &#xBC18;&#xBA74;, <code>etcd</code> &#xC758; &#xB85C;&#xC9C1;&#xC740; 10% &#xC758; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xB9CC; &#xAC00;&#xC9C4;&#xB2E4;&#xACE0; &#xD568;</li></ul></li></ul></li><li>etcd &#xD560;&#xB2F9; &#xB300;&#xBE44; &#xC0AC;&#xC6A9;&#xB7C9;(db size) &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</li><li>Exclude <code>out of quota</code> alarm from health probes</li></ul></li><li>Deframentation(&#xC870;&#xAC01;&#xBAA8;&#xC74C;)<ul><li>X &#xBD84;&#xB9C8;&#xB2E4; Cronjob &#xD615;&#xD0DC;&#xB85C; &#xC218;&#xD589;&#xD558;&#xAE30; + &#xC77C;&#xBD80; jitter &#xC2DC;&#xAC04;&#xC744; &#xB46C;&#xC11C; &#xB3D9;&#xC2DC;&#xC5D0; &#xC5EC;&#xB7EC; etcd &#xBA64;&#xBC84;&#xAC00; Defrag &#xC218;&#xD589;&#xD558;&#xB294;&#xAC83;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xAE30;</li><li>Defrag &#xB97C; &#xC544;&#xB798; &#xCEE8;&#xB514;&#xC158;&#xC5D0;&#xC11C;&#xB9CC; &#xC218;&#xD589;&#xD558;&#xAE30;<ul><li>At least xxx MB of data to recover AND</li><li>Quota utilization over 75%</li></ul></li><li>Disalarm out of quota alarm</li></ul></li></ul><h2 id="etcd-watch-starvation">etcd watch starvation</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/295d1ce1-6658-42c8-a656-3667c477b4b3.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="911" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/295d1ce1-6658-42c8-a656-3667c477b4b3.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/295d1ce1-6658-42c8-a656-3667c477b4b3.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/295d1ce1-6658-42c8-a656-3667c477b4b3.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">kube-scheduler / kube-controller-manager / kubelet &#xB4F1;&#xC740; kube-apiserver &#xC640; &#xD1B5;&#xC2E0;&#xD55C;&#xB2E4;.</span></figcaption></figure><p>&#xB2E4;&#xC591;&#xD55C; &#xCFE0;&#xBC84;&#xB124;&#xD2F0;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; (kube-scheduler / kube-controller-manager &#xB4F1;)&#xC740; kube-apiserver &#xB97C; &#xD1B5;&#xD574; &#xD1B5;&#xC2E0;&#xD558;&#xB294;&#xB370;. &#xACB0;&#xAD6D; &#xAC01; &#xB9AC;&#xC18C;&#xC2A4; &#xC720;&#xD615; &#xBCC4;&#xB85C; &#xBCC4;&#xB3C4;&#xC758; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xC640; Go &#xC2A4;&#xD2B8;&#xB7ED;&#xCCD0; &#xAD6C;&#xC870;&#xAC00; &#xC788;&#xACE0;, &#xAC01; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB294; etcd&#xC5D0; &#xB3C5;&#xB9BD;&#xC801;&#xC778; gRPC &#xCEE4;&#xB125;&#xC158;&#xC744; &#xB9FA;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xD2B9;&#xC815; &#xB9AC;&#xC18C;&#xC2A4;(Deployment / Pods / Nodes)&#xC5D0; &#xB300;&#xD55C; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xBAB0;&#xB9AC;&#xBA74; &#xADF8; &#xB9CE;&#xC740; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xB2E8;&#xC77C; &#xCEE4;&#xB125;&#xC158;&#xC73C;&#xB85C; &#xBAB0;&#xB9AC;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/e94e7c3f-b8e1-443e-a245-42279c6aaf29.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="911" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/e94e7c3f-b8e1-443e-a245-42279c6aaf29.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/e94e7c3f-b8e1-443e-a245-42279c6aaf29.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/e94e7c3f-b8e1-443e-a245-42279c6aaf29.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xAC00; &#xACAA;&#xC740; &#xC0C1;&#xD669;</span></figcaption></figure><p>TLS &#xD65C;&#xC131;&#xD654;&#xB97C; &#xC704;&#xD55C; &#xC791;&#xC5C5;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xB358; &#xB3C4;&#xC911; &#xB9AC;&#xC18C;&#xC2A4; <code>watch</code> &#xC5D0; &#xB300;&#xD574;&#xC11C; starvation &#xC774; &#xBC1C;&#xC0DD;&#xD588;&#xB358; &#xACBD;&#xD5D8; &#xACF5;&#xC720;</p><p>(<a href="https://github.com/etcd-io/etcd/issues/15402?ref=kimsehwan96.com">Etcd watch stream starvation under high read response load when sharing same connection and TLS is enabled &#xB7; Issue #15402 &#xB7; etcd-io/etcd</a> )</p><p>&#xC5B4;&#xB290; &#xD55C; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xC11C;&#xB9CC; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACBC;&#xB294;&#xB370;. &#xADF8; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB294; &#xB2E4;&#xC218;&#xC758; &#xB370;&#xBAAC;&#xC14B; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;(&#xB370;&#xBAAC;&#xC14B;)&#xAC00; &#xC2E4;&#xD589;&#xC911;&#xC774;&#xC600;&#xB2E4;&#xB294; &#xAC83;. &#xD574;&#xB2F9; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0;&#xB294; Fluentd / Fluentbit &#xACFC; &#xAC19;&#xC774; &#xB85C;&#xAE45;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xB370;&#xBAAC;&#xC14B;&#xC774; &#xB9CE;&#xC774; &#xB5A0;&#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xB370;&#xBAAC;&#xC14B; &#xCEE8;&#xD2B8;&#xB864;&#xB7EC;&#xB4E4;&#xC740; &#xB85C;&#xAE45;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xBA54;&#xD0C0;&#xB370;&#xC774;&#xD130;&#xB97C; &#xC218;&#xC815;&#xD55C;&#xB2E4;&#xB4E0;&#xC9C0;(Fluentbit &#xC124;&#xC815;?) &#xD560; &#xB54C; kube-apiserver &#xC640; &#xCEE4;&#xB125;&#xC158;&#xC744; &#xB9FA;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xB370;. &#xC774; &#xB54C; &#xB2E4;&#xC218;&#xC758; &#xB178;&#xB4DC;&#xC5D0; &#xC9E7;&#xC740; &#xB2E4;&#xC6B4; &#xD0C0;&#xC784;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xC815;&#xB9D0; &#xB9CE;&#xC740; &#xB3D9;&#xC2DC; &#xB2E4;&#xBC1C;&#xC801;&#xC778; LIST &#xC694;&#xCCAD;&#xC774; &#xB4E4;&#xC5B4;&#xAC00;&#xACE0;, &#xB2E8;&#xC77C; &#xB9AC;&#xC18C;&#xC2A4; &#xD0C0;&#xC785;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xD558;&#xB098;&#xC758; gRPC &#xCEE4;&#xB125;&#xC158;&#xC5D0; &#xC5C4;&#xCCAD;&#xB09C; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xBAB0;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAC70;&#xAE30;&#xC5D0; &#xB354;&#xD574; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; Watch &#xBCF4;&#xB2E4; List &#xC5D0; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xAC00; &#xB354; &#xB192;&#xC544;&#xC11C; List &#xC751;&#xB2F5;&#xB9CC; &#xACC4;&#xC18D; &#xD558;&#xB2E4;&#xAC00; Watch &#xB294; &#xC751;&#xB2F5;&#xC744; &#xBA87;&#xBD84;&#xB3D9;&#xC548; &#xBABB;&#xBC1B;&#xB294; &#xD3EC;&#xD654;(starvation)&#xC0C1;&#xD0DC;&#xAC00; &#xB418;&#xC5B4;&#xBC84;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/245d2392-19bf-460d-b4e4-516eda9f2265.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="911" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/245d2392-19bf-460d-b4e4-516eda9f2265.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/245d2392-19bf-460d-b4e4-516eda9f2265.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/245d2392-19bf-460d-b4e4-516eda9f2265.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">etcd serving stack. &#xBE44; TLS &#xACBD;&#xB85C;&#xC640; TLS &#xACBD;&#xB85C;&#xAC00; &#xC880; &#xB2E4;&#xB974;&#xB2E4;.</span></figcaption></figure><p>&#xC774; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C; &#xC774;&#xC720;&#xB294; HTTP2 &#xD45C;&#xC900;&#xC5D0;&#xC11C; TLS&#xCEE4;&#xB125;&#xC158;&#xC5D0; &#xB300;&#xD574;&#xC11C; Multiplexing&#xB97C; &#xD5C8;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xB294;&#xAC83;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x2757;</div><div class="kg-callout-text">(&#xCD94;&#xAC00;) HTTP2 &#xD45C;&#xC900;&#xC774;&#xB77C;&#xACE0; &#xC601;&#xC0C1;&#xC5D0;&#xC11C;&#xB294; &#xB9D0;&#xD558;&#xB294;&#xB370;, &#xC544;&#xB9C8; etcd serving stack &#xC774;&#xB77C;&#xACE0; &#xC9C0;&#xCE6D;&#xD558;&#xB294; etcd &#xC55E;&#xB2E8;&#xC5D0;&#xC11C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC5D0;&#xC11C; &#xAD6C;&#xD604;&#xC774; &#xC798; &#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xC558;&#xB358;&#xAC8C; &#xC544;&#xB2CC;&#xAC00; &#xD310;&#xB2E8;&#xB429;&#xB2C8;&#xB2E4;.</div></div><p>non-TLS &#xD2B8;&#xB798;&#xD53D;&#xC778;&#xACBD;&#xC6B0; HTTP &#xC694;&#xCCAD;&#xC740; HTTP &#xC11C;&#xBC84;&#xB85C;, gRPC &#xC694;&#xCCAD;&#xC778;&#xACBD;&#xC6B0; gRPC &#xC11C;&#xBC84;&#xB85C; &#xCEE4;&#xB125;&#xC158; &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xCCB4;&#xD06C;&#xD574;&#xC11C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD2C0;&#xC5B4;&#xC904; &#xC218; &#xC788;&#xB294;&#xB370;, TLS &#xD2B8;&#xB798;&#xD53D;&#xC778;&#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xCEE4;&#xB125;&#xC158; &#xB808;&#xBCA8;&#xC5D0;&#xC11C; HTTP &#xC694;&#xCCAD;&#xC778;&#xC9C0;, gRPC &#xC694;&#xCCAD;&#xC778;&#xC9C0; &#xAD6C;&#xBD84;&#xC744; &#xD560; &#xC218; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC77C;&#xB2E8; HTTP &#xC11C;&#xBC84;&#xC5D0; &#xB118;&#xACA8;&#xC8FC;&#xACE0; gRPC &#xD5E4;&#xB354;&#xAC00; &#xC788;&#xB294;&#xACBD;&#xC6B0;&#xC5D0; gRPC &#xD578;&#xB4E4;&#xB7EC;(&#xC11C;&#xBC84;)&#xB85C; &#xB118;&#xACA8;&#xC8FC;&#xB294; &#xAD6C;&#xC870;&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC989;, non-TLS &#xD2B8;&#xB798;&#xD53D;&#xC740; <code>gRPC</code> &#xC694;&#xCCAD;(stream) &#xC744; <code>gRPC handler</code> &#xB85C; &#xACE7;&#xBC14;&#xB85C; &#xB118;&#xACA8; &#xC904; &#xC218; &#xC788;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>stream</code> &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xAC00; &#xBC00;&#xB9AC;&#xB294;&#xB4F1;&#xC758; &#xCC98;&#xB9AC;&#xAC00; &#xC5C6;&#xC774; &#xC798; &#xB3D9;&#xC791;&#xD588;&#xC9C0;&#xB9CC;. TLS &#xD2B8;&#xB798;&#xD53D;&#xC758; &#xACBD;&#xC6B0;&#xB294; &#xC77C;&#xB2E8; <code>HTTP</code> &#xC11C;&#xBC84;&#xB85C; &#xB118;&#xC5B4;&#xAC04; &#xC774;&#xD6C4;&#xC5D0; &#xCC98;&#xB9AC;&#xB418;&#xC5C8;&#xACE0;, &#xC774; &#xB54C; <code>stream</code> &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC6B0;&#xC120;&#xC21C;&#xC704; &#xCC98;&#xB9AC;&#xAC00; &#xC81C;&#xB300;&#xB85C; &#xB418;&#xC9C0; &#xC54A;&#xC544; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACBC;&#xC5C8;&#xB358;&#xAC83;&#xC73C;&#xB85C; &#xC815;&#xB9AC; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/2b889f85-96ac-45a7-9468-687f14709cd3.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/2b889f85-96ac-45a7-9468-687f14709cd3.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/2b889f85-96ac-45a7-9468-687f14709cd3.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/2b889f85-96ac-45a7-9468-687f14709cd3.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">HTTP vs gRPC Server</span></figcaption></figure><p>gRPC &#xB294; HTTP &#xC11C;&#xBC84;&#xB97C; &#xD1B5;&#xD574; &#xC2E4;&#xD589;&#xD558;&#xB294;&#xAC83;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0;&#xB9CC;</p><ul><li>&#xC131;&#xB2A5;&#xACFC; &#xAE30;&#xB2A5;&#xC774; &#xC880; &#xB2E4;&#xB97C; &#xC218; &#xC788;&#xACE0;</li><li>grpc-go&#xC758; HTTP/2 &#xC11C;&#xBC84;&#xB97C; &#xD1B5;&#xD574; &#xC81C;&#xACF5;&#xB418;&#xB294; &#xC77C;&#xBD80; gRPC &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><p>&#xC6D0;&#xC778;&#xC740;</p><ul><li>HTTP/2 &#xB294; writer &#xBCC4; &#xB2E4;&#xC911; &#xC2A4;&#xD2B8;&#xB9BC;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xACE0;</li><li>&#xC5B4;&#xB5A4; &#xC2A4;&#xD2B8;&#xB9BC;&#xC744; &#xD1B5;&#xD574; &#xC751;&#xB2F5;&#xD560;&#xC9C0; &#xACB0;&#xC815;&#xD558;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xB2E4;&#xB974;&#xACE0;</li><li>HTTP &#xC11C;&#xBC84;&#xB294; <code>PriorityWriteScheduler</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370; (golang)<ul><li> &#xC9E7;&#xC740; &#xC694;&#xCCAD;&#xC740; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xAC00; &#xB192;&#xACE0; &#xCC98;&#xB9AC;&#xAC00; &#xC798; &#xB418;&#xC5C8;&#xC9C0;&#xB9CC;</li><li>etcd Watch &#xAC19;&#xC740; gRPC &#xC2A4;&#xD2B8;&#xB9BC;&#xC740; starvation &#xC0C1;&#xD0DC;</li><li>&#xC815;&#xB9AC;&#xD558;&#xC790;&#xBA74;, &#xC9E7;&#xC740; &#xC694;&#xCCAD;&#xC774; &#xC9C0;&#xC18D;&#xC801;&#xC73C;&#xB85C; &#xB9CE;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xB294;&#xB3D9;&#xC548;, gRPC streams &#xB294; &#xC644;&#xC804;&#xD788; &#xCC28;&#xB2E8;&#xB418;&#xC5B4;&#xBC84;&#xB9BC;</li></ul></li></ul><p>(<a href="https://github.com/golang/go/issues/58804?ref=kimsehwan96.com">net/http: Stream starvation in http2 priority write scheduler &#xB7; Issue #58804 &#xB7; golang/go</a> ) </p><p>&#xACB0;&#xB860;&#xC801;&#xC73C;&#xB85C;&#xB294; <code>etcd</code> &#xC640; <code>golang</code> &#xD300;&#xACFC;&#xC758; &#xD611;&#xB825;&#xC744; &#xD1B5;&#xD574;&#xC11C; <code>HTTP/2 server (golang)</code> &#xBD80;&#xBD84;&#xC774; &#xAC1C;&#xC120;&#xB418;&#xACE0;, <code>etcd watch</code> &#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC; &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xB610;&#xD55C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/19c38bf6-fcbb-48ba-9847-34d2e16f801d.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="911" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/19c38bf6-fcbb-48ba-9847-34d2e16f801d.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/19c38bf6-fcbb-48ba-9847-34d2e16f801d.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/19c38bf6-fcbb-48ba-9847-34d2e16f801d.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xAD8C;&#xC7A5; &#xC0AC;&#xD56D;</span></figcaption></figure><p>etcd v3.4.28, v3.5.10 &#xC5D0;&#xC11C;&#xB294; &#xC774; &#xBD80;&#xBD84;&#xC774; &#xD574;&#xACB0;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;. (<a href="http://golang.org/x/net?ref=kimsehwan96.com">golang.org/x/net</a> &#xC774; RR &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xB418;&#xBA74;&#xC11C; &#xAC19;&#xC774; &#xBC18;&#xC601;)</p><h2 id="failure-mitigation">Failure Mitigation</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/054b5a0b-ce3b-4f2b-a295-8e5d4ad57f3d.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/054b5a0b-ce3b-4f2b-a295-8e5d4ad57f3d.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/054b5a0b-ce3b-4f2b-a295-8e5d4ad57f3d.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/054b5a0b-ce3b-4f2b-a295-8e5d4ad57f3d.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC804;&#xCCB4; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xD558;&#xB098;&#xC758; &#xC7A5;&#xC560; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C; &#xAC04;&#xC8FC;&#xD558;&#xAE30;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/22114f03-28dd-4e62-8b82-efcba550520c.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/22114f03-28dd-4e62-8b82-efcba550520c.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/22114f03-28dd-4e62-8b82-efcba550520c.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/22114f03-28dd-4e62-8b82-efcba550520c.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xC7A5;&#xC560; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xBA74;? &#xB2E4;&#xB978; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xAC00; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xBC1B;&#xB3C4;&#xB85D; &#xD574;&#xC57C;&#xD55C;&#xB2E4;.</span></figcaption></figure><p>Kubernetes&#xAC00; 100% &#xC2E0;&#xB8B0;&#xC131;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xAC70;&#xB098; ,&#xAC1C;&#xBC1C;&#xC790;&#xC758; &#xC2E4;&#xC218;&#xB85C;&#xBD80;&#xD130; &#xC644;&#xC804;&#xD788; &#xBCF4;&#xD638; &#xD574; &#xC904; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xC11C;&#xB294; &#xC548;&#xB429;&#xB2C8;&#xB2E4;.</p><p>.&#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC5D0; &#xBCC0;&#xACBD;&#xC774; &#xBC1C;&#xC0DD; &#xD560; &#xACBD;&#xC6B0; &#xBC1C;&#xACAC;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xBB38;&#xC81C;&#xB85C; &#xC774;&#xC5B4; &#xC9C8; &#xC218; &#xC788;&#xACE0;, &#xBAA8;&#xB4E0; &#xAC83;&#xC744; &#xD55C; &#xACF3;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xAE30;&#xBCF4;&#xB2E4;&#xB294; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xBD84;&#xB9AC;&#xD558;&#xACE0;, &#xC7A5;&#xC560; &#xBC1C;&#xC0DD;&#xC2DC; &#xB2E4;&#xB978; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xAC00; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC778;&#xACC4; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC900;&#xBE44;&#xD558;&#xB294;&#xAC83;&#xC774; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC804;&#xCCB4;&#xAC00; &#xC7A5;&#xC560;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xB294;&#xAC83;&#xBCF4;&#xB2E4;&#xB294;, &#xBD80;&#xBD84; &#xC801;&#xC778; &#xB2E4;&#xC6B4;&#xD0C0;&#xC784;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC70;&#xB098; &#xC57D;&#xAC04;&#xC758; &#xC131;&#xB2A5;&#xC800;&#xD558;&#xB098; &#xC9C0;&#xC5F0;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xB294;&#xAC83;&#xC774; &#xB0AB;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/300dc389-4fc0-4642-b560-742d3200ffba.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/300dc389-4fc0-4642-b560-742d3200ffba.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/300dc389-4fc0-4642-b560-742d3200ffba.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/300dc389-4fc0-4642-b560-742d3200ffba.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xCE74;&#xB098;&#xB9AC; rollout</span></figcaption></figure><p>&#xBE14;&#xB8E8;-&#xADF8;&#xB9B0; &#xBC30;&#xD3EC;&#xCC98;&#xB7FC; &#xBAA8;&#xB4E0; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xC758; &#xC7A0;&#xC7AC;&#xC801;&#xC778; &#xC911;&#xB2E8;&#xC73C;&#xB85C; &#xAC04;&#xC8FC;&#xD558;&#xACE0; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xB864;&#xC544;&#xC6C3;&#xD558;&#xB294;&#xAC83;&#xC744; &#xCD94;&#xCC9C;&#xD569;&#xB2C8;&#xB2E4;. <code>etcd</code> &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;, <code>Kubernetes</code> &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;, &#xD639;&#xC740; &#xC0C8;&#xB85C;&#xC6B4; &#xD2B8;&#xB798;&#xD53D; &#xD328;&#xD134;&#xC744; &#xC720;&#xBC1C;&#xD558;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xAC19;&#xC740;&#xAC83; &#xBAA8;&#xB4E0;&#xAC83;&#xC744; &#xC7A0;&#xC7AC;&#xC801;&#xC778; &#xC911;&#xB2E8;, &#xC7A5;&#xC560;&#xD3EC;&#xC778;&#xD2B8;&#xB85C; &#xC0DD;&#xAC01;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; &#xBAA8;&#xB450; &#xBE14;&#xB799;&#xBC15;&#xC2A4;&#xB85C; &#xAC04;&#xC8FC;&#xD558;&#xACE0; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xB864;&#xC544;&#xC6C3;&#xD55C;&#xB2E4;&#xBA74; &#xBB38;&#xC81C;&#xB97C; &#xC870;&#xAE30;&#xC5D0; &#xBC1C;&#xACAC;&#xD558;&#xACE0; &#xC7A5;&#xC560; &#xC5EC;&#xD30C;&#xB97C; &#xC904;&#xC77C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/cabdf16d-7653-464e-8212-a5c46e3361e5.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/cabdf16d-7653-464e-8212-a5c46e3361e5.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/cabdf16d-7653-464e-8212-a5c46e3361e5.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/cabdf16d-7653-464e-8212-a5c46e3361e5.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC810;&#xC9C4;&#xC801;&#xC778; rollout</span></figcaption></figure><p>&#xBAA8;&#xB4E0; &#xBCC0;&#xACBD;&#xC744; &#xC911;&#xB2E8;, &#xC7A0;&#xC7AC;&#xC801;&#xC778; &#xC7A5;&#xC560; &#xD3EC;&#xC778;&#xD2B8;&#xB85C; &#xAC04;&#xC8FC;&#xD558;&#xACE0; &#xBAA8;&#xB4E0; &#xBCC0;&#xACBD;&#xC744; &#xAC80;&#xC99D;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xB2E4;&#xC591;&#xD55C; &#xC911;&#xC694;&#xB3C4;&#xB85C; &#xBD84;&#xB9AC;&#xD558;&#xACE0; &#xAC01; &#xAC01;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB2E8;&#xACC4;&#xC801; &#xB864;&#xC544;&#xC6C3;&#xC744; &#xD560;&#xB2F9;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC704;&#xD5D8;&#xC744; &#xCD5C;&#xC18C;&#xD654; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. GKE &#xAC00; &#xADF8;&#xB807;&#xAC8C; &#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB7F0; &#xBAA8;&#xB4E0; &#xD574;&#xACB0;&#xCC45;&#xC740; &#xC7A5;&#xC560;&#xB97C; &#xC644;&#xD654;&#xD558;&#xAE30;&#xC704;&#xD55C; &#xD45C;&#xC900;&#xC801;&#xC778; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC774;&#xBA70;, &#xC0C8;&#xB85C; &#xC81C;&#xC548;&#xB41C; &#xB0B4;&#xC6A9;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. </p><h2 id="what-is-the-secret">What is the secret</h2><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/eb94558a-5a5c-4470-a09f-ede41073300a.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/eb94558a-5a5c-4470-a09f-ede41073300a.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/eb94558a-5a5c-4470-a09f-ede41073300a.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/eb94558a-5a5c-4470-a09f-ede41073300a.png 1596w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xB7F0; etcd &#xC6B4;&#xC601;&#xC5D0; &#xAD00;&#xB828;&#xD55C; &#xBE44;&#xBC00;, &#xB178;&#xD558;&#xC6B0;&#xB294; &#xC5B4;&#xB518;&#xAC00;&#xC5D0; &#xC228;&#xACA8;&#xC838;&#xC788;&#xB294;&#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xBAA8;&#xB450; &#xACF5;&#xAC1C;&#xC801;&#xC73C;&#xB85C; &#xB17C;&#xC758;&#xB418;&#xACE0;&#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xB7EC;&#xBD84;&#xB4E4;&#xC740; &#xADF8;&#xAC83;&#xC744; &#xC77D;&#xACE0; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4; Kubernetes &#xC774;&#xBCA4;&#xD2B8; &#xC774;&#xC288;&#xB294; &#xC624;&#xB7AB;&#xB3D9;&#xC548; &#xC874;&#xC7AC;&#xD574;&#xC654;&#xACE0; etcd &#xC758; &#xC774;&#xBCA4;&#xD2B8; &#xC800;&#xC7A5;&#xC6A9; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xBD84;&#xB9AC;&#xD558;&#xB294; &#xAC83;&#xC774; &#xD574;&#xACB0;&#xCC45;&#xC73C;&#xB85C; &#xC81C;&#xC2DC;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; &#xBD88;&#xAD6C;&#xD558;&#xACE0; &#xC5EC;&#xC804;&#xD788; &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xB2E4;&#xB904;&#xC57C; &#xD558;&#xB294;&#xC9C0; &#xC9C8;&#xBB38;&#xD558;&#xACE0;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/1888dbd5-17fb-4b8d-8ecd-df5197e19676.png" class="kg-image" alt="Secrets of Running Etcd (&#xBC88;&#xC5ED;)" loading="lazy" width="1596" height="908" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/1888dbd5-17fb-4b8d-8ecd-df5197e19676.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/1888dbd5-17fb-4b8d-8ecd-df5197e19676.png 1000w, https://www.kimsehwan96.com/content/images/2024/03/1888dbd5-17fb-4b8d-8ecd-df5197e19676.png 1596w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">free speech, not free beer</span></figcaption></figure><p>&#xC0AC;&#xB78C;&#xB4E4;&#xC740; &#xC624;&#xD508;&#xC18C;&#xC2A4;&#xB97C; &#xC644;&#xC131;&#xB41C; &#xD574;&#xACB0;&#xCC45;&#xC73C;&#xB85C; &#xC5EC;&#xAE30;&#xACE0; &#xACBD;&#xD5D8;&#xC744; &#xC313;&#xB294; &#xACFC;&#xC815;&#xC744; &#xAC74;&#xB108;&#xB6F0;&#xACE0;, &#xBB34;&#xB8CC; &#xB9E5;&#xC8FC;&#xB97C; &#xD558;&#xB098; &#xAEBC;&#xB0B4; &#xB9C8;&#xC2DC;&#xB4EF;&#xC774; &#xADF8;&#xAC83;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB824; &#xD558;&#xC9C0;&#xB9CC; &#xC624;&#xD508; &#xC18C;&#xC2A4;&#xB294; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xB97C; &#xAD50;&#xD658;&#xD558;&#xACE0; &#xD568;&#xAED8; &#xBC30;&#xC6B0;&#xB294; &#xC790;&#xC720;&#xC5D0; &#xAD00;&#xD55C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>etcd &#xB97C; &#xC6B4;&#xC601; &#xD560; &#xB54C; &#xC624;&#xD508; &#xC18C;&#xC2A4; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC6B4;&#xC601;&#xB418;&#xB294;&#xC9C0;&#xB97C; &#xC54C;&#xACE0; &#xC624;&#xB79C; &#xC2DC;&#xAC04; &#xB3D9;&#xC548; &#xD14C;&#xC2A4;&#xD2B8;&#xB418;&#xC5B4;&#xC628; etcd &#xC758; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xC0AC;&#xC6A9; &#xC0AC;&#xB840;&#xB97C; &#xBC97;&#xC5B4;&#xB098;&#xB294; &#xD568;&#xC815;&#xC744; &#xD53C;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC2DC;&#xAC04;&#xC744; &#xD22C;&#xC790;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. etcd &#xB294; &#xC0DD;&#xC0B0;&#xC801;&#xC778; key-value &#xC2A4;&#xD1A0;&#xC5B4;&#xC774;&#xC9C0;&#xB9CC; &#xADF8;&#xAC83;&#xC744; &#xD504;&#xB85C;&#xB355;&#xC158; &#xB808;&#xB514; &#xC0C1;&#xD0DC;&#xB85C; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&#xC740; &#xC5EC;&#xB7EC;&#xBD84;&#xC758; &#xBAAB;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xC774; &#xBC1C;&#xD45C;&#xC790;&#xAC00; &#xB17C;&#xC758;&#xD55C; &#xB300;&#xBD80;&#xBD84;&#xC758; etcd &#xC774;&#xC288;&#xC5D0; &#xB300;&#xD55C; &#xD574;&#xACB0;&#xCC45;&#xC740; &#xC624;&#xD508; &#xC18C;&#xC2A4;&#xB85C; &#xAD6C;&#xD604; &#xD560; &#xC218; &#xC5C6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. Kubernetes &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xC7AC;&#xC124;&#xACC4; &#xD574;&#xC57C;&#xD558;&#xAC70;&#xB098; &#xC7AC;&#xAD6C;&#xC131; &#xD574;&#xC57C; &#xD558;&#xB294; &#xAC83;&#xC744; &#xC694;&#xAD6C;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. (&#xC2E4;&#xC81C;&#xB85C; &#xC774; &#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xAC00; TLS , HTTP2 &#xAD00;&#xB828;&#xD574;&#xC11C; &#xC774;&#xC288;&#xB97C; &#xC62C;&#xB9B0; &#xAC83;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xC5EC;&#xB7EC; &#xB300;&#xC548;&#xC744; &#xC81C;&#xC2DC;&#xD558;&#xACE0; &#xC77C;&#xBD80;&#xB294; &#xD604;&#xC2E4;&#xC801;&#xC73C;&#xB85C; &#xC5B4;&#xB824;&#xC6C0;&#xC774; &#xC788;&#xC5B4;&#xC11C; &#xD3D0;&#xAE30;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xC600;&#xC74C;. / <a href="https://github.com/etcd-io/etcd/issues/15402?ref=kimsehwan96.com">Etcd watch stream starvation under high read response load when sharing same connection and TLS is enabled &#xB7; Issue #15402 &#xB7; etcd-io/etcd</a> )</p><p>&#xC5EC;&#xB7EC;&#xBD84;&#xC740; &#xADF8;&#xAC83;&#xC744; &#xACE0;&#xB824;&#xD558;&#xACE0; &#xC5B4;&#xB5BB;&#xAC8C; &#xC54C;&#xACE0;&#xC788;&#xB294; &#xD754;&#xD55C; &#xD568;&#xC815;&#xC744; &#xD53C;&#xD560; &#xC218; &#xC788;&#xC744;&#xC9C0; &#xC0DD;&#xAC01;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xAE30; &#xC704;&#xD574; &#xAC00;&#xC7A5; &#xC88B;&#xC740; &#xBC29;&#xBC95;&#xC740; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xC758; &#xC9D1;&#xB2E8;&#xC801;&#xC778; &#xACBD;&#xD5D8;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xC5EC;&#xC804;&#xD788; &#xC54C;&#xB824;&#xC9C4; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xB294; etcd &#xBC84;&#xC804;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xC73C;&#xBA70;, &#xADF8; &#xBB38;&#xC81C;&#xC5D0; &#xB300;&#xD574; &#xC5EC;&#xB7EC;&#xCC28;&#xB840; &#xBA54;&#xC77C;&#xC774; &#xBC1C;&#xC1A1;&#xB418;&#xC5C8;&#xC74C;&#xC5D0;&#xB3C4; &#xBD88;&#xAD6C;&#xD558;&#xACE0; &#xC5EC;&#xC804;&#xD788; &#xADF8;&#xAC83;&#xC744; &#xB530;&#xB974;&#xC9C0; &#xC54A;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC800;&#xC758; &#xC81C;&#xC548;(&#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;)&#xC740; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xAC00; &#xBB34;&#xC5C7;&#xC744; &#xD558;&#xACE0; &#xC788;&#xB294;&#xC9C0;, &#xB17C;&#xC758;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC9C4;&#xD589;&#xB418;&#xACE0; &#xC788;&#xB294;&#xC9C0;&#xB97C; &#xC54C;&#xC544;&#xBCF4;&#xB294;&#xB370; &#xC2DC;&#xAC04;&#xC744; &#xD22C;&#xC790;&#xD558;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. </p><h2 id="wrapping-up">Wrapping up</h2><p>&#xC774; &#xC138;&#xC158;&#xC744; &#xBC1C;&#xD45C;&#xD55C; etcd &#xBA54;&#xC778;&#xD14C;&#xC774;&#xB108;&#xC774;&#xC790;, &#xAD6C;&#xAE00; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xC778; Marek Siarkowicz&#xB294; etcd &#xC758; &#xC798; &#xC54C;&#xB824;&#xC9C4; (&#xADF8;&#xB7EC;&#xB098; &#xB9CE;&#xC774;&#xB4E4; &#xB530;&#xB974;&#xC9C0; &#xC54A;&#xAC70;&#xB098; &#xBAA8;&#xB974;&#xACE0; &#xC788;&#xB294;) &#xBB38;&#xC81C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBC1C;&#xD45C; &#xC804;&#xCCB4;&#xC5D0; &#xAC78;&#xCCD0;&#xC11C; &#xB2E4;&#xB918;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB4A4;&#xCABD;&#xC5D0;&#xC11C;&#xB294; <code>etcd</code>&#xB97C; &#xB2E8;&#xC21C;&#xD788; &#xC27D;&#xAC8C; <code>free beer</code> &#xCC98;&#xB7FC; &#xAEBC;&#xB0B4; &#xC4F0;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xC815;&#xB9D0; &#xC0DD;&#xC0B0;&#xC801;&#xC774;&#xACE0;, Production Ready &#xC0C1;&#xD0DC;&#xB85C; &#xB9CC;&#xB4DC;&#xB294;&#xAC83;&#xC740; &#xC0AC;&#xC6A9;&#xC790;(&#xAC1C;&#xBC1C;&#xC790;)&#xC758; &#xBAAB;&#xC774;&#xBA70;, &#xC798; &#xC54C;&#xB824;&#xC9C4;, &#xC624;&#xB79C;&#xC2DC;&#xAC04;&#xB3D9;&#xC548; &#xD14C;&#xC2A4;&#xD2B8;&#xB418;&#xC5B4;&#xC628; &#xC0AC;&#xC6A9;&#xC0AC;&#xB840;&#xB97C; &#xB530;&#xB974;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xACE0; &#xC774; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xD758;&#xB7EC;&#xAC00;&#xACE0;&#xC788;&#xB294;&#xC9C0; &#xC2DC;&#xAC04;&#xC744; &#xD22C;&#xC790;&#xD558;&#xB77C;&#xB294; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xB610;&#xD55C; etcd &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB2E4; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE34; &#xACBD;&#xC6B0; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;, etcd &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xCC3E;&#xC544;&#xBCF4;&#xAC70;&#xB098; &#xBA54;&#xC77C;&#xB9C1; &#xB9AC;&#xC2A4;&#xD2B8;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xACE0;, &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xC5D0; &#xC9C8;&#xBB38;&#xD558;&#xACE0; &#xB354; &#xB098;&#xC544;&#xAC00;&#xC11C;&#xB294; &#xACAA;&#xC740; &#xBB38;&#xC81C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xACF5;&#xC720;&#xD558;&#xACE0;, &#xD63C;&#xC790;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xB824;&#xACE0; &#xC2DC;&#xB3C4;&#xD558;&#xC9C0; &#xB9D0;&#xACE0; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xC758; &#xC9D1;&#xB2E8;&#xC801;&#xC778; &#xACBD;&#xD5D8;&#xC744; &#xC798; &#xD65C;&#xC6A9;&#xD558;&#xB77C;&#xACE0; &#xC774;&#xC57C;&#xAE30; &#xD569;&#xB2C8;&#xB2E4;. </p><blockquote>&#xBAA8;&#xB4E0; &#xAC83;&#xC744; &#xD63C;&#xC790;&#xC11C; &#xD574;&#xACB0; &#xD558;&#xB824; &#xD558;&#xC9C0; &#xB9D0;&#xACE0;, &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xC758; &#xC9D1;&#xB2E8;&#xC801; &#xACBD;&#xD5D8;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xACE0;, &#xB300;&#xD654;&#xB97C; &#xB098;&#xB204;&#xBA74;&#xC11C; &#xBC30;&#xC6B0;&#xC138;&#xC694;.</blockquote><p>&#xBC1C;&#xD45C;&#xC790;&#xC758; &#xBC1C;&#xD45C; &#xB9D0;&#xBBF8;&#xC758; &#xD55C; &#xB9C8;&#xB514;&#xB97C; &#xC778;&#xC6A9;&#xD558;&#xBA74;&#xC11C; &#xAE00;&#xC744; &#xB9C8;&#xCE69;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[gRPC transcoder in Istio 테스트]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">gRPC transcoder &#xB97C; envoy&#xAC00; &#xC544;&#xB2CC; istio &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD574;&#xBCF4;&#xB294; &#xC608;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;. gRPC transcoder &#xB294; gRPC &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xAE30;&#xC874; <code spellcheck="false" style="white-space: pre-wrap;">RESTful API</code> &#xD639;&#xC740; <code spellcheck="false" style="white-space: pre-wrap;">HTTP API</code>&#xB77C;&#xACE0; &#xBD88;&#xB9AC;&#xB294; <code spellcheck="false" style="white-space: pre-wrap;">json</code> &#xAE30;&#xBC18;&#xC758; API &#xD638;</div></div>]]></description><link>https://www.kimsehwan96.com/grpc-transcoder-in-istio/</link><guid isPermaLink="false">65f07fd030749cc47571b38c</guid><category><![CDATA[Istio]]></category><category><![CDATA[gRPC]]></category><category><![CDATA[ServiceMesh]]></category><category><![CDATA[K8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Helm]]></category><category><![CDATA[Kustomize]]></category><dc:creator><![CDATA[김세환]]></dc:creator><pubDate>Tue, 12 Mar 2024 14:35:00 GMT</pubDate><media:content url="https://www.kimsehwan96.com/content/images/2024/03/-----------3-.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">gRPC transcoder &#xB97C; envoy&#xAC00; &#xC544;&#xB2CC; istio &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD574;&#xBCF4;&#xB294; &#xC608;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;. gRPC transcoder &#xB294; gRPC &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xAE30;&#xC874; <code spellcheck="false" style="white-space: pre-wrap;">RESTful API</code> &#xD639;&#xC740; <code spellcheck="false" style="white-space: pre-wrap;">HTTP API</code>&#xB77C;&#xACE0; &#xBD88;&#xB9AC;&#xB294; <code spellcheck="false" style="white-space: pre-wrap;">json</code> &#xAE30;&#xBC18;&#xC758; API &#xD638;&#xCD9C;&#xC744; gRPC&#xB85C; &#xBCC0;&#xD658;&#xD574;&#xC8FC;&#xB294; &#xC77C;&#xC885;&#xC758; &#xD504;&#xB85D;&#xC2DC;&#xB77C;&#xACE0; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xAC83;&#xC744; &#xD1B5;&#xD574; &#xC6B0;&#xB9AC;&#xB294; gRPC &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xC640; HTTP &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xB3D9;&#xC2DC;&#xC5D0; &#xC81C;&#xACF5; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</div></div><img src="https://www.kimsehwan96.com/content/images/2024/03/-----------3-.png" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;"><p>&#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC;&#xB4E4;</p><p><a href="https://github.com/kimsehwan96/gRPC-python-example?ref=kimsehwan96.com">GitHub - kimsehwan96/gRPC-python-example</a></p><p><a href="https://github.com/kimsehwan96/istio-example?ref=kimsehwan96.com">GitHub - kimsehwan96/istio-example</a> </p><h2 id="grpc-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%84%9C%EB%B2%84">gRPC &#xD14C;&#xC2A4;&#xD2B8; &#xC11C;&#xBC84;</h2><p>gRPC &#xC758; &#xACBD;&#xC6B0; &#xC9C1;&#xB82C;&#xD654;/&#xC5ED;&#xC9C1;&#xB82C;&#xD654; &#xACFC;&#xC815;&#xC5D0;&#xC11C; protobuf &#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; <code>.proto</code> &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xC8FC;&#xACE0;&#xBC1B;&#xC744; &#xB370;&#xC774;&#xD130;&#xC758; &#xD615;&#xC2DD;&#xC744; &#xC9C0;&#xC815;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.<br></p><figure class="kg-card kg-code-card"><pre><code class="language-proto">// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = &quot;proto3&quot;;

option java_multiple_files = true;
option java_package = &quot;io.grpc.examples.helloworld&quot;;
option java_outer_classname = &quot;HelloWorldProto&quot;;
option objc_class_prefix = &quot;HLW&quot;;

package helloworld;

import &quot;google/api/annotations.proto&quot;;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      get: &quot;/v1/hello&quot;
    };
  }

  // Another Method
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}

  rpc SayHelloStreamReply (HelloRequest) returns (stream HelloReply) {}

  rpc SayHelloBidiStream (stream HelloRequest) returns (stream HelloReply) {}
}

// The request message containing the user&apos;s name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
</code></pre><figcaption><p><span style="white-space: pre-wrap;">proto &#xD30C;&#xC77C; &#xC608;&#xC81C;</span></p></figcaption></figure><p>&#xC704;&#xC640; &#xAC19;&#xC774; &#xAC04;&#xB2E8;&#xD55C; <code>proto</code> &#xD30C;&#xC77C;&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; <code>json</code> &#xD2B8;&#xB79C;&#xC2A4;&#xCF54;&#xB354;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; <code>option (google.api.http)</code>  &#xBD80;&#xBD84;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xBA74; &#xAE30;&#xC874; Restful API(HTTP API) &#xD615;&#xD0DC;&#xB85C; &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; &#xC774;&#xB54C; <code>proto descriptor</code> &#xC0DD;&#xC131;&#xC744; &#xD560; &#xB54C; <code>googleapis</code> &#xB97C;  proto descriptor &#xBE4C;&#xB4DC;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC5D0; &#xCD94;&#xAC00;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xAD73;&#xC774; &#xC704; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xC758; gRPC &#xC11C;&#xBC84;&#xAC00; &#xC544;&#xB2C8;&#xB354;&#xB77C;&#xB3C4;, HTTP &#xC5D4;&#xB4DC;&#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xB178;&#xCD9C;&#xD55C; protobuf + gRPC &#xC11C;&#xBC84;&#xB77C;&#xBA74; &#xC5B4;&#xCC0C;&#xB418;&#xC5C8;&#xB4E0; &#xC774; &#xC608;&#xC81C;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB824;&#xB294; &#xD14C;&#xC2A4;&#xD2B8;&#xB294; &#xC9C4;&#xD589; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. </p><h3 id="istio-envoy-filter">Istio Envoy filter</h3><pre><code class="language-Yaml">apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: grpc-transcoder
spec:
  workloadSelector:
    labels:
      app: grpc-python
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          portNumber: 7777 # 5xxxx &#xBC88;&#xB300; &#xD3EC;&#xD2B8;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xBC18;&#xC601;&#xC774; &#xC548;&#xB41C;&#xB2E4;. &#xC774;&#xAC74; &#xC65C;&#xADF8;&#xB7F0;&#xC9C0;;
          filterChain:
            filter:
              name: &quot;envoy.filters.network.http_connection_manager&quot;
              subFilter:
                name: &quot;envoy.filters.http.router&quot;
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.grpc_json_transcoder
          typed_config:
            &quot;@type&quot;: type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
            services:
              - helloworld.Greeter
            print_options:
              add_whitespace: true
              always_print_enums_as_ints: false
              always_print_primitive_fields: true
              preserve_proto_field_names: false
            convert_grpc_status: true
            proto_descriptor_bin: CuF4ChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24i2gIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRIjCg1yZXNwb25zZV9ib2R5GAwgASgJUgxyZXNwb25zZUJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSUqycwoHEgUOAPoCAQq8BAoBDBIDDgASMrEEIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTEMKCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCggKAQISAxAAEwoICgEIEgMSAB8KCQoCCB8SAxIAHwoICgEIEgMTAFgKCQoCCAsSAxMAWAoICgEIEgMUACIKCQoCCAoSAxQAIgoICgEIEgMVACoKCQoCCAgSAxUAKgoICgEIEgMWACcKCQoCCAESAxYAJwoICgEIEgMXACIKCQoCCCQSAxcAIgrNAQoCBAASBBwAKQEawAEgRGVmaW5lcyB0aGUgSFRUUCBjb25maWd1cmF0aW9uIGZvciBhbiBBUEkgc2VydmljZS4gSXQgY29udGFpbnMgYSBsaXN0IG9mCiBbSHR0cFJ1bGVdW2dvb2dsZS5hcGkuSHR0cFJ1bGVdLCBlYWNoIHNwZWNpZnlpbmcgdGhlIG1hcHBpbmcgb2YgYW4gUlBDIG1ldGhvZAogdG8gb25lIG9yIG1vcmUgSFRUUCBSRVNUIEFQSSBtZXRob2RzLgoKCgoDBAABEgMcCAwKogEKBAQAAgASAyACHhqUASBBIGxpc3Qgb2YgSFRUUCBjb25maWd1cmF0aW9uIHJ1bGVzIHRoYXQgYXBwbHkgdG8gaW5kaXZpZHVhbCBBUEkgbWV0aG9kcy4KCiAqKk5PVEU6KiogQWxsIHNlcnZpY2UgY29uZmlndXJhdGlvbiBydWxlcyBmb2xsb3cgImxhc3Qgb25lIHdpbnMiIG9yZGVyLgoKDAoFBAACAAQSAyACCgoMCgUEAAIABhIDIAsTCgwKBQQAAgABEgMgFBkKDAoFBAACAAMSAyAcHQqUAgoEBAACARIDKAIrGoYCIFdoZW4gc2V0IHRvIHRydWUsIFVSTCBwYXRoIHBhcmFtZXRlcnMgd2lsbCBiZSBmdWxseSBVUkktZGVjb2RlZCBleGNlcHQgaW4KIGNhc2VzIG9mIHNpbmdsZSBzZWdtZW50IG1hdGNoZXMgaW4gcmVzZXJ2ZWQgZXhwYW5zaW9uLCB3aGVyZSAiJTJGIiB3aWxsIGJlCiBsZWZ0IGVuY29kZWQuCgogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbm90IGRlY29kZSBSRkMgNjU3MCByZXNlcnZlZCBjaGFyYWN0ZXJzIGluIG11bHRpCiBzZWdtZW50IG1hdGNoZXMuCgoMCgUEAAIBBRIDKAIGCgwKBQQAAgEBEgMoByYKDAoFBAACAQMSAygpKgq7UwoCBAESBrsCAPECARqsUyAjIGdSUEMgVHJhbnNjb2RpbmcKCiBnUlBDIFRyYW5zY29kaW5nIGlzIGEgZmVhdHVyZSBmb3IgbWFwcGluZyBiZXR3ZWVuIGEgZ1JQQyBtZXRob2QgYW5kIG9uZSBvcgogbW9yZSBIVFRQIFJFU1QgZW5kcG9pbnRzLiBJdCBhbGxvd3MgZGV2ZWxvcGVycyB0byBidWlsZCBhIHNpbmdsZSBBUEkgc2VydmljZQogdGhhdCBzdXBwb3J0cyBib3RoIGdSUEMgQVBJcyBhbmQgUkVTVCBBUElzLiBNYW55IHN5c3RlbXMsIGluY2x1ZGluZyBbR29vZ2xlCiBBUElzXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlYXBpcy9nb29nbGVhcGlzKSwKIFtDbG91ZCBFbmRwb2ludHNdKGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9lbmRwb2ludHMpLCBbZ1JQQwogR2F0ZXdheV0oaHR0cHM6Ly9naXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheSksCiBhbmQgW0Vudm95XShodHRwczovL2dpdGh1Yi5jb20vZW52b3lwcm94eS9lbnZveSkgcHJveHkgc3VwcG9ydCB0aGlzIGZlYXR1cmUKIGFuZCB1c2UgaXQgZm9yIGxhcmdlIHNjYWxlIHByb2R1Y3Rpb24gc2VydmljZXMuCgogYEh0dHBSdWxlYCBkZWZpbmVzIHRoZSBzY2hlbWEgb2YgdGhlIGdSUEMvUkVTVCBtYXBwaW5nLiBUaGUgbWFwcGluZyBzcGVjaWZpZXMKIGhvdyBkaWZmZXJlbnQgcG9ydGlvbnMgb2YgdGhlIGdSUEMgcmVxdWVzdCBtZXNzYWdlIGFyZSBtYXBwZWQgdG8gdGhlIFVSTAogcGF0aCwgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMsIGFuZCBIVFRQIHJlcXVlc3QgYm9keS4gSXQgYWxzbyBjb250cm9scyBob3cgdGhlCiBnUlBDIHJlc3BvbnNlIG1lc3NhZ2UgaXMgbWFwcGVkIHRvIHRoZSBIVFRQIHJlc3BvbnNlIGJvZHkuIGBIdHRwUnVsZWAgaXMKIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYW4gYGdvb2dsZS5hcGkuaHR0cGAgYW5ub3RhdGlvbiBvbiB0aGUgZ1JQQyBtZXRob2QuCgogRWFjaCBtYXBwaW5nIHNwZWNpZmllcyBhIFVSTCBwYXRoIHRlbXBsYXRlIGFuZCBhbiBIVFRQIG1ldGhvZC4gVGhlIHBhdGgKIHRlbXBsYXRlIG1heSByZWZlciB0byBvbmUgb3IgbW9yZSBmaWVsZHMgaW4gdGhlIGdSUEMgcmVxdWVzdCBtZXNzYWdlLCBhcyBsb25nCiBhcyBlYWNoIGZpZWxkIGlzIGEgbm9uLXJlcGVhdGVkIGZpZWxkIHdpdGggYSBwcmltaXRpdmUgKG5vbi1tZXNzYWdlKSB0eXBlLgogVGhlIHBhdGggdGVtcGxhdGUgY29udHJvbHMgaG93IGZpZWxkcyBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGFyZSBtYXBwZWQgdG8KIHRoZSBVUkwgcGF0aC4KCiBFeGFtcGxlOgoKICAgICBzZXJ2aWNlIE1lc3NhZ2luZyB7CiAgICAgICBycGMgR2V0TWVzc2FnZShHZXRNZXNzYWdlUmVxdWVzdCkgcmV0dXJucyAoTWVzc2FnZSkgewogICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkgPSB7CiAgICAgICAgICAgICBnZXQ6ICIvdjEve25hbWU9bWVzc2FnZXMvKn0iCiAgICAgICAgIH07CiAgICAgICB9CiAgICAgfQogICAgIG1lc3NhZ2UgR2V0TWVzc2FnZVJlcXVlc3QgewogICAgICAgc3RyaW5nIG5hbWUgPSAxOyAvLyBNYXBwZWQgdG8gVVJMIHBhdGguCiAgICAgfQogICAgIG1lc3NhZ2UgTWVzc2FnZSB7CiAgICAgICBzdHJpbmcgdGV4dCA9IDE7IC8vIFRoZSByZXNvdXJjZSBjb250ZW50LgogICAgIH0KCiBUaGlzIGVuYWJsZXMgYW4gSFRUUCBSRVNUIHRvIGdSUEMgbWFwcGluZyBhcyBiZWxvdzoKCiBIVFRQIHwgZ1JQQwogLS0tLS18LS0tLS0KIGBHRVQgL3YxL21lc3NhZ2VzLzEyMzQ1NmAgIHwgYEdldE1lc3NhZ2UobmFtZTogIm1lc3NhZ2VzLzEyMzQ1NiIpYAoKIEFueSBmaWVsZHMgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSB3aGljaCBhcmUgbm90IGJvdW5kIGJ5IHRoZSBwYXRoIHRlbXBsYXRlCiBhdXRvbWF0aWNhbGx5IGJlY29tZSBIVFRQIHF1ZXJ5IHBhcmFtZXRlcnMgaWYgdGhlcmUgaXMgbm8gSFRUUCByZXF1ZXN0IGJvZHkuCiBGb3IgZXhhbXBsZToKCiAgICAgc2VydmljZSBNZXNzYWdpbmcgewogICAgICAgcnBjIEdldE1lc3NhZ2UoR2V0TWVzc2FnZVJlcXVlc3QpIHJldHVybnMgKE1lc3NhZ2UpIHsKICAgICAgICAgb3B0aW9uIChnb29nbGUuYXBpLmh0dHApID0gewogICAgICAgICAgICAgZ2V0OiIvdjEvbWVzc2FnZXMve21lc3NhZ2VfaWR9IgogICAgICAgICB9OwogICAgICAgfQogICAgIH0KICAgICBtZXNzYWdlIEdldE1lc3NhZ2VSZXF1ZXN0IHsKICAgICAgIG1lc3NhZ2UgU3ViTWVzc2FnZSB7CiAgICAgICAgIHN0cmluZyBzdWJmaWVsZCA9IDE7CiAgICAgICB9CiAgICAgICBzdHJpbmcgbWVzc2FnZV9pZCA9IDE7IC8vIE1hcHBlZCB0byBVUkwgcGF0aC4KICAgICAgIGludDY0IHJldmlzaW9uID0gMjsgICAgLy8gTWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXIgYHJldmlzaW9uYC4KICAgICAgIFN1Yk1lc3NhZ2Ugc3ViID0gMzsgICAgLy8gTWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXIgYHN1Yi5zdWJmaWVsZGAuCiAgICAgfQoKIFRoaXMgZW5hYmxlcyBhIEhUVFAgSlNPTiB0byBSUEMgbWFwcGluZyBhcyBiZWxvdzoKCiBIVFRQIHwgZ1JQQwogLS0tLS18LS0tLS0KIGBHRVQgL3YxL21lc3NhZ2VzLzEyMzQ1Nj9yZXZpc2lvbj0yJnN1Yi5zdWJmaWVsZD1mb29gIHwKIGBHZXRNZXNzYWdlKG1lc3NhZ2VfaWQ6ICIxMjM0NTYiIHJldmlzaW9uOiAyIHN1YjogU3ViTWVzc2FnZShzdWJmaWVsZDoKICJmb28iKSlgCgogTm90ZSB0aGF0IGZpZWxkcyB3aGljaCBhcmUgbWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhCiBwcmltaXRpdmUgdHlwZSBvciBhIHJlcGVhdGVkIHByaW1pdGl2ZSB0eXBlIG9yIGEgbm9uLXJlcGVhdGVkIG1lc3NhZ2UgdHlwZS4KIEluIHRoZSBjYXNlIG9mIGEgcmVwZWF0ZWQgdHlwZSwgdGhlIHBhcmFtZXRlciBjYW4gYmUgcmVwZWF0ZWQgaW4gdGhlIFVSTAogYXMgYC4uLj9wYXJhbT1BJnBhcmFtPUJgLiBJbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UgdHlwZSwgZWFjaCBmaWVsZCBvZiB0aGUKIG1lc3NhZ2UgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgcGFyYW1ldGVyLCBzdWNoIGFzCiBgLi4uP2Zvby5hPUEmZm9vLmI9QiZmb28uYz1DYC4KCiBGb3IgSFRUUCBtZXRob2RzIHRoYXQgYWxsb3cgYSByZXF1ZXN0IGJvZHksIHRoZSBgYm9keWAgZmllbGQKIHNwZWNpZmllcyB0aGUgbWFwcGluZy4gQ29uc2lkZXIgYSBSRVNUIHVwZGF0ZSBtZXRob2Qgb24gdGhlCiBtZXNzYWdlIHJlc291cmNlIGNvbGxlY3Rpb246CgogICAgIHNlcnZpY2UgTWVzc2FnaW5nIHsKICAgICAgIHJwYyBVcGRhdGVNZXNzYWdlKFVwZGF0ZU1lc3NhZ2VSZXF1ZXN0KSByZXR1cm5zIChNZXNzYWdlKSB7CiAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKSA9IHsKICAgICAgICAgICBwYXRjaDogIi92MS9tZXNzYWdlcy97bWVzc2FnZV9pZH0iCiAgICAgICAgICAgYm9keTogIm1lc3NhZ2UiCiAgICAgICAgIH07CiAgICAgICB9CiAgICAgfQogICAgIG1lc3NhZ2UgVXBkYXRlTWVzc2FnZVJlcXVlc3QgewogICAgICAgc3RyaW5nIG1lc3NhZ2VfaWQgPSAxOyAvLyBtYXBwZWQgdG8gdGhlIFVSTAogICAgICAgTWVzc2FnZSBtZXNzYWdlID0gMjsgICAvLyBtYXBwZWQgdG8gdGhlIGJvZHkKICAgICB9CgogVGhlIGZvbGxvd2luZyBIVFRQIEpTT04gdG8gUlBDIG1hcHBpbmcgaXMgZW5hYmxlZCwgd2hlcmUgdGhlCiByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNPTiBpbiB0aGUgcmVxdWVzdCBib2R5IGlzIGRldGVybWluZWQgYnkKIHByb3RvcyBKU09OIGVuY29kaW5nOgoKIEhUVFAgfCBnUlBDCiAtLS0tLXwtLS0tLQogYFBBVENIIC92MS9tZXNzYWdlcy8xMjM0NTYgeyAidGV4dCI6ICJIaSEiIH1gIHwgYFVwZGF0ZU1lc3NhZ2UobWVzc2FnZV9pZDoKICIxMjM0NTYiIG1lc3NhZ2UgeyB0ZXh0OiAiSGkhIiB9KWAKCiBUaGUgc3BlY2lhbCBuYW1lIGAqYCBjYW4gYmUgdXNlZCBpbiB0aGUgYm9keSBtYXBwaW5nIHRvIGRlZmluZSB0aGF0CiBldmVyeSBmaWVsZCBub3QgYm91bmQgYnkgdGhlIHBhdGggdGVtcGxhdGUgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGUKIHJlcXVlc3QgYm9keS4gIFRoaXMgZW5hYmxlcyB0aGUgZm9sbG93aW5nIGFsdGVybmF0aXZlIGRlZmluaXRpb24gb2YKIHRoZSB1cGRhdGUgbWV0aG9kOgoKICAgICBzZXJ2aWNlIE1lc3NhZ2luZyB7CiAgICAgICBycGMgVXBkYXRlTWVzc2FnZShNZXNzYWdlKSByZXR1cm5zIChNZXNzYWdlKSB7CiAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKSA9IHsKICAgICAgICAgICBwYXRjaDogIi92MS9tZXNzYWdlcy97bWVzc2FnZV9pZH0iCiAgICAgICAgICAgYm9keTogIioiCiAgICAgICAgIH07CiAgICAgICB9CiAgICAgfQogICAgIG1lc3NhZ2UgTWVzc2FnZSB7CiAgICAgICBzdHJpbmcgbWVzc2FnZV9pZCA9IDE7CiAgICAgICBzdHJpbmcgdGV4dCA9IDI7CiAgICAgfQoKCiBUaGUgZm9sbG93aW5nIEhUVFAgSlNPTiB0byBSUEMgbWFwcGluZyBpcyBlbmFibGVkOgoKIEhUVFAgfCBnUlBDCiAtLS0tLXwtLS0tLQogYFBBVENIIC92MS9tZXNzYWdlcy8xMjM0NTYgeyAidGV4dCI6ICJIaSEiIH1gIHwgYFVwZGF0ZU1lc3NhZ2UobWVzc2FnZV9pZDoKICIxMjM0NTYiIHRleHQ6ICJIaSEiKWAKCiBOb3RlIHRoYXQgd2hlbiB1c2luZyBgKmAgaW4gdGhlIGJvZHkgbWFwcGluZywgaXQgaXMgbm90IHBvc3NpYmxlIHRvCiBoYXZlIEhUVFAgcGFyYW1ldGVycywgYXMgYWxsIGZpZWxkcyBub3QgYm91bmQgYnkgdGhlIHBhdGggZW5kIGluCiB0aGUgYm9keS4gVGhpcyBtYWtlcyB0aGlzIG9wdGlvbiBtb3JlIHJhcmVseSB1c2VkIGluIHByYWN0aWNlIHdoZW4KIGRlZmluaW5nIFJFU1QgQVBJcy4gVGhlIGNvbW1vbiB1c2FnZSBvZiBgKmAgaXMgaW4gY3VzdG9tIG1ldGhvZHMKIHdoaWNoIGRvbid0IHVzZSB0aGUgVVJMIGF0IGFsbCBmb3IgdHJhbnNmZXJyaW5nIGRhdGEuCgogSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIG11bHRpcGxlIEhUVFAgbWV0aG9kcyBmb3Igb25lIFJQQyBieSB1c2luZwogdGhlIGBhZGRpdGlvbmFsX2JpbmRpbmdzYCBvcHRpb24uIEV4YW1wbGU6CgogICAgIHNlcnZpY2UgTWVzc2FnaW5nIHsKICAgICAgIHJwYyBHZXRNZXNzYWdlKEdldE1lc3NhZ2VSZXF1ZXN0KSByZXR1cm5zIChNZXNzYWdlKSB7CiAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKSA9IHsKICAgICAgICAgICBnZXQ6ICIvdjEvbWVzc2FnZXMve21lc3NhZ2VfaWR9IgogICAgICAgICAgIGFkZGl0aW9uYWxfYmluZGluZ3MgewogICAgICAgICAgICAgZ2V0OiAiL3YxL3VzZXJzL3t1c2VyX2lkfS9tZXNzYWdlcy97bWVzc2FnZV9pZH0iCiAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgfQogICAgIH0KICAgICBtZXNzYWdlIEdldE1lc3NhZ2VSZXF1ZXN0IHsKICAgICAgIHN0cmluZyBtZXNzYWdlX2lkID0gMTsKICAgICAgIHN0cmluZyB1c2VyX2lkID0gMjsKICAgICB9CgogVGhpcyBlbmFibGVzIHRoZSBmb2xsb3dpbmcgdHdvIGFsdGVybmF0aXZlIEhUVFAgSlNPTiB0byBSUEMgbWFwcGluZ3M6CgogSFRUUCB8IGdSUEMKIC0tLS0tfC0tLS0tCiBgR0VUIC92MS9tZXNzYWdlcy8xMjM0NTZgIHwgYEdldE1lc3NhZ2UobWVzc2FnZV9pZDogIjEyMzQ1NiIpYAogYEdFVCAvdjEvdXNlcnMvbWUvbWVzc2FnZXMvMTIzNDU2YCB8IGBHZXRNZXNzYWdlKHVzZXJfaWQ6ICJtZSIgbWVzc2FnZV9pZDoKICIxMjM0NTYiKWAKCiAjIyBSdWxlcyBmb3IgSFRUUCBtYXBwaW5nCgogMS4gTGVhZiByZXF1ZXN0IGZpZWxkcyAocmVjdXJzaXZlIGV4cGFuc2lvbiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHJlcXVlc3QKICAgIG1lc3NhZ2UpIGFyZSBjbGFzc2lmaWVkIGludG8gdGhyZWUgY2F0ZWdvcmllczoKICAgIC0gRmllbGRzIHJlZmVycmVkIGJ5IHRoZSBwYXRoIHRlbXBsYXRlLiBUaGV5IGFyZSBwYXNzZWQgdmlhIHRoZSBVUkwgcGF0aC4KICAgIC0gRmllbGRzIHJlZmVycmVkIGJ5IHRoZSBbSHR0cFJ1bGUuYm9keV1bZ29vZ2xlLmFwaS5IdHRwUnVsZS5ib2R5XS4gVGhleQogICAgYXJlIHBhc3NlZCB2aWEgdGhlIEhUVFAKICAgICAgcmVxdWVzdCBib2R5LgogICAgLSBBbGwgb3RoZXIgZmllbGRzIGFyZSBwYXNzZWQgdmlhIHRoZSBVUkwgcXVlcnkgcGFyYW1ldGVycywgYW5kIHRoZQogICAgICBwYXJhbWV0ZXIgbmFtZSBpcyB0aGUgZmllbGQgcGF0aCBpbiB0aGUgcmVxdWVzdCBtZXNzYWdlLiBBIHJlcGVhdGVkCiAgICAgIGZpZWxkIGNhbiBiZSByZXByZXNlbnRlZCBhcyBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIHVuZGVyIHRoZSBzYW1lCiAgICAgIG5hbWUuCiAgMi4gSWYgW0h0dHBSdWxlLmJvZHldW2dvb2dsZS5hcGkuSHR0cFJ1bGUuYm9keV0gaXMgIioiLCB0aGVyZSBpcyBubyBVUkwKICBxdWVyeSBwYXJhbWV0ZXIsIGFsbCBmaWVsZHMKICAgICBhcmUgcGFzc2VkIHZpYSBVUkwgcGF0aCBhbmQgSFRUUCByZXF1ZXN0IGJvZHkuCiAgMy4gSWYgW0h0dHBSdWxlLmJvZHldW2dvb2dsZS5hcGkuSHR0cFJ1bGUuYm9keV0gaXMgb21pdHRlZCwgdGhlcmUgaXMgbm8gSFRUUAogIHJlcXVlc3QgYm9keSwgYWxsCiAgICAgZmllbGRzIGFyZSBwYXNzZWQgdmlhIFVSTCBwYXRoIGFuZCBVUkwgcXVlcnkgcGFyYW1ldGVycy4KCiAjIyMgUGF0aCB0ZW1wbGF0ZSBzeW50YXgKCiAgICAgVGVtcGxhdGUgPSAiLyIgU2VnbWVudHMgWyBWZXJiIF0gOwogICAgIFNlZ21lbnRzID0gU2VnbWVudCB7ICIvIiBTZWdtZW50IH0gOwogICAgIFNlZ21lbnQgID0gIioiIHwgIioqIiB8IExJVEVSQUwgfCBWYXJpYWJsZSA7CiAgICAgVmFyaWFibGUgPSAieyIgRmllbGRQYXRoIFsgIj0iIFNlZ21lbnRzIF0gIn0iIDsKICAgICBGaWVsZFBhdGggPSBJREVOVCB7ICIuIiBJREVOVCB9IDsKICAgICBWZXJiICAgICA9ICI6IiBMSVRFUkFMIDsKCiBUaGUgc3ludGF4IGAqYCBtYXRjaGVzIGEgc2luZ2xlIFVSTCBwYXRoIHNlZ21lbnQuIFRoZSBzeW50YXggYCoqYCBtYXRjaGVzCiB6ZXJvIG9yIG1vcmUgVVJMIHBhdGggc2VnbWVudHMsIHdoaWNoIG11c3QgYmUgdGhlIGxhc3QgcGFydCBvZiB0aGUgVVJMIHBhdGgKIGV4Y2VwdCB0aGUgYFZlcmJgLgoKIFRoZSBzeW50YXggYFZhcmlhYmxlYCBtYXRjaGVzIHBhcnQgb2YgdGhlIFVSTCBwYXRoIGFzIHNwZWNpZmllZCBieSBpdHMKIHRlbXBsYXRlLiBBIHZhcmlhYmxlIHRlbXBsYXRlIG11c3Qgbm90IGNvbnRhaW4gb3RoZXIgdmFyaWFibGVzLiBJZiBhIHZhcmlhYmxlCiBtYXRjaGVzIGEgc2luZ2xlIHBhdGggc2VnbWVudCwgaXRzIHRlbXBsYXRlIG1heSBiZSBvbWl0dGVkLCBlLmcuIGB7dmFyfWAKIGlzIGVxdWl2YWxlbnQgdG8gYHt2YXI9Kn1gLgoKIFRoZSBzeW50YXggYExJVEVSQUxgIG1hdGNoZXMgbGl0ZXJhbCB0ZXh0IGluIHRoZSBVUkwgcGF0aC4gSWYgdGhlIGBMSVRFUkFMYAogY29udGFpbnMgYW55IHJlc2VydmVkIGNoYXJhY3Rlciwgc3VjaCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBwZXJjZW50LWVuY29kZWQKIGJlZm9yZSB0aGUgbWF0Y2hpbmcuCgogSWYgYSB2YXJpYWJsZSBjb250YWlucyBleGFjdGx5IG9uZSBwYXRoIHNlZ21lbnQsIHN1Y2ggYXMgYCJ7dmFyfSJgIG9yCiBgInt2YXI9Kn0iYCwgd2hlbiBzdWNoIGEgdmFyaWFibGUgaXMgZXhwYW5kZWQgaW50byBhIFVSTCBwYXRoIG9uIHRoZSBjbGllbnQKIHNpZGUsIGFsbCBjaGFyYWN0ZXJzIGV4Y2VwdCBgWy1fLn4wLTlhLXpBLVpdYCBhcmUgcGVyY2VudC1lbmNvZGVkLiBUaGUKIHNlcnZlciBzaWRlIGRvZXMgdGhlIHJldmVyc2UgZGVjb2RpbmcuIFN1Y2ggdmFyaWFibGVzIHNob3cgdXAgaW4gdGhlCiBbRGlzY292ZXJ5CiBEb2N1bWVudF0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZGlzY292ZXJ5L3YxL3JlZmVyZW5jZS9hcGlzKSBhcwogYHt2YXJ9YC4KCiBJZiBhIHZhcmlhYmxlIGNvbnRhaW5zIG11bHRpcGxlIHBhdGggc2VnbWVudHMsIHN1Y2ggYXMgYCJ7dmFyPWZvby8qfSJgCiBvciBgInt2YXI9Kip9ImAsIHdoZW4gc3VjaCBhIHZhcmlhYmxlIGlzIGV4cGFuZGVkIGludG8gYSBVUkwgcGF0aCBvbiB0aGUKIGNsaWVudCBzaWRlLCBhbGwgY2hhcmFjdGVycyBleGNlcHQgYFstXy5+LzAtOWEtekEtWl1gIGFyZSBwZXJjZW50LWVuY29kZWQuCiBUaGUgc2VydmVyIHNpZGUgZG9lcyB0aGUgcmV2ZXJzZSBkZWNvZGluZywgZXhjZXB0ICIlMkYiIGFuZCAiJTJmIiBhcmUgbGVmdAogdW5jaGFuZ2VkLiBTdWNoIHZhcmlhYmxlcyBzaG93IHVwIGluIHRoZQogW0Rpc2NvdmVyeQogRG9jdW1lbnRdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Rpc2NvdmVyeS92MS9yZWZlcmVuY2UvYXBpcykgYXMKIGB7K3Zhcn1gLgoKICMjIFVzaW5nIGdSUEMgQVBJIFNlcnZpY2UgQ29uZmlndXJhdGlvbgoKIGdSUEMgQVBJIFNlcnZpY2UgQ29uZmlndXJhdGlvbiAoc2VydmljZSBjb25maWcpIGlzIGEgY29uZmlndXJhdGlvbiBsYW5ndWFnZQogZm9yIGNvbmZpZ3VyaW5nIGEgZ1JQQyBzZXJ2aWNlIHRvIGJlY29tZSBhIHVzZXItZmFjaW5nIHByb2R1Y3QuIFRoZQogc2VydmljZSBjb25maWcgaXMgc2ltcGx5IHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgZ29vZ2xlLmFwaS5TZXJ2aWNlYAogcHJvdG8gbWVzc2FnZS4KCiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhbm5vdGF0aW5nIHlvdXIgcHJvdG8gZmlsZSwgeW91IGNhbiBjb25maWd1cmUgZ1JQQwogdHJhbnNjb2RpbmcgaW4geW91ciBzZXJ2aWNlIGNvbmZpZyBZQU1MIGZpbGVzLiBZb3UgZG8gdGhpcyBieSBzcGVjaWZ5aW5nIGEKIGBIdHRwUnVsZWAgdGhhdCBtYXBzIHRoZSBnUlBDIG1ldGhvZCB0byBhIFJFU1QgZW5kcG9pbnQsIGFjaGlldmluZyB0aGUgc2FtZQogZWZmZWN0IGFzIHRoZSBwcm90byBhbm5vdGF0aW9uLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHlvdQogaGF2ZSBhIHByb3RvIHRoYXQgaXMgcmV1c2VkIGluIG11bHRpcGxlIHNlcnZpY2VzLiBOb3RlIHRoYXQgYW55IHRyYW5zY29kaW5nCiBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2UgY29uZmlnIHdpbGwgb3ZlcnJpZGUgYW55IG1hdGNoaW5nIHRyYW5zY29kaW5nCiBjb25maWd1cmF0aW9uIGluIHRoZSBwcm90by4KCiBFeGFtcGxlOgoKICAgICBodHRwOgogICAgICAgcnVsZXM6CiAgICAgICAgICMgU2VsZWN0cyBhIGdSUEMgbWV0aG9kIGFuZCBhcHBsaWVzIEh0dHBSdWxlIHRvIGl0LgogICAgICAgICAtIHNlbGVjdG9yOiBleGFtcGxlLnYxLk1lc3NhZ2luZy5HZXRNZXNzYWdlCiAgICAgICAgICAgZ2V0OiAvdjEvbWVzc2FnZXMve21lc3NhZ2VfaWR9L3tzdWIuc3ViZmllbGR9CgogIyMgU3BlY2lhbCBub3RlcwoKIFdoZW4gZ1JQQyBUcmFuc2NvZGluZyBpcyB1c2VkIHRvIG1hcCBhIGdSUEMgdG8gSlNPTiBSRVNUIGVuZHBvaW50cywgdGhlCiBwcm90byB0byBKU09OIGNvbnZlcnNpb24gbXVzdCBmb2xsb3cgdGhlIFtwcm90bzMKIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvbikuCgogV2hpbGUgdGhlIHNpbmdsZSBzZWdtZW50IHZhcmlhYmxlIGZvbGxvd3MgdGhlIHNlbWFudGljcyBvZgogW1JGQyA2NTcwXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU3MCkgU2VjdGlvbiAzLjIuMiBTaW1wbGUgU3RyaW5nCiBFeHBhbnNpb24sIHRoZSBtdWx0aSBzZWdtZW50IHZhcmlhYmxlICoqZG9lcyBub3QqKiBmb2xsb3cgUkZDIDY1NzAgU2VjdGlvbgogMy4yLjMgUmVzZXJ2ZWQgRXhwYW5zaW9uLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIFJlc2VydmVkIEV4cGFuc2lvbgogZG9lcyBub3QgZXhwYW5kIHNwZWNpYWwgY2hhcmFjdGVycyBsaWtlIGA/YCBhbmQgYCNgLCB3aGljaCB3b3VsZCBsZWFkCiB0byBpbnZhbGlkIFVSTHMuIEFzIHRoZSByZXN1bHQsIGdSUEMgVHJhbnNjb2RpbmcgdXNlcyBhIGN1c3RvbSBlbmNvZGluZwogZm9yIG11bHRpIHNlZ21lbnQgdmFyaWFibGVzLgoKIFRoZSBwYXRoIHZhcmlhYmxlcyAqKm11c3Qgbm90KiogcmVmZXIgdG8gYW55IHJlcGVhdGVkIG9yIG1hcHBlZCBmaWVsZCwKIGJlY2F1c2UgY2xpZW50IGxpYnJhcmllcyBhcmUgbm90IGNhcGFibGUgb2YgaGFuZGxpbmcgc3VjaCB2YXJpYWJsZSBleHBhbnNpb24uCgogVGhlIHBhdGggdmFyaWFibGVzICoqbXVzdCBub3QqKiBjYXB0dXJlIHRoZSBsZWFkaW5nICIvIiBjaGFyYWN0ZXIuIFRoZSByZWFzb24KIGlzIHRoYXQgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlICJ7dmFyfSIgZG9lcyBub3QgY2FwdHVyZSB0aGUgbGVhZGluZyAiLyIKIGNoYXJhY3Rlci4gRm9yIGNvbnNpc3RlbmN5LCBhbGwgcGF0aCB2YXJpYWJsZXMgbXVzdCBzaGFyZSB0aGUgc2FtZSBiZWhhdmlvci4KCiBSZXBlYXRlZCBtZXNzYWdlIGZpZWxkcyBtdXN0IG5vdCBiZSBtYXBwZWQgdG8gVVJMIHF1ZXJ5IHBhcmFtZXRlcnMsIGJlY2F1c2UKIG5vIGNsaWVudCBsaWJyYXJ5IGNhbiBzdXBwb3J0IHN1Y2ggY29tcGxpY2F0ZWQgbWFwcGluZy4KCiBJZiBhbiBBUEkgbmVlZHMgdG8gdXNlIGEgSlNPTiBhcnJheSBmb3IgcmVxdWVzdCBvciByZXNwb25zZSBib2R5LCBpdCBjYW4gbWFwCiB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBib2R5IHRvIGEgcmVwZWF0ZWQgZmllbGQuIEhvd2V2ZXIsIHNvbWUgZ1JQQwogVHJhbnNjb2RpbmcgaW1wbGVtZW50YXRpb25zIG1heSBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCgoLCgMEAQESBLsCCBAKjwEKBAQBAgASBMACAhYagAEgU2VsZWN0cyBhIG1ldGhvZCB0byB3aGljaCB0aGlzIHJ1bGUgYXBwbGllcy4KCiBSZWZlciB0byBbc2VsZWN0b3JdW2dvb2dsZS5hcGkuRG9jdW1lbnRhdGlvblJ1bGUuc2VsZWN0b3JdIGZvciBzeW50YXgKIGRldGFpbHMuCgoNCgUEAQIABRIEwAICCAoNCgUEAQIAARIEwAIJEQoNCgUEAQIAAxIEwAIUFQrQAQoEBAEIABIGxQIC2wIDGr8BIERldGVybWluZXMgdGhlIFVSTCBwYXR0ZXJuIGlzIG1hdGNoZWQgYnkgdGhpcyBydWxlcy4gVGhpcyBwYXR0ZXJuIGNhbiBiZQogdXNlZCB3aXRoIGFueSBvZiB0aGUge2dldHxwdXR8cG9zdHxkZWxldGV8cGF0Y2h9IG1ldGhvZHMuIEEgY3VzdG9tIG1ldGhvZAogY2FuIGJlIGRlZmluZWQgdXNpbmcgdGhlICdjdXN0b20nIGZpZWxkLgoKDQoFBAEIAAESBMUCCA8KXAoEBAECARIEyAIEExpOIE1hcHMgdG8gSFRUUCBHRVQuIFVzZWQgZm9yIGxpc3RpbmcgYW5kIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQKIHJlc291cmNlcy4KCg0KBQQBAgEFEgTIAgQKCg0KBQQBAgEBEgTIAgsOCg0KBQQBAgEDEgTIAhESCkAKBAQBAgISBMsCBBMaMiBNYXBzIHRvIEhUVFAgUFVULiBVc2VkIGZvciByZXBsYWNpbmcgYSByZXNvdXJjZS4KCg0KBQQBAgIFEgTLAgQK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IHZlcmIuCgoNCgUEAgIABRIE9gICCAoNCgUEAgIAARIE9gIJDQoNCgUEAgIAAxIE9gIQEQo1CgQEAgIBEgT5AgISGicgVGhlIHBhdGggbWF0Y2hlZCBieSB0aGlzIGN1c3RvbSB2ZXJiLgoKDQoFBAICAQUSBPkCAggKDQoFBAICAQESBPkCCQ0KDQoFBAICAQMSBPkCEBFiBnByb3RvMwriwgMKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb25K/fsCCgcSBSYAgwgBCqoPCgEMEgMmABIywQwgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCgogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiBtZXQ6CgogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKIGRpc3RyaWJ1dGlvbi4KICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKIE9GIFRISVMgU09GVFdBUkUsIEVW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cyBmaWVsZC4gVGhlIHZhbHVlIGlzIHNldCBieSBwcm90b2NvbCBjb21waWxlci4gSWYgdGhlCiB1c2VyIGhhcyBzZXQgYSAianNvbl9uYW1lIiBvcHRpb24gb24gdGhpcyBmaWVsZCwgdGhhdCBvcHRpb24ncyB2YWx1ZQogd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIGl0J3MgZGVkdWNlZCBmcm9tIHRoZSBmaWVsZCdzIG5hbWUgYnkgY29udmVydGluZwogaXQgdG8gY2FtZWxDYXNlLgoKDQoFBAQCCAQSBIICAgoKDQoFBAQCCAUSBIICCxEKDQoFBAQCCAESBIICEhsKDQoFBAQCCAMSBIICHiAKDAoEBAQCCRIEhAICJAoNCgUEBAIJBBIEhAICCgoNCgUEBAIJBhIEhAILFwoNCgUEBAIJARIEhAIYHwoNCgUEBAIJAxIEhAIiIwqzCQoEBAQCChIEmwICJRqkCSBJZiB0cnVlLCB0aGlzIGlzIGEgcHJvdG8zICJvcHRpb25hbCIuIFdoZW4gYSBwcm90bzMgZmllbGQgaXMgb3B0aW9uYWwsIGl0CiB0cmFja3MgcHJlc2VuY2UgcmVnYXJkbGVzcyBvZiBmaWVsZCB0eXBlLgoKIFdoZW4gcHJvdG8zX29wdGlvbmFsIGlzIHRydWUsIHRoaXMgZmllbGQgbXVzdCBiZSBiZWxvbmcgdG8gYSBvbmVvZiB0bwogc2lnbmFsIHRvIG9sZCBwcm90bzMgY2xpZW50cyB0aGF0IHByZXNlbmNlIGlzIHRyYWNrZWQgZm9yIHRoaXMgZmllbGQuIFRoaXMKIG9uZW9mIGlzIGtub3duIGFzIGEgInN5bnRoZXRpYyIgb25lb2YsIGFuZCB0aGlzIGZpZWxkIG11c3QgYmUgaXRzIHNvbGUKIG1lbWJlciAoZWFjaCBwcm90bzMgb3B0aW9uYWwgZmllbGQgZ2V0cyBpdHMgb3duIHN5bnRoZXRpYyBvbmVvZikuIFN5bnRoZXRpYwogb25lb2ZzIGV4aXN0IGluIHRoZSBkZXNjcmlwdG9yIG9ubHksIGFuZCBkbyBub3QgZ2VuZXJhdGUgYW55IEFQSS4gU3ludGhldGljCiBvbmVvZnMgbXVzdCBiZSBvcmRlcmVkIGFmdGVyIGFsbCAicmVhbCIgb25lb2ZzLgoKIEZvciBtZXNzYWdlIGZpZWxkcywgcHJvdG8zX29wdGlvbmFsIGRvZXNuJ3QgY3JlYXRlIGFueSBzZW1hbnRpYyBjaGFuZ2UsCiBzaW5jZSBub24tcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYWx3YXlzIHRyYWNrIHByZXNlbmNlLiBIb3dldmVyIGl0IHN0aWxsCiBpbmRpY2F0ZXMgdGhlIHNlbWFudGljIGRldGFpbCBvZiB3aGV0aGVyIHRoZSB1c2VyIHdyb3RlICJvcHRpb25hbCIgb3Igbm90LgogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciByb3VuZC10cmlwcGluZyB0aGUgLnByb3RvIGZpbGUuIEZvciBjb25zaXN0ZW5jeSB3ZQogZ2l2ZSBtZXNzYWdlIGZpZWxkcyBhIHN5bnRoZXRpYyBvbmVvZiBhbHNvLCBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQKIHRvIHRyYWNrIHByZXNlbmNlLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHBhcnNlciBjYW4ndAogdGVsbCBpZiBhIGZpZWxkIGlzIGEgbWVzc2FnZSBvciBhbiBlbnVtLCBzbyBpdCBtdXN0IGFsd2F5cyBjcmVhdGUgYQogc3ludGhldGljIG9uZW9mLgoKIFByb3RvMiBvcHRpb25hbCBmaWVsZHMgZG8gbm90IHNldCB0aGlzIGZsYWcsIGJlY2F1c2UgdGhleSBhbHJlYWR5IGluZGljYXRlCiBvcHRpb25hbCB3aXRoIGBMQUJFTF9PUFRJT05BTGAuCgoNCgUEBAIKBBIEmwICCgoNCgUEBAIKBRIEmwILDwoNCgUEBAIKARIEmwIQHwoNCgUEBAIKAxIEmwIiJAoiCgIEBRIGnwIAogIBGhQgRGVzY3JpYmVzIGEgb25lb2YuCgoLCgMEBQESBJ8CCBwKDAoEBAUCABIEoAICGwoNCgUEBQIABBIEoAICCgoNCgUEBQIABRIEoAILEQoNCgUEBQIAARIEoAISFgoNCgUEBQIAAxIEoAIZGgoMCgQEBQIBEgShAgIkCg0KBQQFAgEEEgShAgIKCg0KBQQFAgEGEgShAgsXCg0KBQQFAgEBEgShAhgf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ZSBkZWZpbml0aW9ucyBhYm92ZSBtYXkgaGF2ZSAib3B0aW9ucyIgYXR0YWNoZWQuICBUaGVzZSBhcmUKIGp1c3QgYW5ub3RhdGlvbnMgd2hpY2ggbWF5IGNhdXNlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIHNsaWdodGx5IGRpZmZlcmVudGx5CiBvciBtYXkgY29udGFpbiBoaW50cyBmb3IgY29kZSB0aGF0IG1hbmlwdWxhdGVzIHByb3RvY29sIG1lc3NhZ2VzLgoKIENsaWVudHMgbWF5IGRlZmluZSBjdXN0b20gb3B0aW9ucyBhcyBleHRlbnNpb25zIG9mIHRoZSAqT3B0aW9ucyBtZXNzYWdlcy4KIFRoZXNlIGV4dGVuc2lvbnMgbWF5IG5vdCB5ZXQgYmUga25vd24gYXQgcGFyc2luZyB0aW1lLCBzbyB0aGUgcGFyc2VyIGNhbm5vdAogc3RvcmUgdGhlIHZhbHVlcyBpbiB0aGVtLiAgSW5zdGVhZCBpdCBzdG9yZXMgdGhlbSBpbiBhIGZpZWxkIGluIHRoZSAqT3B0aW9ucwogbWVzc2FnZSBjYWxsZWQgdW5pbnRlcnByZXRlZF9vcHRpb24uIFRoaXMgZmllbGQgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWUKIGFjcm9zcyBhbGwgKk9wdGlvbnMgbWVzc2FnZXMuIFdlIHRoZW4gdXNlIHRoaXMgZmllbGQgdG8gcG9wdWxhdGUgdGhlCiBleHRlbnNpb25zIHdoZW4gd2UgYnVpbGQgYSBkZXNjcmlwdG9yLCBhdCB3aGljaCBwb2ludCBhbGwgcHJvdG9zIGhhdmUgYmVlbgogcGFyc2VkIGFuZCBzbyBhbGwgZXh0ZW5zaW9ucyBhcmUga25vd24uCgogRXh0ZW5zaW9uIG51bWJlcnMgZm9yIGN1c3RvbSBvcHRpb25zIG1heSBiZSBjaG9zZW4gYXMgZm9sbG93czoKICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBvbmx5IGJlIHVzZWQgd2l0aGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uIG9yCiAgIG9yZ2FuaXphdGlvbiwgb3IgZm9yIGV4cGVyaW1lbnRhbCBvcHRpb25zLCB1c2UgZmllbGQgbnVtYmVycyA1MDAwMAogICB0aHJvdWdoIDk5OTk5LiAgSXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHlvdSBkbyBub3QgdXNlIHRoZQogICBzYW1lIG51bWJlciBmb3IgbXVsdGlwbGUgb3B0aW9ucy4KICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwdWJsaXNoZWQgYW5kIHVzZWQgcHVibGljbHkgYnkgbXVsdGlwbGUKICAgaW5kZXBlbmRlbnQgZW50aXRpZXMsIGUtbWFpbCBwcm90b2J1Zi1nbG9iYWwtZXh0ZW5zaW9uLXJlZ2lzdHJ5QGdvb2dsZS5jb20KICAgdG8gcmVzZXJ2ZSBleHRlbnNpb24gbnVtYmVycy4gU2ltcGx5IHByb3ZpZGUgeW91ciBwcm9qZWN0IG5hbWUgKGUuZy4KICAgT2JqZWN0aXZlLUMgcGx1Z2luKSBhbmQgeW91ciBwcm9qZWN0IHdlYnNpdGUgKGlmIGF2YWlsYWJsZSkgLS0gdGhlcmUncyBubwogICBuZWVkIHRvIGV4cGxhaW4gaG93IHlvdSBpbnRlbmQgdG8gdXNlIHRoZW0uIFVzdWFsbHkgeW91IG9ubHkgbmVlZCBvbmUKICAgZXh0ZW5zaW9uIG51bWJlci4gWW91IGNhbiBkZWNsYXJlIG11bHRpcGxlIG9wdGlvbnMgd2l0aCBvbmx5IG9uZSBleHRlbnNpb24KICAgbnVtYmVyIGJ5IHB1dHRpbmcgdGhlbSBpbiBhIHN1Yi1tZXNzYWdlLiBTZWUgdGhlIEN1c3RvbSBPcHRpb25zIHNlY3Rpb24gb2YKICAgdGhlIGRvY3MgZm9yIGV4YW1wbGVzOgogICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8jb3B0aW9ucwogICBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBwb3B1bGFyLCBhIHdlYiBzZXJ2aWNlIHdpbGwgYmUgc2V0IHVwCiAgIHRvIGF1dG9tYXRpY2FsbHkgYXNzaWduIG9wdGlvbiBudW1iZXJzLgoKCwoDBAoBEgSCAwgTCvQBCgQECgIAEgSIAwIjGuUBIFNldHMgdGhlIEphdmEgcGFja2FnZSB3aGVyZSBjbGFzc2VzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKIHBsYWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwcm90byBwYWNrYWdlIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9mdGVuCiBpbmFwcHJvcHJpYXRlIGJlY2F1c2UgcHJvdG8gcGFja2FnZXMgZG8gbm90IG5vcm1hbGx5IHN0YXJ0IHdpdGggYmFja3dhcmRzCiBkb21haW4gbmFtZXMuCgoNCgUECgIABBIEiAMCCgoNCgUECgIABRIEiAMLEQoNCgUECgIAARIEiAMSHgoNCgUECgIAAxIEiAMhIgrxAgoEBAoCARIEjwMCKxriAiBDb250cm9scyB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBKYXZhIGNsYXNzIGdlbmVyYXRlZCBmb3IgdGhlIC5wcm90byBmaWxlLgogVGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBjb250YWluIHRoZSAucHJvdG8gZmlsZSdzIGdldERlc2NyaXB0b3IoKSBtZXRob2QgYXMKIHdlbGwgYXMgYW55IHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgogSWYgamF2YV9tdWx0aXBsZV9maWxlcyBpcyBkaXNhYmxlZCwgdGhlbiBhbGwgdGhlIG90aGVyIGNsYXNzZXMgZnJvbSB0aGUKIC5wcm90byBmaWxlIHdpbGwgYmUgbmVzdGVkIGluc2lkZSB0aGUgc2luZ2xlIHdyYXBwZXIgb3V0ZXIgY2xhc3MuCgoNCgUECgIBBBIEjwMCCgoNCgUECgIBBRIEjwMLEQoNCgUECgIBARIEjwMSJgoNCgUECgIBAxIEjwMpKgqmAwoEBAoCAhIElwMCOxqXAyBJZiBlbmFibGVkLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBzZXBhcmF0ZSAuamF2YQogZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCiBmaWxlLiAgVGh1cywgdGhlc2UgdHlwZXMgd2lsbCAqbm90KiBiZSBuZXN0ZWQgaW5z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BAQKCQASBPUDCw0KDQoFBAoJAAESBPUDCw0KDQoFBAoJAAISBPUDCw0KDAoCBAsSBvgDAMUEAQoLCgMECwESBPgDCBYK2AUKBAQLAgASBIsEAj4ayQUgU2V0IHRydWUgdG8gdXNlIHRoZSBvbGQgcHJvdG8xIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgZm9yIGV4dGVuc2lvbnMuCiBUaGlzIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNZXNzYWdlU2V0IHdpcmUKIGZvcm1hdC4gIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGZvciBhbnkgb3RoZXIgcmVhc29uOiAgSXQncyBsZXNzCiBlZmZpY2llbnQsIGhhcyBmZXdlciBmZWF0dXJlcywgYW5kIGlzIG1vcmUgY29tcGxpY2F0ZWQuCgogVGhlIG1lc3NhZ2UgbXVzdCBiZSBkZWZpbmVkIGV4YWN0bHkgYXMgZm9sbG93czoKICAgbWVzc2FnZSBGb28gewogICAgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7CiAgICAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKICAgfQogTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGNhbm5vdCBoYXZlIGFueSBkZWZpbmVkIGZpZWxkczsgTWVzc2FnZVNldHMgb25seQogaGF2ZSBleHRlbnNpb25zLgoKIEFsbCBleHRlbnNpb25zIG9mIHlvdXIgdHlwZSBtdXN0IGJlIHNpbmd1bGFyIG1lc3NhZ2VzOyBlLmcuIHRoZXkgY2Fubm90CiBiZSBpbnQzMnMsIGVudW1zLCBvciByZXBlYXRlZCBtZXNzYWdlcy4KCiBCZWNhdXNlIHRoaXMgaXMgYW4gb3B0aW9uLCB0aGUgYWJvdmUgdHdvIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIGJ5CiB0aGUgcHJvdG9jb2wgY29tcGlsZXIuCgoNCgUECwIABBIEiwQCCgoNCgUECwIABRIEiwQLDwoNCgUECwIAARIEiwQQJwoNCgUECwIAAxIEiwQqKwoNCgUECwIACBIEiwQsPQoNCgUECwIABxIEiwQ3PArrAQoEBAsCARIEkAQCRhrcASBEaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3RhbmRhcmQgImRlc2NyaXB0b3IoKSIgYWNjZXNzb3IsIHdoaWNoIGNhbgogY29uZmxpY3Qgd2l0aCBhIGZpZWxkIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG1lYW50IHRvIG1ha2UgbWlncmF0aW9uCiBmcm9tIHByb3RvMSBlYXNpZXI7IG5ldyBjb2RlIHNob3VsZCBhdm9pZCBmaWVsZHMgbmFtZWQgImRlc2NyaXB0b3IiLgoKDQoFBAsCAQQSBJAEAgoKDQoFBAsCAQUSBJAECw8KDQoFBAsCAQESBJAEEC8KDQoFBAsCAQMSBJAEMjMKDQoFBAsCAQgSBJAENEUKDQoFBAsCAQcSBJAEP0QK7gEKBAQLAgISBJYEAjEa3wEgSXMgdGhpcyBtZXNzYWdlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgdGhlIG1lc3NhZ2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBtZXNzYWdlcy4KCg0KBQQLAgIEEgSWBAIKCg0KBQQLAgIFEgSWBAsPCg0KBQQLAgIBEgSWBBAaCg0KBQQLAgIDEgSWBB0eCg0KBQQLAgIIEgSWBB8wCg0KBQQLAgIHEgSWBCovCgsKAwQLCRIEmAQCEwoMCgQECwkAEgSYBAsMCg0KBQQLCQABEgSYBAsMCg0KBQQLCQACEgSYBAsMCgwKBAQLCQESBJgEDg8KDQoFBAsJAQESBJgEDg8KDQoFBAsJAQISBJgEDg8KDAoEBAsJAhIEmAQREgoNCgUECwkCARIEmAQREgoNCgUECwkCAhIEmAQREgqgBgoEBAsCAxIErwQCHhqRBiBOT1RFOiBEbyBub3Qgc2V0IHRoZSBvcHRpb24gaW4gLnByb3RvIGZpbGVzLiBBbHdheXMgdXNlIHRoZSBtYXBzIHN5bnRheAogaW5zdGVhZC4gVGhlIG9wdGlvbiBzaG91bGQgb25seSBiZSBpbXBsaWNpdGx5IHNldCBieSB0aGUgcHJvdG8gY29tcGlsZXIKIHBhcnNlci4KCiBXaGV0aGVyIHRoZSBtZXNzYWdlIGlzIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1hcCBlbnRyeSB0eXBlIGZvciB0aGUKIG1hcHMgZmllbGQuCgogRm9yIG1hcHMgZmllbGRzOgogICAgIG1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IG1hcF9maWVsZCA9IDE7CiBUaGUgcGFyc2VkIGRlc2NyaXB0b3IgbG9va3MgbGlrZToKICAgICBtZXNzYWdlIE1hcEZpZWxkRW50cnkgewogICAgICAgICBvcHRpb24gbWFwX2VudHJ5ID0gdHJ1ZTsKICAgICAgICAgb3B0aW9uYWwgS2V5VHlwZSBrZXkgPSAxOwogICAgICAgICBvcHRpb25hbCBWYWx1ZVR5cGUgdmFsdWUgPSAyOwogICAgIH0KICAgICByZXBlYXRlZCBNYXBGaWVsZEVudHJ5IG1hcF9maWVsZCA9IDE7CgogSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGdlbmVyYXRlIHRoZSBtYXBfZW50cnk9dHJ1ZSBtZXNzYWdlLCBidXQKIHVzZSBhIG5hdGl2ZSBtYXAgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0byBob2xkIHRoZSBrZXlzIGFuZCB2YWx1ZXMuCiBUaGUgcmVmbGVjdGlvbiBBUElzIGluIHN1Y2ggaW1wbGVtZW50YXRpb25zIHN0aWxsIG5lZWQgdG8gd29yayBhcwogaWYgdGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KCg0KBQQLAgMEEgSvBAIKCg0KBQQLAgMFEgSvBAsPCg0KBQQLAgMBEgSvBBAZCg0KBQQLAgMDEgSvBBwdCiQKAwQLCRIEsQQCDSIXIGphdmFsaXRlX3NlcmlhbGl6YWJsZQoKDAoEBAsJAxIEsQQLDAoNCgUECwkDARIEsQQLDAoNCgUECwkDAhIEsQQLDAofCgMECwkSBLIEAg0iEiBqYXZhbmFub19hc19saXRlCgoMCgQECwkEEgSyBAsMCg0KBQQLCQQBEgSyBAsM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IGEKIENvcmQsIG9yIHdoZW4gcGFyc2luZyB3aXRoIGFsaWFzaW5nIGVuYWJsZWQsIGFzIHRoZSBwYXJzZWQgQ29yZCBtYXkgdGhlbgogYWxpYXMgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KCg8KBwQMBAACAQESBNkEBAgKDwoHBAwEAAIBAhIE2QQLDAoOCgYEDAQAAgISBNsEBBUKDwoHBAwEAAICARIE2wQEEAoPCgcEDAQAAgICEgTbBBMUCtoCCgQEDAIBEgTiBAIbGssCIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQogd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwogYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwogZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuCgoNCgUEDAIBBBIE4gQCCgoNCgUEDAIBBRIE4gQLDwoNCgUEDAIBARIE4gQQFgoNCgUEDAIBAxIE4gQZGgqaBQoEBAwCAhIE7wQCMxqLBSBUaGUganN0eXBlIG9wdGlvbiBkZXRlcm1pbmVzIHRoZSBKYXZhU2NyaXB0IHR5cGUgdXNlZCBmb3IgdmFsdWVzIG9mIHRoZQogZmllbGQuICBUaGUgb3B0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGZvciA2NCBiaXQgaW50ZWdyYWwgYW5kIGZpeGVkIHR5cGVzCiAoaW50NjQsIHVpbnQ2NCwgc2ludDY0LCBmaXhlZDY0LCBzZml4ZWQ2NCkuICBBIGZpZWxkIHdpdGgganN0eXBlIEpTX1NUUklORwogaXMgcmVwcmVzZW50ZWQgYXMgSmF2YVNjcmlwdCBzdHJpbmcsIHdoaWNoIGF2b2lkcyBsb3NzIG9mIHByZWNpc2lvbiB0aGF0CiBjYW4gaGFwcGVuIHdoZW4gYSBsYXJnZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBmbG9hdGluZyBwb2ludCBKYXZhU2NyaXB0LgogU3BlY2lmeWluZyBKU19OVU1CRVIgZm9yIHRoZSBqc3R5cGUgY2F1c2VzIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBjb2RlIHRvCiB1c2UgdGhlIEphdmFTY3JpcHQgIm51bWJlciIgdHlwZS4gIFRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBvcHRpb24KIEpTX05PUk1BTCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCgogVGhpcyBvcHRpb24gaXMgYW4gZW51bSB0byBwZXJtaXQgYWRkaXRpb25hbCB0eXBlcyB0byBiZSBhZGRlZCwgZS5nLgogZ29vZy5tYXRoLkludGVnZXIuCgoNCgUEDAICBBIE7wQCCgoNCgUEDAICBhIE7wQLEQoNCgUEDAICARIE7wQSGAoNCgUEDAICAxIE7wQbHAoNCgUEDAICCBIE7wQdMgoNCgUEDAICBxIE7wQoMQoOCgQEDAQBEgbwBAL5BAMKDQoFBAwEAQESBPAEBw0KJwoGBAwEAQIAEgTyBAQSGhcgVXNlIHRoZSBkZWZhdWx0IHR5cGUuCgoPCgcEDAQBAgABEgTyBAQNCg8KBwQMBAECAAISBPIEEBEKKQoGBAwEAQIBEgT1BAQSGhkgVXNlIEphdmFTY3JpcHQgc3RyaW5ncy4KCg8KBwQMBAECAQESBPUEBA0KDwoHBAwEAQIBAhIE9QQQEQopCgYEDAQBAgISBPgEBBIaGSBVc2UgSmF2YVNjcmlwdCBudW1iZXJzLgoKDwoHBAwEAQICARIE+AQEDQoPCgcEDAQBAgICEgT4BBARCv8NCgQEDAIDEgSZBQIrGvANIFNob3VsZCB0aGlzIGZpZWxkIGJlIHBhcnNlZCBsYXppbHk/ICBMYXp5IGFwcGxpZXMgb25seSB0byBtZXNzYWdlLXR5cGUKIGZpZWxkcy4gIEl0IG1lYW5zIHRoYXQgd2hlbiB0aGUgb3V0ZXIgbWVzc2FnZSBpcyBpbml0aWFsbHkgcGFyc2VkLCB0aGUKIGlubmVyIG1lc3NhZ2UncyBjb250ZW50cyB3aWxsIG5vdCBiZSBwYXJzZWQgYnV0IGluc3RlYWQgc3RvcmVkIGluIGVuY29kZWQKIGZvcm0uICBUaGUgaW5uZXIgbWVzc2FnZSB3aWxsIGFjdHVhbGx5IGJlIHBhcnNlZCB3aGVuIGl0IGlzIGZpcnN0IGFjY2Vzc2VkLgoKIFRoaXMgaXMgb25seSBhIGhpbnQuICBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCiBlYWdlciBvciBsYXp5IHBhcnNpbmcgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24uICBIb3dldmVyLAogc2V0dGluZyB0aGlzIG9wdGlvbiB0cnVlIHN1Z2dlc3RzIHRoYXQgdGhlIHByb3RvY29sIGF1dGhvciBiZWxpZXZlcyB0aGF0CiB1c2luZyBsYXp5IHBhcnNpbmcgb24gdGhpcyBmaWVsZCBpcyB3b3J0aCB0aGUgYWRkaXRpb25hbCBib29ra2VlcGluZwogb3ZlcmhlYWQgdHlwaWNhbGx5IG5lZWRlZCB0byBpbXBsZW1lbnQgaXQuCgogVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIGFueSBnZW5lcmF0ZWQgY29kZTsKIGFsbCBtZXRob2Qgc2lnbmF0dXJlcyByZW1haW4gdGhlIHNhbWUuICBGdXJ0aGVybW9yZSwgdGhyZWFkLXNhZmV0eSBvZiB0aGUKIGludGVyZmFjZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb247IGNvbnN0IG1ldGhvZHMgcmVtYWluIHNhZmUgdG8KIGNhbGwgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgd2hpbGUgbm9uLWNvbnN0IG1ldGhvZHMgY29udGludWUKIHRvIHJlcXVpcmUgZXhjbHVzaXZlIGFjY2Vzcy4KCiBOb3RlIHRoYXQgaW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGNoZWNrIHJlcXVpcmVkIGZpZWxkcyB3aXRoaW4KIGEgbGF6eSBzdWItbWVzc2FnZS4gIFRoYXQgaXMsIGNhbGxpbmcgSXNJbml0aWFsaXplZCgpIG9uIHRoZSBvdXRlciBtZXNzYWdlCiBtYXkgcmV0dXJuIHRydWUgZXZlbiBpZiB0aGUgaW5uZXIgbWVzc2FnZSBoYXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgaW5uZXIgbWVzc2FnZSB3b3VsZCBoYXZlIHRvIGJlCiBwYXJzZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgY2hlY2ssIGRlZmVhdGluZyB0aGUgcHVycG9zZSBvZiBsYXp5CiBwYXJzaW5nLiAgQW4gaW1wbGVtZW50YXRpb24gd2hpY2ggY2hvb3NlcyBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzCiBtdXN0IGJlIGNvbnNpc3RlbnQgYWJvdXQgaXQuICBUaGF0IGlzLCBmb3IgYW55IHBhcnRpY3VsYXIgc3ViLW1lc3NhZ2UsIHRoZQogaW1wbGVtZW50YXRpb24gbXVzdCBlaXRoZXIgKmFsd2F5cyogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgb3IgKm5ldmVyKgogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBoYXMKIGJlZW4gcGFyc2VkLgoKIEFzIG9mIE1heSAyMDIyLCBsYXp5IHZlcmlmaWVzIHRoZSBjb250ZW50cyBvZiB0aGUgYnl0ZSBzdHJlYW0gZHVyaW5nCiBwYXJzaW5nLiAgQW4gaW52YWxpZCBieXRlIHN0cmVhbSB3aWxsIGNhdXNlIHRoZSBvdmVyYWxsIHBhcnNpbmcgdG8gZmFpbC4KCg0KBQQMAgMEEgSZBQIKCg0KBQQMAgMFEgSZBQsPCg0KBQQMAgMBEgSZBRAUCg0KBQQMAgMDEgSZBRcYCg0KBQQMAgMIEgSZBRkqCg0KBQQMAgMHEgSZBSQpCq8BCgQEDAIEEgSeBQI3GqABIHVudmVyaWZpZWRfbGF6eSBkb2VzIG5vIGNvcnJlY3RuZXNzIGNoZWNrcyBvbiB0aGUgYnl0ZSBzdHJlYW0uIFRoaXMgc2hvdWxkCiBvbmx5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EQUAEgS4Bg0YCg0KBQQRBQABEgS4Bg0RCg0KBQQRBQACEgS4BhUYCosDCgIEEhIGwQYA1QYBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgTBBggbCssCCgQEEgMAEgbHBgLKBgMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KIGEgZG90LXNlcGFyYXRlZCBuYW1lLiAgaXNfZXh0ZW5zaW9uIGlzIHRydWUgaWZmIGEgc2VnbWVudCByZXByZXNlbnRzIGFuCiBleHRlbnNpb24gKGRlbm90ZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBvcHRpb25zIHNwZWNzIGluIC5wcm90byBmaWxlcykuCiBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbIm1vbyIsIGZhbHNlXSB9IHJlcHJlc2VudHMKICJmb28uKGJhci5iYXopLm1vbyIuCgoNCgUEEgMAARIExwYKEgoOCgYEEgMAAgASBMgGBCIKDwoHBBIDAAIABBIEyAYEDAoPCgcEEgMAAgAFEgTIBg0TCg8KBwQSAwACAAESBMgGFB0KDwoHBBIDAAIAAxIEyAYgIQoOCgYEEgMAAgESBMkGBCMK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dHNlbGYgKGkuZS4gbm90IHRvIGFueQogICBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiBpdCkuICBUaGlzIGlzIHVzZWQgd2hlbmV2ZXIgYSBzZXQgb2YgZWxlbWVudHMgYXJlCiAgIGxvZ2ljYWxseSBlbmNsb3NlZCBpbiBhIHNpbmdsZSBjb2RlIHNlZ21lbnQuICBGb3IgZXhhbXBsZSwgYW4gZW50aXJlCiAgIGV4dGVuZCBibG9jayAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBleHRlbnNpb24gZGVmaW5pdGlvbnMpIHdpbGwKICAgaGF2ZSBhbiBvdXRlciBsb2NhdGlvbiB3aG9zZSBwYXRoIHJlZmVycyB0byB0aGUgImV4dGVuc2lvbnMiIHJlcGVhdGVkCiAgIGZpZWxkIHdpdGhvdXQgYW4gaW5kZXguCiAtIE11bHRpcGxlIGxvY2F0aW9ucyBtYXkgaGF2ZSB0aGUgc2FtZSBwYXRoLiAgVGhpcyBoYXBwZW5zIHdoZW4gYSBzaW5nbGUKICAgbG9naWNhbCBkZWNsYXJhdGlvbiBpcyBzcHJlYWQgb3V0IGFjcm9zcyBtdWx0aXBsZSBwbGFjZXMuICBUaGUgbW9zdAogICBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlICJleHRlbmQiIGJsb2NrIGFnYWluIC0tIHRoZXJlIG1heSBiZSBtdWx0aXBsZQogICBleHRlbmQgYmxvY2tzIGluIHRoZSBzYW1lIHNjb3BlLCBlYWNoIG9mIHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBwYXRoLgogLSBBIGxvY2F0aW9uJ3Mgc3BhbiBpcyBub3QgYWx3YXlzIGEgc3Vic2V0IG9mIGl0cyBwYXJlbnQncyBzcGFuLiAgRm9yCiAgIGV4YW1wbGUsIHRoZSAiZXh0ZW5kZWUiIG9mIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBhcHBlYXJzIGF0IHRoZQogICBiZWdpbm5pbmcgb2YgdGhlICJleHRlbmQiIGJsb2NrIGFuZCBpcyBzaGFyZWQgYnkgYWxsIGV4dGVuc2lvbnMgd2l0aGluCiAgIHRoZSBibG9jay4KIC0gSnVzdCBiZWNhdXNlIGEgbG9jYXRpb24ncyBzcGFuIGlzIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgbG9jYXRpb24ncyBzcGFuCiAgIGRvZXMgbm90IG1lYW4gdGhhdCBpdCBpcyBhIGRlc2NlbmRhbnQuICBGb3IgZXhhbXBsZSwgYSAiZ3JvdXAiIGRlZmluZXMKICAgYm90aCBhIHR5cGUgYW5kIGEgZmllbGQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBUaHVzLCB0aGUgbG9jYXRpb25zCiAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgYW5kIGZpZWxkIGFuZCB0aGVpciBjb21wb25lbnRzIHdpbGwgb3ZlcmxhcC4KIC0gQ29kZSB3aGljaCB0cmllcyB0byBpbnRlcnByZXQgbG9jYXRpb25zIHNob3VsZCBwcm9iYWJseSBiZSBkZXNpZ25lZCB0bwogICBpZ25vcmUgdGhvc2UgdGhhdCBpdCBkb2Vzbid0IHVuZGVyc3RhbmQsIGFzIG1vcmUgdHlwZXMgb2YgbG9jYXRpb25zIGNvdWxkCiAgIGJlIHJlY29yZGVkIGluIHRoZSBmdXR1cmUuCgoNCgUEEwIABBIEiAcCCgoNCgUEEwIABhIEiAcLEwoNCgUEEwIAARIEiAcUHAoNCgUEEwIAAxIEiAcfIAoOCgQEEwMAEgaJBwLcBwMKDQoFBBMDAAESBIkHChIKiQcKBgQTAwACABIEoQcELBr4BiBJZGVudGlmaWVzIHdoaWNoIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGRlZmluZWQgYXQgdGhpcwogbG9jYXRpb24uCgogRWFjaCBlbGVtZW50IGlzIGEgZmllbGQgbnVtYmVyIG9yIGFuIGluZGV4LiAgVGhleSBmb3JtIGEgcGF0aCBmcm9tCiB0aGUgcm9vdCBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgZGVmaW5pdGlvbiBvY2N1cnMuCiBGb3IgZXhhbXBsZSwgdGhpcyBwYXRoOgogICBbIDQsIDMsIDIsIDcsIDEgXQogcmVmZXJzIHRvOgogICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMwogICAgICAgLmZpZWxkKDcpICAgICAgICAgLy8gMiwgNwogICAgICAgLm5hbWUoKSAgICAgICAgICAgLy8gMQogVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKICAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CiBhbmQgRGVzY3JpcHRvclByb3RvLmZpZWxkIGhhcyBmaWVsZCBudW1iZXIgMjoKICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwogYW5kIEZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUgaGFzIGZpZWxkIG51bWJlciAxOgogICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CgogVGh1cywgdGhlIGFib3ZlIHBhdGggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIGEgZmllbGQgbmFtZS4gIElmIHdlIHJlbW92ZWQKIHRoZSBsYXN0IGVsZW1lbnQ6CiAgIFsgNCwgMywgMiwgNyBdCiB0aGlzIHBhdGggcmVmZXJzIHRvIHRoZSB3aG9sZSBmaWVsZCBkZWNsYXJhdGlvbiAoZnJvbSB0aGUgYmVnaW5uaW5nCiBvZiB0aGUgbGFiZWwgdG8gdGhlIHRlcm1pbmF0aW5nIHNlbWljb2xvbikuCgoPCgcEEwMAAgAEEgShBwQMCg8KBwQTAwACAAUSBKEHDRIKDwoHBBMDAAIAARIEoQcTFwoPCgcEEwMAAgADEgShBxobCg8KBwQTAwACAAgSBKEHHCsKEAoIBBMDAAIACAISBKEHHSoK0gIKBgQTAwACARIEqAcELBrBAiBBbHdheXMgaGFzIGV4YWN0bHkgdGhyZWUgb3IgZm91ciBlbGVtZW50czogc3RhcnQgbGluZSwgc3RhcnQgY29sdW1uLAogZW5kIGxpbmUgKG9wdGlvbmFsLCBvdGhlcndpc2UgYXNzdW1lZCBzYW1lIGFzIHN0YXJ0IGxpbmUpLCBlbmQgY29sdW1uLgogVGhlc2UgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGZpZWxkIGZvciBlZmZpY2llbmN5LiAgTm90ZSB0aGF0IGxpbmUKIGFuZCBjb2x1bW4gbnVtYmVycyBhcmUgemVyby1iYXNlZCAtLSB0eXBpY2FsbHkgeW91IHdpbGwgd2FudCB0byBhZGQKIDEgdG8gZWFjaCBiZWZvcmUgZGlzcGxheWluZyB0byBhIHVzZXIuCgoPCgcEEwMAAgEEEgSoBwQMCg8KBwQTAwACAQUSBKgHDRIKDwoHBBMDAAIBARIEqAcTFwoPCgcEEwMAAgEDEgSoBxobCg8KBwQTAwACAQgSBKgHHCsKEAoIBBMDAAIBCAISBKgHHSoKpQwKBgQTAwACAhIE2QcEKRqUDCBJZiB0aGlzIFNvdXJjZUNvZGVJbmZvIHJlcHJlc2VudHMgYSBjb21wbGV0ZSBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIGFueQogY29tbWVudHMgYXBwZWFyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2xhcmF0aW9uIHdoaWNoIGFwcGVhciB0byBiZQogYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uLgoKIEEgc2VyaWVzIG9mIGxpbmUgY29tbWVudHMgYXBwZWFyaW5nIG9uIGNvbnNlY3V0aXZlIGxpbmVzLCB3aXRoIG5vIG90aGVyCiB0b2tlbnMgYXBwZWFyaW5nIG9uIHRob3NlIGxpbmVzLCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWVudC4KCiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIHdpbGwga2VlcCBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHRoYXQgYXBwZWFyCiBiZWZvcmUgKGJ1dCBub3QgY29ubmVjdGVkIHRvKSB0aGUgY3VycmVudCBlbGVtZW50LiBFYWNoIHBhcmFncmFwaCwKIHNlcGFyYXRlZCBieSBlbXB0eSBsaW5lcywgd2lsbCBiZSBvbmUgY29tbWVudCBlbGVtZW50IGluIHRoZSByZXBlYXRlZAogZmllbGQuCgogT25seSB0aGUgY29tbWVudCBjb250ZW50IGlzIHByb3ZpZGVkOyBjb21tZW50IG1hcmtlcnMgKGUuZy4gLy8pIGFyZQogc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrCiB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QuCiBOZXdsaW5lcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KCiBFeGFtcGxlczoKCiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7ICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGZvby4KICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCiAgIG9wdGlvbmFsIGludDMyIGJhciA9IDI7CgogICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXouCiAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBiYXouCgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIG1vby4KICAgLy8KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIG1vby4KICAgb3B0aW9uYWwgZG91YmxlIG1vbyA9IDQ7CgogICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZS4gVGhpcyBpcyBub3QgbGVhZGluZyBvciB0cmFpbGluZyBjb21tZW50cwogICAvLyB0byBtb28gb3IgY29yZ2UgYmVjYXVzZSB0aGVyZSBhcmUgYmxhbmsgbGluZXMgc2VwYXJhdGluZyBpdCBmcm9tCiAgIC8vIGJvdGguCgogICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZSBwYXJhZ3JhcGggMi4KCiAgIG9wdGlvbmFsIHN0cmluZyBjb3JnZSA9IDU7CiAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQKICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcwogICAgKiB3aWxsIGJlIHJlbW92ZWQuICovCiAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQgdG8KICAgICogZ3JhdWx0LiAqLwogICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA2OwoKICAgLy8gaWdub3JlZCBkZXRhY2hlZCBjb21tZW50cy4KCg8KBwQTAwACAgQSBNkHBAwKDwoHBBMDAAICBRIE2QcN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GiogVGhlIGVsZW1lbnQgaXMgc2V0IG9yIG90aGVyd2lzZSBtdXRhdGVkLgoKEQoJBBQDAAQAAgEBEgT9BwYJChEKCQQUAwAEAAIBAhIE/QcMDQo4CggEFAMABAACAhIE/wcGEBomIEFuIGFsaWFzIHRvIHRoZSBlbGVtZW50IGlzIHJldHVybmVkLgoKEQoJBBQDAAQAAgIBEgT/BwYLChEKCQQUAwAEAAICAhIE/wcODwoOCgYEFAMAAgQSBIEIBCMKDwoHBBQDAAIEBBIEgQgEDAoPCgcEFAMAAgQGEgSBCA0VCg8KBwQUAwACBAESBIEIFh4KDwoHBBQDAAIEAxIEgQghIgrUCAocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxIKZ29vZ2xlLmFwaRoVZ29vZ2xlL2FwaS9odHRwLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzpLCgRodHRwEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYsMq8IiABKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgRodHRwQm4KDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSUqpBgoGEgQOAB4BCrwECgEMEgMOABIysQQgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIExMQwoKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKCAoBAhIDEAATCgkKAgMAEgMSAB8KCQoCAwESAxMAKgoICgEIEgMVAFgKCQoCCAsSAxUAWAoICgEIEgMWACIKCQoCCAoSAxYAIgoICgEIEgMXADEKCQoCCAgSAxcAMQoICgEIEgMYACcKCQoCCAESAxgAJwoICgEIEgMZACIKCQoCCCQSAxkAIgoJCgEHEgQbAB4BChwKAgcAEgMdAhsaESBTZWUgYEh0dHBSdWxlYC4KCgoKAwcAAhIDGwckCgoKAwcABhIDHQIKCgoKAwcAARIDHQsPCgoKAwcAAxIDHRIaYgZwcm90bzMKyA4KEGhlbGxvd29ybGQucHJvdG8SCmhlbGxvd29ybGQaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8iIgoMSGVsbG9SZXF1ZXN0EhIKBG5hbWUYASABKAlSBG5hbWUiJgoKSGVsbG9SZXBseRIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlMroCCgdHcmVldGVyEk8KCFNheUhlbGxvEhguaGVsbG93b3JsZC5IZWxsb1JlcXVlc3QaFi5oZWxsb3dvcmxkLkhlbGxvUmVwbHkiEYLT5JMCCxIJL3YxL2hlbGxvEkMKDVNheUhlbGxvQWdhaW4SGC5oZWxsb3dvcmxkLkhlbGxvUmVxdWVzdBoWLmhlbGxvd29ybGQuSGVsbG9SZXBseSIAEksKE1NheUhlbGxvU3RyZWFtUmVwbHkSGC5oZWxsb3dvcmxkLkhlbGxvUmVxdWVzdBoWLmhlbGxvd29ybGQuSGVsbG9SZXBseSIAMAESTAoSU2F5SGVsbG9CaWRpU3RyZWFtEhguaGVsbG93b3JsZC5IZWxsb1JlcXVlc3QaFi5oZWxsb3dvcmxkLkhlbGxvUmVwbHkiACgBMAFCNgobaW8uZ3JwYy5leGFtcGxlcy5oZWxsb3dvcmxkQg9IZWxsb1dvcmxkUHJvdG9QAaICA0hMV0rACgoGEgQOADIBCr8ECgEMEgMOABIytAQgQ29weXJpZ2h0IDIwMTUgZ1JQQyBhdXRob3JzLgoKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKCAoBCBIDEAAiCgkKAggKEgMQACIKCAoBCBIDEQA0CgkKAggBEgMRADQKCAoBCBIDEgAwCgkKAggIEgMSADAKCAoBCBIDEwAhCgkKAggkEgMTACEKCAoBAhIDFQATCgkKAgMAEgMXACYKLgoCBgASBBoAKAEaIiBUaGUgZ3JlZXRpbmcgc2VydmljZSBkZWZpbml0aW9uLgoKCgoDBgABEgMaCA8KIAoEBgACABIEHAIgAxoSIFNlbmRzIGEgZ3JlZXRpbmcKCgwKBQYAAgABEgMcBg4KDAoFBgACAAISAxwQHAoMCgUGAAIAAxIDHCcxCg0KBQYAAgAEEgQdBB8GChEKCQYAAgAEsMq8IhIEHQQfBgodCgQGAAIBEgMjAjoaECBBbm90aGVyIE1ldGhvZAoKDAoFBgACAQESAyMGEwoMCgUGAAIBAhIDIxUhCgwKBQYAAgEDEgMjLDYKCwoEBgACAhIDJQJHCgwKBQYAAgIBEgMlBhkKDAoFBgACAgISAyUbJwoMCgUGAAICBhIDJTI4CgwKBQYAAgIDEgMlOUMKCwoEBgACAxIDJwJNCgwKBQYAAgMBEgMnBhgKDAoFBgACAwUSAycaIAoMCgUGAAIDAhIDJyEtCgwKBQYAAgMGEgMnOD4KDAoFBgACAwMSAyc/SQo9CgIEABIEKwAtARoxIFRoZSByZXF1ZXN0IG1lc3NhZ2UgY29udGFpbmluZyB0aGUgdXNlcidzIG5hbWUuCgoKCgMEAAESAysIFAoLCgQEAAIAEgMsAhIKDAoFBAACAAUSAywCCAoMCgUEAAIAARIDLAkNCgwKBQQAAgADEgMsEBEKOwoCBAESBDAAMgEaLyBUaGUgcmVzcG9uc2UgbWVzc2FnZSBjb250YWluaW5nIHRoZSBncmVldGluZ3MKCgoKAwQBARIDMAgSCgsKBAQBAgASAzECFQoMCgUEAQIABRIDMQIICgwKBQQBAgABEgMxCRAKDAoFBAECAAMSAzETFGIGcHJvdG8z
</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC740; <code>EnvoyFilter</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; HTTP + gRPC &#xB97C; &#xB3D9;&#xC2DC;&#xC5D0; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; gRPC &#xC11C;&#xBC84;&#xB97C; &#xAD6C;&#xCD95; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xB2E8; &#xC704; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; <code>&#xD30C;&#xB4DC;</code> &#xC758; &#xC0AC;&#xC774;&#xB4DC;&#xCE74;&#xC5D0; &#xC774; &#xD544;&#xD130;&#xB97C; &#xC0BD;&#xC785;&#xD574;&#xC11C; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xB294; &#xC608;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;. (context &#xAC00; <code>SIDECAR_INBOUND</code> &#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; .. &#xD544;&#xC694;&#xC5D0; &#xB530;&#xB77C; ingress gateway &#xCABD;&#xC5D0; &#xC774; &#xD544;&#xD130;&#xB97C; &#xC0BD;&#xC785; &#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.) &#xA0;</p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC8FC;&#xC758;&#xAE4A;&#xAC8C; &#xBD10;&#xC57C;&#xD558;&#xB294;&#xAC83;&#xC740; <code>listener.portNumber</code> &#xC640; <code>patch.value.services</code> , <code>patch.value.proto_descriptor_bin</code> &#xBD80;&#xBD84;&#xC785;&#xB2C8;&#xB2E4;. </p><p><code>listener.portNumber</code> &#xC758; &#xACBD;&#xC6B0; gRPC &#xC11C;&#xBC84; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xB744;&#xC6B4; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; gRPC &#xD3EC;&#xD2B8;&#xBC88;&#xD638;&#xB97C; &#xC9C0;&#xC815;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xA0;</p><p><code>patch.value.services</code> &#xC5D0;&#xB294; &#xC5B4;&#xB5A4; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC774; &#xADDC;&#xCE59;&#xC744; &#xC0AC;&#xC6A9;&#xD574; gRPC &#xC11C;&#xBC84;&#xC5D0; http json transcoder &#xB97C; &#xC801;&#xC6A9;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xD560;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xBD80;&#xBD84;&#xC774;&#xACE0;. </p><p><code>patch.value.proto_descriptor_bin</code> &#xC758; &#xACBD;&#xC6B0; <code>protobuf descriptor</code> &#xB97C; base64 &#xC778;&#xCF54;&#xB529;&#xD55C; &#xAC12;&#xC744; &#xB123;&#xC5B4;&#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p><strong>&#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4;, &#xC704; </strong><code>EnvoyFilter</code><strong> &#xB97C; &#xC801;&#xC6A9;&#xD558;&#xB824;&#xBA74; gRPC &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xD30C;&#xB4DC;&#xC5D0; Istio Proxy(Enovy) &#xC0AC;&#xC774;&#xB4DC;&#xCE74;&#xAC00; &#xB5A0;&#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;!</strong></p><p>&#xC544;&#xB798;&#xB294; gRPC &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; <code>deployment.yaml</code> &#xC608;&#xC2DC;&#xC785;&#xB2C8;&#xB2E4;. </p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-python
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grpc-python
  template:
    metadata:
      labels:
        app: grpc-python
        sidecar.istio.io/inject: &apos;true&apos;
      annotations:
         sidecar.istio.io/rewriteAppHTTPProbers: &quot;false&quot;
      # &#xC704; &#xC5B4;&#xB178;&#xD14C;&#xC774;&#xC158;&#xC744; &#xB2EC;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; istio-sidecar-injector &#xAC00; mutatingWebhook &#xC5D0;&#xC11C; &#xAC15;&#xC81C;&#xB85C; http-get &#xC73C;&#xB85C; &#xC218;&#xC815;&#xD55C;&#xB2E4;.
      # &#xAE00;&#xB85C;&#xBC8C;&#xD558;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC2F6;&#xC73C;&#xBA74; istio-sidecar-injector &#xC758; configmap &#xC744; &#xC218;&#xC815;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.
      # https://preliminary.istio.io/latest/docs/ops/configuration/mesh/app-health-check/#disable-the-http-probe-rewrite-for-a-pod
    spec:
      containers:
        - name: grpc-python
          image: kimsehwan96/python-grpc
          imagePullPolicy: Always
          ports:
            - containerPort: 7777
              name: grpc
          resources:
            requests:
              cpu: 500m
            limits:
              cpu: 500m
          readinessProbe:
            grpc:
              port: 7777

</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>istio sidecar</code> &#xB97C; label &#xC744; &#xD1B5;&#xD574; inject &#xD558;&#xB3C4;&#xB85D; &#xBA85;&#xC2DC;&#xD558;&#xC600;&#xACE0;, <code>annotations</code> &#xC758; <code>sidecar.istio.io/rewriteAppHTTPProbers: &quot;false&quot;</code>  &#xC740; &#xC8FC;&#xC11D;&#xC5D0;&#xB3C4; &#xB2EC;&#xB824;&#xC788;&#xC9C0;&#xB9CC;, gRPC HealthCheck &#xD504;&#xB85C;&#xBE0C;&#xB97C; istio&#xAC00; mutating Webhook &#xC5D0;&#xC11C; &#xAC15;&#xC81C;&#xB85C; &#xB36E;&#xC5B4;&#xC4F0;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xBC29;&#xC9C0;&#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC785;&#xB2C8;&#xB2E4;.</p><p>(yaml &#xD30C;&#xC77C; &#xC608;&#xC81C;&#xB294; <a href="https://github.com/kimsehwan96/istio-example/tree/master/grpc-python?ref=kimsehwan96.com">https://github.com/kimsehwan96/istio-example/tree/master/grpc-python</a> &#xC5EC;&#xAE30;&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.)</p><p>&#xC704; &#xB0B4;&#xC6A9;&#xC744; <code>$ kubectl kustomize --enable-helm . | kubectl apply -f - --server-side --force-conflicts</code> &#xB85C; &#xBC30;&#xD3EC;&#xD574;&#xBD05;&#xB2C8;&#xB2E4;. </p><p>kustomize &#xB97C; &#xD1B5;&#xD574; &#xC704; yaml &#xB4E4;&#xC744; &#xD558;&#xB098;&#xC758; yaml&#xB85C; &#xBB36;&#xC5B4;&#xC11C; &#xBC30;&#xD3EC;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC704;&#xC640; &#xAC19;&#xC740; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xADF8;&#xB798;&#xC11C; Deployment &#xB4E0;, EnvoyFilter &#xB4E0; &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xB808;&#xC774;&#xBE14;&#xC774; &#xBE60;&#xC838;&#xC788;&#xB294;&#xB370;, &#xC2E4;&#xC81C;&#xB85C;&#xB294; kustomization.yaml &#xD56D;&#xBAA9;&#xC5D0; &#xC9C0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.) </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/890a7a2a-5214-4de7-8905-ee06ddbbdabb.png" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1860" height="1692" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/890a7a2a-5214-4de7-8905-ee06ddbbdabb.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/890a7a2a-5214-4de7-8905-ee06ddbbdabb.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/890a7a2a-5214-4de7-8905-ee06ddbbdabb.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/890a7a2a-5214-4de7-8905-ee06ddbbdabb.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Deployment &#xC758; &#xBC30;&#xD3EC; &#xACB0;&#xACFC;</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/f8f42fb6-1a2e-480b-9287-3ab8a058dfa7.png" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1860" height="1692" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/f8f42fb6-1a2e-480b-9287-3ab8a058dfa7.png 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/f8f42fb6-1a2e-480b-9287-3ab8a058dfa7.png 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/f8f42fb6-1a2e-480b-9287-3ab8a058dfa7.png 1600w, https://www.kimsehwan96.com/content/images/2024/03/f8f42fb6-1a2e-480b-9287-3ab8a058dfa7.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">EnvoyFilter &#xAC00; grpc-python &#xB124;&#xC784;&#xC2A4;&#xD398;&#xC774;&#xC2A4;&#xC5D0; &#xC801;&#xC6A9;&#xB428;</span></figcaption></figure><p></p><h3 id="%ED%85%8C%EC%8A%A4%ED%8A%B8">&#xD14C;&#xC2A4;&#xD2B8;</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kimsehwan96/gRPC-python-example?ref=kimsehwan96.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kimsehwan96/gRPC-python-example: &#xD14C;&#xC2A4;&#xD2B8;&#xC6A9;</div><div class="kg-bookmark-description">&#xD14C;&#xC2A4;&#xD2B8;&#xC6A9;. Contribute to kimsehwan96/gRPC-python-example development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kimsehwan96</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/8adec5defd950d1028c8575fa2fa73dcad825ce8d06df1701f93df64ec42eeed/kimsehwan96/gRPC-python-example" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;"></div></a></figure><p>&#xA0;&#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC704;&#xD55C; grpc &#xC11C;&#xBC84;&#xB294; &#xC704; &#xB9C1;&#xD06C;&#xC5D0; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC788;&#xACE0;, &#xD3B8;&#xC758;&#xB97C; &#xC704;&#xD574; gRPC reflection &#xB4F1;&#xC744; &#xD1B5;&#xD574; &#xC5B4;&#xB5A4; &#xBA54;&#xC11C;&#xB4DC;&#xB4E4;&#xC774; &#xB178;&#xCD9C;&#xB418;&#xB294;&#xC9C0; &#xBCFC; &#xC218; &#xC788;&#xAC8C; &#xC138;&#xD305;&#xD558;&#xACE0;, + &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC81C;&#xACF5;&#xB418;&#xB294; health check &#xAE30;&#xB2A5;&#xC744; &#xB123;&#xC5B4;&#xB450;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>(health check &#xAE30;&#xB2A5; &#xCD94;&#xAC00; &#xB77C;&#xC778; : <a href="https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/greeter_server.py?ref=kimsehwan96.com#L54-L58">https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/greeter_server.py#L54-L58</a>)</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/image.webp" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1786" height="1772" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/image.webp 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/image.webp 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/image.webp 1600w, https://www.kimsehwan96.com/content/images/2024/03/image.webp 1786w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/image--2-.webp" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1786" height="1772" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/image--2-.webp 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/image--2-.webp 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/image--2-.webp 1600w, https://www.kimsehwan96.com/content/images/2024/03/image--2-.webp 1786w" sizes="(min-width: 720px) 720px"></figure><p>&#xB2F9;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4; gRPC &#xC694;&#xCCAD;&#xC740; &#xC798; &#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.kimsehwan96.com/content/images/2024/03/image--3-.webp" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1786" height="1772" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/image--3-.webp 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/image--3-.webp 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/image--3-.webp 1600w, https://www.kimsehwan96.com/content/images/2024/03/image--3-.webp 1786w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">gRPC &#xAC00; &#xC544;&#xB2CC; &#xC77C;&#xBC18; HTTP &#xD638;&#xCD9C;</span></figcaption></figure><p><a href="https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/proto/helloworld.proto?ref=kimsehwan96.com#L27-L33">https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/proto/helloworld.proto#L27-L33</a></p><p>&#xC704; &#xCF54;&#xB4DC;&#xC5D0;&#xC11C; &#xC815;&#xC758;&#xD588;&#xB4EF;&#xC774; <code>/v1/hello</code> &#xC5D0; &#xB300;&#xD574;&#xC11C;  <code>rpc SayHello (HelloRequest) returns (HelloReply)</code> &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xB294;&#xB370;, &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; HTTP &#xC694;&#xCCAD;&#xC73C;&#xB85C; &#xD638;&#xCD9C;&#xB418;&#xB294;&#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.  &#xC774; &#xB54C; <code>Content-Type</code> &#xD5E4;&#xB354;&#xB97C; <code>application/json</code> &#xC73C;&#xB85C; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xD5E4;&#xB354;&#xC5D0; &#xB2F4;&#xC544;&#xC11C; &#xC694;&#xCCAD;&#xD574;&#xC57C; &#xCC98;&#xB9AC;&#xB429;&#xB2C8;&#xB2E4;. </p><p>EnvoyFilter &#xB97C; &#xC81C;&#xAC70;&#xD558;&#xACE0; &#xD638;&#xCD9C;&#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/image--4-.webp" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1786" height="1772" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/image--4-.webp 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/image--4-.webp 1000w, https://www.kimsehwan96.com/content/images/size/w1600/2024/03/image--4-.webp 1600w, https://www.kimsehwan96.com/content/images/2024/03/image--4-.webp 1786w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xB807;&#xAC8C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xD5E4;&#xB354;&#xB85C; &#xC694;&#xCCAD;&#xC774; &#xB4E4;&#xC5B4;&#xC654;&#xAE30;&#xB54C;&#xBB38;&#xC5D0; &#xC694;&#xCCAD;&#xC774; &#xCC98;&#xB9AC;&#xB418;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p></p><h2 id="grpc-healthcheck-in-k8s">gRPC HealthCheck in K8s</h2><p>&#xA0;</p><p>k8s v1.27 &#xBD80;&#xD130; stable &#xD558;&#xAC8C; &#xB4E4;&#xC5B4;&#xC628; &#xAE30;&#xB2A5;</p><p><a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/?ref=kimsehwan96.com#define-a-grpc-liveness-probe">Configure Liveness, Readiness and Startup Probes</a> &#xA0;</p><p>&#xC774;&#xAC83;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; gRPC &#xC11C;&#xBC84; &#xCE21;&#xC5D0; Health Check &#xAE30;&#xB2A5;&#xC774; GRPC Health Checking Protocol &#xC5D0; &#xB9DE;&#xAC8C; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC788;&#xC73C;&#xBA74; &#xB418;&#xACE0; (&#xD504;&#xB85C;&#xD1A0;&#xCF5C; : <a href="https://github.com/grpc/grpc/blob/master/doc/health-checking.md?ref=kimsehwan96.com">https://github.com/grpc/grpc/blob/master/doc/health-checking.md</a> )</p><p>&#xAC01; &#xC5B8;&#xC5B4;&#xBCC4;&#xB85C; &#xC704; &#xD504;&#xB85C;&#xD1A0;&#xCF5C; &#xBB38;&#xC11C;&#xB97C; &#xB530;&#xB978; gRPC HealthCheck &#xAD6C;&#xD604;&#xCCB4;&#xAC00; &#xC788;&#xAE30;&#xB54C;&#xBB38;&#xC5D0;, &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xC11C;&#xBC84;&#xC5D0; &#xC0BD;&#xC785;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.</p><p>(<a href="https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/greeter_server.py?ref=kimsehwan96.com#L54-L58">https://github.com/kimsehwan96/gRPC-python-example/blob/266ec547524d7afb73f10ad596e8b0eb96759eea/greeter_server.py#L54-L58</a>)</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    ...
    spec:
      containers:
        - name: grpc-python
          ...
          readinessProbe:
            grpc:
              port: 7777</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>readinessProbe</code> / <code>livenessProbe</code> &#xB4F1;&#xC5D0; <code>grpc.port</code> &#xBC0F; <code>grpc.service</code> &#xB97C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD558;&#xACE0;. <code>service</code> &#xB97C; &#xC9C0;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; GRPC Health Checking Protocol &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xC11C;&#xBE44;&#xC2A4;.&#xBA54;&#xC11C;&#xB4DC;&#xB85C; &#xD504;&#xB85C;&#xBE0C;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. (&#xB9E4;&#xC6B0; &#xAC04;&#xD3B8;) </p><p>&#xA0;</p><h2 id="proto-descriptor-%EB%A5%BC-base64-%EB%A1%9C-%EC%A7%81%EC%A0%91-envoy-filter-%EC%97%90-%EB%84%A3%EC%A7%80%EC%95%8A%EA%B3%A0-configmap-%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C-%EA%B2%BD%EB%A1%9C%EB%A5%BC-%EC%A7%80%EC%A0%95%ED%95%B4-%EC%84%B8%ED%8C%85%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">Proto Descriptor &#xB97C; base64 &#xB85C; &#xC9C1;&#xC811; envoy filter &#xC5D0; &#xB123;&#xC9C0;&#xC54A;&#xACE0; ConfigMap &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xACBD;&#xB85C;&#xB97C; &#xC9C0;&#xC815;&#xD574; &#xC138;&#xD305;&#xD558;&#xB294; &#xBC29;&#xBC95;</h2><p>&#xA0;</p><p><code>kustomize</code> &#xC758; <code>configMapGenerator</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. (&#xD15C;&#xD50C;&#xB9AC;&#xD305; &#xD234;&#xC73C;&#xB85C; helm &#xC744; &#xC4F4;&#xB2E4;&#xBA74; helm &#xC5D0;&#xB3C4; &#xBE44;&#xC2B7;&#xD55C; &#xAE30;&#xB2A5;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. kustomize &#xB4E0; helm &#xC774;&#xB4E0; yaml &#xAD00;&#xB9AC;&#xB97C; &#xC704;&#xD55C; &#xD234;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0;&#xC11C;&#xB294; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6C0;)</p><p><a href="https://github.com/kimsehwan96/istio-example/blob/73f993ffead22376edbd74f5905091b575c30679/grpc-python/helloworld.pb?ref=kimsehwan96.com">https://github.com/kimsehwan96/istio-example/blob/73f993ffead22376edbd74f5905091b575c30679/grpc-python/helloworld.pb</a></p><p>&#xC704; &#xD30C;&#xC77C;&#xCC98;&#xB7FC; <code>kustomization.yaml</code> &#xC774; &#xC788;&#xB294; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xB85C; &#xB41C; <code>proto descriptor</code> (<code>pb</code>) &#xD30C;&#xC77C;&#xC744; &#xB123;&#xC5B4;&#xB461;&#xB2C8;&#xB2E4;.</p><pre><code class="language-yaml">namespace: grpc-python

resources:
  - ./namespace.yaml
  - ./deployment.yaml
  - ./service.yaml
  - ./mtls.yaml
  - ./grpc-virtualservice.yaml
  - ./grpc-gateway.yaml
  - ./envoy-filter.yaml

configMapGenerator:
  - name: grpc-python-proto-descriptor-configmap
    files:
      - ./helloworld.pb

generatorOptions:
  disableNameSuffixHash: true
</code></pre><p><code>kustomization.yaml</code> &#xC5D0; <code>configMapGenerator</code> &#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBC14;&#xC774;&#xB108;&#xB9AC; &#xD30C;&#xC77C;&#xC744; <code>configMap</code> &#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://www.kimsehwan96.com/content/images/2024/03/image--5-.webp" class="kg-image" alt="gRPC transcoder in Istio &#xD14C;&#xC2A4;&#xD2B8;" loading="lazy" width="1008" height="1301" srcset="https://www.kimsehwan96.com/content/images/size/w600/2024/03/image--5-.webp 600w, https://www.kimsehwan96.com/content/images/size/w1000/2024/03/image--5-.webp 1000w, https://www.kimsehwan96.com/content/images/2024/03/image--5-.webp 1008w" sizes="(min-width: 720px) 720px"></figure><p>&#xC704; &#xC0AC;&#xC9C4;&#xCC98;&#xB7FC; &#xB85C;&#xCEEC;&#xC5D0; &#xC788;&#xB294; &#xD30C;&#xC77C;&#xC774; base64 &#xC778;&#xCF54;&#xB529; &#xB418;&#xC5B4;&#xC11C; configMap &#xC73C;&#xB85C; &#xC54C;&#xC544;&#xC11C; &#xC798; &#xB4E4;&#xC5B4;&#xAC11;&#xB2C8;&#xB2E4;. &#xC774;&#xB54C;&#xC758; configMap binary Data &#xC758; &#xD0A4;&#xB294; &#xD30C;&#xC77C;&#xBA85;&#xACFC; &#xB3D9;&#xC77C;(<code>helloworld.pb</code>)</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-python
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grpc-python
  template:
    metadata:
      labels:
        app: grpc-python
        sidecar.istio.io/inject: &apos;true&apos;
      annotations:
        sidecar.istio.io/rewriteAppHTTPProbers: &quot;false&quot;
      # &#xC704; &#xC5B4;&#xB178;&#xD14C;&#xC774;&#xC158;&#xC744; &#xB2EC;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; istio-sidecar-injector &#xAC00; mutatingWebhook &#xC5D0;&#xC11C; &#xAC15;&#xC81C;&#xB85C; http-get &#xC73C;&#xB85C; &#xC218;&#xC815;&#xD55C;&#xB2E4;.
      # &#xAE00;&#xB85C;&#xBC8C;&#xD558;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC2F6;&#xC73C;&#xBA74; istio-sidecar-injector &#xC758; configmap &#xC744; &#xC218;&#xC815;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.
      # https://preliminary.istio.io/latest/docs/ops/configuration/mesh/app-health-check/#disable-the-http-probe-rewrite-for-a-pod
        sidecar.istio.io/userVolumeMount: &apos;[{&quot;name&quot;:&quot;proto-descriptor&quot;,&quot;mountPath&quot;:&quot;/etc/envoy&quot;,&quot;readOnly&quot;:true}]&apos;
        sidecar.istio.io/userVolume: &apos;[{&quot;name&quot;:&quot;proto-descriptor&quot;,&quot;configMap&quot;:{&quot;name&quot;:&quot;grpc-python-proto-descriptor-configmap&quot;,&quot;items&quot;:[{&quot;key&quot;:&quot;helloworld.pb&quot;,&quot;path&quot;:&quot;helloworld.pb&quot;}]}}]&apos;
...
...</code></pre><p><code>Deployment</code> &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC5D0; <code>istio</code> &#xC5B4;&#xB178;&#xD14C;&#xC774;&#xC158;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; <code>configMap</code> &#xC744; <code>sidecar</code> &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xC5D0; &#xB9C8;&#xC6B4;&#xD2B8; &#xD558;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. <code>sidecar.istio.io/userVolumeMount</code> , <code>sidecar.istio.io/userVolume</code> &#xC5B4;&#xB178;&#xD14C;&#xC774;&#xC158;&#xC744; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-yaml">apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: grpc-transcoder
spec:
  workloadSelector:
    labels:
      app: grpc-python
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          portNumber: 7777 # 5xxxx &#xBC88;&#xB300; &#xD3EC;&#xD2B8;&#xB97C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xBC18;&#xC601;&#xC774; &#xC548;&#xB41C;&#xB2E4;. &#xC774;&#xAC74; &#xC65C;&#xADF8;&#xB7F0;&#xC9C0;;
          filterChain:
            filter:
              name: &quot;envoy.filters.network.http_connection_manager&quot;
              subFilter:
                name: &quot;envoy.filters.http.router&quot;
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.grpc_json_transcoder
          typed_config:
            &quot;@type&quot;: type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
            services:
              - helloworld.Greeter
            print_options:
              add_whitespace: true
              always_print_enums_as_ints: false
              always_print_primitive_fields: true
              preserve_proto_field_names: false
            convert_grpc_status: true
            proto_descriptor: /etc/envoy/helloworld.pb
</code></pre><p><code>EnvoyFilter</code> &#xC624;&#xBE0C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; <code>proto_descriptor</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC0AC;&#xC774;&#xB4DC;&#xCE74; &#xB0B4;&#xC5D0; <code>proto descriptor</code> &#xAC00; &#xC788;&#xB294; &#xACBD;&#xB85C;&#xB97C; &#xC9C0;&#xC815;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; <code>kustomize</code> &#xAC00; &#xC544;&#xB2CC; <code>helm</code> &#xC73C;&#xB85C;&#xB9CC; &#xB124;&#xC774;&#xD2F0;&#xBE0C;&#xD558;&#xAC8C; &#xAD6C;&#xD604;&#xD55C;&#xB2E4;&#xBA74;</p><pre><code class="language-yaml"># configMap.yml
kind: ConfigMap
apiVersion: v1
data:
binaryData:
  {{- $binaryFiles := $.Files }}  
  {{- range .binaryFiles }}
  {{ base .}}: |-
    {{- $binaryFiles.Get (printf &quot;%s/%s&quot; &quot;configs&quot; . ) | b64enc | nindent 6 -}}
  {{- end}}
# values.yaml
configs:
  - name: proto-descriptor
    binaryFiles:
      - api_descriptor.pb</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; <code>helm</code> &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xD15C;&#xD50C;&#xB9AC;&#xD305; &#xD568;&#xC218;&#xB4E4;&#xC774;&#xB098; &#xAE30;&#xB2A5;&#xC744; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xAD6C;&#xD604;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.  &#xB2E4;&#xB9CC; <code>kustomize</code> &#xB4E0; <code>helm</code> &#xC774;&#xB4E0; <code>proto descriptor</code> &#xD30C;&#xC77C;&#xC774; <code>helm</code> / <code>kustomize</code> &#xBA85;&#xB839;&#xC5B4;&#xB4E4;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC640; &#xAC19;&#xC740; &#xC704;&#xCE58;&#xC5D0; &#xC788;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;&#xB294;&#xAC8C; &#xB2E8;&#xC810;? &#xC77C;&#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%9C%84-%EC%83%81%ED%99%A9%EC%97%90%EC%84%9C-proto-descriptor-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EB%B0%94%EB%80%8C%EC%97%88%EC%9D%84-%EB%95%8C-%EC%96%B8%EC%A0%9C-%EB%B0%98%EC%98%81%EC%9D%B4-%EB%90%98%EB%8A%94%EA%B0%80">&#xC704; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;, <code>proto descriptor</code> &#xD30C;&#xC77C;&#xC774; &#xBC14;&#xB00C;&#xC5C8;&#xC744; &#xB54C; &#xC5B8;&#xC81C; &#xBC18;&#xC601;&#xC774; &#xB418;&#xB294;&#xAC00;?</h3><p>&#xA0;</p><p>&#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC;, <code>configMap</code> &#xC758; &#xBC14;&#xC774;&#xB108;&#xB9AC;( <code>proto descriptor</code> )&#xB97C; &#xBC14;&#xAFB8;&#xB354;&#xB77C;&#xB3C4; &#xAE30;&#xC874;&#xC5D0; &#xB5A0;&#xC788;&#xB294; <code>&#xD30C;&#xB4DC;</code> &#xC5D0;&#xB294; &#xC601;&#xD5A5;&#xC774; &#xAC00;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD30C;&#xB4DC;&#xB97C; &#xB0B4;&#xB838;&#xB2E4;&#xAC00; &#xC62C;&#xB9AC;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xBC18;&#xC601;&#xC774; &#xB429;&#xB2C8;&#xB2E4;. <strong>&#xB530;&#xB77C;&#xC11C; &#xC2E4;&#xC81C; &#xD504;&#xB85C;&#xB355;&#xC158; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; </strong><code>proto descriptor</code><strong> &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC774;&#xD6C4; &#xBAA8;&#xB4E0; </strong><code>Deployment / StatefulSet</code><strong> &#xC758; &#xD30C;&#xB4DC;&#xB97C; rolloing update &#xD558;&#xAC70;&#xB098;, canary &#xBC30;&#xD3EC; &#xD558;&#xB294;&#xB4F1; &#xC544;&#xBB34;&#xD2BC; &#xBAA8;&#xB4E0; &#xD30C;&#xB4DC;&#xAC00; &#xB0B4;&#xB824;&#xAC14;&#xB2E4;&#xAC00; &#xC62C;&#xB77C;&#xAC08; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </strong></p><p></p><p>&#xCC38;&#xACE0; : <a href="https://github.com/grpc-ecosystem/grpc-gateway?ref=kimsehwan96.com">https://github.com/grpc-ecosystem/grpc-gateway</a></p>]]></content:encoded></item></channel></rss>