And Brain said,
CI/CD Argonautica - Istio, 돛 본문
CI/CD Argonautica
Docker, 선박
Kubernetes, 조타수 Harbor, 항구
Helm, 타륜
Istio, 돛
Jenkins, 선장
ArgoCD, 출항
1장/ Loki, Trickster
Troubleshooting
이제 출항 준비가 거의 끝나갑니다. 고생 많으셨지만, 조금만 더 힘내봅시다. 이번 시간도 꽤나 중요합니다. 항해를 위해선 당연히 돛이 필요하겠지요. Istio는 마치 돛처럼 우리의 트래픽을 라우팅해 줄 것입니다.
Istio 설치는 아래 링크를 참고해주시길 바랍니다.
https://theworldaswillandidea.tistory.com/196
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.
'IT > CICD Argonautica' 카테고리의 다른 글
CI/CD Argonautica - Jenkins, 선장 (0) | 2023.09.19 |
---|---|
CI/CD Argonautica - Troubleshooting (0) | 2023.09.14 |
CI/CD Argonautica - Helm, 타륜 (0) | 2023.09.12 |
CI/CD Argonautica - Harbor, 항구 (0) | 2023.09.11 |
CI/CD Argonautica - Kubernetes, 조타수 - 실습 [3] (0) | 2023.08.19 |