<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator><link href="https://blog.uluru.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.uluru.io/" rel="alternate" type="text/html" /><updated>2022-11-17T12:13:39+00:00</updated><id>https://blog.uluru.io/feed.xml</id><title type="html">모험하는 개발자</title><subtitle>dev, blog</subtitle><author><name>모험하는 개발자</name></author><entry><title type="html">[Jenkins] 젠킨스로 CI/CD 구현하기</title><link href="https://blog.uluru.io/study/jenkins-2/" rel="alternate" type="text/html" title="[Jenkins] 젠킨스로 CI/CD 구현하기" /><published>2021-12-20T00:00:00+00:00</published><updated>2021-12-19T00:00:00+00:00</updated><id>https://blog.uluru.io/study/jenkins-2</id><content type="html" xml:base="https://blog.uluru.io/study/jenkins-2/">&lt;h2 id=&quot;54-젠킨스로-cicd-구현하기&quot;&gt;5.4 젠킨스로 CI/CD 구현하기&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;쿠버네티스 환경에서 젠킨스를 이용하여 CI/CD 환경을 구성해 보자.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CI&lt;/code&gt;란 ? (5-1에서 설명했지만 복습을 위해 다시 설명)
    &lt;ul&gt;
      &lt;li&gt;코드를 커밋하고 빌드했을 때 정상적으로 작동하는지 반복적으로 검증해 애플리케이션의 신뢰성을 높이는 작업&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CD&lt;/code&gt;란 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CI&lt;/code&gt;과정에서 생성된 신뢰할 수 있는 애플리케이션을 실제 상용 환경에 자동으로 배포하는 것을 의미.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;젠킨스에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;아이템&lt;/code&gt; 이란?
    &lt;ul&gt;
      &lt;li&gt;새롭게 정의할 작업을 의미.&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;이러한 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;아이템&lt;/code&gt;(작업)의 정의와 순서를 모아 둔 전체 작업을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;프로젝트&lt;/code&gt;라고 한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;Freestyle project
        &lt;ul&gt;
          &lt;li&gt;자유도가 높은 방식으로, 브라우저에서 사용자가 직접 설정값과 수행할 동작을 입력할 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Pipeline
        &lt;ul&gt;
          &lt;li&gt;젠킨스에서 지원하는 고유의 Pipeline 문법으로 코드를 작성해 작업을 정의할 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Multi-configuration project
        &lt;ul&gt;
          &lt;li&gt;하나의 소스 코드를 여러 조건의 조합으로 나온 경우의 수에 해당하는 환경에 동시에 배포할 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Folder
        &lt;ul&gt;
          &lt;li&gt;젠킨스의 작업이 많아질 수록 폴더를 이용하여 작업을 분류할 수 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Multibranch Pipeline
        &lt;ul&gt;
          &lt;li&gt;하나의 소스 코드 저장소 내에 존재하는 각 브런치에서 파이프라인 코드가 작성된 파일을 불러와 한번에 여러 브런치에 대해 품질 검증, 테스트, 빌드 등의 작업을 할 수 있도록 해준다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><category term="jenkins" /><summary type="html">5.4 젠킨스로 CI/CD 구현하기 쿠버네티스 환경에서 젠킨스를 이용하여 CI/CD 환경을 구성해 보자. CI란 ? (5-1에서 설명했지만 복습을 위해 다시 설명) 코드를 커밋하고 빌드했을 때 정상적으로 작동하는지 반복적으로 검증해 애플리케이션의 신뢰성을 높이는 작업</summary></entry><entry><title type="html">[Nas] 시놀로지 NAS Let’s Encrypt Root 인증서 교체</title><link href="https://blog.uluru.io/nas/2/" rel="alternate" type="text/html" title="[Nas] 시놀로지 NAS Let’s Encrypt Root 인증서 교체" /><published>2021-12-06T00:00:00+00:00</published><updated>2021-12-06T00:00:00+00:00</updated><id>https://blog.uluru.io/nas/2</id><content type="html" xml:base="https://blog.uluru.io/nas/2/">&lt;p&gt;시놀로지 정식 버전이라면 문제가 되지 않지만, 헤놀로지를 사용하는 유저라면
Let’s Encrypt 로 인증서 교체 시&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 60
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위 에러 문구로 교체가 되지 않을 것이다.
아마 CURL 로 접근 시 사용하는 root 인증서가 업데이트가 되면서, 헤놀로지에서는 오래된 인증서로 인해 접근이 되지 않는듯 하다.
따라서 아래와 같은 절차가 필요하다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;https://letsencrypt.org/certs/isrgrootx1.pem.txt 에 접근하여 인증서 내용 복사&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;/etc/ssl/certs/ca-certificates.crt 파일 맨 아래에 복사한 내용 추가&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>모험하는 개발자</name></author><category term="nas" /><category term="cloudflare" /><category term="namecheap" /><category term="domain" /><category term="let's encrypt" /><category term="synology" /><summary type="html">시놀로지 정식 버전이라면 문제가 되지 않지만, 헤놀로지를 사용하는 유저라면 Let’s Encrypt 로 인증서 교체 시 Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 60 위 에러 문구로 교체가 되지 않을 것이다. 아마 CURL 로 접근 시 사용하는 root 인증서가 업데이트가 되면서, 헤놀로지에서는 오래된 인증서로 인해 접근이 되지 않는듯 하다. 따라서 아래와 같은 절차가 필요하다.</summary></entry><entry><title type="html">[Jenkins] 젠킨스 설치 및 설정하기</title><link href="https://blog.uluru.io/study/jenkins-1/" rel="alternate" type="text/html" title="[Jenkins] 젠킨스 설치 및 설정하기" /><published>2021-12-06T00:00:00+00:00</published><updated>2021-12-06T00:00:00+00:00</updated><id>https://blog.uluru.io/study/jenkins-1</id><content type="html" xml:base="https://blog.uluru.io/study/jenkins-1/">&lt;h2 id=&quot;53-젠킨스-설치-및-설정하기&quot;&gt;5.3 젠킨스 설치 및 설정하기&lt;/h2&gt;

&lt;h3 id=&quot;531-헬름으로-젠킨스-설치하기&quot;&gt;5.3.1 헬름으로 젠킨스 설치하기&lt;/h3&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# helm 저장소 추가&lt;/span&gt;
helm repo add jenkins https://charts.jenkins.io

&lt;span class=&quot;c&quot;&gt;# helm config 다운로드&lt;/span&gt;
helm inspect values jenkins/jenkins &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; jenkins.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;adminUser&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;admin&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 젠킨스 로그인 아이디&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;adminPassword&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;admin&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 젠킨스 로그인 패스워드&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ingress&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;networking.k8s.io/v1&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;kubernetes.io/ingress.class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nginx&lt;/span&gt;  
    &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;hostName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;lt;Worker Node Ip의 hostName&amp;gt;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;persistence&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;storageClass&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-standard&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;accessMode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ReadWriteOnce&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;8Gi&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 설치&lt;/span&gt;
kubectl create ns jenkins
kubens jenkins
helm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jenkins &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; jenkins.yaml jenkins/jenkins
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;532-젠킨스-살펴보기&quot;&gt;5.3.2 젠킨스 살펴보기&lt;/h3&gt;

&lt;h4 id=&quot;젠킨스-접속하기&quot;&gt;젠킨스 접속하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;jenkins.yaml 에서 설장했던 hostName 으로 접속&lt;/li&gt;
  &lt;li&gt;adminUser, adminPassword 에 설정했던 아이디 패스워드로 로그인&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;533-젠킨스-컨트롤러-설정하기&quot;&gt;5.3.3 젠킨스 컨트롤러 설정하기&lt;/h3&gt;

&lt;h4 id=&quot;젠킨스-시스템-설정하기&quot;&gt;젠킨스 시스템 설정하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;젠킨스 관리 &amp;gt; 시스템 설정 메뉴로 이동&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;젠킨스 시스템 설정&lt;/code&gt; 이 현재 접속한 컨트롤러의 설정을 의미&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;젠킨스-플러그인-관리하기&quot;&gt;젠킨스 플러그인 관리하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;젠킨스 관리 &amp;gt; 플러그인 관리 메뉴로 이동&lt;/li&gt;
  &lt;li&gt;이곳에서는 플러그인 설치 가능 목록, 설치 된 목록, 프록시 서버 설정 등을 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;534-젠킨스-에이전트-설정하기&quot;&gt;5.3.4 젠킨스 에이전트 설정하기&lt;/h3&gt;

