Ssoon

1주차 : Istio 첫걸음 (4) - 서비스 메시에 첫 번째 애플리케이션 배포 본문

Istio Hands-on Study [1기]

1주차 : Istio 첫걸음 (4) - 서비스 메시에 첫 번째 애플리케이션 배포

구구달스 2025. 4. 12. 18:43
CloudNet@ 가시다님이 진행하는 Istio Hands-on Study [1기]

 Istio 서비스 메시에서 첫 애플리케이션 배포하기

  • istioinaction 네임스페이스 생성
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl create ns istioinaction
namespace/istioinaction created

 방법1 : yaml에 sidecar 설정을 추가

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ cat services/catalog/kubernetes/catalog.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: catalog
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: catalog
  name: catalog
spec:
  ports:
  - name: http
    port: 80 #Service가 외부에서 수신할 포트를 80번으로 설정
    protocol: TCP
    targetPort: 3000 #들어온 요청을 파드의 3000번 포트로 전달
  selector: #트래픽을 라우팅할 파드를 선택하는 레이블 셀렉터를 정의
    app: catalog #app: catalog 레이블을 가진 파드로 트래픽을 보내도록 설정
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: catalog
    version: v1
  name: catalog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: catalog
      version: v1
  template:
    metadata:
      labels:
        app: catalog
        version: v1
    spec:
      serviceAccountName: catalog #파드가 사용할 ServiceAccount를 catalog로 설정
      containers:
      - env:
        - name: KUBERNETES_NAMESPACE #환경 변수의 이름을 KUBERNETES_NAMESPACE로 지정
          valueFrom: #환경 변수 값을 동적으로 가져오는 방법을 정의
            fieldRef: #Kubernetes 필드에서 값을 가져오도록 설정
              fieldPath: metadata.namespace #환경 변수 값을 파드의 네임스페이스(metadata.namespace)로 설정
        image: istioinaction/catalog:latest #컨테이너가 사용할 Docker 이미지를 istioinaction/catalog:latest로 설정
        imagePullPolicy: IfNotPresent #이미지가 로컬에 없으면 다운로드하고, 있으면 재사용
        name: catalog
        ports:
        - containerPort: 3000 #컨테이너가 3000번 포트를 사용하도록 설정
          name: http
          protocol: TCP
        securityContext:
          privileged: false #컨테이너가 권한 있는(Privileged) 모드로 실행되지 않도록 설정
  • catalog.yaml 파일에 정의된 Kubernetes 리소스(catalog 애플리케이션)에 Istio의 사이드카 프록시(Envoy)를 자동으로 추가하도록 설정합니다.
    • docker exec -it myk8s-control-plane: myk8s-control-plane이라는 Docker 컨테이너 안에서 명령어를 실행합니다 
    • istioctl kube-inject: Istio 도구(istioctl)를 사용해 애플리케이션 설정에 Istio 프록시를 삽입합니다.
    • -f /istiobook/services/catalog/kubernetes/catalog.yaml: catalog.yaml 파일을 읽어서 그 안의 설정(애플리케이션 배포 정보)을 수정합니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ docker exec -it myk8s-control-plane istioctl kube-inject -f /istiobook/services/catalog/kubernetes/catalog.yaml
...
    spec:
...
      - args: #[istio-proxy 컨테이너에 전달할 명령줄 인수(arguments)를 정의하는 섹션]
        - proxy #컨테이너가 실행할 명령어로, Envoy 프록시를 시작하도록 지시
        - sidecar #프록시를 사이드카 모드(애플리케이션과 함께 실행되는 보조 컨테이너)로 실행하도록 설정
        - --domain #프록시가 사용할 도메인 이름을 지정하는 플래그
        - $(POD_NAMESPACE).svc.cluster.local #프록시의 도메인을 파드의 네임스페이스(예: default)와 클러스터 도메인(svc.cluster.local)으로 설정
        - --proxyLogLevel=warning #프록시의 로그 레벨을 warning으로 설정하여 중요한 메시지만 기록
        - --proxyComponentLogLevel=misc:error #프록시의 특정 컴포넌트(기타 항목)에 대해 오류(error) 수준의 로그만 기록하도록 설정
        - --log_output_level=default:info #기본 로그 출력 레벨을 info로 설정하여 일반적인 정보 로그를 포함
        - --concurrency #프록시가 사용할 동시 스레드 수를 지정하는 플래그
        - "2" #프록시가 2개의 스레드를 사용하여 병렬 처리를 하도록 설정
        env: #[istio-proxy 컨테이너에 설정할 환경 변수 목록을 정의하는 섹션]
        - name: JWT_POLICY
          value: third-party-jwt #JWT 인증 정책을 third-party-jwt로 설정하여 외부 JWT 토큰 검증을 지원
        - name: PILOT_CERT_PROVIDER
          value: istiod #인증서 제공자를 istiod(Istio 제어 평면)으로 설정하여 보안 인증서를 가져옵니다.
        - name: CA_ADDR
          value: istiod.istio-system.svc:15012 #Istio 제어 평면(Istiod)의 주소와 포트(istiod.istio-system.svc:15012)를 설정하여 프록시가 인증서 및 설정을 가져오도록 합니다.
        - name: POD_NAME
          valueFrom: #환경 변수 값을 동적으로 가져오는 방법을 정의
            fieldRef: #Kubernetes #파드 메타데이터에서 값을 가져오도록 설정
              fieldPath: metadata.name #파드의 이름을 환경 변수 POD_NAME 값으로 설정
...
        image: docker.io/istio/proxyv2:1.17.8 #istio-proxy 컨테이너가 사용할 Docker 이미지를 istio/proxyv2:1.17.8로 지정
        name: istio-proxy
