Ssoon
1주차 : Istio 첫걸음 (4) - 서비스 메시에 첫 번째 애플리케이션 배포 본문
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 서비스는 다른 서비스에서 데이터를 집계해 브라우저에 시각적으로 표시한다
'Istio Hands-on Study [1기]' 카테고리의 다른 글
1주차 : Istio 첫걸음 (6) - Resiliency (0) | 2025.04.12 |
---|---|
1주차 : Istio 첫걸음 (5) - Observability (0) | 2025.04.12 |
1주차 : Istio 첫걸음 (3) - Istio Control Plane (0) | 2025.04.12 |
1주차 : Istio 첫걸음 (2) - Istio 1.17.8 설치 (1) | 2025.04.12 |
1주차 : Istio 첫걸음 (1) - 실습환경설정 (0) | 2025.04.12 |
Comments