&lt;h4 id=&quot;젠킨스-노드-관리&quot;&gt;젠킨스 노드 관리&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;젠킨스 관리 &amp;gt; 노드 관리 메뉴로 이동&lt;/li&gt;
  &lt;li&gt;신규 노드
    &lt;ul&gt;
      &lt;li&gt;에이전트 노드를 추가&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Configure Clouds
    &lt;ul&gt;
      &lt;li&gt;클라우드 환경 기반의 에이전트를 설정할 때 필요&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Node Monitering
    &lt;ul&gt;
      &lt;li&gt;각 종 모니터링 관련된 사항을 설정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;노드 목록
    &lt;ul&gt;
      &lt;li&gt;현재 구성된 노드의 목록을 확인할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;쿠버네티스에서-젠킨스-에이전트-구성&quot;&gt;쿠버네티스에서 젠킨스 에이전트 구성&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Configure Clouds 메뉴로 이동&lt;/li&gt;
  &lt;li&gt;Kubernetes
    &lt;ul&gt;
      &lt;li&gt;쿠버네티스 설정과 관련된 영역으로 Name에 이름을 지정할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Kubernetes Cloud details
    &lt;ul&gt;
      &lt;li&gt;쿠버네티스 클러스터에 접속하기 위한 정보를 설정할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Pod Templates
    &lt;ul&gt;
      &lt;li&gt;에이전트로 사용할 파드와 관련된 설정을 한다.&lt;/li&gt;
      &lt;li&gt;젠킨스 컨트롤러를 다시 시작하면 모든 설정이 초기화 된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jenkins-서비스-어카운트를-위한-권한-설정하기&quot;&gt;jenkins 서비스 어카운트를 위한 권한 설정하기&lt;/h4&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# jenkins 계정에 쿠버네티스 클러스터에 대한 admin 권한을 부여한다.&lt;/span&gt;
kubectl create clusterrolebinding jenkins-cluster-admin &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;--clusterrole&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;cluster-admin &lt;span class=&quot;nt&quot;&gt;--serviceaccount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;default:jenkins
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;jenkins 서비스 어카운트를 통해 젠킨스 에이전트 파드를 생성하거나 젠킨스 에이전트 파드 내부에서 쿠버네티스의 오브젝트에 제약 없이 접근하려면 cluster-admin 역할을 부여해야 한다.&lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th style=&quot;text-align: left&quot;&gt;명령&lt;/th&gt;
          &lt;th style=&quot;text-align: left&quot;&gt;설명&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;kubectl create&lt;/td&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;오브젝트를 생성하는 kubectl 명령어&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;clusterrolebinding&lt;/td&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;생성되는 오브젝트가 clusterrolebinding임을 나타낸다.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;jenkins-cluster-admin&lt;/td&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;clusterrolebinding으로 생성되는 오브젝트의 이름이 jenkins-cluster-admin임을 나타낸다.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;–clusterrole=cluster-admin&lt;/td&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;clusterrolebinding의 첫 번째 옵션으로, cluster-admin 역할을 부여한다.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;–serviceaccount=default:jenkins&lt;/td&gt;
          &lt;td style=&quot;text-align: left&quot;&gt;clusterrolebinding의 두 번쨰 옵션으로, default에 있는 jenkins라는 서비스 어카운트에 이 권한을 부여한다.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# clusterrolebinding에 적용 된 내용을 yaml으로 출력&lt;/span&gt;
kubectl get clusterrolebindings jenkins-cluster-admin &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><category term="jenkins" /><summary type="html">5.3 젠킨스 설치 및 설정하기</summary></entry><entry><title type="html">[Jenkins] 지속적 통합과 배포 자동화, 젠킨스</title><link href="https://blog.uluru.io/study/docker-6/" rel="alternate" type="text/html" title="[Jenkins] 지속적 통합과 배포 자동화, 젠킨스" /><published>2021-11-24T00:00:00+00:00</published><updated>2021-11-24T00:00:00+00:00</updated><id>https://blog.uluru.io/study/docker-6</id><content type="html" xml:base="https://blog.uluru.io/study/docker-6/">&lt;h2 id=&quot;5-지속적-통합과-배포-자동화-젠킨스&quot;&gt;5 지속적 통합과 배포 자동화, 젠킨스&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;4장에서 진행한 과정을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;파이프라인&lt;/code&gt;이라고 한다.&lt;/li&gt;
  &lt;li&gt;자동화는 크게 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;지속적 통합(CI)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;지속적 배포(CD)&lt;/code&gt; 2가지로 정의 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;51-컨테이너-인프라-환경에서-cicd&quot;&gt;5.1 컨테이너 인프라 환경에서 CI/CD&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;컨테이너 인프라 환경에서는 주로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CD&lt;/code&gt;를 강조하지만 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CI&lt;/code&gt;와 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CD&lt;/code&gt;는 함께 사용되기 때문에 개념을 정확히 이해하는 것이 중요하다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;인프라 관점에서 정리한다면, 개발자가 소스를 커밋하고 푸시하면 CI  단계로 들어 가게 되고, 자동 빌드 되고 테스트를 거쳐 배포할 수 있는 애플리케이션인지 검증을 거치면 CD 단계로 넘어간다, CD단계에서는 애플리케이션을 컨테이너 이미지로 만들어서 파드, 디플로이먼트, 스테이트풀셋 등 다양한 오브젝트 조건에 맞춰 배포 된다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;511-cicd-도구-비교&quot;&gt;5.1.1 CI/CD 도구 비교&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;팀시티
    &lt;ul&gt;
      &lt;li&gt;코틀린 기반으로, 에이전트 3개와 빌드 작업 100개를 무료로 사용할 수 있으며, 이후는 유료 결제를 해야 한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;깃허브 액션
    &lt;ul&gt;
      &lt;li&gt;깃허브에서 지원하는 워크플로 기반의 도구이다. 한달에 2,000분 제한 시간이 있으며, 추가로 사용할 경우 분 단위의 요금이 부과 된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;뱀부
    &lt;ul&gt;
      &lt;li&gt;아틀라시안에서 만든 도구로, 유료이며, 사용자 서버에 설치해 사용한다. 아틀라시안에서 만든 다른 협업 도구를 사용 중이라면 같이 사용하기 좋다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;젠킨스
    &lt;ul&gt;
      &lt;li&gt;오픈 소스 도구로, 사용자가 직접 UI에서 작업을 구성하거나 코드로 정의할 수 있다.&lt;/li&gt;
      &lt;li&gt;오랜 시간 동안 사용되어 CI/CD 도구의 대명사라 해도 될 정도이다.&lt;/li&gt;
      &lt;li&gt;사용자 수가 많아 정보를 찾기 쉽고 활용 방법과 플러그인 개발 등 쉽게 찾을 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;따라서 젠킨스로 ㄱㄱ&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;젠킨스로-쿠버네티스-운영-환경-개선하기&quot;&gt;젠킨스로 쿠버네티스 운영 환경 개선하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;컨테이너 인프라 환경에서 젠킨스를 사용하는 주된 이유는 애플리케이션을 컨테이너로 만들고 배포하는 과정을 자동화 하기 위해서이다.&lt;/li&gt;
  &lt;li&gt;젠킨스는 컨트롤러와 에이전트 형태로 구성한 다음 배포해야 하며, 여기에 필요한 설정을 모두 넣어야 한다.&lt;/li&gt;
  &lt;li&gt;구성 환경에 따라 많은 부분을 동적으로 변경해야 하는데, 동적인 변경 사항을 간편하고 빠르게 적용할 수 있도록 도와주는 도구에는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;커스터마이즈&lt;/code&gt; 그리고 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;헬름&lt;/code&gt;이 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;52-젠킨스-설치를-위한-간편화-도구-살펴보기&quot;&gt;5.2 젠킨스 설치를 위한 간편화 도구 살펴보기&lt;/h2&gt;

&lt;h3 id=&quot;521-배포-간편화-도구-비교하기&quot;&gt;5.2.1 배포 간편화 도구 비교하기&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;구분&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;큐브시티엘&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;커스터마이즈&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;헬름&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;설치방법&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;쿠버네티스에 기본 포함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;별도 실행 파일 또는 쿠버네티스에 통합&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;별도 설치&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;배포 대상&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;정적인 야믈 파일&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;커스터마이즈 파일&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;패키지(차트)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;주 용도&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;오브젝트 관리 및 배포&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;오브젝트의 가변적 배포&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;패키지 단위 오브젝트 배포 및 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;가변적 환경&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;대응 힘듬(야믈 수정 필요)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;간단한 대응 가능&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;복잡한 대응 가능&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;기능 복잡도&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;단순함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;보통&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;복잡함&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;522-커스터마이즈로-배포-간편화하기&quot;&gt;5.2.2 커스터마이즈로 배포 간편화하기&lt;/h3&gt;

