Implantação de um aplicativo que utiliza o COS
Crie uma solicitação de volume persistente (PVC) para provisionar o IBM Cloud Object Storage para seu cluster.
Dependendo das configurações que você escolher em seu PVC, é possível provisionar o IBM Cloud Object Storage das maneiras a seguir:
- Provisionamento dinâmico: Ao criar o PVC, o volume persistente (PV) correspondente e o bucket na sua instância do serviço “ IBM Cloud Object Storage ” são criados automaticamente.
- Provisionamento estático: você pode referenciar um bucket existente na sua instância do serviço “ IBM Cloud Object Storage ” no seu PVC. Quando você cria o PVC, somente o PV correspondente é criado e vinculado automaticamente ao seu bucket existente no IBM Cloud Object Storage.
Antes de Iniciar:
- Crie e prepare sua IBM Cloud Object Storage instância de serviço .
- Crie um segredo para armazenar suas credenciais de serviço do IBM Cloud Object Storage.
- Decida sobre a configuração para seu IBM Cloud Object Storage .
Para incluir o IBM Cloud Object Storage em seu cluster:
-
Crie um arquivo de configuração para definir a sua solicitação de volume persistente (PVC). Se você adicionar suas credenciais do IBM Cloud Object Storage às classes de armazenamento padrão, não inclua seu segredo no PVC.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: <name> # Enter the name of the PVC. namespace: <namespace> # Enter the namespace where you want to create the PVC. The PVC must be created in the same namespace where you created the Kubernetes secret for your service credentials and where you want to run your pod. annotations: ibm.io/auto-create-bucket: "<true_or_false>" ibm.io/auto-delete-bucket: "<true_or_false>" ibm.io/bucket: "<bucket_name>" ibm.io/object-path: "<bucket_subdirectory>" ibm.io/quota-limit: "true/false" # Disable or enable a quota limit for your PVC. To use this annotation you must specify the -set quotaLimit=true option during installation. ibm.io/endpoint: "https://<s3fs_service_endpoint>" ibm.io/tls-cipher-suite: "default" ibm.io/secret-name: "<secret_name>" # The name of your Kubernetes secret that you created. ibm.io/secret-namespace: "<secret-namespace>" # By default, the COS plug-in searches for your secret in the same namespace where you create the PVC. If you created your secret in a namespace other than the namespace where you want to create your PVC, enter the namespace where you created your secret. ibm.io/add-mount-param: "<option-1>,<option-2>" # s3fs mount options ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX" # A csv of allow listed IPs. ibm.io/bucket-versioning: "false" # Set to true to enable bucket versioning. spec: accessModes: - ReadWriteOnce resources: requests: storage: <size> storageClassName: <storage_class>ibm.io/auto-create-bucket-
- Escolha entre as opções a seguir.
true: Ao criar a PVC, o PV e o depósito na instância de serviço do IBM Cloud Object Storage são criados automaticamente. Escolha essa opção para criar um novo bucket em sua instância de serviço do IBM Cloud Object Storage. Note que as credenciais de serviço devem ter permissões de Gravador para criar o depósito automaticamente.false: Escolha esta opção para acessar dados em um depósito existente. Quando você cria o PVC, o PV é criado e vinculado automaticamente ao bucket especificado emibm.io/bucket.
ibm.io/auto-delete-bucket-
- Escolha entre as opções a seguir.
true: Seus dados, o depósito e o PV são removidos automaticamente quando a PVC é excluída. A instância de serviço do IBM Cloud Object Storage permanece e não é excluída. Se você escolhe configurar essa opção comotrue, deve-se configuraribm.io/auto-create-bucket: trueeibm.io/bucket: ""para que seu bucket seja criado automaticamente com um nome com o formatotmp-s3fs-xxxx.false: Quando a PVC é excluída, o PV é excluído automaticamente, mas seus dados e o depósito na instância de serviço do IBM Cloud Object Storage permanecem. Para acessar seus dados, deve-se criar um novo PVC com o nome de seu bucket existente.
ibm.io/bucket-
- Escolha entre as opções a seguir.
- Se
ibm.io/auto-create-bucketfor configurado comotrue: insira o nome do depósito que você deseja criar em IBM Cloud Object Storage. Se, além disso,ibm.io/auto-delete-bucketestá configurado comotrue, deve-se deixar esse campo em branco para designar automaticamente seu bucket a um nome com o formatotmp-s3fs-xxxx. O nome deve ser exclusivo no IBM Cloud Object Storage. - Se
ibm.io/auto-create-bucketfor configurado comofalse: insira o nome do depósito existente que você deseja acessar no cluster.
ibm.io/object-path- Opcional: insira o nome do subdiretório existente no bucket que você deseja montar. Use essa opção se desejar montar somente um subdiretório e não o bucket inteiro. Para montar um subdiretório, deve-se configurar
ibm.io/auto-create-bucket: "false"e fornecer o nome do bucket emibm.io/bucket. ibm.io/quota-limit-
- Para usar esta anotação, deve-se especificar a opção
--set quotaLimit=truedurante a instalação. Se você quiser usar esta anotação, mas não especificou--set quotaLimit=truedurante a instalação, reinstale o gráfico do leme. - Se a opção
ibm.io/quota-limitestiver definida comotrue``, seu PVC definirá uma quantidade máxima de armazenamento (em bytes) disponível para o bucket com base no tamanhostorage:que você especificar. - Se
ibm.io/quota-limitfor configurado comofalse, a cota não é imposta em seu significado PVC que a quantidade real de armazenamento em bytes pode exceder ostorage: <size>que você especificou dependendo do seu app.
- Para usar esta anotação, deve-se especificar a opção
ibm.io/endpoint- Se você criou a instância de serviço do IBM Cloud Object Storage em um local diferente de seu cluster, insira o terminal em serviço de nuvem privada ou pública da instância de serviço do IBM Cloud Object Storage que deseja usar. Para obter
mais informações e uma visão geral dos terminais em serviço disponíveis, consulte Informações adicionais do terminal. Por padrão, o plug-in do Helm
ibmcrecupera automaticamente o local de seu cluster e cria as classes de armazenamento usando o terminal em serviço de nuvem privada do IBM Cloud Object Storage que corresponde ao local de seu cluster. Se o seu cluster clássico estiver em uma região metropolitana com várias zonas, comodal10, será utilizado o endpoint do serviço de nuvem privada IBM Cloud Object Storage para a região metropolitana com várias zonas, como Dallas. Para verificar se o terminal em serviço nas classes de armazenamento corresponde ao terminal em serviço da instância de serviço, executeoc describe storageclass <storageclassname>. Certifique-se de inserir o terminal em serviço no formatohttps://<s3fs_private_service_endpoint>para terminais em serviço de nuvem privada ouhttp://<s3fs_public_service_endpoint>para terminais em serviço em nuvem pública. Se o terminal em serviço na classe de armazenamento corresponder ao terminal em serviço da instância de serviço do IBM Cloud Object Storage, não inclua a opçãoibm.io/endpointno arquivo PVC YAML. ibm.io/add-mount-param- Insira opções de montagem para os seus volumes s3fs Fuse. Por exemplo,
ibm.io/add-mount-param: "del_cache,retries=6". Para obter uma lista de opções, consulte as páginas do manual do s3fs ibm.io/access-policy-allowed-ips- Insira uma lista de IPs separados por vírgula que podem acessar seus volumes. Por exemplo,
ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX". storage- Na seção “Solicitações de recursos de especificação”, insira o tamanho do seu bucket do IBM Cloud Object Storage em gigabytes. O espaço real usado no IBM Cloud Object Storage pode ser diferente e é faturado com base na tabela de precificação. Se você ativou cotas quando instalou o plug-in, a cota para o seu balde é igual a este tamanho.
storageClassName-
- Escolha entre as opções a seguir.
- Se
ibm.io/auto-create-bucket: "true": insira a classe de armazenamento que deseja usar para o novo depósito. - Se
ibm.io/auto-create-bucket: "false": insira a classe de armazenamento usada para criar o depósito existente. - Se você criou o depósito manualmente na instância de serviço do IBM Cloud Object Storage, ou se não se lembrar da classe de armazenamento que usou, localize a instância de serviço no painel da IBM Cloud e revise a Classe e o Local do depósito existente. Em seguida, use a classe de armazenamento apropriada. O terminal de API do IBM Cloud Object Storage que está configurado em sua classe de armazenamento se baseia na região na qual seu cluster está. Se você quiser acessar um bucket localizado em uma região diferente daquela em que seu cluster está, será necessário criar sua própria classe de armazenamento e usar o endpoint da API apropriado para o seu bucket.
ibm.io/secret-name- Insira o nome do segredo que contém as credenciais do IBM Cloud Object Storage que você criou anteriormente. Se você adicionar o seu IBM Cloud Object Storage credenciais às classes de armazenamento padrão, você não deve listar segredos no PVC. Se você deseja integrar a criptografia Key Protect ao criar novos baldes de PVCs em seu cluster, você deve incluir a chave raiz CRN ao criar seu IBM Cloud Object Storage secreto. Note que você não pode adicionar Key Protect criptografia para baldes existentes.
secret-namespace- Por padrão, o plug-in do COS procura o segredo no mesmo espaço de nomes no qual a PVC é criada. Se você criou o segredo em um espaço de nomes diferente daquele no qual deseja criar a PVC, insira o espaço de nomes no qual o segredo foi criado.
ibm.io/bucket-versioning- O controle de versão do bucket está configurado como “
false” por padrão. Defina comotruepara ativar o controle de versão do bucket. Defina comofalsepara desativar o controle de versão de um bucket em que o controle de versão está ativado. Observe que as credenciais de serviço devem ter permissões de Manager ou Writer para ativar ou desativar o controle de versão do bucket no bucket. Para obter mais informações, acesse Introdução ao controle de versões.
-
Crie o PVC em seu cluster.
oc apply -f filepath/pvc.yaml -
Verifique se o PVC foi criado e ligado ao PV.
oc get pvcSaída de exemplo
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE s3fs-test-pvc Bound pvc-b38b30f9-1234-11e8-ad2b-t910456jbe12 8Gi RWO ibmc-s3fs-standard-cross-region 1h -
Opcional: se você planejar acessar seus dados com um usuário não raiz ou arquivos incluídos em um depósito do IBM Cloud Object Storage existente usando o console ou a API diretamente, certifique-se de que os arquivos tenham a permissão correta designada para que seu app possa ler e atualizar com êxito os arquivos, conforme necessário.
-
Para montar o PV para a implementação, crie um arquivo
.yamlde configuração e especifique a PVC que é ligada ao PV.apiVersion: apps/v1 kind: Deployment metadata: name: <deployment_name> labels: app: <deployment_label> spec: selector: matchLabels: app: <app_name> template: metadata: labels: app: <app_name> spec: containers: - image: <image_name> name: <container_name> securityContext: runAsUser: <non_root_user> volumeMounts: - name: <volume_name> mountPath: /<file_path> volumes: - name: <volume_name> persistentVolumeClaim: claimName: <pvc_name>app- Na seção de metadados, digite o rótulo para a implementação.
matchLabels.appelabels.app- No seletor de especificação e nas seções de metadados do modelo de especificação, digite um rótulo para o seu app.
image- O nome da imagem de contêiner que você deseja usar. Para listar as imagens disponíveis em sua conta do IBM Cloud Container Registry, execute
ibmcloud cr image-list. name- O nome do contêiner que você deseja implementar em seu cluster.
runAsUser- Na seção de contexto de segurança de contêineres de especificação, é possível configurar opcionalmente a execução como valor de usuário.
mountPath- Na seção de montagens de volume de contêineres de especificação, digite o caminho absoluto do diretório para o qual o volume é montado dentro do contêiner. Para compartilhar um volume entre diferentes apps, é possível especificar subcaminhos de volume para cada um dos apps.
volumeMounts.name- Na seção de montagens de volume de contêineres de especificação, digite o nome do volume para montar em seu pod.
volumes.name- Na seção volumes, insira o nome do volume para montar em seu pod. Geralmente, esse nome é o mesmo que
volumeMounts/name. claimName- Na seção de solicitação de volume persistente de volumes, insira o nome da PVC que liga o PV que você deseja usar.
Como criar uma implementação
Após criar o PVC e os arquivos de configuração de implementação, crie a implementação em seu cluster.
-
Crie a implementação.
oc apply -f <local_yaml_path> -
Verifique se o PV foi montado com êxito.
oc describe deployment <deployment_name>O ponto de montagem está no campo Montagens de volume e o volume está no campo Volumes.
Volume Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-tqp61 (ro) /volumemount from myvol (rw) ... Volumes: myvol: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: mypvc ReadOnly: false -
Verifique se é possível gravar dados em sua instância de serviço do IBM Cloud Object Storage, efetuando login no pod do app e gravando dados. Efetue login no pod que monta seu PV.
oc exec <pod_name> -it bash -
Navegue para o caminho de montagem do volume que você definiu em sua implementação de app.
-
Crie um arquivo de texto.
echo "This is a test" > test.txt -
No console do IBM Cloud, acesse sua instância do serviço IBM Cloud Object Storage.
-
No menu, selecione ** Buckets **.
-
Abra seu bucket e verifique se é possível ver o
test.txtque você criou.
Usando o armazenamento de objetos em um conjunto stateful
Se você tiver um app stateful, como um banco de dados, será possível criar conjuntos stateful que usam o IBM Cloud Object Storage para armazenar os dados de seu app. Como alternativa, é possível usar um banco de dados como um serviço do IBM Cloud (tal como o IBM Cloudant) e armazenar seus dados na nuvem.
Antes de começar, execute as etapas pré-requisitos descritas no início deste tópico.
Para implementar um conjunto stateful que usa armazenamento de objetos:
-
Crie um arquivo de configuração para seu conjunto stateful e o serviço usado para expor o conjunto stateful. Os exemplos a seguir mostram como implementar o NGINX como um conjunto stateful com três réplicas. Cada réplica com um depósito separado ou compartilhando o mesmo depósito.
Exemplo para criar um conjunto stateful com três réplicas, com cada réplica usando um depósito separado.
apiVersion: v1 kind: Service metadata: name: nginx-v01 namespace: default labels: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-v01 namespace: default spec: selector: matchLabels: app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML serviceName: "nginx-v01" replicas: 3 template: metadata: labels: app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: mypvc mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: mypvc annotations: ibm.io/auto-create-bucket: "true" ibm.io/auto-delete-bucket: "true" ibm.io/bucket: "" ibm.io/secret-name: mysecret volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "ibmc-s3fs-standard-perf-cross-region" resources: requests: storage: 1GiExemplo para criar um conjunto stateful com três réplicas que compartilham o mesmo depósito
mybucket.apiVersion: v1 kind: Service metadata: name: nginx-v01 namespace: default labels: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-v01 namespace: default spec: selector: matchLabels: app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML serviceName: "nginx-v01" replicas: 3 template: metadata: labels: app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: mypvc mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: mypvc annotations: ibm.io/auto-create-bucket: "false" ibm.io/auto-delete-bucket: "false" ibm.io/bucket: mybucket ibm.io/secret-name: mysecret volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs spec: accessModes: [ "ReadOnlyMany" ] storageClassName: "ibmc-s3fs-standard-perf-cross-region" resources: requests: storage: 1Gi
name-
Insira um nome para seu conjunto stateful. O nome inserido é usado para criar o nome da PVC no formato:
<volume_name>-< statefulset_name>-<replica_number>. serviceName-
Insira o nome do serviço que deseja usar para expor o conjunto stateful.
replicas-
Insira o número de réplicas para seu conjunto stateful.
matchLabels-
Na seção de rótulos de correspondência do seletor de especificação, digite todos os rótulos que você deseja incluir no seu conjunto stateful e no seu PVC. Os rótulos incluídos no
volumeClaimTemplatesde seu conjunto stateful não são reconhecidos pelo Kubernetes. Em vez disso, deve-se definir esses rótulos na seçãospec.selector.matchLabelsespec.template.metadata.labelsde seu YAML do conjunto stateful. Para se certificar de que todas as réplicas de conjunto stateful estejam no balanceamento de carga do serviço, inclua o mesmo rótulo que o usado na seçãospec.selectordo serviço YAML. labels-
Na seção de rótulos de metadados da especificação, insira os mesmos rótulos que você incluiu na seção
spec.selector.matchLabelsdo seu conjunto stateful do YAML. terminationGracePeriodSeconds-
Insira o número de segundos para que o
kubeletencerre com segurança o pod que executa a réplica do seustateful set. Para obter mais informações, consulte Excluir pods. VolumeClaimTemplates.name-
Na seção de metadados de modelos de solicitação de volume de especificação, insira um nome para o seu volume. Use o mesmo nome definido na seção
spec.containers.volumeMount.name. O nome inserido aqui é usado para criar o nome para a PVC no formato:<volume_name>-<statefulset_name>-<replica_number>. ibm.io/auto-create-bucket-
Na seção de metadados de modelos de solicitação de volume de especificação, configure uma anotação para configurar como os depósitos são criados. Escolha entre as opções a seguir:
- **true: **escolha essa opção para criar automaticamente um bucket para cada réplica do conjunto stateful. Note que as credenciais de serviço devem ter permissões de Gravador para criar o depósito automaticamente.
- **false: **escolha essa opção se você desejar compartilhar um bucket existente em suas réplicas do conjunto stateful. Certifique-se de definir o nome do bucket na seção
spec.volumeClaimTemplates.metadata.annotions.ibm.io/bucketde seu YAML do conjunto stateful.
ibm.io/auto-delete-bucket-
Na seção de metadados de modelos de reclamação de volume de especificação, configure uma anotação para configurar como os depósitos são excluídos. Escolha entre as opções a seguir:
- **true: **seus dados, o bucket e o PV são removidos automaticamente quando você exclui o PVC. A instância de serviço do IBM Cloud Object Storage permanece e não é excluída. Se você escolhe configurar essa opção como true, deve-se configurar
ibm.io/auto-create-bucket: trueeibm.io/bucket: ""para que seu bucket seja criado automaticamente com um nome com o formatotmp-s3fs-xxxx. - false: quando você exclui o PVC, o PV é excluído automaticamente, mas os seus dados e o bucket em sua instância de serviço do IBM Cloud Object Storage permanecem. Para acessar seus dados, deve-se criar um novo PVC com o nome de seu bucket existente.
- **true: **seus dados, o bucket e o PV são removidos automaticamente quando você exclui o PVC. A instância de serviço do IBM Cloud Object Storage permanece e não é excluída. Se você escolhe configurar essa opção como true, deve-se configurar
ibm.io/bucket-
Na seção de metadados de modelos de reclamação de volume de especificação, configure uma anotação para os detalhes do depósito. Escolha entre as opções a seguir:
- Se
ibm.io/auto-create-bucketestiver configurado como true: insira o nome do bucket que você deseja criar no IBM Cloud Object Storage. Se, além disso,ibm.io/auto-delete-bucketestá configurado comotrue, deve-se deixar esse campo em branco para designar automaticamente seu bucket a um nome com o formatotmp-s3fs-xxxx. O nome deve ser exclusivo no IBM Cloud Object Storage. - Se
ibm.io/auto-create-bucketestiver configurado como false: insira o nome do bucket existente que você deseja acessar no cluster.
- Se
ibm.io/secret-name-
Na seção de anotações de metadados de modelos de solicitação de volume de especificação, digite o nome do segredo que mantém as credenciais do IBM Cloud Object Storage que você criou anteriormente. Se incluir as credenciais do IBM Cloud Object Storage nas classes de armazenamento padrão, você não deverá listar o segredo na PVC.
kubernetes.io/storage-class-
Na seção de anotações de metadados de modelos de solicitação de volume de especificação, digite a classe de armazenamento que você deseja usar. Escolha entre as opções a seguir:
- Se
ibm.io/auto-create-bucket: "true": insira a classe de armazenamento que deseja usar para o novo depósito. - Se
ibm.io/auto-create-bucket: "false": insira a classe de armazenamento usada para criar o depósito existente.
- Se
-
Para listar as classes de armazenamento existentes, execute o comando
oc get sc | grep s3. Se você não especificar uma classe de armazenamento, a PVC será criada com a classe de armazenamento padrão que está configurada no cluster. Certifique-se de que a classe de armazenamento padrão use o provisionadoribm.io/ibmc-s3fspara que seu conjunto stateful seja provisionado com armazenamento de objetos. storageClassName-
Na seção de especificação de modelos de solicitação de volume de especificação, digite a mesma classe de armazenamento que você inseriu na seção
spec.volumeClaimTemplates.metadata.annotations.volume.beta.kubernetes.io/storage-classdo seu conjunto stateful do YAML. storage-
Na seção de solicitações de recursos de especificação de modelos de solicitação de volume de especificação, digite um tamanho fictício para o seu depósito do IBM Cloud Object Storage em gigabytes. O tamanho é necessário para o Kubernetes, mas não é respeitado no IBM Cloud Object Storage. É possível inserir qualquer tamanho que desejar. O espaço real usado no IBM Cloud Object Storage pode ser diferente e é faturado com base na tabela de precificação.