3.4. 사용자 정의 메트릭 자동 확장기 트리거 이해


트리거는 스케일러라고도 하며, 사용자 정의 메트릭 자동 스케일러 연산자가 포드의 크기를 조정하는 데 사용하는 메트릭을 제공합니다.

사용자 정의 메트릭 자동 확장기는 현재 Prometheus, CPU, 메모리, Apache Kafka 및 Cron 트리거를 지원합니다.

다음 섹션에서 설명하는 대로 ScaledObject 또는 ScaledJob 사용자 정의 리소스를 사용하여 특정 개체에 대한 트리거를 구성합니다.

확장된 객체나 클러스터의 모든 스케일러 에 사용할 인증 기관을 구성할 수 있습니다.

3.4.1. Prometheus 트리거 이해

Prometheus 메트릭을 기반으로 Pod를 확장할 수 있으며, 설치된 OpenShift Container Platform 모니터링이나 외부 Prometheus 서버를 메트릭 소스로 사용할 수 있습니다. OpenShift Container Platform 모니터링을 메트릭 소스로 사용하는 데 필요한 구성에 대한 자세한 내용은 "OpenShift Container Platform 모니터링을 사용하도록 사용자 정의 메트릭 자동 확장기 구성"을 참조하세요.

참고

Prometheus가 사용자 정의 메트릭 자동 확장기가 확장하는 애플리케이션에서 메트릭을 수집하는 경우 사용자 정의 리소스에서 최소 복제본을 0 으로 설정하지 마세요. 애플리케이션 포드가 없으면 사용자 정의 메트릭 자동 확장기는 확장할 메트릭을 갖지 않습니다.

Prometheus 대상을 사용한 확장된 객체의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prom-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: prometheus 
1

    metadata:
      serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092 
2

      namespace: kedatest 
3

      metricName: http_requests_total 
4

      threshold: '5' 
5

      query: sum(rate(http_requests_total{job="test-app"}[1m])) 
6

      authModes: basic 
7

      cortexOrgID: my-org 
8

      ignoreNullValues: "false" 
9

      unsafeSsl: "false" 
10
Copy to Clipboard Toggle word wrap

1
트리거 유형으로 Prometheus를 지정합니다.
2
Prometheus 서버의 주소를 지정합니다. 이 예제에서는 OpenShift Container Platform 모니터링을 사용합니다.
3
선택 사항: 크기를 조정하려는 개체의 네임스페이스를 지정합니다. OpenShift Container Platform 모니터링을 메트릭의 소스로 사용하는 경우 이 매개변수는 필수입니다.
4
external.metrics.k8s.io API에서 메트릭을 식별하는 이름을 지정합니다. 두 개 이상의 트리거를 사용하는 경우 모든 메트릭 이름은 고유해야 합니다.
5
크기 조정을 트리거하는 값을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다.
6
사용할 Prometheus 쿼리를 지정합니다.
7
사용할 인증 방법을 지정합니다. Prometheus 스케일러는 베어러 인증( bearer ), 기본 인증( basic ), TLS 인증( tls )을 지원합니다. 다음 섹션에서 설명하는 대로 트리거 인증에서 특정 인증 매개변수를 구성합니다. 필요에 따라 비밀을 사용할 수도 있습니다.
8
선택 사항: Prometheus의 다중 테넌트 Cortex 또는 Mimir 스토리지에 X-Scope-OrgID 헤더를 전달합니다. 이 매개변수는 다중 테넌트 Prometheus 저장소에서만 필요하며, Prometheus가 어떤 데이터를 반환해야 하는지 나타냅니다.
9
선택 사항: Prometheus 대상이 손실된 경우 트리거가 어떻게 진행되어야 하는지 지정합니다.
  • true 인 경우 Prometheus 대상이 손실되어도 트리거가 계속 작동합니다. 이는 기본 동작입니다.
  • false 인 경우 Prometheus 대상이 손실되면 트리거가 오류를 반환합니다.
10
선택 사항: 인증서 확인을 건너뛸지 여부를 지정합니다. 예를 들어, 테스트 환경에서 실행 중이고 Prometheus 엔드포인트에서 자체 서명된 인증서를 사용하는 경우 검사를 건너뛸 수 있습니다.
  • false 인 경우 인증서 검사가 수행됩니다. 이는 기본 동작입니다.
  • true 인 경우 인증서 검사가 수행되지 않습니다.

    중요

    검사를 건너뛰는 것은 권장되지 않습니다.

