<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>딩코딩</title>
    <link>https://givedev.tistory.com/</link>
    <description>기억 저장소</description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 19:00:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>딩코딩</managingEditor>
    <image>
      <title>딩코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/5945412/attach/e7a7128fed244ef9b8cf8ab20ecf5489</url>
      <link>https://givedev.tistory.com</link>
    </image>
    <item>
      <title>단위 테스트와 통합 테스트, 언제 어떤 걸 써야 할까?</title>
      <link>https://givedev.tistory.com/92</link>
      <description>&lt;h1&gt;단위 테스트와 통합 테스트, 언제 어떤 걸 써야 할까?&lt;/h1&gt;
&lt;p&gt;개발을 하다 보면 &amp;quot;테스트를 왜 해야 하지?&amp;quot;, &amp;quot;어떤 테스트가 더 중요한가?&amp;quot; 같은 고민이 생긴다.&lt;br&gt;이번에 직접 테스트를 작성하면서, 단위 테스트와 통합 테스트에 대해 정리해봤다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 단위 테스트(Unit Test)란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;실제 데이터 없이, &lt;strong&gt;로직 자체의 흐름과 메서드 호출 여부&lt;/strong&gt;를 검증하는 테스트&lt;/li&gt;
&lt;li&gt;주로 mock 객체를 사용하여 &lt;strong&gt;의존성 분리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;빠르고, 내부 구현이 바뀌면 바로 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;  예를 들어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;특정 메서드가 호출되었는지&lt;/li&gt;
&lt;li&gt;if/else 조건 분기가 잘 작동하는지&lt;/li&gt;
&lt;li&gt;특정 입력에 대해 정확한 출력을 내는지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 통합 테스트(Integration Test)란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;실제 데이터(DB 등)를 사용하여 &lt;strong&gt;기능이 전반적으로 잘 동작하는지&lt;/strong&gt;를 검증&lt;/li&gt;
&lt;li&gt;사람이 수동으로 하던 QA를 자동화한 느낌&lt;/li&gt;
&lt;li&gt;예: 회원가입 → 로그인 → 글 작성 → 글 조회 흐름을 자동으로 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 두 테스트의 차이점&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;단위 테스트&lt;/th&gt;
&lt;th&gt;통합 테스트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;속도&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터&lt;/td&gt;
&lt;td&gt;mock (가짜)&lt;/td&gt;
&lt;td&gt;실제 DB 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;로직 흐름 검증&lt;/td&gt;
&lt;td&gt;전체 흐름 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;디버깅&lt;/td&gt;
&lt;td&gt;쉬움&lt;/td&gt;
&lt;td&gt;어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;테스트 대상&lt;/td&gt;
&lt;td&gt;개별 클래스/함수&lt;/td&gt;
&lt;td&gt;여러 컴포넌트 간 상호작용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;  이렇게 이해했다&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;단위 테스트는 &lt;strong&gt;로직을 안전하게 보호&lt;/strong&gt;하는 테스트&lt;/li&gt;
&lt;li&gt;통합 테스트는 &lt;strong&gt;사람이 직접 해보는 QA를 자동화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;TDD는 핵심 로직이 바뀌지 않도록 &lt;strong&gt;테스트 먼저 작성 후 기능 구현&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;초기 개발 단계나 작은 프로젝트에서는 통합 테스트만으로도 현실적으로 충분할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;  언제 어떤 테스트를?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;추천 테스트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;복잡한 로직, 조건 분기 많음&lt;/td&gt;
&lt;td&gt;단위 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 전체 흐름을 점검하고 싶음&lt;/td&gt;
&lt;td&gt;통합 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빠르게 MVP 개발 중&lt;/td&gt;
&lt;td&gt;통합 테스트 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 리팩터링 전&lt;/td&gt;
&lt;td&gt;단위 테스트 선 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 결론&lt;/h2&gt;
&lt;p&gt;테스트는 모든 걸 다 해야 하는 게 아니라,&lt;br&gt;&lt;strong&gt;상황에 따라 전략적으로 선택&lt;/strong&gt;하는 것이 중요하다.&lt;/p&gt;
&lt;p&gt;작은 프로젝트는 통합 테스트 위주,&lt;br&gt;중대형 서비스에서는 단위 + 통합 + E2E까지 조화롭게 구성하는 게 이상적이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;  내 생각&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;단위 테스트는 내부 흐름과 조건 분기를 검증하고,&lt;br&gt;통합 테스트는 실제 데이터를 기반으로 한 자동화 QA이다.&lt;br&gt;결국 테스트는 &lt;strong&gt;신뢰성 + 유지보수성 + 개발 효율&lt;/strong&gt;을 위한 투자다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;</description>
      <category>Programing/Spring Boot</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/92</guid>
      <comments>https://givedev.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 7 Apr 2025 14:45:03 +0900</pubDate>
    </item>
    <item>
      <title>Kubernetes에서 MySQL과 연동하여 볼륨(Persistent Volume) 사용하기</title>
      <link>https://givedev.tistory.com/91</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;쿠버네티스(Kubernetes)에서 MySQL을 배포할 때, 데이터를 지속적으로 유지하려면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Persistent Volume (PV)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 및 **Persistent Volume Claim (PVC)**를 활용해야 합니다. 이 글에서는 MySQL을 쿠버네티스에서 운영하면서 볼륨을 연동하는 방법을 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Persistent Volume (PV) 생성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PV는 클러스터 내에서 사용할 수 있는 스토리지 자원을 정의하는 객체입니다. MySQL 데이터를 유지하기 위해 PV를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: mysql-storage
  hostPath:
    path: &quot;/mnt/data&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;storage:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 10Gi (10GB 크기의 볼륨)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;accessModes:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; ReadWriteOnce (하나의 노드에서 읽기/쓰기 가능)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;persistentVolumeReclaimPolicy:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; Retain (삭제 후에도 데이터 유지)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;hostPath:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &quot;/mnt/data&quot; (노드의 경로에 데이터를 저장)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. Persistent Volume Claim (PVC) 생성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PVC는 애플리케이션이 PV를 요청하는 객체입니다. PVC를 생성하여 MySQL Pod에서 사용할 수 있도록 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: mysql-storage&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;storageClassName:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; mysql-storage (PV와 매칭되는 Storage Class 지정)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;accessModes:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; ReadWriteOnce (하나의 노드에서 접근 가능)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;requests.storage:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 10Gi (요청하는 스토리지 크기)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. MySQL Deployment 및 Service 생성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;PVC를 MySQL Pod에서 사용할 수 있도록 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Deployment&lt;/b&gt;&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: &quot;rootpassword&quot;
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;image:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; mysql:5.7 (MySQL 5.7 이미지 사용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MYSQL_ROOT_PASSWORD:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &quot;rootpassword&quot; (루트 비밀번호 설정)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;volumeMounts:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/lib/mysql&lt;/span&gt;&lt;span&gt;에 PVC를 마운트하여 데이터 보존&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;volumes:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mysql-pvc&lt;/span&gt;&lt;span&gt;와 연결&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MySQL Service 생성&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;ClusterIP 서비스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;로 설정하여 외부에서 직접 접근할 수 없도록 제한합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;내부에서 MySQL에 접근하려면 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;kubectl port-forward&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;를 활용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kubectl port-forward svc/mysql 3306:3306&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 로컬 머신에서 다음 명령으로 MySQL에 접근할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;mysql -h 127.0.0.1 -P 3306 -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한 원격 클러스터에서 접근하려면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;SSH 터널링&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ssh -L 3306:localhost:3306 user@your-remote-cluster&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 하면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;로컬에서 원격 클러스터의 MySQL에 접속할 수 있습니다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. 배포 및 확인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 위의 YAML 파일들을 적용하여 MySQL을 쿠버네티스 클러스터에 배포합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;배포된 MySQL Pod 확인:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 볼륨 상태 확인:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;kubectl get pv
kubectl get pvc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 컨테이너에 접속하여 데이터가 유지되는지 확인:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;kubectl exec -it &amp;lt;mysql-pod-name&amp;gt; -- mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;비밀번호를 입력하고 MySQL이 정상적으로 동작하는지 확인하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5. 결론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;쿠버네티스에서 MySQL과 볼륨(PV &amp;amp; PVC)을 연동하면, Pod가 재시작되어도 데이터를 유지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>DevOps/k8s</category>
      <category>k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/91</guid>
      <comments>https://givedev.tistory.com/91#entry91comment</comments>
      <pubDate>Thu, 6 Feb 2025 22:34:11 +0900</pubDate>
    </item>
    <item>
      <title>MSA 도커 localhost 안될때 호스트머신 주소 접근방법, host.docker.internal</title>
      <link>https://givedev.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Docker 컨테이너 간 통신 및 localhost 사용 문제 해결&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너에서&amp;nbsp;&lt;b&gt;localhost&lt;/b&gt;&amp;nbsp;또는&amp;nbsp;**127.0.0.1**을 사용할 경우, 이는&amp;nbsp;&lt;b&gt;컨테이너 내부&lt;/b&gt;를 참조합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다른 컨테이너나 호스트 머신에 접근하려고 할 때&amp;nbsp;&lt;b&gt;연결되지 않는 문제&lt;/b&gt;가 발생할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 1. 컨테이너 이름으로 접근&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker는 같은 네트워크에 있는 컨테이너 간에&amp;nbsp;&lt;b&gt;컨테이너 이름을 도메인 이름처럼 사용할 수 있도록 지원&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&amp;nbsp;**post-service**라는 이름의 컨테이너에 접근하려면&amp;nbsp;**http://post-service:포트번호**로 요청할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 컨테이너를 같은 네트워크로 설정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 Docker 컨테이너는 서로 다른 네트워크로 분리되어 있습니다. 따라서 같은 네트워크로 연결해야 합니&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 네트워크 생성&lt;/b&gt;&amp;nbsp;실행 중인 컨테이너가 없다면 새 네트워크를 생성한 뒤 컨테이너를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1738755961513&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;docker network create backend-network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 컨테이너 실행 시 네트워크 연결&lt;/b&gt;&amp;nbsp;컨테이너 실행 시&amp;nbsp;&lt;b&gt;-network&lt;/b&gt;&amp;nbsp;옵션을 사용해 네트워크를 연결합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1738756019701&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name post-service --network backend-network -p 9000:9000 post-service-image
docker run --name another-service --network backend-network -p 8080:8080 another-service-image&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. &lt;/b&gt;&lt;b&gt;실행 중인 컨테이너에 네트워크 연결&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;이미 실행 중인 컨테이너가 있다면&amp;nbsp;&lt;/span&gt;&lt;b&gt;docker network connect&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;명령으로 연결합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738756053253&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network connect backend-network post-service docker network connect backend-network another-service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 컨테이너 이름으로 접근&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예:&amp;nbsp;&lt;b&gt;post-service&lt;/b&gt;&amp;nbsp;컨테이너에 접근하려면:&lt;/li&gt;
&lt;li&gt;&amp;lt;http://post-service:9000&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호스트나 별도의 설정 없이 Docker 환경 내에서 자체적으로 동작.&lt;/li&gt;
&lt;li&gt;표준화된 네트워크 관리 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 2. host.docker.internal 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**host.docker.internal**은 Docker 컨테이너 내부에서&amp;nbsp;&lt;b&gt;호스트 머신&lt;/b&gt;을 참조하기 위한 예약 도메인입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 사용하면 컨테이너에서 호스트 머신에 있는 서비스에 쉽게 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. host.docker.internal로 변경&lt;/b&gt;&amp;nbsp;기존의&amp;nbsp;&lt;b&gt;localhost&lt;/b&gt;&amp;nbsp;대신&amp;nbsp;**host.docker.internal**을 사용합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1738756093708&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url=jdbc:mariadb://host.docker.internal:3307/lulla_volume?serverTimezone=UTC&amp;amp;characterEncoding=UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 리눅스에서 설정 추가&lt;/b&gt;&amp;nbsp;Linux에서는&amp;nbsp;**host.docker.internal**이 기본적으로 동작하지 않습니다. 이 경우 컨테이너 실행 시&amp;nbsp;&lt;b&gt;-add-host&lt;/b&gt;&amp;nbsp;옵션을 추가합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1738756160036&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name my-service \
  --add-host host.docker.internal:host-gateway \
  -p 8080:8080 my-service-image&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 설정 없이 호스트 머신과 직접 통신 가능.&lt;/li&gt;
&lt;li&gt;호스트에서 실행 중인 데이터베이스, 서버 등에 접근할 때 간편.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;방법&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;장점&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방법 1. 컨테이너 이름 사용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컨테이너 이름으로 다른 컨테이너 접근 (&lt;b&gt;http://post-service:9000&lt;/b&gt;)&lt;/td&gt;
&lt;td&gt;컨테이너 간 통신에 표준화된 접근 방식 제공. 네트워크 분리 가능.&lt;/td&gt;
&lt;td&gt;같은 네트워크 설정 필요. Docker 환경 외부와의 통신은 어려움.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방법 2. host.docker.internal&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;localhost&lt;/b&gt;&amp;nbsp;대신&amp;nbsp;&lt;b&gt;host.docker.internal&lt;/b&gt;&amp;nbsp;사용해 호스트 머신에 접근&lt;/td&gt;
&lt;td&gt;호스트 머신의 서비스에 간편하게 접근 가능. 네트워크 설정 불필요.&lt;/td&gt;
&lt;td&gt;리눅스에서는 기본적으로 동작하지 않아 추가 설정 필요. 보안 관리 주의 필요.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DevOps/Docker</category>
      <category>docker</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/90</guid>
      <comments>https://givedev.tistory.com/90#entry90comment</comments>
      <pubDate>Wed, 5 Feb 2025 20:51:09 +0900</pubDate>
    </item>
    <item>
      <title>쿠버네티스 ConfigMap과 Secret 완벽 정리</title>
      <link>https://givedev.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에서 애플리케이션의 설정을 분리하여 관리하는 두 가지 주요 리소스가 &lt;b&gt;ConfigMap&lt;/b&gt;과 &lt;b&gt;Secret&lt;/b&gt;입니다. 이 두 가지는 환경 설정 값을 Pod에 주입하는 데 사용되지만, 중요한 차이점이 있습니다. 이번 포스팅에서는 &lt;b&gt;ConfigMap과 Secret의 차이점, 사용 방법, 주의할 점&lt;/b&gt; 등을 정리해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. ConfigMap이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ConfigMap&lt;/b&gt;은 애플리케이션에서 사용하는 설정 데이터를 저장하는 쿠버네티스 리소스입니다. 일반적으로 &lt;b&gt;환경 변수, 설정 파일, 커맨드라인 인자&lt;/b&gt; 등을 저장하는 용도로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;비밀 데이터가 아닌 일반적인 설정 값&lt;/b&gt;을 저장함 (예: 데이터베이스 URL, 서비스 포트)&lt;/li&gt;
&lt;li&gt;Key-Value 형태로 데이터를 저장&lt;/li&gt;
&lt;li&gt;Pod 내에서 &lt;b&gt;환경 변수, 파일, 커맨드라인 인자&lt;/b&gt;로 주입 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  ConfigMap 생성 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;YAML 파일을 이용한 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738686575293&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: &quot;production&quot;
  DATABASE_URL: &quot;mysql://user:password@db:3306/mydb&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  ConfigMap을 Pod에 적용하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;환경 변수로 주입&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738686688058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_ENV&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  2. Secret이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Secret&lt;/b&gt;은 민감한 데이터를 저장하는 쿠버네티스 리소스입니다. ConfigMap과 유사하지만, &lt;b&gt;비밀번호, API 키, 인증 토큰&lt;/b&gt; 등 보안이 필요한 데이터를 저장하는 용도로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ConfigMap과 유사하지만, &lt;b&gt;Base64 인코딩&lt;/b&gt;을 사용하여 데이터를 저장함&lt;/li&gt;
&lt;li&gt;민감한 정보를 보호하기 위해 Pod에 주입될 때 특정한 보안 메커니즘이 적용됨&lt;/li&gt;
&lt;li&gt;Pod 내에서 &lt;b&gt;환경 변수, 파일, 커맨드라인 인자&lt;/b&gt;로 주입 가능&lt;/li&gt;
&lt;li&gt;kubectl get secret을 사용하면 값이 ***로 표시되어 직접 볼 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  Secret 생성 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;YAML 파일을 이용한 생성&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738686704948&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  DB_PASSWORD: bXlwYXNzd29yZA==  # &quot;mypassword&quot;를 Base64 인코딩한 값
  API_KEY: dG9wLXNlY3JldC1rZXk=&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  Secret을 Pod에 적용하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;환경 변수로 주입&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738686721254&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: DB_PASSWORD&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. ConfigMap과 Secret의 차이점 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 114px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;비교 항목&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;ConfigMap&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;환경 설정값 저장&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;비밀번호, API 키 등 보안 정보 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;데이터 저장 방식&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;일반 텍스트&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Base64 인코딩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;데이터 보안&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;보안 없음&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;보안 강화 (Base64 인코딩 + RBAC 적용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;사용 방법&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;환경 변수, 볼륨 마운트&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;환경 변수, 볼륨 마운트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;kubectl get 출력&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;평문 표시&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;값이 ***로 숨겨짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  4. ConfigMap과 Secret 사용 시 주의할 점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;ConfigMap&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;어플리케이션 설정을 코드에서 분리&lt;/b&gt;하여 관리할 수 있음.&lt;/li&gt;
&lt;li&gt;보안이 필요한 정보는 ConfigMap이 아닌 Secret을 사용할 것.&lt;/li&gt;
&lt;li&gt;Pod가 실행 중일 때 ConfigMap이 변경되면, 즉시 반영되지 않을 수도 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;Secret&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Base64는 암호화가 아님!&lt;/b&gt; Base64 인코딩된 값은 쉽게 디코딩할 수 있음. (echo &quot;bXlwYXNzd29yZA==&quot; | base64 --decode)&lt;/li&gt;
&lt;li&gt;보안이 필요한 경우 &lt;b&gt;Kubernetes RBAC(Role-Based Access Control)를 활용&lt;/b&gt;하여 접근을 제한할 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파일 시스템 볼륨 마운트를 이용하면 Secret이 자동으로 업데이트됨&lt;/b&gt; (환경 변수 주입 방식은 Pod 재시작 필요).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  결론&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ConfigMap은 일반적인 설정 정보&lt;/b&gt;, &lt;b&gt;Secret은 보안이 필요한 정보&lt;/b&gt;를 저장하는 용도!&lt;/li&gt;
&lt;li&gt;ConfigMap과 Secret을 활용하면 &lt;b&gt;코드와 설정을 분리하여 관리&lt;/b&gt;할 수 있음.&lt;/li&gt;
&lt;li&gt;Secret은 &lt;b&gt;Base64로 인코딩되지만, 보안 강화를 위해 RBAC 및 암호화 솔루션(KMS 등)과 함께 사용하는 것이 중요!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>DevOps/k8s</category>
      <category>k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/89</guid>
      <comments>https://givedev.tistory.com/89#entry89comment</comments>
      <pubDate>Wed, 5 Feb 2025 01:33:42 +0900</pubDate>
    </item>
    <item>
      <title>Kubernetes에서 Service란?</title>
      <link>https://givedev.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;서비스(Service) &lt;/span&gt;&lt;span data-token-index=&quot;1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;3&quot;&gt;외부로부터 요청을 받는 역할 / 외부로부터 들어오는 트래픽을 받아, 파드에 균등하게 분배해주는 로드밸런서 역할을 하는 기능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;spring-service.yaml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738677270573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service

# Service 기본 정보
metadata:
  name: spring-service # Service 이름
  
# Service 세부 정보
spec:
  type: NodePort # Service의 종류
  selector:
    app: backend-app # 실행되고 있는 파드 중 'app: backend-app'이라는 값을 가진 파드와 서비스를 연결
  ports:
    - protocol: TCP # 서비스에 접속하기 위한 프로토콜
      port: 8080 # 쿠버네티스 내부에서 Service에 접속하기 위한 포트 번호
      targetPort: 8080 # 매핑하기 위한 파드의 포트 번호
      nodePort: 30000 # 외부에서 사용자들이 접근하게 될 포트 번호&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kubernetes Service의 주요 개념&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;Selector와 Label&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service는 특정 Pod을 대상으로 트래픽을 전달해야 한다. 이때 Selector를 사용하여 특정 Label을 가진 Pod을 찾아 연결한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;ClusterIP (기본값)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service는 기본적으로 ClusterIP를 제공하여 내부 네트워크에서 Pod을 접근할 수 있도록 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;NodePort&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터 외부에서도 접근할 수 있도록 NodePort를 설정하면, 각 노드의 특정 포트를 통해 Service에 접근할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;LoadBalancer&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서 외부 로드 밸런서를 생성하여 Service에 접근할 수 있도록 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. &lt;b&gt;ExternalName&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 이름을 반환하여 외부 서비스로 연결할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6cqq/btsL7jZ0QlR/kdwvQQWcur5vFPUKQWr59k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6cqq/btsL7jZ0QlR/kdwvQQWcur5vFPUKQWr59k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6cqq/btsL7jZ0QlR/kdwvQQWcur5vFPUKQWr59k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6cqq%2FbtsL7jZ0QlR%2FkdwvQQWcur5vFPUKQWr59k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1204&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스 실행하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kubectl apply -f spring-service.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738677461548&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get service&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DevOps/k8s</category>
      <category>k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/88</guid>
      <comments>https://givedev.tistory.com/88#entry88comment</comments>
      <pubDate>Tue, 4 Feb 2025 22:58:57 +0900</pubDate>
    </item>
    <item>
      <title>Docker + GitHub Actions 배포 vs 쿠버네티스 배포 비교</title>
      <link>https://givedev.tistory.com/87</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;쿠버네티스를 이용한 배포 방식으로 변경하면 &lt;/span&gt;&lt;b&gt;기존 Docker + GitHub Actions 기반 배포&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;와 비교해서 차이가 많습니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;5f7d8fb9-a4a6-4091-8a62-d2ca6aeb3faf&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, &lt;b&gt;온프레미스(개발 서버 직접 운영) 환경&lt;/b&gt;이라면, 쿠버네티스를 적용하는 방식이 다소 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
배포 방식기존 Docker + GitHub Actions쿠버네티스 (K8s)&lt;/div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;5f7d8fb9-a4a6-4091-8a62-d2ca6aeb3faf&quot; data-message-author-role=&quot;assistant&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;5f7d8fb9-a4a6-4091-8a62-d2ca6aeb3faf&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;배포 대상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;EC2 또는 직접 구축한 서버에서 실행&lt;/td&gt;
&lt;td&gt;쿠버네티스 클러스터 (온프레미스 or 클라우드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실행 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버에서 Docker 컨테이너 직접 실행&lt;/td&gt;
&lt;td&gt;K8s의 Pod 단위로 컨테이너 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;배포 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;GitHub Actions에서 docker build &amp;rarr; docker run&lt;/td&gt;
&lt;td&gt;GitHub Actions에서 kubectl apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;확장 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버의 스펙을 높이거나, 새로운 서버 추가 후 수동 배포&lt;/td&gt;
&lt;td&gt;HPA(Pod 자동 확장), Node 추가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;장애 대응&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컨테이너가 죽으면 수동으로 재시작 필요&lt;/td&gt;
&lt;td&gt;쿠버네티스가 자동으로 복구 (Self-healing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네트워크 관리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Docker 컨테이너별 포트 설정&lt;/td&gt;
&lt;td&gt;K8s Service &amp;amp; Ingress 컨트롤 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;로드 밸런싱&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nginx 또는 AWS ELB 사용&lt;/td&gt;
&lt;td&gt;쿠버네티스 자체 로드 밸런싱 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;결론:&lt;/b&gt; 기존 Docker 배포보다 &lt;b&gt;확장성, 장애 대응, 자동 복구, 트래픽 관리&lt;/b&gt; 측면에서 쿠버네티스가 훨씬 유리함. 하지만 &lt;b&gt;운영이 더 복잡&lt;/b&gt;할 수 있음.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;기존 Docker + GitHub Actions 배포 방식&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  기존 배포 과정 (Docker 방식)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;GitHub Actions 실행 &amp;rarr; 서버에서 Docker 이미지 빌드&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630517954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Build Docker Image
  run: docker build -t my-app .&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;Docker Hub or ECR에 푸시&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630539394&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Push to Docker Hub
  run: docker push my-app&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;서버에 SSH 접속 후 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738630558906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Deploy to Server
  run: |
    ssh user@server &quot;docker stop my-app &amp;amp;&amp;amp; docker rm my-app&quot;
    ssh user@server &quot;docker run -d -p 8080:8080 my-app&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;문제점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 직접 Docker 컨테이너를 실행하는 방식이라 &lt;b&gt;서버 장애 발생 시 자동 복구 안됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;스케일링(트래픽 증가 시 확장)이 어렵고, 컨테이너 개수를 늘리면 수동으로 관리해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;  쿠버네티스 기반 배포 방식&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스로 전환하면 기존 Docker 배포보다 &lt;b&gt;더 유연하고 자동화된 방식&lt;/b&gt;으로 운영 가능.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  쿠버네티스 배포 과정 (K8s 방식)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;GitHub Actions 실행 &amp;rarr; Docker 이미지 빌드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738630574354&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Build Docker Image
  run: docker build -t my-app .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;이미지를 컨테이너 레지스트리(Docker Hub, ECR, Private Registry)에 푸시&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630588514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Push to Docker Hub
  run: docker push my-app&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;서버의 쿠버네티스 클러스터에 kubectl apply&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630599474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Deploy to Kubernetes
  run: kubectl apply -f deployment.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;차이점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub Actions에서 docker run으로 직접 실행하는 것이 아니라, &lt;b&gt;쿠버네티스 클러스터에 배포&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버 장애 발생 시 &lt;b&gt;쿠버네티스가 자동 복구&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HPA (Horizontal Pod Autoscaler)로 트래픽 증가 시 자동 확장&lt;/b&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;  쿠버네티스 배포 시 필요한 구성 요소&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스로 배포하려면 기존과 다른 몇 가지 &lt;b&gt;추가 설정이 필요&lt;/b&gt;.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;1) Deployment 설정 (deployment.yaml)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630623426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;Pod 개수(replica)를 설정하여 스케일링 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;2) Service 설정 (service.yaml)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630634106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;쿠버네티스 내부에서 Pod 간 트래픽을 관리&lt;/b&gt;&lt;br /&gt;✔️ &lt;b&gt;LoadBalancer 타입을 사용하여 외부에서 접근 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;3) Ingress 설정 (ingress.yaml, 선택)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738630648490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ &lt;b&gt;도메인을 통해 접근하도록 설정 (Nginx Ingress 사용 가능)&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;  쿠버네티스로 바뀌면 무엇이 편리해질까?&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능기존 Docker 배포쿠버네티스 배포&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;자동 복구&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컨테이너 죽으면 직접 재시작 필요&lt;/td&gt;
&lt;td&gt;Pod가 죽으면 K8s가 자동으로 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;트래픽 증가 대응&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버 수동 추가 필요&lt;/td&gt;
&lt;td&gt;HPA(Pod 자동 확장) 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;로드 밸런싱&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nginx 등 직접 설정&lt;/td&gt;
&lt;td&gt;K8s Service &amp;amp; Ingress로 자동 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Zero-Downtime 배포&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기존 컨테이너 중지 후 배포&lt;/td&gt;
&lt;td&gt;Rolling Update로 무중단 배포 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;다중 서버 관리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수동으로 서버 추가&lt;/td&gt;
&lt;td&gt;K8s 노드 추가로 자동 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;  쿠버네티스로 전환하면 이런 점이 좋아짐&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;트래픽 증가 시, 자동으로 Pod 개수를 늘릴 수 있음 (HPA 사용)&lt;/b&gt;&lt;br /&gt;2️⃣ &lt;b&gt;서버 장애 발생 시, 자동으로 복구됨 (Self-Healing)&lt;/b&gt;&lt;br /&gt;3️⃣ &lt;b&gt;CI/CD 연동하여 무중단 배포(Rolling Update) 가능&lt;/b&gt;&lt;br /&gt;4️⃣ &lt;b&gt;서비스 간 통신(Networking)이 자동 관리됨 (Service &amp;amp; Ingress 활용)&lt;/b&gt;&lt;br /&gt;5️⃣ &lt;b&gt;운영이 안정적이고, 확장성이 좋아짐 (스케일아웃이 유리함)&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;  결론: 쿠버네티스로 전환하는 게 좋은 경우&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;개발 서버가 여러 개 있고, 트래픽 증가 시 자동 확장이 필요할 때&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;서버 장애가 나도 자동 복구되도록 운영하고 싶을 때&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;Zero-Downtime 배포(무중단 배포)를 적용하고 싶을 때&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;CI/CD 파이프라인을 K8s 기반으로 개선하고 싶을 때&lt;/b&gt;&lt;/p&gt;</description>
      <category>DevOps/k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/87</guid>
      <comments>https://givedev.tistory.com/87#entry87comment</comments>
      <pubDate>Tue, 4 Feb 2025 10:02:23 +0900</pubDate>
    </item>
    <item>
      <title>Kubernetes Deployment를 사용하여 여러 개의 Pod 실행하기</title>
      <link>https://givedev.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 동일한 Pod을 여러 개 실행하려면 Deployment를 활용하면 된다. Deployment는 여러 개의 Pod을 관리하고, 업데이트 및 롤백을 손쉽게 수행할 수 있도록 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment 작성 방법&lt;/h3&gt;
&lt;pre id=&quot;code_1738599490121&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1  # Deployment의 API 버전
kind: Deployment  # Deployment 리소스를 생성한다.

metadata:
  name: spring-deployment  # Deployment의 이름

spec:
  replicas: 3  # 동일한 Pod을 3개 실행한다.
  selector:
    matchLabels:
      app: backend-app  # backend-app 레이블을 가진 Pod을 관리한다.

  template:  # 새로운 Pod을 생성하는 템플릿
    metadata:
      labels:
        app: backend-app
    spec:
      containers:
        - name: spring-container
          image: spring-server  # 사용할 컨테이너 이미지
          imagePullPolicy: IfNotPresent  # 로컬에 이미지가 없으면 풀받아온다.
          ports:
            - containerPort: 8080  # 컨테이너가 사용할 포트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment 생성 및 확인 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Deployment 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 실행하여 Deployment를 생성한다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738676887024&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f deployment.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Deployment 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deployment가 정상적으로 생성되었는지 확인하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738676899068&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get deployment&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. ReplicaSet 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deployment는 ReplicaSet을 통해 Pod을 관리하므로, ReplicaSet이 정상적으로 생성되었는지 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738676914205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get replicaset&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Pod 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 실행 중인 Pod이 정상적으로 배포되었는지 확인하려면 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738676927772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Deployment를 사용하면 동일한 Pod을 여러 개 띄울 수 있으며, 관리도 편리해진다. kubectl get 명령어를 활용하여 Deployment, ReplicaSet, Pod이 정상적으로 배포되었는지 확인하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DevOps/k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/86</guid>
      <comments>https://givedev.tistory.com/86#entry86comment</comments>
      <pubDate>Tue, 4 Feb 2025 01:25:54 +0900</pubDate>
    </item>
    <item>
      <title>Dockerfile에서 WORKDIR과 COPY . .의 역할과 필요성</title>
      <link>https://givedev.tistory.com/85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dockerfile을 작성할 때 &lt;span&gt;`WORKDIR`&lt;/span&gt;과 &lt;span&gt;`COPY . .`&lt;/span&gt;을 자주 사용하지만, &lt;span&gt;**정말 필요할까? 없이도 실행이 가능할까?&lt;/span&gt;&amp;nbsp;이 글에서는 &lt;span&gt;`WORKDIR`&lt;/span&gt;과 &lt;span&gt;`COPY . .`&lt;/span&gt;의 필요성과 역할을 명확하게 정리해보겠습니다.&lt;/h3&gt;
&lt;pre id=&quot;code_1738594365162&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;## ✅ WORKDIR과 COPY . . 없이도 실행이 가능할까?

### 1️⃣ `WORKDIR` 없이 `COPY . .`만 사용하는 경우

FROM node:18
COPY . .
RUN npm install
CMD [&quot;node&quot;, &quot;index.js&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 실행 가능하지만 &lt;b&gt;모든 파일이 루트(/) 디렉터리에 복사&lt;/b&gt;됩니다.&lt;br /&gt;❌ 루트 디렉터리는 시스템 파일과 섞일 위험이 있어 &lt;b&gt;관리하기 어렵습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ COPY . . 없이 WORKDIR만 설정한 경우&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738594608742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:18
WORKDIR /app
RUN npm install
CMD [&quot;node&quot;, &quot;index.js&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 컨테이너 내부에 실행할 코드가 존재하지 않아, 실행 시 &lt;b&gt;파일을 찾을 수 없다는 오류&lt;/b&gt;가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ WORKDIR과 COPY . . 둘 다 없는 경우&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738594630809&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:18
CMD [&quot;node&quot;, &quot;index.js&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 애플리케이션 코드가 컨테이너 내부에 존재하지 않기 때문에 실행이 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ WORKDIR과 COPY . .을 사용하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WORKDIR과 COPY . .를 함께 사용하면 &lt;b&gt;파일을 정리하여 관리하기 쉽고, 실행 환경을 명확하게 설정할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  올바른 Dockerfile 예시&lt;/h3&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1738594660800&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:18

# 작업 디렉터리를 /app으로 설정
WORKDIR /app

# 현재 디렉터리의 모든 파일을 컨테이너의 /app 폴더로 복사
COPY . .

# npm 패키지 설치
RUN npm install

# 앱 실행
CMD [&quot;node&quot;, &quot;index.js&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  사용의 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;파일이 특정 폴더(/app)에 정리되어 관리가 용이&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;컨테이너 실행 시 자동으로 /app에서 실행되므로 실행 명령어가 단순해짐&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;루트(/) 디렉터리에 파일이 흩어지는 것을 방지하여 보안성이 증가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ WORKDIR과 COPY . . 비교 정리&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;방법&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;실행 여부&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추천 여부 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WORKDIR 없이 COPY . . 사용&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;파일이 루트(/)에 복사되어 관리가 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COPY . . 없이 WORKDIR만 설정&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;컨테이너 내부에 실행할 파일이 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;둘 다 없음&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;컨테이너 내부에서 실행할 코드가 없어서 실행 자체가 안 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;둘 다 사용 (권장 방식)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;애플리케이션을 /app 등 특정 폴더에 정리하여 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 결론  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker에서 WORKDIR과 COPY . .는 &lt;b&gt;필수는 아니지만, 일반적으로 권장되는 설정&lt;/b&gt;입니다.&lt;br /&gt;이를 통해 &lt;b&gt;파일을 체계적으로 관리하고 실행 환경을 명확하게 설정할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 실무에서는 여러 컨테이너를 운영하기 때문에 특정 폴더(/app 등)에 파일을 모아두는 것이 &lt;b&gt;관리 및 유지보수 측면에서 매우 중요합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 gpt를 통해 궁금해서 찾아본 내용을 정리해 보았습니다.&lt;/p&gt;</description>
      <category>DevOps/Docker</category>
      <category>docker</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/85</guid>
      <comments>https://givedev.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 4 Feb 2025 00:00:20 +0900</pubDate>
    </item>
    <item>
      <title>쿠버네티스 기초 명령어</title>
      <link>https://givedev.tistory.com/84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 매니페스트 생성 (nginx-pod.yaml)&lt;/p&gt;
&lt;pre id=&quot;code_1737474061527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod #Pod를 만들때는 apiVersion을 V1을 써야하는데 공식문서에서 이렇게 안내한다. 따로 이유를 알 필요는 없음

metadata:
  name: nginx-pod

spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: 80
      imagePullPolicy: IfNotPresent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. pod 시작&lt;/p&gt;
&lt;pre id=&quot;code_1737474121483&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f nginx-pod.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실행중인 pod 확인&lt;/p&gt;
&lt;pre id=&quot;code_1737474144766&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. pod 내부로 진입&lt;/p&gt;
&lt;pre id=&quot;code_1737474180316&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl exec -it nginx-pod -- bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. pod 포트 포워딩&lt;/p&gt;
&lt;pre id=&quot;code_1737474207791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl port-forward pod/nginx-pod 80:80&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. pod 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1737474234985&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete pod nginx-pod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. pod 디버깅 할때&lt;/p&gt;
&lt;pre id=&quot;code_1738599007922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;                          # Pod 상태 및 이슈 확인
kubectl logs &amp;lt;pod-name&amp;gt; -f                      # 실시간 로그 확인 (follow mode)
kubectl exec -it &amp;lt;pod-name&amp;gt; -- /bin/sh          # Pod 내부 접근 (sh shell)
kubectl exec -it &amp;lt;pod-name&amp;gt; -- /bin/bash        # Pod 내부 접근 (bash shell)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DevOps/k8s</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/84</guid>
      <comments>https://givedev.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 22 Jan 2025 00:44:01 +0900</pubDate>
    </item>
    <item>
      <title>플러터 상중하 AppBar 기본 init</title>
      <link>https://givedev.tistory.com/83</link>
      <description>&lt;pre id=&quot;code_1721055011633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}): super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Container(),
        bottomNavigationBar: BottomAppBar(),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programing/Flutter</category>
      <author>딩코딩</author>
      <guid isPermaLink="true">https://givedev.tistory.com/83</guid>
      <comments>https://givedev.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 15 Jul 2024 23:50:38 +0900</pubDate>
    </item>
  </channel>
</rss>