&lt;h4 id=&quot;커스터마이즈의-작동-원리&quot;&gt;커스터마이즈의 작동 원리&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;야믈 파일에 정의된 값을 사용자가 원하는 값으로 변경할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 커스터마이즈로 변경될 작업을 정의&lt;/span&gt;
kustomize create &lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;metallb-system &lt;span class=&quot;nt&quot;&gt;--resources&lt;/span&gt; namespace.yaml,metallb.yaml,metallb-12config.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;kustomization.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;namespace.yaml&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb.yaml&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb-12config.yaml&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb-system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 설치 된 이미지를 안정적인 버전으로 유지하기 위해 이미지 태그를 v0.8.2로 지정&lt;/span&gt;
kustomize edit &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;image metallb/controller:v0.8.2
kustomize edit &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;image metallb/speaker:v0.8.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;kustomization.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;중략&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb/controller&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;newTag&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v0.8.2&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb/speaker&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;newTag&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v0.8.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# MetlLB 설치를 위한 매니페스트를 생성&lt;/span&gt;
kustomize build

&lt;span class=&quot;c&quot;&gt;# 빌드한 결과가 바로 kubectl apply에 인자로 전달돼 배포되도록 할수도 있다.&lt;/span&gt;
kustomize build | kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# MetalLB가 정상 배포 되었는지 확인&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
kubectl get configmap &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 디플로이먼트 1개를 배포하여 LB 타입으로 노출하고 IP가 정상적으로 할당 됬는지 확인&lt;/span&gt;
kubectl create deployment echo-ip &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;sysnet4admin/echo-ip
kubectl expose deployment echo-ip &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
kubectl get service echo-ip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;523-헬름으로-배포-간편화하기&quot;&gt;5.2.3 헬름으로 배포 간편화하기&lt;/h3&gt;

&lt;h4 id=&quot;헬름의-작동-원리&quot;&gt;헬름의 작동 원리&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스에 패키지를 손쉽게 배포할 수 있도록 패키지를 관리하는 쿠버네티스 전용 패키지 매니저이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;플랫폼&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;패키지 매니저&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;저장소&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;사용 목적&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;리눅스&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;yum, apt&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;배포판 저장소&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;소프트웨어 의존성 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;파이썬&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;pip&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;pypi.org&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;파이썬 모듈 의존성 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자바&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;maven&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;mvnrepository.com&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자바 라이브러리의 의존성 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;쿠버네티스&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;helm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;artifacthub.io&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;쿠버네티스 패키지 관리&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;다수의 오브젝트 배포 야믈은 파일 구분자인 ‘&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;---&lt;/code&gt;‘로 묶어 단일 야믈로 작성해 배포할 수 있는 장점이 있다.&lt;/li&gt;
  &lt;li&gt;요구 조건별로 리소르를 편집하거나 변수를 넘겨서 처리하는 패키지를 만들 수 있다. 이 패키지는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;차트&lt;/code&gt;라고 한다&lt;/li&gt;
  &lt;li&gt;배포한 애플리케이션을 업그레이드하거나 되돌릴 수 있는 기능과 삭제할 수 있는 기능을 제공한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# MetalLB 설치를 위해 저장소 등록&lt;/span&gt;
helm repo add edu https://iac-source.github.io/helm-charts

&lt;span class=&quot;c&quot;&gt;# 레포지토리 업데이트&lt;/span&gt;
helm repo update

&lt;span class=&quot;c&quot;&gt;# 설치&lt;/span&gt;
helm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;metallb edu/metallb &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;metallb-system &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;--crate-namespace&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;--set&lt;/span&gt; controller.tag&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;v0.8.3 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;--set&lt;/span&gt; speaker.tag&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;v0.8.3
&lt;span class=&quot;nt&quot;&gt;--set&lt;/span&gt; configmap.ipRange&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;192.168.1.11-192.168.1.29
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 배포 상태 확인&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
kubectl get configmap &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system

&lt;span class=&quot;c&quot;&gt;# 테스트를 위한 디플로이먼트 생성&lt;/span&gt;
kubectl create deployment echo-ip &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;sysnet4admin/echo-ip
kubectl expose deployment echo-ip &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
kubectl get service echo-ip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><category term="jenkins" /><summary type="html">5 지속적 통합과 배포 자동화, 젠킨스 4장에서 진행한 과정을 파이프라인이라고 한다. 자동화는 크게 지속적 통합(CI), 지속적 배포(CD) 2가지로 정의 된다.</summary></entry><entry><title type="html">[Docker] 4가지 방법으로 컨테이너 이미지 만들기</title><link href="https://blog.uluru.io/study/docker-4/" rel="alternate" type="text/html" title="[Docker] 4가지 방법으로 컨테이너 이미지 만들기" /><published>2021-11-20T00:00:00+00:00</published><updated>2021-11-20T00:00:00+00:00</updated><id>https://blog.uluru.io/study/docker-4</id><content type="html" xml:base="https://blog.uluru.io/study/docker-4/">&lt;h2 id=&quot;43-4가지-방법으로-컨테이너-이미지-만들기&quot;&gt;4.3 4가지 방법으로 컨테이너 이미지 만들기&lt;/h2&gt;

&lt;h3 id=&quot;431-기본-방법으로-빌드하기&quot;&gt;4.3.1 기본 방법으로 빌드하기&lt;/h3&gt;
&lt;p&gt;자바소스 빌드 -&amp;gt; 도커파일 작성 -&amp;gt; 도커파일 빌드 -&amp;gt; 빌드 완료&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;도커 빌드에 사용 된 Dockerfile은 DSL로 작성된 파일이다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM openjdk:8
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
EXPOST 60431
COPY ./abc.jar /opt/abc.jar
WORKDIR /opt
ENTRYPOINT &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;java&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;abc.jar&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;도커 파일 내용&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;배시 명령으로 유사 해석&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;설명&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;FROM openjdk:8&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;import openjdk:8 image&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;openjdk를 기초 이미지로 사용한다.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;LABEL description=”Echo IP Java Application”&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Label_desc=”Echo IP Java Application”&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;이미지에 부가적인 설명을 위한 레이블을 추가할 떄 사용&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;EXPOST 60431&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;EXPOST=60431&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;사용할 포트&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;COPY ./abc.jar /otp/abc.jar&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;scp ./target/abc.jar /opt/abc.jar&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 이미지로 필요한 파일 복사&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;WORKDIR /opt&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;cd /opt&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;이미지의 현재 작업 위치를 opt로 변경&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;6&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;ENTRYPOINT [“java”, “-jar”, “abc.jar”]&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;./java -jar .abc.jar&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;abc.jar를 java -jar 명령어를 통해 실행&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 생성한 이미지 확인&lt;/span&gt;
docker images basic-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 1.0 태그 이미지 생성&lt;/span&gt;
docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; basic-img:1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# sed를 이용한 Dockerfile 내용 중 일부 수정&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/Application/Development/'&lt;/span&gt; Dockerfile

&lt;span class=&quot;c&quot;&gt;# 버전이 중복 되지 않도록 태그 2.0 으로 사용&lt;/span&gt;
docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; basic-img:2.0 &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 컨테이너 동작&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 60431:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; basic-run &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always basic-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;432-컨테이너-용량-줄이기&quot;&gt;4.3.2 컨테이너 용량 줄이기&lt;/h3&gt;
&lt;p&gt;도커파일 작성 -&amp;gt; 도커파일 빌드 -&amp;gt; 빌드 완료&lt;/p&gt;

&lt;p&gt;Dockerfile&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM gcr.io/distroless/java:8 &lt;span class=&quot;c&quot;&gt;# 자바 실행을 위해 설계 된 가벼운 이미지&lt;/span&gt;
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
EXPOST 60432
COPY ./abc.jar /opt/abc.jar
WORKDIR /opt
ENTRYPOINT &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;java&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;abc.jar&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;Dockerfile 에서 변경 된 FROM 에 distroless 는 자바 실행으 위해 경량화 된 이미지이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;용량을 줄여 빌드한 컨테이너 이미지와 원래 빌드한 이미지를 비교.&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 현재 새로 생성된 이미지만 볼 수 있게 head -n 3 옵션을 추가&lt;/span&gt;
docker images | &lt;span class=&quot;nb&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 3
REPOSITORY      TAG     SIZE
optimal-img     latest  145MB
basic-img       latest  528MB

