sping cloud gateway와 k8s의 배치와 구덩이

20482 단어
하나.k8s로 배치된pod,
gateway를 어떻게 구축하는지gateway 구축을 보십시오 다음에 제가 새로운 의존을 추가합니다
implementation("org.springframework.cloud:spring-cloud-commons")

implementation("org.springframework.cloud:spring-cloud-kubernetes-core")
implementation("org.springframework.cloud:spring-cloud-kubernetes-discovery")

implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-ribbon")
implementation("org.springframework.cloud:spring-cloud-starter-netflix-ribbon")
implementation("org.springframework.cloud:spring-cloud-starter-netflix-hystrix")
implementation("org.springframework.boot:spring-boot-starter-webflux")

여기는 주로 편과 달리 나는gradle을 사용하지만, 사실은 완전하지 않다yaml은 다음과 같다.
server:
  port: 8888
spring:
  redis:
    host:      
    port: 6379
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          enabled: true
      routes:
        - id: all
          uri: lb://      /
          predicates:
            - Path=/**
          filters:
            - name: RequestRateLimiter
              args:
                rate-limiter: "#{@userLevelRedisRateLimiter}"
                key-resolver: "#{@userKeyResolver}"
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 3
logging:
  level:
    org.springframework.cloud.gateway: debug
    org.springframework.web: debug
product-infra-service:
  ribbon:
    KubernetesNamespace: default

backend:
  ribbon:
    eureka:
      enabled: false
    client:
      enabled: true
    ServerListRefreshInterval: 5000

hystrix:
  command:
    BackendCall:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
  threadpool:
    BackendCallThread:
      coreSize: 5
feign:
  hystrix:
    enabled: true


docker가 거울로 포장된 후 k8s배치yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: gateway
  labels:
    name: gateway
spec:
  replicas: 1
  selector:
    name: gateway
  template:
    metadata:
      labels:
        name: gateway
    spec:
      containers:
        - name: gateway
          image:   
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8888

service
apiVersion: v1
kind: Service
metadata:
  name: gateway
  labels:
    name: gateway
spec:
  type: NodePort
  ports:
    - port: 8888
      nodePort: 32223
  selector:
    name: gateway

명령kubectl create -f 파일 이름.yaml 이후 minikube 서비스gateway - url 서비스 외부 접근 경로가 얼마나 되는지 볼 수 있습니다. 테스트하기 편리하지만 문제가 있습니다. 서비스가 찾을 수 없는 상황이 발생할 수 있습니다. 권한이 없기 때문입니다.
# NOTE: The service account `default:default` already exists in k8s cluster.
# You can create a new account following like this:
#---
#apiVersion: v1
#kind: ServiceAccount
#metadata:
#  name: 
#  namespace: 

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: fabric8-rbac
subjects:
  - kind: ServiceAccount
    # Reference to upper's `metadata.name`
    name: default
    # Reference to upper's `metadata.namespace`
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

이미 추가하면 됩니다.
하나.gateway는 프로젝트의 가능한 점에 영향을 줄 수 있습니다
첫 번째:gateway 용기에 루트를 통해 전송되면 업무 용기에 전송
request의header:x-forwarded-for는 두 번의 IP를 기록하는데 변환할 때 문제가 있을 수 있습니다.
두 번째:gateway 전역 문제
gateway 용기에 요청을 보낼 때, 크로스 필드가 되면 403 오류가 발생합니다. 여기에 코드를 추가해야 합니다. (제 쪽에서 사용하는kotlin은 자바로 전환하십시오.)
  @Bean
    fun corsFilter(): CorsWebFilter {
        val config = CorsConfiguration()
        config.addAllowedMethod("*")
        config.addAllowedOrigin("*")
        config.addAllowedHeader("*")

        val source = UrlBasedCorsConfigurationSource(PathPatternParser())
        source.registerCorsConfiguration("/**", config)

        return CorsWebFilter(source)
    }

그러나 어떤 사람들은 여전히 문제를 해결하지 못했다. 403이 잘못 보고하지 않았기 때문이다. 그러나 또 코즈가 정수리를 반복하는 문제가 발생했다. (Access-Control-Allow-Origin은 두 개가 나타난다) 이gateway의 버그는 먼저 버전이 바뀌었는지 모르겠다. 여기에 추가해야 한다.
class CorsResponseHeaderFilter : GlobalFilter, Ordered {
    override fun getOrder(): Int { //     gateway  。   return Ordered.LOWEST_PRECEDENCE
      //   gateway filter       filter    
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1
    }

    override fun filter(exchange: ServerWebExchange, chain: GatewayFilterChain): Mono<Void> {
        val log = LogFactory.getLog(this.javaClass)
        log.info("CorsResponseHeaderFilter  ")
        return chain.filter(exchange).then(Mono.defer {
            exchange.response.headers.entries
                .filter { kv -> kv.value.size > 1 }
                .filter { kv -> kv.key == HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN || kv.key == HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS }
                .forEach { kv ->
                    kv.setValue(arrayListOf(kv.value[0]))
                }
            chain.filter(exchange)
        })
    }
}

배치에 있어서 거의 문제가 없다
만약 중복 헤더의 문제가 있다면, 업무 용기가 코어스에도 설정되어 영향을 미쳤는지 검사해야 한다

좋은 웹페이지 즐겨찾기