{"componentChunkName":"component---src-templates-blog-post-js","path":"/infra/201008-Kubernetes/","result":{"data":{"site":{"siteMetadata":{"title":"Junbyeol Blog","author":"Junsung Yoon","siteUrl":"https://junbyeol.github.io","comment":{"disqusShortName":"","utterances":"junbyeol/junbyeol.github.io"},"sponsor":{"buyMeACoffeeId":"junbyeol"}}},"markdownRemark":{"id":"832b8dee-ea04-5be7-9b0e-bffce49c4763","excerpt":"이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. : 컨테이너 오케스트레이션 툴 툴마다 다르지만 컨테이너의 배포나 관리를 도와주는 녀석! 스케쥴링 적당한 서버에 배포 클러스터링 여러 개의 서버를 하나의 서버처럼 사용 서비스 디스커버리 key value…","html":"<blockquote>\n<p>이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.</p>\n</blockquote>\n<p>: 컨테이너 오케스트레이션 툴</p>\n<ul>\n<li>툴마다 다르지만 컨테이너의 배포나 관리를 도와주는 녀석!</li>\n<li>\n<p>스케쥴링</p>\n<ul>\n<li>적당한 서버에 배포</li>\n</ul>\n</li>\n<li>\n<p>클러스터링</p>\n<ul>\n<li>여러 개의 서버를 하나의 서버처럼 사용</li>\n</ul>\n</li>\n<li>\n<p>서비스 디스커버리</p>\n<ul>\n<li>key value에 저장할 필요 없이 바로 가져올 수 있음</li>\n</ul>\n</li>\n<li>로깅, 모니터링으로 중앙에서 관리 가능</li>\n<li>비슷한 툴로는 Docker Swarm, Apache Mesos 가 있다</li>\n</ul>\n<h1 id=\"쿠버네티스-오브젝트\" style=\"position:relative;\"><a href=\"#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8\" aria-label=\"쿠버네티스 오브젝트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>쿠버네티스 오브젝트</h1>\n<p><a href=\"https://subicura.com/2019/05/19/kubernetes-basic-1.html#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90\">쿠버네티스 시작하기 - Kubernetes란 무엇인가?</a></p>\n<h3 id=\"pod\" style=\"position:relative;\"><a href=\"#pod\" aria-label=\"pod permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Pod</h3>\n<ul>\n<li>쿠버네티스에 배포 가능한 가장 작은 단위</li>\n<li>\n<p>한 개 이상의 컨테이너와 스토리지, 네트워크 속성으로 구성</p>\n<ul>\n<li>pod내의 컨테이너들은 스토리지를 공유한다!</li>\n<li>pod내의 컨테이너들은 서로 localhost로 접근할 수 있다!</li>\n</ul>\n</li>\n<li>컨테이너를 하나만 사용하더라도 Pod로 반드시 감싸야함</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 958px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 57.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABq0lEQVQoz32STUvDQBCG/XMieBUUK4igoIgiXvwExYt6VfTWixcv/gKvihdFvFk8pLTGNm2TNN/ZTbLp6+yW1rZWN1mYnZl9ZnZmJjCyOp1OX3YyjjoPEYlUbYNkO2VD/pxz5HnevzsxCOrBLBbhpVLG+6eOesNEFMVgjMNomijpOp7LGpqhr3yDIEAYhuOBoJ/i4aFUwszyDuZW9zFV2MTu6RXOr28wOb+Bwvohphe2cPf4pO4xCiah44G04o7Am6ZhceMIi1vHmF3dw9lFEZfFW8ys7GBp+wTzawe4f36V8RWwl6Fcv4BuwtCIAljtADo9t1xr4aPhQzMjkk2la1oudN8DyzMFbDsOarUafN//G5jTUcgSCKDiJKi6CZjo6qTtK/D7QMd1YNu2yvQX0OExDFlwOmZCIE1TWFYLjaaBJEkgSCdtX75Dnc/AGfv/yRmNQIWc64GHlC6QgUApYuqyTE0GMUIPmmt3a0jAsU0ZncE2ZSrBZvwTXY6T1Nk86us8z6Oxiv7u8uA89iBVglSDLnzQT70oy4Z0YzMchQoqQ5aLIT/1Dfj05G9S50CeYVco4gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled.png\"\n        title=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled.png\"\n        src=\"/static/7c05efcd3aabe857fe6ae351358fec32/b97f6/201008-1.png\"\n        srcset=\"/static/7c05efcd3aabe857fe6ae351358fec32/5a46d/201008-1.png 300w,\n/static/7c05efcd3aabe857fe6ae351358fec32/0a47e/201008-1.png 600w,\n/static/7c05efcd3aabe857fe6ae351358fec32/b97f6/201008-1.png 958w\"\n        sizes=\"(max-width: 958px) 100vw, 958px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h1 id=\"쿠버네티스-아키텍쳐\" style=\"position:relative;\"><a href=\"#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90\" aria-label=\"쿠버네티스 아키텍쳐 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>쿠버네티스 아키텍쳐</h1>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 26.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9ElEQVQY01WQwUoDMRCG+87ePfsWgkefwKOHHjwIwqK2yyKLHlyk3dI1m9mdSSa/k7SlNfCTBGY+5psF7KSUcDr5nX86EcJPV+4UApQ8kghy6dhPmJ1Ao0KmgDDHErEsTjBV/Q8eHVK/hQ77A4gZ4NkgByDtZzDJsTchZjiFM7Cua1RVBSKCz9n1GGbG5voK7v4OuZXdAO8mKCKWt694uHkGRcLLtoNXs7icsG1bNE1TJo05NiGbard8xG79DrW6rM/WlFU/376xevoovV/9xmoFkfUMLLu7VM478yOCQYPpqvs1bVNWlP0FCRAW07TdeQEf8wdOWYIjzkIA6QAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%201.png\"\n        title=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%201.png\"\n        src=\"/static/0a0c8626a4486488a70b204ffb66bfee/c1b63/201008-2.png\"\n        srcset=\"/static/0a0c8626a4486488a70b204ffb66bfee/5a46d/201008-2.png 300w,\n/static/0a0c8626a4486488a70b204ffb66bfee/0a47e/201008-2.png 600w,\n/static/0a0c8626a4486488a70b204ffb66bfee/c1b63/201008-2.png 1200w,\n/static/0a0c8626a4486488a70b204ffb66bfee/7e21b/201008-2.png 1626w\"\n        sizes=\"(max-width: 1200px) 100vw, 1200px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h1 id=\"튜토리얼-정리\" style=\"position:relative;\"><a href=\"#%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%A0%95%EB%A6%AC\" aria-label=\"튜토리얼 정리 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>튜토리얼 정리</h1>\n<p><a href=\"https://kubernetes.io/ko/docs/tutorials/\">튜토리얼</a></p>\n<h3 id=\"1-쿠버네티스-클러스터-생성하기\" style=\"position:relative;\"><a href=\"#1-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0\" aria-label=\"1 쿠버네티스 클러스터 생성하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 쿠버네티스 클러스터 생성하기</h3>\n<ul>\n<li>\n<p>클러스터는 마스터 + 노드</p>\n<ul>\n<li>\n<p>마스터</p>\n<ul>\n<li>클러스터를 관리, 컨트롤</li>\n</ul>\n</li>\n<li>\n<p>노드</p>\n<ul>\n<li>애플리케이션 구동한다</li>\n<li>Kubelet은 마스터와 통신하고 노드를 관리한다</li>\n<li>컨테이너 운영을 담당하는 Docker나 rkt같은 툴을 갖는다</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1002px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 71.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAAB+0lEQVQ4y32Tu4/UMBjE9/+v6GkoqCjoKI4CGkSDdEJCAnSA9jb7iJNsHs7DrzgZJomS2+weWLJix84v883Ym77vMTY+hvEyZ9NtB9X6ZX6953Lv3DbzwuWiISiuLETNrixibaG8J2/+eb98cw3fXL7UtsO5cghSg1NmcSzYS4uwcNhLg8QR3Htc67oUs5kn3vcQ/PBAUFZNZcZ5i11sx7F1PbZFg9Ap2tCi73pE5xSyqm8VzupE7nAkMC1bfPnR4PWHM168jfHpW4VKewSVRuQ1qs6Nfmpj4VyLS9sWYKn8WGZUOjwmBq/ep/j8UONroPDuPsdDonD2XPcGsnc3Jd8oHFSFBAppkdQOddcib/yoPJCa/mmEmt0qxK2G7zokaY40K1bgMWVPP0TmELLkiMBDbnB3L/H9oLHnT3YECm0gDJ8ER62C6TzqRkGWFUs3sNY9HZtuMDifgCcmGxL+5mOBl3cxdoVCNChT7AOQCgWDsQRKWUHE57FnuVyXbFy3pFw2U8oBEw4KHhdL7xhA7CYPh6PzXFtKnqGNYTA5S06npIeAREOInoDCGZR+ner1Ab+5KVK1ONHHE4GC48SwW8KdQ9a65bb86/pt1gvT9qw22CcFlUoqLnGkPxEPsO//D1spXJXO9H7+2uL3NsDj/og/fEY0/qbUZ3z8CyNrQFlrVaPQAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%202.png\"\n        title=\"201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%202.png\"\n        src=\"/static/83b5e2cf0b23b579a7a11a6529395e7e/d69c4/201008-3.png\"\n        srcset=\"/static/83b5e2cf0b23b579a7a11a6529395e7e/5a46d/201008-3.png 300w,\n/static/83b5e2cf0b23b579a7a11a6529395e7e/0a47e/201008-3.png 600w,\n/static/83b5e2cf0b23b579a7a11a6529395e7e/d69c4/201008-3.png 1002w\"\n        sizes=\"(max-width: 1002px) 100vw, 1002px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\">#클러스터 정보 보기</span>\nkubectl cluster-info\n<span class=\"token comment\">#node들 정보 보기</span>\nkubectl get nodes</code></pre></div>\n<h3 id=\"2-앱-배포하기\" style=\"position:relative;\"><a href=\"#2-%EC%95%B1-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0\" aria-label=\"2 앱 배포하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 앱 배포하기</h3>\n<ul>\n<li>\n<p>쿠버네티스 Deployment 설정을 만들어야한다</p>\n<ul>\n<li>인스턴스를 어떻게 생성할지</li>\n<li>어떻게 업데이트할지</li>\n<li>이 정보를 통해, 마스터는 클러스터의 노드에서 앱이 배포되도록 스케쥴한다</li>\n</ul>\n</li>\n<li>쿠버네티스 Deployment 컨트롤러는 노드가 다운/삭제 되었을때 노드를 교체해주는 self-healing도 제공한다!</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\">#deployment 생성</span>\n<span class=\"token comment\">#kubectl create deployment</span>\nkubectl create deployment kubernetes-bootcamp --image<span class=\"token operator\">=</span>gcr.io/googkle-samples/kubernetes-booycamp:v1\n\n<span class=\"token comment\">#deploymeny 확인</span>\nkubectl get deployments\n\n<span class=\"token comment\">#proxy 시작</span>\n<span class=\"token comment\">#curl http://localhost:8001/version(예시)로 확인해보자!</span>\nkubectl proxy</code></pre></div>\n<h3 id=\"3-파드와-노드-보기\" style=\"position:relative;\"><a href=\"#3-%ED%8C%8C%EB%93%9C%EC%99%80-%EB%85%B8%EB%93%9C-%EB%B3%B4%EA%B8%B0\" aria-label=\"3 파드와 노드 보기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 파드와 노드 보기</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># pods 정보보기</span>\nkubectl get pods\n\n<span class=\"token comment\"># pods에 속한 container들 등 보기</span>\nkubectl describe pods\n\n<span class=\"token comment\">#$POD_NAME의 컨테이너 접속해서 명령실행하기</span>\nkubectl <span class=\"token builtin class-name\">exec</span> -it <span class=\"token variable\">$POD_NAME</span> <span class=\"token function\">bash</span></code></pre></div>\n<h3 id=\"4-앱-외부로-노출하기\" style=\"position:relative;\"><a href=\"#4-%EC%95%B1-%EC%99%B8%EB%B6%80%EB%A1%9C-%EB%85%B8%EC%B6%9C%ED%95%98%EA%B8%B0\" aria-label=\"4 앱 외부로 노출하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 앱 외부로 노출하기</h3>\n<ul>\n<li>service: 비슷한 기능을 하는 파드들의 모음!</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># services 정보보기</span>\nkubectl get services\n\n<span class=\"token comment\"># 새로운 service 포트 할당하기</span>\nkubectl expose deploment/kubernetes-bootcamp --type<span class=\"token operator\">=</span><span class=\"token string\">\"NodePort\"</span> --port <span class=\"token number\">8080</span>\n\n<span class=\"token comment\"># 열린 포트 번호 등 정보 보기</span>\nkubectl describe services\nkubectl describe services/<span class=\"token punctuation\">(</span>서비스 이름<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># service로 필터링(run=kubernetes-bootcamp라는 라벨이 붙은 것)하기</span>\nkubectl get pods -l <span class=\"token assign-left variable\">run</span><span class=\"token operator\">=</span>kubernetes-bootcamp\nkubectl get services -l <span class=\"token assign-left variable\">run</span><span class=\"token operator\">=</span>kubernetes-bootcamp\n\n<span class=\"token comment\"># (app=v1이라는)라벨링하기</span>\nkubectl label pod <span class=\"token variable\">$POD_NAME</span> <span class=\"token assign-left variable\">app</span><span class=\"token operator\">=</span>v1\n\nkubectl get pods -l <span class=\"token assign-left variable\">app</span><span class=\"token operator\">=</span>v1\n\n<span class=\"token comment\"># 서비스 배포 중단하기</span>\nkubectl delete <span class=\"token function\">service</span> -l <span class=\"token assign-left variable\">run</span><span class=\"token operator\">=</span>kubernetes-bootcamp\n<span class=\"token comment\"># 외부에 공개되던 것이 중단될 뿐, 실제로 kubectl delete를 해도 pod에서 server는 계속 구동중이다</span>\n<span class=\"token comment\"># curl $(ip):$NODE_PORT로 하면 접근이 거부되지만</span>\n<span class=\"token comment\"># kubectl exec -it $POD_NAME curl localhost:8080으로는 server가 작동됨을 확인 가능</span></code></pre></div>\n<h2 id=\"k8s-secret\" style=\"position:relative;\"><a href=\"#k8s-secret\" aria-label=\"k8s secret permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>k8s Secret</h2>\n<p>비밀번호, 토큰, 키 등을 secret에 저장하자!</p>\n<p>파드가 시크릿을 참조하는 방법은 3가지가 있다</p>\n<ul>\n<li>하나 이상의 컨테이너에 마운트된 볼륨 내의 파일로써 사용</li>\n<li>컨테이너의 환경변수로써 사용</li>\n<li>파드의 이미지를 가져올 때 kubelet에 의해 사용</li>\n</ul>\n<h2 id=\"시크릿-생성하기\" style=\"position:relative;\"><a href=\"#%EC%8B%9C%ED%81%AC%EB%A6%BF-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0\" aria-label=\"시크릿 생성하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>시크릿 생성하기</h2>\n<h3 id=\"kubectl-이용\" style=\"position:relative;\"><a href=\"#kubectl-%EC%9D%B4%EC%9A%A9\" aria-label=\"kubectl 이용 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>kubectl 이용</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># 각각 username, password 이라는 키명으로 username.txt, password.txt.에서 값 가져오기</span>\nkubectl create secret generic db-user-pass --from-file<span class=\"token operator\">=</span>username<span class=\"token operator\">=</span>./username.txt --from-file<span class=\"token operator\">=</span>password<span class=\"token operator\">=</span>./password.txt\n\n<span class=\"token comment\"># 생성된 시크릿 확인</span>\nkubectl get secrets\nkubectl describe secrets/db-user-pass</code></pre></div>\n<h3 id=\"yaml로-직접-작성\" style=\"position:relative;\"><a href=\"#yaml%EB%A1%9C-%EC%A7%81%EC%A0%91-%EC%9E%91%EC%84%B1\" aria-label=\"yaml로 직접 작성 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>yaml로 직접 작성</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token builtin class-name\">echo</span> -n <span class=\"token string\">'admin'</span> <span class=\"token operator\">|</span> base64\n<span class=\"token comment\"># YWRtaW4=</span>\n\n<span class=\"token builtin class-name\">echo</span> -n <span class=\"token string\">'1f2d1e2e67df'</span> <span class=\"token operator\">|</span> base64\n<span class=\"token comment\"># MWYyZDFlMmU2N2Rm</span></code></pre></div>\n<p>일 때 시크릿을 아래와 같이 작성하고</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">apiVersion: v1\nkind: Secret\nmetadata:\n  name: mysecret\ntype: Opaque\ndata:\n  username: <span class=\"token assign-left variable\">YWRtaW4</span><span class=\"token operator\">=</span>\n  password: MWYyZDFlMmU2N2Rm</code></pre></div>\n<p><code class=\"language-text\">kubectl apply -f ./secret.yaml</code> 로 시크릿을 생성할 수 있다. 하지만, 이 방법은 base64로 인코딩 하는 과정을 거치는 방법이다. base64로 인코딩되지 않은 문자열을 시크릿에 직접 넣을 수도 있다. 애플리케이션이 다음 구성 파일을 사용할 때,</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">apiUrl: <span class=\"token string\">\"https://my.api.com/api/v1\"</span>\nusername: <span class=\"token string\">\"user\"</span>\npassword: <span class=\"token string\">\"password\"</span></code></pre></div>","frontmatter":{"title":"Kubernetes","date":"February 07, 2020"}}},"pageContext":{"slug":"/infra/201008-Kubernetes/","previous":null,"next":{"fields":{"slug":"/infra/200716-Docker/"},"frontmatter":{"title":"Docker"}}}}}