Skip to main content

[Tech 005] GKE 환경에서 istio 세팅

GKE 환경에서 istio 세팅

준비

  • GKE
  • SSL (Let’s encrypt)
  • istio 기본지식(조직에서 분산형 MS 기반 앱을 어디서나 실행할 수 있도록 지원하는 오픈소스 서비스 메시)
  • cert-manager 사용

[순서]

Architecture



출처 : https://cloud.google.com/architecture/exposing-service-mesh-apps-through-gke-ingress?hl=ko

 

DNS 세팅

DNS 발급

  1. freenom 도메인 발급

    도메인 검색 후 가능한 도메인을 풀 네임으로 검색 후 Checkout

    후에 가입 및 절차를 거치면 Domain 발급.

  2. Cloud DNS에서 생성된 Nameserver를 freenom 사이트에 적용
    (google Domain 및 타 Domain은 각 사이트에 접속 후 적용)

Cloud DNS 세팅


istio 및 cert-manager 세팅

  1. istio 설치 (링크)
    1. Download Istio
      curl -L https://istio.io/downloadIstio | sh - # down
      cd istio-1.11.3 # Directory 이동
      export PATH=$PWD/bin:$PATH # istioctl Client를 path에 추가

       

    1. Install Istio
      istioctl install --set profile=demo -y # istio install
      
      kubectl label namespace default istio-injection=enabled # 추후 애플리케이션 배포 시 Envoy 사이드카 Proxy를 자동으로 삽입하도록 Istio에 지시하는 Namespace Label을 추가.

       

    1. Install cert-manager
      kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.yaml # github에 있는 cert-manager.yaml 배포

       

    1. ClusterIssuer 배포
      # 모든 Namespace에서 적용되는 ClusterIssuer 배포(prod/staging)
      
      kubectl apply -f - <<EOF
      
      #prod
      
      apiVersion: cert-manager.io/v1
      
      kind: ClusterIssuer
      
      metadata:
      
        name: letsencrypt-prod-istio
      
      spec:
      
        acme:
      
          server: https://acme-v02.api.letsencrypt.org/directory
      
          email: jinkyug@cloocus.com
      
          privateKeySecretRef:
      
            name: letsencrypt-prod-istio
      
          solvers:
      
          - http01:
      
              ingress:
      
                class: istio
      
      ---
      
      #staging
      
      apiVersion: cert-manager.io/v1
      
      kind: ClusterIssuer
      
      metadata:
      
        name: letsencrypt-staging-istio
      
      spec:
      
        acme:
      
          server: https://acme-staging-v02.api.letsencrypt.org/directory
      
          email: jinkyu@cloocus.com
      
          privateKeySecretRef:
      
            name: letsencrypt-staging-istio
      
          solvers:
      
          - http01:
      
              ingress:
      
                class: istio
      
      EOF
      

       

    1. 배포 확인
      #Pod, Service 확인
      kubectl get svc,pod -n cert-manager
      
      #secret 확인
      kubectl get secret -n cert-manager
      
      #ClusterIssuer 확인
      kubectl get clusterissuers.cert-manager.io

       

    1. test Application 배포
      #nginx Image 배포 (port 80 open)
      kubectl create deployment --image nginx --port 80 nginx
      
      kubectl expose deployment nginx --port 80

       

    1. 인증서 발급
      #nginx Image 배포 (port 80 open)
      
      ---yaml---
      
      apiVersion: cert-manager.io/v1alpha2
      kind: Certificate
      metadata:
        name: nginx
        namespace: istio-system # istio 설치경로
      spec:
        secretName: nginx-tls
        issuerRef:
          name: letsencrypt-prod-istio
          kind: ClusterIssuer
        commonName: test.jinkyu.tk # 알맞는 도메인으로 변경
        dnsNames:
        - test.jinkyu.tk # 알맞는 도메인으로 변경
      
      
      ----CMD-----
      
      kubectl get certificate -n istio-system # 생성된 certi 확인.

       

    1. Istio Gateway 배포
      #Istio Gateway 배포 (port 443 redirection Setting)
      
      ---yaml---
      
      kind: Gateway
      apiVersion: networking.istio.io/v1alpha3
      metadata:
        name: nginx
      spec:
        servers:
          - hosts:
              - test.jinkyu.tk
            port:
              name: http
              number: 80
              protocol: HTTP
            tls:
              httpsRedirect: true # 80포트 진입 시 443 Redirect 설정
          - hosts:
              - test.jinkyu.tk
            port:
              name: https
              number: 443
              protocol: HTTPS
            tls:
              credentialName: nginx-tls  # Secret 명
              mode: SIMPLE    # 기본적인 
        selector:
          app: istio-ingressgateway # Selector 설정

       

    1. virtualservice 수정 후 저장
      #virtualservice clusterip에 붙을 때
      
      	---yaml---
      	kind: VirtualService
      	apiVersion: networking.istio.io/v1alpha3
      	metadata:
      	  name: nginx
      	spec:
      	  hosts:
      	  - test.jinkyu.tk  #적용 도메인
      	  http:
      	  - match:
      		 - uri:
      			 prefix: /   #경로 수정 필요
      		route:
      		  - destination:
      			  port:
      				number: 8080    #Service name 및 Port 수정 필요
      			  host: hello-cloudbuild
      	  gateways:
      	- nginx # gateway name

       

     

완료


 

 

Secured By miniOrange