&lt;span class=&quot;c&quot;&gt;# 정상 작동하는지 확인&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 60432:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; optimal-run &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always optimal-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;433-컨테이너-내부에서-컨테이너-빌드하기&quot;&gt;4.3.3 컨테이너 내부에서 컨테이너 빌드하기&lt;/h3&gt;
&lt;p&gt;도커파일 작성 -&amp;gt; 도커파일 빌드 -&amp;gt; 빌드 완료&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM openjdk:8
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
EXPOST 60433
RUN git clone https://github.com/iac-source/inbuilder.git &lt;span class=&quot;c&quot;&gt;# 이미지 내부에서 실행하기 위해 RUN을 추가&lt;/span&gt;
WORKDIR inbuilder &lt;span class=&quot;c&quot;&gt;# git clone으로 내려받은 디렉터리 현재 작업 공간으로 설정&lt;/span&gt;
RUN &lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;700 mvnw &lt;span class=&quot;c&quot;&gt;# mvnw에 실행 권한 설정&lt;/span&gt;
RUN ./mvnw clean package &lt;span class=&quot;c&quot;&gt;# 메이븐 래퍼로 JAR 빌드&lt;/span&gt;
RUM &lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;target/abc.jar /opt/abc.jar &lt;span class=&quot;c&quot;&gt;# 빌드된 jar를 옮김&lt;/span&gt;
WORKDIR /opt
ENTRYPOINT &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;java&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;abc.jar&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# docker 파일 빌드&lt;/span&gt;
docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; nohost-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 정상 작동 확인&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 60433:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; nohost-run &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always nohost-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 빌드한 컨테이너 삭제&lt;/span&gt;
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; optimal-run
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; basic-run
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; nohost-run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;434-최적화해-컨테이너-빌드하기&quot;&gt;4.3.4 최적화해 컨테이너 빌드하기&lt;/h3&gt;
&lt;p&gt;도커파일 작성 -&amp;gt; 도커파일 빌드 -&amp;gt; 빌드 완료&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;멀티 스테이지 빌드은 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도굴르 설치할 필요도 없다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;docker-ce 17.06 버전 부터 지원한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dockerfile&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 1단계: 자바 소스를 빌드해 JAR로 만든다.&lt;/span&gt;
FROM openjdk:8 AS int-build &lt;span class=&quot;c&quot;&gt;# openjdk 이미지에 별칭을 붙인다.`&lt;/span&gt;
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
RUN git clone https://github.com/iac-source/inbuilder.git
WORKDIR inbuilder
RUN &lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;700 mvnw
RUN ./mvnw clean package

&lt;span class=&quot;c&quot;&gt;# 2단계: 빌드 된 JAR를 경량화 이미지에 복사한다.&lt;/span&gt;
FROM gcr.io/distroless/java:8
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
EXPOSE 60434 &lt;span class=&quot;c&quot;&gt;# 노출 되는 포트의 중복을 피하고자 변경.&lt;/span&gt;
COPY &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;int-build inbuilder/target/abc.jar /opt/abc.jar &lt;span class=&quot;c&quot;&gt;# 1단계에서 빌드가 완성된 jar를 distroless에 복사 함&lt;/span&gt;
WORKDIR /otp
ENTRYPOINT &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;java&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;abc.jar&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; multistage-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;컨테이너 이미지 중에 &lt;none&gt; 으로 표시되는 이미지가 있다, 이런 이미지를 댕글링 이미지라고 한다.&lt;/none&gt;&lt;/li&gt;
  &lt;li&gt;멀티 스테이지 과정에서 자바 소스를 빌드하는 과정에 생성 된 이미지로, 불필요한 이미지이기에 삭제 한다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rmi &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker images &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;danling&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 정상 작동 확인&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 60434:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; multistage-run &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always multistage-img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 그동안 빌드한 컨테이너 삭제&lt;/span&gt;
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; optimal-run
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; basic-run
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; nohost-run
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; multistage-run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><summary type="html">4.3 4가지 방법으로 컨테이너 이미지 만들기</summary></entry><entry><title type="html">[Docker] 쿠버네티스에서 직접 만든 컨테이너 사용하기</title><link href="https://blog.uluru.io/study/docker-5/" rel="alternate" type="text/html" title="[Docker] 쿠버네티스에서 직접 만든 컨테이너 사용하기" /><published>2021-11-20T00:00:00+00:00</published><updated>2021-11-20T00:00:00+00:00</updated><id>https://blog.uluru.io/study/docker-5</id><content type="html" xml:base="https://blog.uluru.io/study/docker-5/">&lt;h2 id=&quot;44-쿠버네티스에서-직접-만든-컨테이너-사용하기&quot;&gt;4.4 쿠버네티스에서 직접 만든 컨테이너 사용하기&lt;/h2&gt;

&lt;h3 id=&quot;441-쿠버네티스에서-도커-이미지-구동하기&quot;&gt;4.4.1 쿠버네티스에서 도커 이미지 구동하기&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스는 컨테이너를 효과적으로 다루기 위해 만들어 졌다.&lt;/li&gt;
  &lt;li&gt;kubectl 명령으로 직접 만든 컨테이너 이미지도 구동할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dockerfile&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM openjdk:8 AS int-build
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Java Application builder&quot;&lt;/span&gt;
RUN git clone https://github.com/iac-source/inbuilder.git
WORKDIR inbuilder
RUN &lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;700 mvnw
RUN ./mvnw clean package

FROM gcr.io/distroless/java:8
LABEL &lt;span class=&quot;nv&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Echo IP Java Application&quot;&lt;/span&gt;
EXPOSE 60434
COPY &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;java&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;app-in-image.jar&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 내부에 존재하는 컨테이너 이미지를 사용하도록 설정하여 디플로이먼트 생성&lt;/span&gt;
kubectl create deployment &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--dry-run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;client &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; yaml &lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;multistage-img &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; test.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;442-레지스트리-구성하기&quot;&gt;4.4.2 레지스트리 구성하기&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;호스트에서 생성한 이미지를 사용하려면 모든 노드에서 공통으로 접근하는 저장소가 필요하다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;도커는 레지스트리에 접속하는 과정에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;주체 대체 이름&lt;/code&gt; 이라는 추가 정보를 검증하기 때문에 인증서를 생성하는 과정이 필요하다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;도커에서 제공하는 도커 레지스트리 이미지를 사용하여 사설 도커 레지스트리를 만들어 보자.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tls.csr&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;req]
distringuished_name &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; private_registry_cert_req
x509_extensions &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; v3_req
prompt &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; no

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;private_registry_cert_req]
C &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; KR
ST &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; SEOUL
L &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; SEOUL
O &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; gilbut
OU &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; uluru
CN &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 192.16.1.10

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;v3_req]
keyUsage &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; keyEncipherment, dataEncipherment
extendedKeyUsage &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; serverAuth
subjectAltName &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; @alt_names

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;alt_names]
DNS.0 &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; uluru
IP.0 &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 102.168.1.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;create-registry.sh&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 레지스트리를 생성 하고 구동하는 과정이 담긴 스크립트이다.&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;certs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/docker/certs.d/192.168.1.10:8443
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /registry-image
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /etc/docker/certs
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$certs&lt;/span&gt;
openssl req &lt;span class=&quot;nt&quot;&gt;-x509&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-config&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dirname&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/tls.csr &lt;span class=&quot;nt&quot;&gt;-nodes&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-keyout&lt;/span&gt; tls.key &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; tls.crt &lt;span class=&quot;nt&quot;&gt;-days&lt;/span&gt; 365 &lt;span class=&quot;nt&quot;&gt;-extensions&lt;/span&gt; v3_req

yum &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;sshpass &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;i &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..3&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;do
        &lt;/span&gt;sshpass &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; vgrant ssh &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;no root@192.168.1.10&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$certs&lt;/span&gt;
        sshpass &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; vagrant scp tls.crt 192.168.1.10&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$certs&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;done

&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cp &lt;/span&gt;tls.crt &lt;span class=&quot;nv&quot;&gt;$certs&lt;/span&gt;
mvtls.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; /etc/docker/certs

docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;always &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; registry &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /etc/docker/certs:/docker-in-certs:ro &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /registry-image:/var/lib/registry &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;REGISTRY_HTTP_ADDR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.0.0.0:443 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;REGISTRY_HTTP_TLS_CERTIFICATE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/docker-in-certs/tls.crt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;REGISTRY_HTTP_TLS_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/docker-in-certs/tls.key &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 8443:443
    registry:2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# sh 실행&lt;/span&gt;