...

 방법2 : namespace에 레이블을 추가하면 istiod (오퍼레이터)가 해당 namepsace의 pod spec에 자동으로 sidecar 설정을 주입

  • Kubernetes 환경에서 Istio 서비스 메쉬를 사용하기 위해 특정 네임스페이스에 라벨을 추가
  • istio-injection=enabled: Istio의 사이드카 자동 주입을 활성화하는 라벨입니다. 이 라벨이 추가되면, 해당 네임스페이스에 배포되는 파드에 Istio의 Envoy 프록시가 자동으로 삽입됩니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl label namespace istioinaction istio-injection=enabled
namespace/istioinaction labeled
  • istioinaction 네임스페이스에 istio-injection=enabled 라벨이 제대로 적용된 것을 확인할 수 있습니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl get ns --show-labels
NAME                 STATUS   AGE     LABELS
...
istioinaction        Active   2m40s   istio-injection=enabled,kubernetes.io/metadata.name=istioinaction
...
  • kubectl get mutatingwebhookconfiguration 명령어를 실행하여 Kubernetes 클러스터에 설정된 MutatingWebhookConfiguration 리소스를 확인합니다.
    • MutatingWebhookConfiguration은 Kubernetes에게 "리소스를 만들 때 내가 정한 규칙대로 수정해줘!"라고 명령하는 설정입니다. Istio에서는 이걸로 애플리케이션에 네트워크 관리 기능을 자동 추가합니다.
  • Istio가 클러스터에서 제대로 작동하도록 설정된 사이드카 주입 웹훅을 확인합니다. istioinaction 네임스페이스에 istio-injection=enabled 라벨을 추가한 이전 작업과 연계되어, 이 웹훅들이 해당 네임스페이스의 파드에 자동으로 Istio의 Envoy 프록시를 삽입할 준비가 된 것입니다.
  • 이 리소스는 Istio와 관련된 설정으로, 파드 생성 시 자동으로 Istio의 사이드카(Envoy 프록시)를 주입하는 역할을 합니다.
    • istio-revision-tag-default: 특정 Istio 리비전(버전)과 연결된 웹훅 설정.
    • istio-sidecar-injector: Istio의 기본 사이드카 주입을 담당하는 웹훅.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl get mutatingwebhookconfiguration
NAME                         WEBHOOKS   AGE
istio-revision-tag-default   4          17m
istio-sidecar-injector       4          17m

catalog와 webapp 애플리케이션 배포

  • catalog와 webapp 애플리케이션을 배포하기 위해 각각의 YAML 파일을 사용해 필요한 리소스(서비스 어카운트, 서비스, 디플로이먼트)를 istioinaction 네임스페이스에 생성했습니다.
  • 이 리소스들은 애플리케이션을 실행하고 외부에서 접근 가능하게 하며, Istio의 사이드카 주입(istio-injection=enabled) 덕분에 각 파드에 Envoy 프록시가 자동으로 추가되어 서비스 메쉬 기능이 적용됩니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl apply -f services/catalog/kubernetes/catalog.yaml -n istioinaction
serviceaccount/catalog created
service/catalog created
deployment.apps/catalog created
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl apply -f services/webapp/kubernetes/webapp.yaml -n istioinaction
serviceaccount/webapp created
service/webapp created
deployment.apps/webapp created
  • istioinaction 네임스페이스에서 catalog와 webapp이라는 두 애플리케이션이 실행 중이며, 각 파드는 Istio의 사이드카(Envoy 프록시)를 포함해 정상적으로 동작하고 있습니다. 이는 이전에 설정한 istio-injection=enabled 라벨이 제대로 작동하여 Istio 서비스 메쉬 기능이 적용되었음을 보여줍니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl get pod -n istioinaction
NAME                     READY   STATUS    RESTARTS   AGE
catalog-6cf4b97d-5p442   2/2     Running   0          21s
webapp-7685bcb84-mcmxv   2/2     Running   0          15s
  • 접속 테스트용 netshoot 파드 생성
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: netshoot
spec:
  containers:
  - name: netshoot
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF
pod/netshoot created
  • netshoot 파드에서 catalog 서비스로 요청을 보내 ID가 1인 항목의 정보를 조회했습니다.
  • 응답은 catalog 애플리케이션이 정상적으로 동작하며, 요청한 데이터를 JSON 형식으로 잘 반환했음을 보여줍니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl exec -it netshoot -- curl -s http://catalog.istioinaction/items/1 | jq
{
  "id": 1,
  "color": "amber",
  "department": "Eyewear",
  "name": "Elinor Glasses",
  "price": "282.00"
}
  • netshoot 파드에서 webapp 서비스로 요청을 보내 ID가 1인 상품 정보를 조회했습니다.
  • webapp은 내부적으로 catalog 서비스와 통신하여 데이터를 성공적으로 가져왔고, 이를 JSON 형식으로 응답했습니다.
  • 이는 istioinaction 네임스페이스에서 Istio의 서비스 메쉬를 통해 webapp과 catalog 간 통신이 정상적으로 작동함을 보여줍니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl exec -it netshoot -- curl -s http://webapp.istioinaction/api/catalog/items/1 | jq
{
  "id": 1,
  "color": "amber",
  "department": "Eyewear",
  "name": "Elinor Glasses",
  "price": "282.00"
}
  • istioinaction 네임스페이스의 webapp 앱(포트 8080)을 로컬 컴퓨터의 8080 포트로 연결해서, localhost:8080으로 앱에 접근
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl port-forward -n istioinaction deploy/webapp 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Handling connection for 8080
Handling connection for 8080
  • webapp 서비스는 다른 서비스에서 데이터를 집계해 브라우저에 시각적으로 표시한다

 
Comments