{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2022-08-07--002","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"9b728d5d-b6f9-5c2c-94c7-a2af924d91b6","html":"<h1>✔️ Kubernetes Concepts</h1>\n<ul>\n<li>K8S가 관리하는 각 항목은 객체로 표시되며 이러한 객체의 속성과 상태를 확인하고 변경할 수 있다.</li>\n<li>Kubernetes는 ‘watch loop’를 사용하여 관리되고 있는 객체에 대해 원하는 상태를 지정할 수 있고, Kubernetes는 객체를 해당 상태로 전환&#x26;유지한다.</li>\n</ul>\n<hr>\n<h1>✔️ 제어 영역 Kubernetes 구성요소</h1>\n<ul>\n<li>제어 영역의 역할은 전체 클러스터를 조정하는 것이다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/bd9eb/002-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 42.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAACQUlEQVQozz2QTU8TYRSF+xtcGHe6cuHOpYmJe3+LG91oojExJhA1ho3RkECC0EBbaAu2nc5HZ2qEdtppp6W0pV/TUsCCoQWBSFA3j1dF3+Qk99yb98m519dptxgMj4lbWZaNNdS890dGro7pNIiWPMLFTZaKdSKuJ77FUqEm9W/fJfLbOzVChTr57gG+kuvS6u1SzcRx9AWyWpCMyLXC1LIqkfVV/Pll5p0VwhtZolULvx0lVIoRqeSll2IuGyFQTpDtbuEbHhywtTvguLDAqfWYz+8uM3h7iRP9IUN7Fq0UR8mGMJwl1JqOXv0gdZiUu4haT2Gsr5ByomjFRdztFj7knXw7ZyiNr2sT9GZui25x/Ok1IzeKXjSxbB1L0iplC83VpNYxbYVEJY3uqHy0U6iZGIWt9gXw7AeHqy840u8zykwzWpvkUH3AKP0co2xgFhJYBUlaSaFXBOgkMYviZX2jnCRdUNHkJMX+BfBUgAP/TXYnfIyMR6IneK989CavozdiqN159K4fpSkf27KyFyTlBVAakqwTkVkQpTNP4f/KAvwSvstw+goj8xlDa4zRzFX2A3cEGEfvBTAEqjQ19HZMYIuYXohkw0TrRGUmdWeB4j/g6dk5/akbNMd8HCn3OEw9ZXPcR/vNNbTNMEp3FtWbISbwZEsSdfyiOeJ1uWs7KDM/8fZ78v3GX+DZ95/07Sk8c5y9SoK9qkE3/RJvdRK7V8beyWNv58j0NrD7ZXLbjigvvibeJbfjkOnnaO7v8QusHkxIgTWQLQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/d9199/002-01.png\"\n        srcset=\"/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/8ff5a/002-01.png 240w,\n/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/e85cb/002-01.png 480w,\n/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/d9199/002-01.png 960w,\n/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/07a9c/002-01.png 1440w,\n/devHistoryBlog/static/faae6f0c2e555185e9dd495b1e963613/bd9eb/002-01.png 1442w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h2>1. kube API Server</h2>\n<ul>\n<li>사용자가 직접 상호작용하는 단일 구성요소</li>\n<li>kubectl 명령어와 통신하는 서버</li>\n<li>kubeconfig 값으로 수신된 요청을 인증하고 요청의 승인 여부와 유효성을 확인하며 허용 제어를 관리</li>\n</ul>\n<h2>2. etcd</h2>\n<ul>\n<li>클러스터의 데이터베이스</li>\n<li>클러스터의 상태를 저장하는 역할을 한다.</li>\n<li>여기에는 모든 클러스터의 구성 데이터와 많은 동적 정보(클러스터의 일부인 노드, 실행해야 하는 Pod, 실행 위치)가 포함된다.</li>\n<li>사용자는 etcd와 직접 상호작용하지 않는다.</li>\n</ul>\n<h2>3. kube-scheduler</h2>\n<ul>\n<li>Pod의 요구사항을 평가하고 가장 적합한 노드를 선택하는 역할을 한다.</li>\n<li>노드의 자원 사용량을 모니터링 하기때문에 적합한 노드 선택이 가능</li>\n<li>kube-apiserver를 통해 etcd에 Pod생성 요청이 있는지 감시한다. (Watch 기능)</li>\n<li>\n<p>노드를 선택하는 방법</p>\n<ol>\n<li>노드에 아직 할당되지 않은 Pod 객체 발견 </li>\n<li>모든 노드의 리소스를 확인하여 적합한 노드를 선택 </li>\n<li>해당 노드의 이름을 Pod 객체에 작성</li>\n<li>시스템의 또 다른 구성요소가 Pod를 시작</li>\n</ol>\n</li>\n</ul>\n<h2>4. kube-controller-manager</h2>\n<ul>\n<li>컨트롤러 오브젝트들의 요구사항을 수행</li>\n<li>클러스터의 현재 상태가 원하는 상태와 일치하지 않을 때마다 kube-controller-manager는 원하는 상태를 달성하기 위해 변경을 시도</li>\n<li>\n<p>컨트롤러 종류</p>\n<ul>\n<li>ReplicaSet, Deployment, DaemonSet, Job, CronJob</li>\n</ul>\n</li>\n</ul>\n<h2>5. Kubelet</h2>\n<ul>\n<li>각 워커 노드에서 클러스터 에이전트 역할을 한다.</li>\n<li>kube-apiserver 에 watch 를 걸어 자신의 노드이름이 붙은 Pod 생성 및 변경 요청에 대해 수행한다.</li>\n<li>Kubelet은 컨테이너 런타임을 사용하여 Pod의 컨테이너를 실행하고 Pod의 수명 주기를 모니터링하고 kube-apiserver에 다시 보고한다.</li>\n</ul>\n<h2>6. kube-proxy</h2>\n<ul>\n<li>클러스터에서 Pod 간 네트워크 생성 및 연결을 유지</li>\n<li>DaemonSet으로 설치된다.</li>\n</ul>\n<hr>\n<h1>✔️ Pod 생성 플로우</h1>\n<ol>\n<li>사용자가 Pod 생성 요청 → kube-apiserver 로 명령어 전달</li>\n<li>kube-apiserver는 etcd에 해당 Pod 정보를 저장</li>\n<li>kube-scheduler는 kube-apiserver를 통해 etcd에 새로 들어온 Pod 생성 요청을 체크하고, 노드들의 자원상태를 확인하여 적합한 노드를 선택 후 해당 Pod에 노드명 기재</li>\n<li>모든 노드의 kublet이 kube-apiserver 를 watch 하고 있다가 자신의 노드명이 붙은 Pod 생성 이벤트가 발생하면 해당 정보를 가져온다.</li>\n<li>kublet은 Container Runtime에게 해당 파드 생성 및 컨테이너 실행 요청을 함</li>\n<li>그리고 kublet은 kube-proxy에게 네트워크 생성 요청을 하게되고, kube-proxy는 새로 생성된 컨테이너가 네트워크 통신이 되도록 도와줌</li>\n</ol>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/28fe3/002-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACR0lEQVQozzWSy2/aYBDE+f+l9tBbW/VQKTlUiSoljZqmaZQ0pHlgwJinMRhs/DYOGD8gzeXXhaSH0Ur7zY7mm92KYiSEyw1RuiHOnpn6Dnf1XxjWBHee7zCeRZhOhO0nJKsNj9kTsfCj5VrmXhAs1qTFXyrfHlx0K0Kf+rva7PX5fX9N33KZRiVDJ0Ez3B3aY59JmEu/EGxr9lpzzCDbCVcOr8fU1S71hkpT1WhpfaZBLoNr1EnETesSZdhh6K35rpoc1kbsX7dRRuI4LjDDF9Hxf8G9U43OwMRyPMypg25YmN5iR2qYIV9vr7hot9GdjBPFZL865NO5SmMc4CYFVpxhzzMx8Cr49c8MtWvQ7Rt0eluMMJwFHStHHefU9ILGqKBrFVypIeeKT22Q0p5Kz35BxyoF2S7TimLM8aMlQbRgJqHbQYL3WDIKnxm4G3FWMHBKerOS5njJfX++6+nS0+V96K4FG8mwZFXKUqruI/qi5D5MUaIVF7pNzbbojlV6vklYPrHcPHFmx7SilMGjuA6XdJMMZerSFBPteYoWpyRbwS/tKa04p+qlPPgpjVmMYjncahqKOcGRE/GzNR8edC4kU21eCHfFg7cUXkRdrkCXLHuiEeYbKgciqMUrqvJwLS6OtRFHPZs39Qnv6iZutiEsnvh43+NStr7l3rjCFbEj1eBs6PK2ZvC+OSHe3uHJKKArX9CCBdWhzQ9V57Sl8/muzfFghrPI8dKCA92jas8ZyLebXkJ1MOFna8hFx2BP6XOiOwTC+wcyqc6lReLfuQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/d9199/002-02.png\"\n        srcset=\"/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/8ff5a/002-02.png 240w,\n/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/e85cb/002-02.png 480w,\n/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/d9199/002-02.png 960w,\n/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/07a9c/002-02.png 1440w,\n/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/29114/002-02.png 1920w,\n/devHistoryBlog/static/9a3b5f0544137224fa5af5b796054097/28fe3/002-02.png 3446w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<hr>\n<h1>✔️ Deployment 생성 플로우</h1>\n<ul>\n<li>Controller Manager Pod 내에 여러 컨트롤러들에 대한 기능들이 각각의 스레드 형태로 돌아가고 있다.</li>\n<li>사용자가 Deployment 생성 요청 → kube-apiserver로 명령어 전달</li>\n<li>kube-apiserver는 etcd에 해당 Deployment에 대한 정보를 저장</li>\n<li>Controller Manager Pod 내의 Deployment 스레드가 이를 감지하여 ReplicaSet 생성을 요청한다.</li>\n<li>Controller Manager Pod 내의 ReplicaSet 스레드가 이를 감지하여 replica 개수만큼 Pod 생성 요청을 한다.</li>\n<li>이후에 파드 생성 플로우로 진행한다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/4faaa/002-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACYklEQVQozzWS228SWxTG+fdNfPDBxJiYmKPRJjV60mOobapCkVrKwAy3uTIDey7I3KBQoKX68DtLGx9W1to73/72t9a3KldOTnp9S7neU2x/MY8z7ONTxvqQMFsT5yvGYcpE7idxKrg7FjeClfxQP8TfunLUSnBUjqfmuGGG40xxv10RuBFBWDBs9TH6PkP/BwMvQWVbwnwneUNY7AjLW1T+EEm5pXJ4HtDWTbSOTkfvYQxG+OkatbynN1DYh6/kgzrjdM9ZX3F4afO2adJ05py3FdWaTa3tc9q0mKYbKv8cC4npo+IZgUqwvClBUoqCNV1/hdb7SrXxngtrTrUT8OK0y/NPGk0j4LzW5+jjJSe1DidnTVRSUHn3LaJtWDhjH8v1GdljvKhgpDYY/oaWXVAbxLS9Jd9HJZ87c1rdGT09RhtkNMwl9eGCi35CFCVUWnZOki7JiiWztCScF8zKjbT4EzveY0e3uMlDNkTxxTDDDLeYch6GO7zkjiD9xTT7KabcU2lIe664fDVf0U5X1GXwLRViTgZYszHJ5pbN/Z56XNBJr/GWonq+5OpHSd1VtMV5J7JwY4t0u6PypufTLzZ0ii3d7AY9LtGiGQ3doBv4TNayUrs9r40xVTdhuNih5VuMXN7IaLQ4p+3YMo4R4UpcPtA9NFH3+NLhZW/Kf7Ii1ZHiqa54Iu45iy3Xd/e80ixO3JiubMCj7zYvxZSj3phjU/GsF/7BTq5F4fEkYyCOHpohH4Tsiznh3J7yRgg+2NEf0G/Cj4JrxAvM4oaDoeK94XE2Cmg4ioOuw7+CjaWb/wF7ucX+yEggLAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"002 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/d9199/002-03.png\"\n        srcset=\"/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/8ff5a/002-03.png 240w,\n/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/e85cb/002-03.png 480w,\n/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/d9199/002-03.png 960w,\n/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/07a9c/002-03.png 1440w,\n/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/29114/002-03.png 1920w,\n/devHistoryBlog/static/d1913241559172c9dfb4c04294f374e8/4faaa/002-03.png 2308w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>","fields":{"tagSlugs":["/tags/k-8-s/"],"slug":"/history/posts/2022-08-07--002"},"frontmatter":{"title":"[대세는 쿠버네티스] Kubernetes Architecture","tags":["k8s"],"date":"2022-08-07","description":""}}},"pageContext":{"slug":"/history/posts/2022-08-07--002"}},"staticQueryHashes":[]}