~/create-registry.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 이미지를 도커 레지스트리에 등록&lt;/span&gt;
docker push 192.168.10.10:8443/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;443-직접-만든-이미지로-컨테이너-구동하기&quot;&gt;4.4.3 직접 만든 이미지로 컨테이너 구동하기&lt;/h3&gt;
&lt;p&gt;test.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.1.10:8443/multistage-img&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;multistage&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# test.yaml 디플로이 먼트 생성&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; test.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 구동 확인&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><summary type="html">4.4 쿠버네티스에서 직접 만든 컨테이너 사용하기</summary></entry><entry><title type="html">[Docker] 도커를 알아야 하는 이유</title><link href="https://blog.uluru.io/study/docker-2/" rel="alternate" type="text/html" title="[Docker] 도커를 알아야 하는 이유" /><published>2021-11-11T00:00:00+00:00</published><updated>2021-11-11T00:00:00+00:00</updated><id>https://blog.uluru.io/study/docker-2</id><content type="html" xml:base="https://blog.uluru.io/study/docker-2/">&lt;h2 id=&quot;41-도커를-알아야-하는-이유&quot;&gt;4.1 도커를 알아야 하는 이유&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스를 이루는 기본 오브젝트가 파드고, 파드는 컨테이너로 이루어져 있으며, 컨테이너를 만들고 관리하는 도구가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;도커&lt;/code&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;411-파드-컨테이너-도커-쿠버네티스의-관계&quot;&gt;4.1.1 파드, 컨테이너, 도커, 쿠버네티스의 관계&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;파드들은 워커 노드라는 노드 단위로 관리한다.&lt;/li&gt;
  &lt;li&gt;워커 노드와 마스터 노드가 모여 쿠버네티스 클러스터가 된다.&lt;/li&gt;
  &lt;li&gt;파드는 1개 이상의 컨테이너로 이루어져 있다.&lt;/li&gt;
  &lt;li&gt;파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공한다.&lt;/li&gt;
  &lt;li&gt;파드는 컨테이너들이 정상적으로 작동하는지 확인하고 너트워크나 저장 공간을 서로 공유하게 한다.&lt;/li&gt;
  &lt;li&gt;따라서, 컨테이너를 돌보는 것이 파드고, 파드를 돌보는 것이 쿠버네티스 워커 노드이며, 워커 노드를 돌보는 것이 쿠버네티스 마스터이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;컨테이너&lt;/code&gt;는 하나의 운영 체제 안에서 커널을 공유하며 개별적인 실행 환경을 제공하는 격리된 공간이다.&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;개별적인 실행 환경&lt;/code&gt;이란 CPU, 네트워크, 메모리와 같은 시스템 자원을 독자적으로 사용하도록 할당된 환경을 말한다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;도커&lt;/code&gt;는 컨테이너를 사용하는 방법을 명령어로 정리한 것으로 보면 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;412-다양한-컨테이너-관리-도구&quot;&gt;4.1.2 다양한 컨테이너 관리 도구&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;구분&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;&lt;center&gt;설명&lt;/center&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너디&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1. Docker사에서 컨테이너 런타임 부분을 분리하여 만든 오픈 소스 컨테이너 관리도구이다.&lt;br /&gt;2. 쿠버네티스와의 통신에 필요한 컨테이너 런타임 인터페이스 규격에 맞춰 구현한 플로그인을 사용해 쿠버네티스와 통합할 수 있다.&lt;br /&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;크라이오&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1. 레드햇에서 개발해 2019년 클라우드 네이티브 컴퓨팅 재단에 기부한 오픈 소스 프로젝트이다.&lt;br /&gt;2. 다른 도구보다 가볍고 단순하며, 컨테이너 런타임 인터페이스 규격을 자체적으로 구현하고 있어서 별도의 구성요소나 플러그인 없이 쿠버네티스와 통합할 수 있다.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;카타컨테이너&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1. 오픈스택 재단에서 후원하는 오픈 소스 컨테이너 관리 도구이다.&lt;br /&gt;2. 컨테이너마다 독립적인 커널을 제공한다는 점에서 기존 컨테이너 방식과 큰 차이가 있다.&lt;br /&gt;3. 카타를 실행하면 개별 컨테이너를 위한 가벼운 가상 머신을 생성하고 그 위에 컨테이너가 작동한다.&lt;br /&gt;4. 모든 컨테이너가 독립적인 커널을 사용하므로 다른 컨테이너의 영향을 받지 않는다.&lt;br /&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;도커&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1. Docker사에서 2013년에 만든 컨테이너 관리 도구로, 컨테이너 관리 기능 외에도 컨테이너를 실행하는 데 필요한 이미지를 만들거나 공유하는 등 다양한 기능을 제공한다.&lt;br /&gt;2. 사용자가 명령어를 입력하는 명령어 도구와 명령을 받아들이는 도커 데몬으로 구성 되어있다.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;구분&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;컨테이너디&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;크라이오&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;카타 컨테이너&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;도커&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;명령어 도구&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;별도 지원&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;타 도구 사용&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자체 지원&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자체 지원&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;내부 구조&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;단순&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 단순&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;복잡&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;복잡&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;확장성&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋지 못함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋지 못함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 관리&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;이미지 관리&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;보안성&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;자원 사용량&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋지 못함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;정보량&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;적음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;거의 없음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;거의 없음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 많음&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><summary type="html">4.1 도커를 알아야 하는 이유 쿠버네티스를 이루는 기본 오브젝트가 파드고, 파드는 컨테이너로 이루어져 있으며, 컨테이너를 만들고 관리하는 도구가 도커 이다.</summary></entry><entry><title type="html">[Docker] 도커로 컨테이너 다루기</title><link href="https://blog.uluru.io/study/docker-3/" rel="alternate" type="text/html" title="[Docker] 도커로 컨테이너 다루기" /><published>2021-11-11T00:00:00+00:00</published><updated>2021-11-11T00:00:00+00:00</updated><id>https://blog.uluru.io/study/docker-3</id><content type="html" xml:base="https://blog.uluru.io/study/docker-3/">&lt;h2 id=&quot;42-도커로-컨테이너-다루기&quot;&gt;4.2 도커로 컨테이너 다루기&lt;/h2&gt;

&lt;h3 id=&quot;421-컨테이너-이미지-알아보기&quot;&gt;4.2.1 컨테이너 이미지 알아보기&lt;/h3&gt;

&lt;h4 id=&quot;이미지-검색하고-내려받기&quot;&gt;이미지 검색하고 내려받기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;이미지는 레지스트리라고 하는 저장소에 모여 있다.&lt;/li&gt;
  &lt;li&gt;레지스트리는 도커 허브처럼 공개된 유명 레지스트리일 수도 있고, 내부에 구축한 레지스트리일 수도 있다.&lt;/li&gt;
  &lt;li&gt;이미지는 레지스트리 웹 사이트에서 직접 검색해도 되고, 명령 창에서 쿠버네티스 마스터 노드에 접속해 검색할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 이미지 검색 Ex) docker search [검색어]&lt;/span&gt;
docker search nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 이미지 내려받기 Ex) docker pull [NAME]&lt;/span&gt;
docker pull nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;이미지-태그&quot;&gt;이미지 태그&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;태그&lt;/code&gt;는 이름이 동일한 이미지에 추가하는 식별자이다.&lt;/li&gt;
  &lt;li&gt;이미지를 내려받거나 이미지를 기반으로 컨테이너를 구동할 때 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;태그&lt;/code&gt;를 명시하지 않으면 기본 적으로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;latest&lt;/code&gt; 태그를 사용한다.&lt;/li&gt;
  &lt;li&gt;최신 버전은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;latest&lt;/code&gt;, 안정화 버전은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 최신 버전&lt;/span&gt;
docker pull nginx:latest 또는 docker pull nginx
&lt;span class=&quot;c&quot;&gt;# 안정화 버전&lt;/span&gt;
docker pull nginx:stable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;이미지의-레이어-구조&quot;&gt;이미지의 레이어 구조&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;컨테이너 이미지는 애플리케이션과 각종 파일을 담고 있다는 점에서 Zip 같은 압축 파일과 비슷하다.&lt;/li&gt;
  &lt;li&gt;압축 파일은 파일의 개수에 따라 전체 용량이 증가하지만 이미지는 같은 내용일 경우 여러 이미지에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;동일한 레이어를 공유&lt;/code&gt;하므로 전체 용량이 감소한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 내려받은 이미지 조회 Ex) docker images [NAME]&lt;/span&gt;
