대머리개발자

grpc tls 설정. 본문

개발이야기/개념

grpc tls 설정.

대머리개발자 2025. 3. 25. 13:44
728x90

 

pod간 Grpc 통신은 단순 PlainText로 간단하게 하면 된다.

하지만 테스트가 녹록하지 않다.. 매번 반영해서 테스트를 해왔다.

 

미루고 미루던 작업을 진행한다.

 

내부 통신은 일절 변경 없다... 인그레스가 다 감춰준다. ㅎ

 

 

ingress 설정

grpc 전용 인그레스 별도 추가 해야 한다. 

metadata:
  name: grpc-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"    // 필수
spec:
  tls:
  - hosts:
        - dev.도메인.co.kr
    secretName: tls-secrets
  rules:
      http:
        paths:
          - path: /oauth.user.UserService
            pathType: Prefix
            backend:
              service:
                name: oauth-service
                port:
                  number: 80

 

아르메리아 프레임워크를 이용하기 때문에. http 포트 grpc 포트가 동일하다.

 

설정은.. 너무 힘들다.

 

// TLS
private fun createTlsChannel(): ManagedChannel {
    val sslContext = SslContextBuilder.forClient()
        .trustManager(File(certFilePath))
        .applicationProtocolConfig(io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolConfig(
            io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolConfig.Protocol.ALPN,
            io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,
            io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT,
            io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolNames.HTTP_2))
        .build()
    // url 도메인
    return NettyChannelBuilder.forAddress(url, 443)
        .keepAliveTimeout(3, TimeUnit.SECONDS)
        .sslContext(sslContext)
        .maxInboundMessageSize(33554432)
        .build()
}

// service (pod) 간 호출 - 내부 통신
private fun createChannel() : ManagedChannel{
	// url 서비스 이름
    return ManagedChannelBuilder.forAddress(url, 80)
        .keepAliveTimeout(3, TimeUnit.SECONDS)
        .maxInboundMessageSize(33554432)
        .usePlaintext()
        .build();
}

 

 

 

728x90