Kubernetes 서비스 등록 구성

Kubernetes 서비스 등록 구성

Kubernetes Service Registration은 Vault 파드를 현재 상태 태그로 표시해 selector와 함께 사용할 수 있게 합니다. 서비스 등록은 Vault가 고가용성(High Availability) 모드로 실행 중일 때만 사용할 수 있습니다.

출처: 문서

본문

  • HashiCorp 지원 – Kubernetes Service Registration은 HashiCorp가 공식 지원합니다.

구성

service_registration "kubernetes" {
  namespace      = "my-namespace"
  pod_name       = "my-pod-name"
}

또는 namespace와 pod 이름은 다음 환경 변수로 설정할 수 있습니다:

  • VAULT_K8S_NAMESPACE
  • VAULT_K8S_POD_NAME

이를 통해 Downward API를 사용해 이러한 파라미터를 설정할 수 있습니다.

환경 변수만 사용한다면 Kubernetes를 사용하고 있다는 서비스 등록 스탠자가 의도를 나타내기 위해 여전히 존재해야 합니다:

service_registration "kubernetes" {}

서비스 등록이 성공하려면 Vault가 Kubernetes의 파드에 라벨을 적용할 수 있어야 합니다. Vault 파드와 연결된 서비스 계정이 자신의 파드 사양을 갱신할 수 있게 하려면 다음 RBAC 규칙이 필요합니다:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: mynamespace
  name: vault-service-account
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "update", "patch"]

예시

올바르게 구성되면 서비스 등록을 활성화하면 Kubernetes 파드가 다음 라벨과 함께 시작됩니다:

apiVersion: v1
kind: Pod
metadata:
  name: vault
  labels:
    vault-active: "false"
    vault-initialized: "true"
    vault-perf-standby: "false"
    vault-sealed: "false"
    vault-version: 2.0.4

종료 후 Vault 파드는 다음 라벨을 가집니다:

apiVersion: v1
kind: Pod
metadata:
  name: vault
  labels:
    vault-active: "false"
    vault-initialized: "false"
    vault-perf-standby: "false"
    vault-sealed: "true"
    vault-version: 2.0.4

라벨 정의

  • vault-active (string: "true"/"false") – Vault active는 Vault의 active 상태가 변경될 때마다 동적으로 갱신됩니다. True는 이 Vault 파드가 현재 리더임을, False는 현재 standby임을 나타냅니다.

  • vault-initialized (string: "true"/"false") – Vault initialized는 Vault의 초기화 상태가 변경될 때마다 동적으로 갱신됩니다. True는 Vault가 현재 초기화되었음을, False는 현재 초기화되지 않았음을 나타냅니다.

  • vault-perf-standby (string: "true"/"false") – Vault performance standby는 Vault의 leader/standby 상태가 변경될 때마다 동적으로 갱신됩니다. 이 필드는 파드가 performance standby 클러스터의 멤버인 경우에만 유용하며, 해당되지 않을 때는 단순히 "false"로 설정됩니다. True는 이 Vault 파드가 현재 performance standby임을, False는 현재 performance leader임을 나타냅니다.

  • vault-sealed (string: "true"/"false") – Vault sealed는 Vault의 sealed/unsealed 상태가 변경될 때마다 동적으로 갱신됩니다. True는 Vault가 현재 봉인되었음을, False는 현재 봉인 해제되었음을 나타냅니다.

  • vault-version (string: "2.0.4") – Vault version은 파드의 수명 주기 동안 변경되지 않는 문자열입니다.

Vault의 서비스 검색 라벨 사용

예시 서비스

파드에 라벨이 적용되면 selector를 사용해 특정 Vault HA 역할을 가진 파드를 필터링하는 서비스를 만들어 Vault 파드의 하위 집합과 직접 통신할 수 있게 됩니다. 아래의 vault-active: "true" 줄을 주목하세요.

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/instance: vault
    app.kubernetes.io/name: vault
    helm.sh/chart: vault-0.34.1
  name: vault-active-us-east
  namespace: default
spec:
  clusterIP: 10.7.254.51
  ports:
  - name: http
    port: 8200
    protocol: TCP
    targetPort: 8200
  - name: internal
    port: 8201
    protocol: TCP
    targetPort: 8201
  publishNotReadyAddresses: false
  selector:
    app.kubernetes.io/instance: vault
    app.kubernetes.io/name: vault
    component: server
    vault-active: "true"
  type: ClusterIP

또한 위에서 publishNotReadyAddresses: false를 설정하면 실패한 파드가 서비스 풀에서 제거됩니다.

이 active 서비스를 배치하면 항상 active 노드에 도달하는 전용 엔드포인트가 생깁니다. Vault 복제를 설정할 때 이를 기본 주소로 사용할 수 있습니다:

$ vault write -f sys/replication/performance/primary/enable \
    primary_cluster_addr='https://vault-active-us-east:8201'

예시 업그레이드

파드 라벨과 OnDelete 업그레이드 전략을 함께 사용하면 업그레이드를 훨씬 더 쉽게 오케스트레이션할 수 있습니다:

$ helm upgrade vault --set='server.image.tag=2.0.4'

$ kubectl delete pod --selector=vault-active=false \
    --selector=vault-version=1.2.3

$ kubectl delete pod --selector=vault-active=true \
    --selector=vault-version=1.2.3

파드 인스턴스를 삭제하면 클러스터의 원하는 상태를 정의하는 StatefulSet이 삭제된 파드를 최신 이미지로 재스케줄링합니다.

더 알아보기