docker images nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# stable 이미지 생성 과정에 대한 자세한 이력을 볼 수 있다.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 또한 latest 버전과 stable 버전에서 서로 레이어를 공유하고 있음을 확인할 수 있다.&lt;/span&gt;
docker &lt;span class=&quot;nb&quot;&gt;history &lt;/span&gt;nginx:stable
docker &lt;span class=&quot;nb&quot;&gt;history &lt;/span&gt;nginx:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;422-컨테이너-실행하기&quot;&gt;4.2.2 컨테이너 실행하기&lt;/h3&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 새로운 컨테이너를 실행&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;notice--info&quot;&gt;옵션에 따라 달라지는 컨테이너 시작 방법&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;값&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;컨테이너 비정상 종료 시&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;도커 서비스 시작 시&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no (기본값)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 재시작하지 않음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 시작하지 않음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;on-failure&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 재시작함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 시작함&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;always&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 재시작함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 시작함&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;unless-stopped&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너를 재시작함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;사용자가 직접 정하지 않은 컨테이너만 시작함&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 생성한 컨테이너 상태를 확인&lt;/span&gt;
docker ps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;CONTAINER ID
    &lt;ul&gt;
      &lt;li&gt;컨테이너를 식별하기 위한 고유 ID&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;IMAGE
    &lt;ul&gt;
      &lt;li&gt;컨테이너를 만드는 데 사용한 이미지&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;COMMAND
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 생성될 때 내부에서 작동할 프로그램을 실행하는 명령어&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;CREATED
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 생성 된 시각&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;STATUS
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 작동을 시작한 시각 (CREATED와 달리 컨테이너를 재시작할 경우 초기화)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;PORTS
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 사용하는 포트와 프로토콜&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;NAMES
    &lt;ul&gt;
      &lt;li&gt;컨테이너 이름을 표시 (docker run 시에 –name 옵션으로 직접 지정 가능)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# docker ps 시 -f 옵션으로 필터링 할 수 있다. (문자열 포함)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# ex) docker ps -f id=[CONTAINER ID]&lt;/span&gt;
docker ps &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;ef
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;notice--info&quot;&gt;자주 사용하는 필터링 키&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;id
    &lt;ul&gt;
      &lt;li&gt;컨테이너 아이디&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;name
    &lt;ul&gt;
      &lt;li&gt;컨테이너 이름&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;label
    &lt;ul&gt;
      &lt;li&gt;컨테이너 레이블&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;exited
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 종료됬을 때 반환하는 숫자 코드&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;status
    &lt;ul&gt;
      &lt;li&gt;컨테이너의 작동 상태&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;ancestor
    &lt;ul&gt;
      &lt;li&gt;컨테이너가 사용하는 이미지&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;컨테이너는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;변경 불가능한 인프라&lt;/code&gt;를 지향한다.&lt;br /&gt;
따라서 초기에 인프라를 구성하면 임의로 디렉터리 연결이나 포트 노출 같은 설정을 변경할 수 없다.&lt;br /&gt;
번거롭더라도 컨테이너 설정의 변경이 필요하고자 한다면 새로운 컨테이너를 생성해야 한다.&lt;br /&gt;
이러한 특성 덕분에 컨테이너로 배포된 인프라는 배포된 상태를 유지한다는 장점이 있다.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 컨테이너 외부에서 접속할 수 있도록 포트포워딩을 해준다.&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 8080:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; nginx-exposed &lt;span class=&quot;nt&quot;&gt;--restart&lt;/span&gt; always nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 지정한 name 을 필터링 하여 컨테이너가 작동하는지 확인&lt;/span&gt;
docker ps &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx-exposed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;컨테이너가 정상적으로 동작한다면 외부에서 8080으로 접근 시 해당 컨테이너의 80포트 서비스로 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;423-컨테이너-내부-파일-변경하기&quot;&gt;4.2.3 컨테이너 내부 파일 변경하기&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;도커는 컨테이너 내부에서 컨테이너 외부의 파일을 사용할 수 있는 방법을 크게 4가지 제공 한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;docker cp
    &lt;ul&gt;
      &lt;li&gt;호스트에 위치한 파일을 구동 중인 컨테이너 내부에 복사&lt;/li&gt;
      &lt;li&gt;컨테이너에 임시로 필요한 파일이 있는 경우 또는 컨테이너에 저장돼 있는 설정 및 로그를 추출해 확인하는 목적으로 사용&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Dockerfile ADD
    &lt;ul&gt;
      &lt;li&gt;이미지는 Dockerfile을 기반으로 만들어지는데, Dockerfile에 ADD 라는 구문으로 이미지를 빌드할 떄 지정한 파일이 이미지 내부로 복사 된다.&lt;/li&gt;
      &lt;li&gt;사용자가 원하는 파일을 선택해 사용할 수 없다는 단점이 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;바인드 마운트
    &lt;ul&gt;
      &lt;li&gt;호스트 파일의 시스템과 컨테이너 내부를 연결해 양쪽에 동시에 반영 된다.&lt;/li&gt;
      &lt;li&gt;컨테이너가 바뀌어도 없어지면 안 되는 자료는 이 방법으로 보존할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;볼륨
    &lt;ul&gt;
      &lt;li&gt;바인드 마운트와 비슷하지만, 도커가 관리하는 볼륨을 컨테이너와 연결한다는 점에서 다르다.&lt;/li&gt;
      &lt;li&gt;도커가 관리하는 볼륨 공간을 NS와 같은 공유 디렉터리에 생성 한다면 다른 호스트에서도 도커가 관리하는 볼륨을 함께 사용할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;보통 서비스를 하면서 파일을 보존해야 되기 때문에 바인드 마운트 또는 볼륨이 효과적인 방법이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;구분&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;docker cp&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Dockerfile ADD&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;바인드 마운트&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;볼륨&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 적용&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;구동 중 복사&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;이미지 생성 시 복사&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;구동 시 디렉터리 연결&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;구동 시 도커의 볼륨 연결&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;파일 보관 위치&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 내부&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 내부&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;호스트(디렉터리)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;호스트(도커 볼륨)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;주 활용 용도&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;임시 파일&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;컨테이너 생성 시 필요한 파일&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;보존이 필요한 파일&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;보존이 필요한 파일&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;관리 편의성&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋지 못함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;파일 보존성&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋지 못함&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;매우 좋음&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;424-사용하지-않는-컨테이너-정리하기&quot;&gt;4.2.4 사용하지 않는 컨테이너 정리하기&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker stop&lt;/code&gt; 명령어로 사용하지 않는 컨테이너를 정지할 수 있다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 컨테이너를 생성하는 데 사용한 이미지를 기준으로 필터링하여 컨테이너 상태 확인&lt;/span&gt;
docker ps &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# -q 옵션으로 컨테이너 ID만 출력 하도록하여 인자에 담아 일괄 정지 처리&lt;/span&gt;
docker stop &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;컨테이너를 정지를 하였고, 컨테이너를 다시 구동하고 싶다면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker start &amp;lt;컨테이너 ID&amp;gt;&lt;/code&gt; 를 실행 한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;컨테이너를 삭제 하기 위해서는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker rm&lt;/code&gt; 명령어를 사용 한다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# -q 옵션으로 컨테이너 ID만 출력 하도록하여 인자에 담아 일괄 삭제 처리&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# -a 옵션의 경우 정지 된 컨테이너 상태까지 모두 보여준다.&lt;/span&gt;
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-aq&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;컨테이너를 모두 삭제 하였지만, 내려받은 이미지는 아직 남아 있어 공간을 차지 한다. 따라서 사용하지 않는 이미지라면 이미지도 삭제 처리.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rmi &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;docker images &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; nginx&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><category term="docker" /><summary type="html">4.2 도커로 컨테이너 다루기</summary></entry><entry><title type="html">[Kubernetes] 쿠버네티스 오브젝트</title><link href="https://blog.uluru.io/study/k8s-4/" rel="alternate" type="text/html" title="[Kubernetes] 쿠버네티스 오브젝트" /><published>2021-11-06T00:00:00+00:00</published><updated>2021-11-06T00:00:00+00:00</updated><id>https://blog.uluru.io/study/k8s-4</id><content type="html" xml:base="https://blog.uluru.io/study/k8s-4/">&lt;h2 id=&quot;34-알아두면-쓸모-있는-쿠버네티스-오브젝트&quot;&gt;3.4 알아두면 쓸모 있는 쿠버네티스 오브젝트&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;오브젝트&lt;/code&gt;에는 데몬셋, 컨피그맵, PV, PVC, 스테이트풀셋 등 이 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;341-데몬셋&quot;&gt;3.4.1 데몬셋&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;데몬셋&lt;/code&gt;은 디플로이먼트의 replicas가 노드 수만큼 정해져 있는 형태라고 할 수 있으며, 노드 하나당 파드 한 개만을 생성한다.&lt;/li&gt;
  &lt;li&gt;노드를 관리하는 파드라면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;데몬셋&lt;/code&gt;으로 만드는 게 가장 효율적이다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;데몬셋&lt;/code&gt;을 만드는 예제를 보며 작동 원리를 확인해 보자.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 현재 MetalLB의 스피커가 각 노드에 분포돼 있는 상태를 확인한다.&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 워커 노드를 추가 후 -w 옵션을 추가하여 실시간으로 오브젝트 상태 변화를 감지한다.&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 자동으로 추가된 노드에 설치된 스피커가 데몬셋이 맞는지 확인.&lt;/span&gt;