설치된 OpenShift Container Platform Prometheus 모니터링을 사용자 정의 메트릭 자동 확장기에서 사용하는 메트릭의 소스로 사용할 수 있습니다. 하지만 추가로 수행해야 할 구성이 몇 가지 있습니다.

확장된 개체가 OpenShift Container Platform Prometheus 메트릭을 읽을 수 있도록 하려면 트리거 인증이나 클러스터 트리거 인증을 사용하여 필요한 인증 정보를 제공해야 합니다. 다음 절차는 사용하는 트리거 인증 방법에 따라 다릅니다. 트리거 인증에 대한 자세한 내용은 "사용자 정의 메트릭 자동 확장기 트리거 인증 이해"를 참조하세요.

참고

외부 Prometheus 소스에는 이러한 단계가 필요하지 않습니다.

이 섹션에 설명된 대로 다음 작업을 수행해야 합니다.

  • 서비스 계정을 생성합니다.
  • 서비스 계정에 대한 토큰을 생성하는 비밀을 만듭니다.
  • 트리거 인증을 생성합니다.
  • 역할을 만듭니다.
  • 해당 역할을 서비스 계정에 추가합니다.
  • Prometheus에서 사용하는 트리거 인증 객체의 토큰을 참조합니다.

사전 요구 사항

  • OpenShift Container Platform 모니터링을 설치해야 합니다.
  • 사용자 정의 워크로드 모니터링은 사용자 정의 워크로드 모니터링 구성 맵 만들기 섹션에 설명된 대로 OpenShift Container Platform 모니터링에서 활성화되어야 합니다.
  • Custom Metrics Autoscaler Operator를 설치해야 합니다.

프로세스

  1. 해당 프로젝트로 변경하세요:

    $ oc project <project_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    다음 프로젝트 중 하나를 지정합니다.
    • 트리거 인증을 사용하는 경우 크기를 조정하려는 개체가 있는 프로젝트를 지정합니다.
    • 클러스터 트리거 인증을 사용하는 경우 openshift-keda 프로젝트를 지정하세요.
  2. 클러스터에 서비스 계정과 토큰이 없으면 새로 만드세요.

    1. 다음 명령을 사용하여 서비스 계정 객체를 만듭니다.

      $ oc create serviceaccount thanos 
      1
      Copy to Clipboard Toggle word wrap
      1
      서비스 계정의 이름을 지정합니다.
    2. 서비스 계정 토큰을 생성하려면 비밀 YAML을 만듭니다.

      apiVersion: v1
      kind: Secret
      metadata:
        name: thanos-token
        annotations:
          kubernetes.io/service-account.name: thanos 
      1
      
      type: kubernetes.io/service-account-token
      Copy to Clipboard Toggle word wrap
      1
      서비스 계정의 이름을 지정합니다.
    3. 다음 명령을 사용하여 비밀 객체를 만듭니다.

      $ oc create -f <file_name>.yaml
      Copy to Clipboard Toggle word wrap
    4. 다음 명령을 사용하여 서비스 계정에 할당된 토큰을 찾으세요.

      $ oc describe serviceaccount thanos 
      1
      Copy to Clipboard Toggle word wrap
      1
      서비스 계정의 이름을 지정합니다.

      출력 예

      Name:                thanos
      Namespace:           <namespace_name>
      Labels:              <none>
      Annotations:         <none>
      Image pull secrets:  thanos-dockercfg-nnwgj
      Mountable secrets:   thanos-dockercfg-nnwgj
      Tokens:              thanos-token 
      1
      
      Events:              <none>
      Copy to Clipboard Toggle word wrap

      1
      이 토큰을 트리거 인증에 사용하세요.
  3. 서비스 계정 토큰을 사용하여 트리거 인증을 만듭니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: keda.sh/v1alpha1
      kind: <authentication_method> 
      1
      
      metadata:
        name: keda-trigger-auth-prometheus
      spec:
        secretTargetRef: 
      2
      
        - parameter: bearerToken 
      3
      
          name: thanos-token 
      4
      
          key: token 
      5
      
        - parameter: ca
          name: thanos-token
          key: ca.crt
      Copy to Clipboard Toggle word wrap
      1
      다음 트리거 인증 방법 중 하나를 지정합니다.
      • 트리거 인증을 사용하는 경우 TriggerAuthentication 을 지정합니다. 이 예제에서는 트리거 인증을 구성합니다.
      • 클러스터 트리거 인증을 사용하는 경우 ClusterTriggerAuthentication을 지정합니다.
      2
      이 개체가 권한 부여를 위해 비밀을 사용한다는 것을 지정합니다.
      3
      토큰을 사용하여 제공할 인증 매개변수를 지정합니다.
      4
      사용할 토큰의 이름을 지정합니다.
      5
      지정된 매개변수와 함께 사용할 토큰의 키를 지정합니다.
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
      Copy to Clipboard Toggle word wrap
  4. Thanos 메트릭을 읽기 위한 역할을 만듭니다.

    1. 다음 매개변수를 사용하여 YAML 파일을 만듭니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: thanos-metrics-reader
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
      - apiGroups:
        - metrics.k8s.io
        resources:
        - pods
        - nodes
        verbs:
        - get
        - list
        - watch
      Copy to Clipboard Toggle word wrap
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
      Copy to Clipboard Toggle word wrap
  5. Thanos 메트릭을 읽기 위한 역할 바인딩을 만듭니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: <binding_type> 
      1
      
      metadata:
        name: thanos-metrics-reader 
      2
      
        namespace: my-project 
      3
      
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: thanos-metrics-reader
      subjects:
      - kind: ServiceAccount
        name: thanos 
      4
      
        namespace: <namespace_name> 
      5
      Copy to Clipboard Toggle word wrap
      1
      다음 개체 유형 중 하나를 지정합니다.
      • 트리거 인증을 사용하는 경우 RoleBinding을 지정합니다.
      • 클러스터 트리거 인증을 사용하는 경우 ClusterRoleBinding을 지정합니다.
      2
      생성한 역할의 이름을 지정합니다.
      3
      다음 프로젝트 중 하나를 지정합니다.
      • 트리거 인증을 사용하는 경우 크기를 조정하려는 개체가 있는 프로젝트를 지정합니다.
      • 클러스터 트리거 인증을 사용하는 경우 openshift-keda 프로젝트를 지정하세요.
      4
      역할에 바인딩할 서비스 계정의 이름을 지정합니다.
      5
      이전에 서비스 계정을 만든 프로젝트를 지정합니다.
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
      Copy to Clipboard Toggle word wrap

