And Brain said,

CI/CD Argonautica - Istio, 돛 본문

IT/CICD Argonautica

CI/CD Argonautica - Istio, 돛

The Man 2023. 9. 14. 13:12
반응형

CI/CD Argonautica

Docker, 선박
Kubernetes, 조타수 Harbor, 항구
Helm, 타륜
Istio, 돛
Jenkins, 선장
ArgoCD, 출항

1장/ Loki, Trickster

Troubleshooting

 

이제 출항 준비가 거의 끝나갑니다. 고생 많으셨지만, 조금만 더 힘내봅시다. 이번 시간도 꽤나 중요합니다. 항해를 위해선 당연히 돛이 필요하겠지요. Istio는 마치 돛처럼 우리의 트래픽을 라우팅해 줄 것입니다.

 

Istio 설치는 아래 링크를 참고해주시길 바랍니다.

https://theworldaswillandidea.tistory.com/196

 

Istio, 광활한 Service Mesh로의 항해

Istio는 오픈 소스 서비스 메쉬 프레임워크로, 마이크로서비스 간의 통신을 쉽게 관리하고 제어할 수 있게 도와줍니다. 여러분들의 Kubernetes, Mesos 및 기타 플랫폼에서 실행되는 애플리케이션의 네

theworldaswillandidea.tistory.com

 

Istio의 아름다운 기능을 사용하기 위해선 로드밸런서가 필요합니다. Kubernetes를 배울 때 MetalLB를 사용했었습니다, 우리는 로드밸런서로 MetalLB를 사용하여 Istio의 gateway 기능을 사용할 것입니다. 설치는 이전에 했으니 넘어가겠습니다.

 

저의 상황에서 로드밸런싱이 되야하는 곳은 APIGateway 하나입니다. 나머지 서비스들은 Spring Cloud의 Discovery 와 APIGateway 가 알아서 트래픽을 처리해줄 것이기 때문입니다. 

 

 

APIGateway chart 에서 주목하셔야할 것은 gateway.yaml 파일과 virtualserivce.yaml 파일입니다.

 

아래는 각각 gateway.yaml 파일과 virtualservice.yaml 파일입니다.

# gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: apigateway-gateway
spec:
  selector:
    istio: ingress
  servers:
  - port:
      number: 80
      name: http-80
      protocol: HTTP
    hosts:
    - "*"

 

Gateway는 Istio에서 인바운드 및 아웃바운드 트래픽을 제어하는데 사용되는 리소스입니다. 여기서는 apigateway-gateway라는 이름의 Gateway를 정의했고, 해당 Gateway는 80 포트에서 모든 호스트(*)로 오는 HTTP 트래픽을 수락하도록 설정합니다.

 

# virtualservice.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: apigateway-vs
spec:
  hosts:
  - "*"
  gateways:
  - apigateway-gateway
  http:
  - route:
    - destination:
        host: apigateway
        port:
          number: 80

 

VirtualService는 HTTP와 TCP 트래픽의 라우팅 규칙을 정의합니다. 이 경우, apigateway-vs라는 VirtualService는 모든 호스트로부터 오는 트래픽을 apigateway 서비스의 80 포트로 라우팅하도록 설정되어 있습니다. 그리고 해당 VirtualService는 apigateway-gateway를 게이트웨이로 사용하도록 설정되어 있습니다.

 

 

아래는 실제 제가 사용 중인 deployment.yaml 파일과 service.yaml 파일입니다. 여러분들이 참고하시는데 도움이 될 수 있도록 드립니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apigateway
  labels:
    app: apigateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apigateway
  template:
    metadata:
      labels:
        app: apigateway
    spec:
      imagePullSecrets:
      - name: harbor-regcred
      containers:
        - name: apigateway
          image: {{ .Values.global.imageRegistry }}/{{ .Values.image.name }}:{{ .Values.image.tag }}
          imagePullPolicy: Always
          env:
          - name: EUREKA_INSTANCE_HOSTNAME
            value: discovery
          - name: RABBITMQ_HOSTNAME
            value: rabbitmq
          - name: MYSQL_HOSTNAME
            value: mysql
          - name: MONGO_HOSTNAME_FOOD
            value: mongo
          - name: FLUENTD_HOST
            value: fluentd
          - name: CONFIG_HOSTNAME
            value: {{ .Values.config.server }}
          - name: CONFIG_PORT
            value: "80"
          volumeMounts:
            - mountPath: /var/log/application/apigateway
              name: log-volume
            - mountPath: /usr/app/msa-volume
              name: msa-volume
      volumes:
        - name: log-volume
          emptyDir: {}
        - name: msa-volume
          emptyDir: {}
apiVersion: v1
kind: Service
metadata:
  name: apigateway
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: 80
      targetPort: 8000
      protocol: TCP
      name: http
  selector:
    app: apigateway

 

이제, 이를 실행하여, Istio gateway 의 외부 IP의 80 포트로 접근한다면 apigateway로 접근할 수 있게 됩니다. 외부 IP 확인은 아래 명령어로 확인하실 수 있습니다. EXTERNAL-IP 항목을 확인하시면 됩니다.

 

kubectl get svc -o wide -n istio-ingress

 

이제 얼마 안 남았습니다. 'Jenkins, 선장' 편으로 돌아오겠습니다. 안녕 ~~

 

Thanks for watching, Have a nice day.

반응형
Comments