kubectl get pods &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;생성 된 스피커 이름] &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; yaml &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;342-컨피그맵&quot;&gt;3.4.2 컨피그맵&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;컨피그맵&lt;/code&gt;은 설정을 목적으로 하는 오브젝트이다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;컨피그맵&lt;/code&gt;으로 작성 된 MetalLB의 IP 설정을 변경해 보자.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#테스트용 디플로이먼트를 cfgmap 이라는 이름으로 생성.&lt;/span&gt;
kubectl create deployment cfgmap &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;sysnet4admin/echo-hname
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#cfgmap을 로드밸런서를 통해 노출하고 이름은 cfgmap-svc 로 지정&lt;/span&gt;
kubectl expose deployment cfgmap &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;cfgmap-svc &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 생성된 서비스 IP 확인&lt;/span&gt;
kubectl get services
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# sed 명령을 사용항려 기존 IP를 변경 (11 -&amp;gt; 21, 13 -&amp;gt; 23)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/11/21;s/13/23/'&lt;/span&gt; ~/config.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#apply를 실행하여 변경된 설정을 적용&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/config.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# MetalLB와 관련된 모든 파드를 삭제하면 이후에 kubelet에서 해당 파드를 자동으로 모두 다시 생성한다. -all 옵션을 통해 한번에 모두 삭제 할 수 있다.&lt;/span&gt;
kubectl delete pods &lt;span class=&quot;nt&quot;&gt;--all&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 새롭게 생성 된 MetalLB의 파드들을 확인&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 기존에 삭제한 서비스를 동일한 이름으로 다시 생성하여 새로운 컨피그맵을 적용한 서비스가 올라오게 한다.&lt;/span&gt;
kubectl delete service cfgmap-svc
kubectl exposd deployment cfgmap &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;cfgmap-svc &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 새로 올라온 서비스의 IP가 바뀌었는지 확인.&lt;/span&gt;
kubectl get services
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;343-pv와-pvc&quot;&gt;3.4.3 PV와 PVC&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스는 다음과 같은 목적으로 다양한 형태의 볼륨을 제공한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;구분&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;볼륨&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;임시&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;emptyDir&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;로컬&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;host Path, local&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;원격&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;persistentVolumeClaim, cephfs, cinder, csi, fibre channel, flexVolume, flocker, glusterfs, iscsi, nfs, portworkxVolume, quobyte, rbd, scaleIO, storageos, vsphereVolume&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;특수 목적&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;downwardAPI, configMap, secret, azureFile, projected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;클라우드&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;awsElasticBlockStore, azureDisk, gcePersistentDisk&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PV&lt;/code&gt;는 볼륨을 사용할 수 있게 준비하는 단계이고, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PVC&lt;/code&gt;는 준비된 볼륨에서 일정 공간을 할당받는 것이다. 비유하면 PV는 요리사가 피자를 굽는 것이고, PVC는 손님이 원하는 만큼의 피자를 접시에 담아 가져오는 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;nfs-볼륨에-pvpvc를-만들고-파드에-연결하기&quot;&gt;NFS 볼륨에 PV/PVC를 만들고 파드에 연결하기&lt;/h4&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 공유할 디렉토리를 생성하고 NFS로 받아들일 IP 영역을 정한다.&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /nfs_shared
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/nfs_shared 192.168.1.0/24(rw,sync,no_root_squash)'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/exports
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# NFS 서버를 활성화하고 다음에 시작할때 자동으로 적용 되도록 한다.&lt;/span&gt;
systemctl &lt;span class=&quot;nb&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--now&lt;/span&gt; nfs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 오브젝트 스펙을 실행하여 PV를 생성&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-pv.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;nfs-pv.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;PersistentVolume&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pv&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;100Mi&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;accessModes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ReadWriteMany&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;persistentVolumeReclaimPolicy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Retain&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nfs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.1.10&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/nfs_shared&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# PV의 상태가 Available(사용가능)임을 확인&lt;/span&gt;
kubectl get pv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 오브젝트 스펙을 실행하여 PVC를 생성&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-pvc.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;nfs-pvc.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;PersistentVolumeClaim&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;accessModes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ReadWriteMany&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;10Mi&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 생성한 PVC를 볼륨으로 사용하는 디플로이먼트 오브젝트 스펙을 배포&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-pvc-deploy.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;nfs-pvc-deploy.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;apps/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deployment&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-deploy&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;replicas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-deploy&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-deploy&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-deploy&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;audit-trail&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sysnet4admin/audit-trail&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/audit&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;claimName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 생성된 파드를 확인 후 생성한 파드 중 하나에 exec로 접속&lt;/span&gt;
kubectl get pods
kubectl &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; nfs-pvc-deploy-788b77964-69c8n &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 외부에서 파드에 접속할 수 있도록 expose로 로드밸런서 서비스를 생성&lt;/span&gt;
kubectl expose deployment nfs-pvc-deploy &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nfs-pvc-deploy-svc &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 다른 파드 1개를 추가로 exec로 접속&lt;/span&gt;
kubectl &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; nfs-pvc-deploy-7888b77964-c66nrp &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;이전에 접속한 파드에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls /audit&lt;/code&gt; 명령어를 통해 audit 로그를 확인하고, 다른 파드에서도 동일하게 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls /audit&lt;/code&gt; 명령어를 치고 동일한 로그파일인지 확인.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;nfs-볼륨을-파드에-직접-마운트하기&quot;&gt;NFS 볼륨을 파드에 직접 마운트하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;사용자와 관리자가 동일한 단일 시스템이라면 PV와 PVC를 사용할 필요가 없다. 따라서 볼륨을 마운트 해보자.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-ip.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;nfs-ip.yaml&lt;/p&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;apps/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deployment&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-ip&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;replicas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-ip&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-ip&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;audit-trail&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sysnet4admin/audit-trail&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/audit&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nfs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.1.10&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/nfs_shared&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 새로 배포된 파드를 확인하고 그중 하나를 exec 로 접속한다.&lt;/span&gt;
kubectl get pods
kubectl &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; nfs-ip-84fd4d6f69-475vb &lt;span class=&quot;nt&quot;&gt;--v&lt;/span&gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;동일하게 양쪽에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls /audit&lt;/code&gt; 를 실행해 동일한 NFS 볼륨을 바라보고 있는지 확인.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;344-스테이트풀셋&quot;&gt;3.4.4 스테이트풀셋&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;파드가 만들어지는 이름과 순서를 예측해야 할 때가 있다. 주로 레디스, 주키퍼, 카산드라, 몽고DB 등의 마스터-슬레이브 구조 시스템에서 필요하다. 이때 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;스테이트풀셋&lt;/code&gt;을 사용한다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;스테이트풀셋&lt;/code&gt;은 volumeClaimTemplates 기능을 사용해 PVC를 자동으로 생성한다.&lt;/li&gt;
  &lt;li&gt;각 파드가 순서대로 생성되기 때문에 고정된 이름, 볼륨, 설정 등을 가질 수 있다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 스테이트풀셋을 다음 명령어로 생성&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-pvc-sts.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;nfs-pvc-sts.yaml&lt;/p&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;apps/1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;StatefulSet&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-sts&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;replicas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;serviceName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sts-svc-domain&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-sts&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-sts&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;audit-trail&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sytsnet4admin/audit-trail&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/audit&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-vol&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;claimName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 파드가 정상적으로 생성 되는지 확인&lt;/span&gt;