"사용자 정의 메트릭 자동 확장기를 추가하는 방법 이해"에 설명된 대로 이제 확장된 개체나 확장된 작업을 배포하여 애플리케이션의 자동 확장을 활성화할 수 있습니다. OpenShift Container Platform 모니터링을 소스, 트리거 또는 스케일러로 사용하려면 다음 매개변수를 포함해야 합니다.

  • triggers.typeprometheus 여야 합니다.
  • triggers.metadata.serverAddress 는 https://thanos-querier.openshift-monitoring.svc.cluster.local:9092 여야 합니다.
  • triggers.metadata.authModes 는 bearer 여야 합니다.
  • triggers.metadata.namespace는 확장할 개체의 네임스페이스로 설정해야 합니다.
  • triggers.authenticationRef는 이전 단계에서 지정한 트리거 인증 리소스를 가리켜야 합니다.

3.4.2. CPU 트리거 이해하기

CPU 메트릭에 따라 Pod의 크기를 조정할 수 있습니다. 이 트리거는 클러스터 메트릭을 메트릭의 소스로 사용합니다.

사용자 정의 메트릭 자동 확장기는 사용자가 지정한 CPU 사용량을 유지하기 위해 개체와 연결된 포드의 크기를 조정합니다. 자동 확장기는 모든 포드에서 지정된 CPU 사용률을 유지하기 위해 최소값과 최대값 사이의 복제본 수를 늘리거나 줄입니다. 메모리 트리거는 전체 포드의 메모리 사용률을 고려합니다. 포드에 여러 개의 컨테이너가 있는 경우 메모리 트리거는 포드에 있는 모든 컨테이너의 총 메모리 사용량을 고려합니다.

참고
  • 이 트리거는 ScaledJob 사용자 정의 리소스와 함께 사용할 수 없습니다.
  • 메모리 트리거를 사용하여 객체의 크기를 조정하는 경우, 여러 개의 트리거를 사용하더라도 객체의 크기가 0 으로 조정되지 않습니다.

CPU 타겟이 있는 확장된 객체의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: cpu 
1

    metricType: Utilization 
2

    metadata:
      value: '60' 
3

  minReplicaCount: 1 
4
Copy to Clipboard Toggle word wrap

