O dispositivo de appliance isolado do Google Distributed Cloud (GDC) transfere dados arbitrários de e para um ambiente isolado do Google Distributed Cloud. As transferências podem ser iniciadas manualmente ou definidas para ocorrerem automaticamente num intervalo definido.
Exemplos de transferências:
- Transferir atualizações de software ou cargas de trabalho de clientes atualizadas
- Carregue dados de clientes, métricas de dispositivos ou registos de segurança, auditoria e operações de dispositivos
- Instantâneos de dados de cópia de segurança
A ferramenta de transferência de armazenamento transfere dados e é distribuída numa imagem para utilização em contentores em execução no cluster.
Origens de dados
A ferramenta de transferência de armazenamento permite flexibilidade com as condições de funcionamento do dispositivo isolado do GDC. As APIs compatíveis com S3 podem aceder a destinos de armazenamento expostos externamente e internos. A ferramenta também suporta o sistema de ficheiros local e origens do Cloud Storage.
O operador é responsável por manter o controlo das chaves de acesso e de quaisquer outras credenciais, segredos ou dados confidenciais necessários para a autenticação de forma a ligar o dispositivo isolado do GDC a redes externas. O operador também é responsável pela configuração da rede externa.
Consulte o artigo Crie contentores de armazenamento para criar e aceder ao armazenamento externo.
Armazenamento local
O armazenamento local está contido no ambiente do contentor do pod e inclui o sistema de ficheiros temporário ou os volumes montados. A ServiceAccount associada ao pod tem de ter acesso a todos os destinos de montagem ao montar volumes.
Armazenamento S3
O armazenamento disponível na rede é acessível através da API compatível com S3. O serviço pode ser externo ou apenas exposto na rede do cluster. Tem de fornecer um URL acessível e credenciais padronizadas montadas através de um segredo do Kubernetes.
Os dados definidos de armazenamento de objetos e de vários nós são acedidos através da API S3. Consulte as secções relevantes para configurar o armazenamento de vários nós e o armazenamento de objetos no dispositivo isolado do GDC.
Armazenamento na nuvem
Tem de fornecer um URL acessível e credenciais padronizadas montadas através de um segredo.
Se aceder a um contentor do Cloud Storage com controlos de acesso uniformes, tem de definir a flag --bucket-policy-only
como true
.
Credenciais
É necessário um segredo do Kubernetes para usar o serviço de transferência de armazenamento para definições de origem ou destino do S3 ou do GCS. Estas podem ser fornecidas com uma conta de serviço remota ou uma conta de utilizador.
Quando usar segredos numa definição de trabalho ou CronJob, o JobSpec tem de ser anexado a uma ServiceAccount do Kubernetes que tenha acesso aos segredos.
Crie uma ServiceAccount que seja usada pela transferência e, em seguida, adicione autorizações à ServiceAccount para ler e escrever segredos através de funções e associações de funções. Pode optar por não criar uma ServiceAccount se a ServiceAccount do espaço de nomes predefinido ou a ServiceAccount personalizada já tiver autorizações.
apiVersion: v1
kind: ServiceAccount
metadata:
name: transfer-service-account
namespace: NAMESPACE
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: read-secrets-role
namespace: NAMESPACE
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-secrets-rolebinding
namespace: NAMESPACE
subjects:
- kind: ServiceAccount
name: transfer-service-account
namespace: NAMESPACE
roleRef:
kind: Role
name: read-secrets-role
apiGroup: rbac.authorization.k8s.io
Contas de serviço remotas
Para obter credenciais da conta de serviço do Cloud Storage para fazer uma transferência, consulte o artigo
https://developers.google.com/workspace/guides/create-credentials#create_credentials_for_a_service_account.
Estas credenciais têm de ser armazenadas num segredo no campo service-account-key
.
Vejamos um exemplo:
apiVersion: v1
data:
service-account-key: BASE_64_ENCODED_VERSION_OF_CREDENTIAL_FILE_CONTENTS
kind: Secret
metadata:
name: gcs-secret
namespace: NAMESPACE
type: Opaque
Contas de utilizador
Pode usar uma conta de utilizador para autenticação com contentores compatíveis com S3, não com contentores do Cloud Storage. Tem de especificar o argumento --src_type
ou --dst_type
como s3
.
kubectl create secret -n NAMESPACE generic S3_CREDENTIAL_SECRET_NAME \
--from-literal=access-key-id=ACCESS_KEY_ID
--from-literal=access-key=ACCESS_KEY
Substitua o seguinte:
NAMESPACE
: o nome do espaço de nomes no qual vai criar a definição de tarefa.SECRET_NAME
: o nome do segredo que está a criar.ACCESS_KEY_ID
: o valor encontrado no campo Chave de acesso na consola Google Cloud . Quando configurar o armazenamento de objetos, isto é denominado access-key-id.ACCESS_KEY
: o valor encontrado no campo Secret na consola Google Cloud . Quando configurar o armazenamento de objetos, esta é a chave secreta ou o segredo.
Certificados
Forneça certificados para validação no trabalho com um segredo do Kubernetes
que contenha uma chave de dados ca.crt
.
apiVersion: v1
kind: Secret
metadata:
name: SRC_CERTIFICATE_SECRET_NAME
namespace: NAMESPACE
data:
ca.crt : BASE_64_ENCODED_SOURCE_CERTIFICATE
---
apiVersion: v1
kind: Secret
metadata:
name: DST_CERTIFICATE_SECRET_NAME
namespace: NAMESPACE
data:
ca.crt : BASE_64_ENCODED_DESTINATION_CERTIFICATE # Can be same OR different than source certificate.
Os certificados podem ser fornecidos por referência à ferramenta através dos argumentos src_ca_certificate_reference
e dst_ca_certificate_reference
no formato NAMESPACE/SECRET_NAME
. Por exemplo:
...
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
...
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
Para o armazenamento S3 no dispositivo, pode usar diretamente o segredo trust-store-root-ext
como o certificado de AC. Por exemplo:
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_type=s3
- --src_ca_certificate_reference=NAMESPACE/trust-store-root-ext
Opcional: defina um LoggingTarget para ver os registos no Loki
Por predefinição, os registos de trabalhos só são visíveis nos recursos do Kubernetes e não estão disponíveis na pilha de observabilidade. Têm de ser configurados com um LoggingTarget para serem visíveis.
apiVersion: logging.gdc.goog/v1alpha1
kind: LoggingTarget
metadata:
namespace: NAMESPACE # Same namespace as your transfer job
name: logtarg1
spec:
# Choose matching pattern that identifies pods for this job
# Optional
# Relationship between different selectors: AND
selector:
# Choose pod name prefix(es) to consider for this job
# Observability platform will scrape all pods
# where names start with specified prefix(es)
# Should contain [a-z0-9-] characters only
# Relationship between different list elements: OR
matchPodNames:
- data-transfer-job # Choose the prefix here that matches your transfer job name
serviceName: transfer-service
Defina uma profissão incorporada
Os utilizadores gerem os seus próprios recursos de emprego. Para transferências de dados de utilização única, defina um Job. A tarefa cria um pod para executar o contentor storage-transfer.
Um exemplo de tarefa:
apiVersion: batch/v1
kind: Job
metadata:
name: data-transfer-job
namespace: NAMESPACE
spec:
template:
spec:
restartPolicy: Never
serviceAccountName: transfer-service-account,
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_path=/src
- --src_type=local
- --dst_endpoint=https://your-dst-endpoint.com
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
- --dst_type=gcs
- --bucket_policy_only=true
- --bandwidth_limit=10M #Optional of the form '10K', '100M', '1G' bytes per second
volumeMounts:
- mountPath: /src
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-transfer-source
Defina um CronJob incorporado
Os utilizadores gerem os seus próprios recursos CronJob definidos. A utilização de um CronJob integrado permite transferências de dados agendadas regularmente.
Um exemplo de CronJob que alcança uma transferência de dados automatizada:
apiVersion: batch/v1
kind: CronJob
metadata:
name: data-transfer-cronjob
namespace: NAMESPACE
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
serviceAccountName: transfer-service-account
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_path=LOCAL_PATH
- --src_type=local
- --dst_endpoint=https://your-dst-endpoint.com
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
- --dst_type=gcs
- --bucket_policy_only=true
volumeMounts:
- mountPath: LOCAL_PATH
name: source
restartPolicy: Never
volumes:
- name: source
persistentVolumeClaim:
claimName: data-transfer-source
A Google recomenda definir concurrencyPolicy
como Forbid
para evitar a contenção de dados.
O CronJob, o segredo e o PersistentVolumeClaim têm de estar no mesmo espaço de nomes.
Priorize tarefas de dados
A definição da prioridade nas tarefas de dados pode ser alcançada de várias formas que não são mutuamente exclusivas. Pode definir programações de tarefas menos frequentes na definição de CronJob.
Também pode ordenar as tarefas através de InitContainers (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) que são sempre executados por ordem de definição. No entanto, todos os contentores têm de ser executados com êxito. Use InitContainers para dar maior prioridade a uma tarefa ou gerir a contenção de dados definindo dois ou mais InitContainers com definições de origem e destino espelhadas.
Um exemplo de jobTemplate
que alcança a transferência de dados ordenada:
apiVersion: batch/v1
kind: CronJob
metadata:
name: ordered-data-transfer-cronjob
namespace: NAMESPACE
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: job-complete
image: whalesay
command: ["sh", "-c", "echo Job Completed."]
initContainers:
- name: A-to-B
image: gcr.io/private-cloud-staging/storage-transfer:latest
command: [/storage-transfer]
args:
- --src_type=s3
- --src_endpoint=ENDPOINT_A
- --src_path=/example-bucket
- --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --dst_type=s3
- --dst_endpoint=ENDPOINT_B
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
- --dst_path=/example-bucket
- name: B-to-A
image: gcr.io/private-cloud-staging/storage-transfer:latest
command: [/storage-transfer]
args:
- --src_type=s3
- --src_endpoint=ENDPOINT_B
- --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --src_path=/example-bucket
- --dst_type=s3
- --dst_endpoint=ENDPOINT_A
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
- --dst_path=/example-bucket
O contentor A-to-B
é executado antes de B-to-A
. Este exemplo alcança uma sincronização bidirecional e uma ordenação de tarefas.