kubectl get pods &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;expose&lt;/code&gt; 명령으로는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;스테이트풀셋&lt;/code&gt; 을 실행할 수 없다. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;expose&lt;/code&gt; 명령으로 서비스를 생성할수 있는 오브젝트는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;디플로이먼트&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;파드&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;레플리카셋&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;레플리케이션 컨트롤러&lt;/code&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 스테이트풀셋을 노출하기 위한 서비스를 생성, 생성한 로드밸런서 서비스를 확dls.&lt;/span&gt;
kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/nfs-pvc-sts-svc.yaml
kubectl get services
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;nfs-pvc-sts-svc.yaml&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Service&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-sts-svc&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nfs-pvc-sts&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;LoadBalancer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><summary type="html">3.4 알아두면 쓸모 있는 쿠버네티스 오브젝트 오브젝트에는 데몬셋, 컨피그맵, PV, PVC, 스테이트풀셋 등 이 있다.</summary></entry><entry><title type="html">[Kubernetes] 쿠버네티스 서비스</title><link href="https://blog.uluru.io/study/k8s-3/" rel="alternate" type="text/html" title="[Kubernetes] 쿠버네티스 서비스" /><published>2021-10-26T00:00:00+00:00</published><updated>2021-10-26T00:00:00+00:00</updated><id>https://blog.uluru.io/study/k8s-3</id><content type="html" xml:base="https://blog.uluru.io/study/k8s-3/">&lt;h2 id=&quot;33-쿠버네티스-연결을-담당하는-서비스&quot;&gt;3.3 쿠버네티스 연결을 담당하는 서비스&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스에서는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;서비스&lt;/code&gt;라고 한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;331-가장-간단하게-연결하는-노드포트&quot;&gt;3.3.1 가장 간단하게 연결하는 노드포트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;노드포트&lt;/code&gt; 서비스를 이용하여 외부에서 쿠버네티스 클러스터의 내부에 쉽게 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;노드포트-서비스로-외부에서-접속하기&quot;&gt;노드포트 서비스로 외부에서 접속하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;아래 명령어로 노드포트 서비스를 생성 할수 었다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kebuctl create &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; nodeport.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;nodeport.yaml&lt;/p&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Service&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;np-svc&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;np-pods&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nodePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;30000&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;NodePort&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl get services&lt;/code&gt;를 실행해 노드포트 서비스로 생성한 np-svc 서비스 확인
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl get services
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;워커 노드 IP 확인
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl get nodes &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;웹 브라우저에서 확인 된 워커 노드 IP 접속
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;http://192.168.1.101:30000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;부하-분산-테스트하기&quot;&gt;부하 분산 테스트하기&lt;/h4&gt;

&lt;h4 id=&quot;expose로-노드포트-서비스-생성하기&quot;&gt;expose로 노드포트 서비스 생성하기&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;노드포트 서비스는 오브젝트 스펙 파일로만 생성하는것 뿐만 아니라 expose 명령어로도 생성할 수 있다.&lt;/li&gt;
  &lt;li&gt;디플로이먼트를 np-pods로 지정, 서비스의 이름은 np-svc-v2, 타입은 NodePort로 지정, 마지막으로 서비스가 파드로 보내줄 연결 포트를 80번으로 지정
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl expose deployment np-pods &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;NodePort &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;np-svc-v2 &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;서비스 확인
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl get services
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;332-사용-목적별로-연결하는-인그레스&quot;&gt;3.3.2 사용 목적별로 연결하는 인그레스&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;인그레스&lt;/code&gt;는 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공하도록 하고, 트래픽에 대한 L4/L7 로드밸런서와 보안 인증서를 처리하는 기능을 제공한다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;인그레스&lt;/code&gt;를 사용하기 위해서는 인그레스 컨트롤러가 필요하다.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;인그레스&lt;/code&gt;를 위한 설정 파일 예시&lt;/p&gt;

    &lt;p&gt;ingress-config.yaml&lt;/p&gt;

    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;networking.k8s.io/v1beta1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Ingress&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ingress-nginx&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 이름을 통해서 통신할 ingress 컨트롤러를 확인&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 규칙을 지정&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; 
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#기본 경로 규칙&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 연결되는 서비스와 포트&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;serviceName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;hname-svc-default&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;servicePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/ip&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;serviceName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ip-svc&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;servicePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/your-directory&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;serviceName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;your-svc&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;servicePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl get ingress -o yaml&lt;/code&gt; 명령어를 통해 인그레스 내용이 확실하게 적용됬는지 확인 가능.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;포트 포워딩 기능 예시&lt;/p&gt;

    &lt;p&gt;ingress.yaml&lt;/p&gt;

    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Service&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nginx-ingress-controller&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ingress-nginx&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;nodePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;30100&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;443&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;443&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;nodePort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;30101&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ingress-nginx&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;NodePort&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;333-클라우드에서-쉽게-구성-가능한-로드밸런서&quot;&gt;3.3.3 클라우드에서 쉽게 구성 가능한 로드밸런서&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;쿠버네티스에서는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;로드밸런서&lt;/code&gt;라는 서비스 타입을 제공해 파드를 외부에 노출하고 부하를 분산 한다.&lt;/li&gt;
  &lt;li&gt;클라우드에서 제공하는 쿠버네티스를 사용하고 있다면 다음과 같은 선언으로 사용할 수 있다.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl expose deployment ex-lb &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;ex-svc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;334-온프레미스에서-로드밸런서를-제공하는-metallb&quot;&gt;3.3.4 온프레미스에서 로드밸런서를 제공하는 MetalLB&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MetalLB&lt;/code&gt;는 베어메탈(운영체제가 설지되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트이다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MetalLB&lt;/code&gt;는 기존의 L2 네트워크와 L3 네트워크로 로드밸런서를 구현한다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MetalLB&lt;/code&gt; 컨트롤러는 작동 방식을 정의하고, EXTERNAL-IP를 부여해 관리 한다.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MetalLB&lt;/code&gt;는 ConfigMap 오브젝트를 사용하는데, 설정 예시는 다음과 같다.&lt;/p&gt;

    &lt;p&gt;metallb-l2config.yaml&lt;/p&gt;

    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ConfigMap&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;metallb-system&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;config&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;address-pools:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;- name: nginx-ip-range&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;protocol: layer2&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;addresses:&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;- 192.168.1.11-192.168.1.13&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;configMap 생성여부 및 적용이 잘 됬는지는 아래 명령어로 확인 가능.
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl get configmap &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system &lt;span class=&quot;c&quot;&gt;# 생성 확인&lt;/span&gt;
kubectl get configmap &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; metallb-system &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; yaml &lt;span class=&quot;c&quot;&gt;# 적용 확인&lt;/span&gt;
kubectl expose deployment lb-hname-pods &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;LoadBalancer &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lb-hname-svc &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;80 &lt;span class=&quot;c&quot;&gt;# 각 디플로이먼트를 로드밸런서 서비스로 노출&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;335-부하에-따라-자동으로-파드-수를-조절하는-hpa&quot;&gt;3.3.5 부하에 따라 자동으로 파드 수를 조절하는 HPA&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;부하량에 따라 디플로이먼트의 파드 수를 유동적으로 관리하는 기능을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HPA&lt;/code&gt;라고 한다.&lt;/li&gt;
  &lt;li&gt;부하량 확인 (리눅스 top과 비슷)
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl top pods
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HPA&lt;/code&gt;가 자원을 요청할 떄 메트릭 서버를 통해 계측값을 전달받으므로 메트릭 서버를 설정해야한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;메트릭서버 또한 서비스와 마찬가지로 오브젝트 스펙파일로 설치 가능하다.&lt;/li&gt;
  &lt;li&gt;scale 기준 값을 설정하여 파드 증설 시점을 지정 할 수 있다.
    &lt;h4 id=&quot;edit-명령어로-디플로이먼트-설정-내용-수정&quot;&gt;edit 명령어로 디플로이먼트 설정 내용 수정&lt;/h4&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10m&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# cpu 0.01 사용을 기준으로 파드를 증설&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;50m&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# cpu 0.05로 사용 제한&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;h4 id=&quot;hpa-hname-pods에-autoscale을-설정&quot;&gt;hpa-hname-pods에 autoscale을 설정&lt;/h4&gt;
    &lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl autoscale deployment hpa-hname-pods &lt;span class=&quot;nt&quot;&gt;--min&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;nt&quot;&gt;--max&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;30 &lt;span class=&quot;nt&quot;&gt;--cpu-percent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;50
&lt;span class=&quot;c&quot;&gt;# min은 최소 파드의 수, max는 최대 파드의 수, cpu-percent는 CPU 사용량이 50% 넘을 떄 autoscale 하겠다는 조건&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>모험하는 개발자</name></author><category term="study" /><category term="kubernetes" /><category term="k8s" /><summary type="html">3.3 쿠버네티스 연결을 담당하는 서비스 쿠버네티스에서는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 서비스라고 한다.</summary></entry></feed>