1
트리거 유형으로 CPU를 지정합니다.
2
사용할 메트릭 유형( 사용률 또는 평균값) 을 지정합니다.
3
크기 조정을 트리거하는 값을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다.
  • Utilization을 사용할 때 대상 값은 모든 관련 Pod의 리소스 메트릭 평균이며, Pod의 리소스 요청 값에 대한 백분율로 표시됩니다.
  • AverageValue를 사용할 때 대상 값은 모든 관련 Pod의 메트릭 평균입니다.
4
축소할 때 최소 복제본 수를 지정합니다. CPU 트리거의 경우, CPU 메트릭만 사용하는 경우 HPA가 0으로 확장될 수 없으므로 1 이상의 값을 입력하세요.

3.4.3. 메모리 트리거 이해하기

메모리 메트릭에 따라 Pod의 크기를 조정할 수 있습니다. 이 트리거는 클러스터 메트릭을 메트릭의 소스로 사용합니다.

사용자 정의 메트릭 자동 확장기는 사용자가 지정한 평균 메모리 사용량을 유지하기 위해 개체와 연결된 포드의 크기를 조정합니다. 자동 확장기는 모든 포드에서 지정된 메모리 사용량을 유지하기 위해 최소값과 최대값 사이의 복제본 수를 늘리거나 줄입니다. 메모리 트리거는 전체 Pod의 메모리 사용률을 고려합니다. 포드에 여러 개의 컨테이너가 있는 경우 메모리 사용률은 모든 컨테이너의 합계입니다.

참고
  • 이 트리거는 ScaledJob 사용자 정의 리소스와 함께 사용할 수 없습니다.
  • 메모리 트리거를 사용하여 객체의 크기를 조정하는 경우, 여러 개의 트리거를 사용하더라도 객체의 크기가 0 으로 조정되지 않습니다.

메모리 타겟이 있는 확장된 객체의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: memory-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: memory 
1

    metricType: Utilization 
2

    metadata:
      value: '60' 
3

      containerName: api 
4
Copy to Clipboard Toggle word wrap

1
트리거 유형으로 메모리를 지정합니다.
2
사용할 메트릭 유형( 사용률 또는 평균값) 을 지정합니다.
3
크기 조정을 트리거하는 값을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다.
  • Utilization을 사용할 때 대상 값은 모든 관련 Pod의 리소스 메트릭 평균이며, Pod의 리소스 요청 값에 대한 백분율로 표시됩니다.
  • AverageValue를 사용할 때 대상 값은 모든 관련 Pod의 메트릭 평균입니다.
4
선택 사항: 전체 포드가 아닌, 해당 컨테이너의 메모리 사용률에 따라 확장할 개별 컨테이너를 지정합니다. 이 예에서는 api 라는 컨테이너만 확장됩니다.

3.4.4. 카프카 트리거 이해하기

Apache Kafka 주제나 Kafka 프로토콜을 지원하는 다른 서비스를 기반으로 Pod를 확장할 수 있습니다. 사용자 정의 메트릭 자동 확장기는 확장된 객체나 확장된 작업에서 allowIdleConsumers 매개변수를 true 로 설정하지 않는 한 Kafka 파티션 수보다 더 높게 확장되지 않습니다.

참고

소비자 그룹의 수가 토픽의 파티션 수를 초과하는 경우, 추가 소비자 그룹은 유휴 상태로 유지됩니다. 이를 방지하기 위해 기본적으로 복제본 수는 다음을 초과하지 않습니다.

  • 주제가 지정된 경우 주제의 파티션 수
  • 주제가 지정되지 않은 경우 소비자 그룹의 모든 주제의 파티션 수
  • 확장된 개체 또는 확장된 작업 CR에 지정된 maxReplicaCount

allowIdleConsumers 매개변수를 사용하여 이러한 기본 동작을 비활성화할 수 있습니다.

Kafka 타겟을 사용한 확장된 객체의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: kafka 
1

    metadata:
      topic: my-topic 
2

      bootstrapServers: my-cluster-kafka-bootstrap.openshift-operators.svc:9092 
3

      consumerGroup: my-group 
4

      lagThreshold: '10' 
5

      activationLagThreshold: '5' 
6

      offsetResetPolicy: latest 
7

      allowIdleConsumers: true 
8

      scaleToZeroOnInvalidOffset: false 
9

      excludePersistentLag: false 
10

      version: '1.0.0' 
11

      partitionLimitation: '1,2,10-20,31' 
12

      tls: enable 
13
Copy to Clipboard Toggle word wrap

