Nesta página, descrevemos como configurar um servidor de registros central para dispositivos de appliance isolados do Google Distributed Cloud (GDC) pela organização de data center isolado do Google Distributed Cloud.
Para criar um local de geração de registros central, o dispositivo do GDC precisa ter os seguintes componentes na organização do data center do GDC:
- projeto único
- bucket para os registros de auditoria
- bucket para registros operacionais
Criar um projeto
As etapas a seguir precisam ser realizadas na organização do data center do GDC para onde os registros serão exportados.
Defina
KUBECONFIG
como a API Organization Management:export KUBECONFIG=ORG_MANAGEMENT_API_KUBECONFIG_PATH
Para receber as permissões necessárias para exportar registros, peça ao administrador do IAM da organização para conceder a você a função "Criador de projetos" (
ClusterRole project-creator
) do ClusterRole. Para mais informações sobre esses papéis, consulte Preparar permissões do IAM.Aplique o recurso personalizado do projeto para criar um projeto exclusivo para o appliance do GDC de onde os registros serão exportados:
kubectl apply -f - <<EOF apiVersion: resourcemanager.gdc.goog/v1 kind: Project metadata: namespace: platform name: APPLIANCE_PROJECT_NAME labels: object.gdc.goog/tenant-category: user EOF
Verifique se o novo projeto está disponível no dispositivo GDC:
kubectl get namespace APPLIANCE_PROJECT_NAME
Vincule o novo projeto a uma conta de faturamento. Para acompanhar os custos de recursos do projeto, você precisa ter uma conta de faturamento associada vinculada a ele.
Para receber as permissões necessárias para exportar registros, peça ao administrador do IAM da organização para conceder a você o papel de administrador do IAM do projeto (
project-iam-admin
) no namespaceAPPLIANCE_PROJECT_NAME
.
Criar um bucket
As etapas a seguir precisam ser realizadas pelo administrador da plataforma (PA) na organização do data center do GDC para onde os registros serão exportados.
Defina
KUBECONFIG
como a API Organization Management:export KUBECONFIG=ORG_MANAGEMENT_API_KUBECONFIG_PATH
Para receber as permissões necessárias para exportar registros, peça ao administrador do IAM da organização para conceder a você o papel de administrador do bucket do projeto (
project-bucket-admin
) no namespaceAPPLIANCE_PROJECT_NAME
.Aplique o recurso personalizado de bucket para criar um bucket:
apiVersion: object.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: APPLIANCE_PROJECT_NAME labels: object.gdc.goog/bucket-type: normal object.gdc.goog/encryption-version: v2 object.gdc.goog/tenant-category: user spec: description: Bucket for storing appliance xyz audit logs location: zone1 storageClass: Standard
Depois que o bucket for criado, execute o seguinte para confirmar e verificar os detalhes dele:
kubectl describe buckets BUCKET_NAME -n APPLIANCE_PROJECT_NAME
Crie um
ProjectServiceAccount
para acessar objetos no bucket.kubectl apply -f - <<EOF --- apiVersion: resourcemanager.gdc.goog/v1 kind: ProjectServiceAccount metadata: name: BUCKET_NAME-read-write-sa namespace: APPLIANCE_PROJECT_NAME spec: {} EOF
Verifique se o
ProjectServiceAccount
foi propagado:kubectl get projectserviceaccount BUCKET_NAME-read-write-sa -n APPLIANCE_PROJECT_NAME -o json | jq '.status'
Verifique se o
ServiceAccount
tem as permissõesread
ewrite
adicionadas a ele para o bucket.kubectl apply -f - <<EOF --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: BUCKET_NAME-read-write-role namespace: APPLIANCE_PROJECT_NAME rules: - apiGroups: - object.gdc.goog resourceNames: - BUCKET_NAME resources: - buckets verbs: - read-object - write-object --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: BUCKET_NAME-read-write-rolebinding namespace: APPLIANCE_PROJECT_NAME roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: BUCKET_NAME-read-write-role subjects: - kind: ServiceAccount name: BUCKET_NAME-read-write-sa namespace: APPLIANCE_PROJECT_NAME EOF
Extraia o secret que contém as credenciais de acesso ao bucket:
kubectl get secret -n APPLIANCE_PROJECT_NAME -o json| jq --arg jq_src BUCKET_NAME-read-write-sa '.items[].metadata|select(.annotations."object.gdc.goog/subject"==$jq_src)|.name'
A saída precisa ser semelhante ao exemplo a seguir, em que o nome do secret do bucket é exibido:
"object-storage-key-sysstd-sa-olxv4dnwrwul4bshu37ikebgovrnvl773owaw3arx225rfi56swa"
Exporte o valor para uma variável:
export BUCKET_RW_SECRET_NAME=BUCKET_RW_SECRET_NAME
Consiga o ID da chave para acesso ao bucket:
kubectl get secret $BUCKET_RW_SECRET_NAME -n appliance-xyz -o json | jq -r '.data."access-key-id"' | base64 -di
A saída será semelhante ao exemplo a seguir:
PCEW2HU47Y8ACUWQO4SK
Extraia a chave de acesso secreta do bucket:
kubectl get secret $BUCKET_RW_SECRET_NAME -n appliance-xyz -o json | jq -r '.data."secret-access-key"' | base64 -di
A saída será semelhante ao exemplo a seguir:
TzGdAbgp4h2i5UeiYa9k09rNPFQ2tkYADs67+65E
Consiga o endpoint do bucket:
kubectl get bucket BUCKET_NAME -n APPLIANCE_PROJECT_NAME -o json | jq '.status.endpoint'
A saída será semelhante ao exemplo a seguir:
https://objectstorage.org-1.zone1.google.gdch.test
Consiga o nome totalmente qualificado do bucket:
kubectl get bucket BUCKET_NAME -n APPLIANCE_PROJECT_NAME -o json | jq '.status.fullyQualifiedName'
A saída será semelhante ao exemplo a seguir:
aaaoa9a-logs-bucket
Transferir dados do GDC
Siga Exportar registros para um bucket remoto para transferir registros do appliance do GDC para o bucket criado anteriormente no data center isolado do GDC usando o endpoint do bucket, o nome totalmente qualificado, o ID da chave de acesso e a chave de acesso secreta.
Configurar o Loki e o Grafana no data center com isolamento físico do Google Distributed Cloud
As etapas a seguir precisam ser realizadas pelo operador de infraestrutura (IO) na organização do data center isolado do GDC para onde os registros foram exportados.
Receber papéis do IAM
Para receber as permissões necessárias para exportar registros, peça ao administrador do IAM da organização para conceder a você o papel de administrador da restauração de registros (logs-restore-admin
) no namespace obs-system
no cluster de infraestrutura e os papéis de leitor de fonte de dados (datasource-viewer
) e editor de fonte de dados (datasource-editor
) no namespace obs-system
no plano de gerenciamento.
Configurar o Loki
Defina
KUBECONFIG
como o cluster da infraestrutura da organização:export KUBECONFIG=ORG_INFRA_CLUSTER_KUBECONFIG_PATH
Obtenha o ID da chave de acesso e a chave de acesso secreta para o bucket de registros do appliance do PA e crie um secret que contenha as credenciais no namespace
obs-system
:kubectl create secret generic -n obs-system APPLIANCE_LOGS_BUCKET_SECRET_NAME --from-literal=access-key-id=APPLIANCE_LOGS_BUCKET_ACCESS_KEY_ID --from-literal=secret-access-key=APPLIANCE_LOGS_BUCKET_SECRET_ACCESS_KEY
Extraia o endpoint e o nome totalmente qualificado do bucket de registros do appliance do PA e crie um
configmap
do Loki:kubectl apply -f - <<EOF --- apiVersion: v1 kind: ConfigMap metadata: name: CONFIGMAP_NAME namespace: obs-system data: loki.yaml: |- auth_enabled: true common: ring: kvstore: store: inmemory compactor: working_directory: /data/loki/compactor compaction_interval: 10m retention_enabled: true retention_delete_delay: 2h retention_delete_worker_count: 150 delete_request_store: s3 ingester: chunk_target_size: 1572864 chunk_encoding: snappy max_chunk_age: 2h chunk_idle_period: 90m chunk_retain_period: 30s autoforget_unhealthy: true lifecycler: ring: kvstore: store: inmemory replication_factor: 1 heartbeat_timeout: 10m wal: enabled: false limits_config: discover_service_name: [] retention_period: 48h reject_old_samples: false ingestion_rate_mb: 256 ingestion_burst_size_mb: 256 max_streams_per_user: 20000 max_global_streams_per_user: 20000 max_line_size: 0 per_stream_rate_limit: 256MB per_stream_rate_limit_burst: 256MB shard_streams: enabled: false desired_rate: 3MB schema_config: configs: - from: "2020-10-24" index: period: 24h prefix: index_ object_store: s3 schema: v13 store: tsdb server: http_listen_port: 3100 grpc_server_max_recv_msg_size: 104857600 grpc_server_max_send_msg_size: 104857600 graceful_shutdown_timeout: 60s analytics: reporting_enabled: false storage_config: tsdb_shipper: active_index_directory: /tsdb/index cache_location: /tsdb/index-cache cache_ttl: 24h aws: endpoint: APPLIANCE_LOGS_BUCKET_ENDPOINT bucketnames: APPLIANCE_LOGS_BUCKET_FULLY_QUALIFIED_NAME access_key_id: ${S3_ACCESS_KEY_ID} secret_access_key: ${S3_SECRET_ACCESS_KEY} s3forcepathstyle: true --- EOF
Crie um
statefulset
e um serviço do Loki:kubectl apply -f - <<EOF --- apiVersion: apps/v1 kind: StatefulSet metadata: labels: app: STATEFULSET_NAME name: STATEFULSET_NAME namespace: obs-system spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Retain whenScaled: Retain podManagementPolicy: OrderedReady replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: STATEFULSET_NAME serviceName: STATEFULSET_NAME template: metadata: labels: app: STATEFULSET_NAME istio.io/rev: default spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: node-role.kubernetes.io/control-plane operator: DoesNotExist - key: node-role.kubernetes.io/master operator: DoesNotExist weight: 1 podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - STATEFULSET_NAME topologyKey: kubernetes.io/hostname weight: 100 containers: - args: - -config.file=/etc/loki/loki.yaml - -config.expand-env=true - -target=all env: - name: S3_ACCESS_KEY_ID valueFrom: secretKeyRef: key: access-key-ID name: APPLIANCE_LOGS_BUCKET_SECRET_NAME optional: false - name: S3_SECRET_ACCESS_KEY valueFrom: secretKeyRef: key: secret-access-key name: APPLIANCE_LOGS_BUCKET_SECRET_NAME optional: false image: gcr.io/private-cloud-staging/loki:v3.0.1-gke.1 imagePullPolicy: Always livenessProbe: failureThreshold: 3 httpGet: path: /ready port: loki-server scheme: HTTP initialDelaySeconds: 330 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 name: STATEFULSET_NAME ports: - containerPort: 3100 name: loki-server protocol: TCP - containerPort: 7946 name: gossip-ring protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /ready port: loki-server scheme: HTTP initialDelaySeconds: 45 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 resources: limits: ephemeral-storage: 2000Mi memory: 8000Mi requests: cpu: 300m ephemeral-storage: 2000Mi memory: 1000Mi securityContext: readOnlyRootFilesystem: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /etc/loki name: config - mountPath: /data name: loki-storage - mountPath: /tsdb name: loki-tsdb-storage - mountPath: /tmp name: temp - mountPath: /tmp/loki/rules-temp name: tmprulepath - mountPath: /etc/ssl/certs name: trust-bundle readOnly: true dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: fsGroup: 10001 runAsGroup: 10001 runAsUser: 10001 terminationGracePeriodSeconds: 4800 volumes: - emptyDir: {} name: temp - emptyDir: {} name: tmprulepath - configMap: defaultMode: 420 name: trust-store-root-ext optional: true name: trust-bundle - configMap: defaultMode: 420 name: CONFIGMAP_NAME name: config updateStrategy: type: RollingUpdate volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: loki-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo volumeMode: Filesystem - apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: loki-tsdb-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo volumeMode: Filesystem --- apiVersion: v1 kind: Service metadata: name: STATEFULSET_NAME namespace: obs-system spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: loki-server port: 3100 protocol: TCP targetPort: loki-server selector: app: STATEFULSET_NAME sessionAffinity: None type: ClusterIP --- EOF
Configurar o Grafana DataSource
Defina
KUBECONFIG
como a API Organization Management:export KUBECONFIG=ORG_MANAGEMENT_API_KUBECONFIG_PATH
Crie
DataSources
para os registros de infraestrutura e plataforma:kubectl apply -f - <<EOF --- apiVersion: monitoring.private.gdc.goog/v1alpha1 kind: Datasource metadata: name: INFRA_DATASOURCE_NAME namespace: APPLIANCE_PROJECT_NAME-obs-system spec: datasource: access: proxy isDefault: false jsonData: httpHeaderName1: X-Scope-OrgID name: UI_FRIENDLY_NAME orgId: 1 readOnly: true secureJsonData: httpHeaderValue1: infra-obs type: loki uid: INFRA_DATASOURCE_NAME url: http://STATEFULSET_NAME.obs-system.svc:3100 version: 1 withCredentials: false --- apiVersion: monitoring.private.gdc.goog/v1alpha1 kind: Datasource metadata: name: PLATFORM_DATASOURCE_NAME namespace: APPLIANCE_PROJECT_NAME-obs-system spec: datasource: access: proxy isDefault: false jsonData: httpHeaderName1: X-Scope-OrgID name: UI_FRIENDLY_NAME orgId: 1 readOnly: true secureJsonData: httpHeaderValue1: platform-obs type: loki uid: PLATFORM_DATASOURCE_NAME url: http://STATEFULSET_NAME.obs-system.svc:3100 version: 1 withCredentials: false --- EOF
Ver registros no Grafana do data center com isolamento físico do Google Distributed Cloud
Os registros exportados para o bucket do data center isolado do Google Distributed Cloud podem ser visualizados na instância do Grafana do projeto do dispositivo GDC.