1
트리거 유형으로 Kafka를 지정합니다.
2
Kafka가 오프셋 지연을 처리하고 있는 Kafka 토픽의 이름을 지정합니다.
3
연결할 Kafka 브로커의 쉼표로 구분된 목록을 지정합니다.
4
토픽에 대한 오프셋을 확인하고 관련 지연을 처리하는 데 사용되는 Kafka 소비자 그룹의 이름을 지정합니다.
5
선택 사항: 크기 조정을 트리거하는 평균 대상 값을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다. 기본값은 5 입니다.
6
선택 사항: 활성화 단계의 목표 값을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다.
7
선택 사항: Kafka 소비자에 대한 Kafka 오프셋 재설정 정책을 지정합니다. 사용 가능한 값은 latestearliest 입니다. 기본값은 최신 입니다.
8
선택 사항: Kafka 복제본 수가 토픽의 파티션 수를 초과할 수 있는지 여부를 지정합니다.
  • true 인 경우 Kafka 복제본 수가 토픽의 파티션 수를 초과할 수 있습니다. 이를 통해 유휴 Kafka 소비자가 허용됩니다.
  • false 인 경우 Kafka 복제본 수는 토픽의 파티션 수를 초과할 수 없습니다. 이는 기본값입니다.
9
Kafka 파티션에 유효한 오프셋이 없는 경우 트리거가 어떻게 동작하는지 지정합니다.
  • true인 경우 소비자는 해당 파티션에 대해 0으로 조정됩니다.
  • false 인 경우 스케일러는 해당 파티션에 대해 단일 소비자를 유지합니다. 이는 기본값입니다.
10
선택 사항: 트리거가 현재 오프셋이 이전 폴링 주기의 현재 오프셋과 동일한 파티션에 대한 파티션 지연을 포함할지 또는 제외할지 여부를 지정합니다.
  • true인 경우, 스케일러는 이러한 파티션에서 파티션 지연을 제외합니다.
  • false인 경우 트리거에는 모든 파티션의 모든 소비자 지연이 포함됩니다. 이는 기본값입니다.
11
선택 사항: Kafka 브로커의 버전을 지정합니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다. 기본값은 1.0.0 입니다.
12
선택 사항: 확장 범위를 지정할 파티션 ID의 쉼표로 구분된 목록을 지정합니다. 이 옵션을 설정하면 지연 시간을 계산할 때 나열된 ID만 고려됩니다. 따옴표로 묶인 문자열 값으로 지정해야 합니다. 기본적으로 모든 파티션을 고려합니다.
13
선택 사항: Kafka에 TSL 클라이언트 인증을 사용할지 여부를 지정합니다. 기본값은 비활성화 입니다. TLS 구성에 대한 자세한 내용은 "사용자 정의 메트릭 자동 확장기 트리거 인증 이해"를 참조하세요.

3.4.5. Cron 트리거 이해하기

시간 범위에 따라 포드의 크기를 조정할 수 있습니다.

시간 범위가 시작되면 사용자 정의 메트릭 자동 확장기는 구성된 최소 포드 수에서 지정된 원하는 포드 수까지 개체와 연관된 포드를 확장합니다. 시간 범위가 끝나면 포드의 크기가 구성된 최소값으로 줄어듭니다. 기간은 cron 형식 으로 구성해야 합니다.

다음 예제에서는 이 확장된 객체와 연관된 포드를 인도 표준시 기준 오전 6시부터 오후 6시 30분까지 0 에서 100 까지 확장합니다.

Cron 트리거를 사용한 확장된 객체의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: my-deployment
  minReplicaCount: 0 
1

  maxReplicaCount: 100 
2

  cooldownPeriod: 300
  triggers:
  - type: cron 
3

    metadata:
      timezone: Asia/Kolkata 
4

      start: "0 6 * * *" 
5

      end: "30 18 * * *" 
6

      desiredReplicas: "100" 
7
Copy to Clipboard Toggle word wrap

1
시간 프레임이 끝날 때 축소할 최소 포드 수를 지정합니다.
2
확장 시 최대 복제본 수를 지정합니다. 이 값은 desiredReplicas 와 동일해야 합니다. 기본값은 100입니다.
3
Cron 트리거를 지정합니다.
4
시간대에 대한 시간대를 지정합니다. 이 값은 IANA 표준 시간대 데이터베이스 에서 가져와야 합니다.
5
시간 프레임의 시작을 지정합니다.
6
기간의 끝을 지정합니다.
7
시간 프레임의 시작과 끝 사이에 확장할 포드 수를 지정합니다. 이 값은 maxReplicaCount 와 같아야 합니다.
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat