Esse é um recurso experimental que está disponível para fins de avaliação e teste e pode ser alterado sem aviso prévio.
Criação de contêineres confidenciais
Saiba como instalar e usar contêineres confidenciais, que também são conhecidos como Kata Containers ou OpenShift Sandboxed Containers, em um cluster Red Hat OpenShift on IBM Cloud.
O que são contêineres confidenciais?
Um contêiner confidencial fornece um ambiente de tempo de execução seguro para cargas de trabalho confidenciais, mas permite que você continue a trabalhar com os fluxos de trabalho existentes.
A implementação IBM Cloud de contêineres confidenciais aproveita os pods de pares para estender a funcionalidade dos pods Red Hat OpenShift em um VSI separado do nó de trabalho. Essa extensão cria um ambiente de execução confiável além dos tradicionais Kubernetes e OpenShift.
Saiba mais:
- Analise os motivos pelos quais você pode usar contêineres confidenciais.
- Consulte o site Perguntas frequentes para ver se há contêineres confidenciais.
Pré-requisitos
-
Quando você cria ou escolhe o cluster Red Hat OpenShift on IBM Cloud a ser usado, o cluster deve atender aos seguintes requisitos:
- O cluster deve estar em uma região que ofereça suporte a VSIs(Virtual Server Instances)TDX.
- O cluster deve ter uma interface pública ou você pode se conectar ao seu ambiente por meio de uma VPN.
- Para permitir que o cluster se comunique com qualquer VSI criado com contêineres confidenciais, é necessário criar um grupo de segurança com o nome especificado.
kube-CLUSTER_IDpara o cluster.
-
Se necessário, habilite OperatorHub. Às vezes, o OperatorHub é desativado em um cluster por motivos de segurança.
Etapa 1: Instalação do operador
Instale o OpenShift Sandboxed Containers Operator para gerenciar o ciclo de vida de contêineres confidenciais em clusters.
-
Abra o painel de controle do cluster.
-
Clique em OpenShift console da Web > Operators > OperatorHub.
-
Procure por
OpenShift sandboxed containers Operatore clique no bloco. -
Clique em Instalar para obter a versão estável e com suporte do OpenShift Sandboxed Containers Operator, versão 1.10.3. Consulte o Verificador de informações de atualização do operador do site Red Hat para obter as versões compatíveis do site OpenShift.
-
Na janela Instalar operador, você pode manter as seleções padrão e clicar em Instalar.
-
Espere que a instalação seja concluída. Clique no link View installed Operators in Namespace openshift-sandboxed-containers-operator e aguarde até que o status seja Succeeded. Enquanto espera, você pode concluir a próxima etapa para configurar a CLI.
Etapa 2: Configuração da CLI
Antes de começar, você pode concluir estas etapas para configurar a CLI ou pode usar o shell IBM Cloud para executar comandos.
-
Instale a linha de comando IBM Cloud.
-
Efetue login na CLI do IBM Cloud.
ibmcloud login --apikey API_KEY -g RESOURCE_GROUP -
Liste os clusters na conta e copie o ID do cluster que você deseja usar na próxima etapa.
ibmcloud ks cluster ls -
Execute o comando
config.ibmcloud ks cluster config --cluster CLUSTER_ID --admin --endpoint linkEm seu diretório pessoal, é criada uma pasta
.kubee as informações são armazenadas para a comunicação com esse cluster. -
Confirme se os comandos do
ocforam executados corretamente, visualizando os detalhes dos nós de trabalho no cluster.oc get nodes -
Defina o namespace project para que você não precise incluir o namespace em comandos posteriores.
oc project openshift-sandboxed-containers-operator -
Opcional: Explore o namespace.
oc get allPor exemplo, na lista de pods, o gerenciador de controlador chamado
pod/controller-manager-<id>gerencia os microsserviços dentro do operador.
Etapa 3: Importar a imagem do pod de pares
O OpenShift Sandboxed Containers Operator inicia um sistema operacional especial dentro do pod de pares que deve ser importado para a sua conta IBM Cloud. Esse sistema operacional é necessário para implementar uma carga de trabalho em um contêiner confidencial.
A imagem do pod de pares contém um sistema operacional completo Red Hat Enterprise Linux (RHEL) 9.6 com o software necessário para instanciar um contêiner em uma Máquina Virtual Confidencial (CVM).
Todas as configurações e pacotes instalados no sistema operacional permanecem com os valores padrão Red Hat. No entanto, os VSIs ( IBM Cloud ) exigem cloud init que o funcione. Nos scripts, o cloud init é impedido de
ser desinstalado quando termina de criar o podvm, o que é uma diferença importante em relação à sua imagem de origem.
Antes de Iniciar:
Validar a compatibilidade da versão. A imagem é compatível com as seguintes versões.
- OpenShift Contêineres em sandbox Versão do operador 1.10.3
- OpenShift versões 4.19, 4.18, 4.17, e 4.16 clusters
Para importar a imagem do pod de pares:
-
Execute o
image-createcomando.# Note IMAGE_NAME is a placeholder variable. Image names do not support capitalization. ibmcloud is image-create "IMAGE_NAME" --file cos://us-south/podvm-image/rhel9-podvm-latest.qcow2 --os-name red-9-amd64 -
Abra as imagens computacionais.
-
Clique no ícone Criar +, escolha uma região com VSIs compatíveis com TDX e preencha os campos obrigatórios.
a. Para Fonte de imagem, selecione Cloud Object Storage.
b. Selecione a guia Localizar por URL do arquivo de imagem e, no URL da imagem, insira
cos://us-south/podvm-image/rhel9-podvm-latest.qcow2.c. Para o sistema operacional, selecione Red Hat Enterprise Linux > red-9-amd64.
d. Opcional: Para criar outro contêiner confidencial a partir da API com os mesmos detalhes posteriormente, clique no botão Get sample API call (Obter chamada de API de amostra ) e copie o comando Curl.
e. Clique em “Criar imagem personalizada ”.
-
Quando a imagem for adicionada à lista Imagens, clique no nome da imagem e selecione a guia IDs. Em seguida, anote o ID da imagem para usar posteriormente.
-
Aguarde até que o status da imagem passe a ser “Disponível ”.
ibmcloud is image IMAGE_NAME -
Repita essas etapas quando uma nova versão da imagem estiver disponível.
Etapa 4: Criação de uma chave de API ou perfil confiável
Os contêineres confidenciais exigem uma credencial para instanciar o pod par por meio do site kata-remote quando uma carga de trabalho segura é iniciada. Essa credencial deve ser uma chave de API válida ou um perfil confiável com
permissões para criar um VSI em sua conta.
Se estiver testando contêineres confidenciais, poderá usar uma chave de API. Se estiver usando o site Secrets Manager, você deverá configurar um perfil confiável.
-
Chave API da interface do usuário
-
No painel IBM Cloud, clique em Gerenciar > Acesso (IAM) > Chaves de API.
-
Clique em Criar.
-
Salve essa chave de forma segura, pois ela não poderá ser recuperada dessa página posteriormente.
-
-
Chave API da CLI.
Execute o comando a seguir e salve o resultado.
ibmcloud iam api-key-create KEY_NAME -
Perfil confiável
-
Abra o painel de perfis confiáveis.
-
Crie um perfil confiável e conceda a esse perfil as permissões necessárias para criar servidores virtuais a partir de OpenShift.
a. Crie um perfil confiável.
ibmcloud iam trusted-profile-create <NAME> [--description <DESCRIPTION>]b. Permitir que os recursos em
openshift-sandboxed-containers-operatorusem o perfil confiável.ibmcloud iam trusted-profile-rule-create PROFILE_NAME_OR_ID --name RULE_NAME --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:openshift-sandboxed-containers-operator --cr-type ROKS_SAc. Permitir acesso aos serviços de infraestrutura da VPC (
is).Para permitir o acesso a todos os recursos da conta:
ibmcloud iam trusted-profile-policy-create <NAME or ID of the trusted profile> --roles Editor,Writer --service-name isPara permitir o acesso a um grupo de recursos específico:
ibmcloud iam trusted-profile-policy-create <NAME or ID of the trusted profile> --roles Viewer [--resource-group-id <resource group>]
-
Etapa 5: criação de uma chave SSH (opcional)
Em clusters de teste, pode ser útil ter uma chave SSH pronta para solucionar problemas de não inicialização e para visualizar os registros. Em clusters de produção, talvez você não queira ativar a funcionalidade SSH.
-
Clique em Infraestrutura > Computação > Chaves SSH.
-
Crie uma chave SSH e anote o ID da chave SSH.
Etapa 6: Configuração de contêineres confidenciais
Depois que o Operator for instalado, crie o site ConfigMaps para permitir que o Kata manipule cargas de trabalho na conta IBM Cloud.
-
Crie uma pasta para armazenar os arquivos.
mkdir <directory-name> -
Mudar para o diretório.
cd <directory-name> -
Copie as seguintes variáveis de ambiente para a chave de API, ID do perfil confiável, nome do cluster, ID da imagem PodVM, ID da chave SSH e ID da VPC (opcional).
Opcional: você pode armazená-los em um script do Shell no novo diretório para defini-los novamente mais tarde. Exemplo:
<directory-name>/env-vars.sha. Reúna os valores das seguintes variáveis e atualize os valores no script.
- Para o site
CLUSTER_NAME, abra os detalhes do cluster na lista de clusters e copie o nome. - Opcional: Para o site
VPC_ID, na seção Detalhes do cluster da mesma página, você pode clicar no nome do vpc para abrir os detalhes do VPC e copiar o campo ID do VPC. - Para
PODVM_IMAGE_ID, use a ID da imagem que você salvou para a imagem do pod de pares. - Se estiver usando uma chave de API, você pode remover a linha
IBMCLOUD_TRUSTED_PROFILE_ID. - Se estiver usando um perfil confiável, você pode remover a linha
IBMCLOUD_API_KEY. - Se você não definiu uma chave SSH, poderá remover a linha
SSH_KEY_ID.
export IBMCLOUD_API_KEY=<your API key> export IBMCLOUD_TRUSTED_PROFILE_ID="<your Trusted Profile ID>" export CLUSTER_NAME=<cluster-name-region-flavor> export PODVM_IMAGE_ID=<PodVM image ID provided by IBM or a custom-built image> export SSH_KEY_ID=<SSH key ID to be used by the peer pod VSI> export VPC_ID=<Optional: the VPC that your Openshift cluster is in>b. Se você armazenou as variáveis em um script do Shell, execute-o. Exemplo:
sh env-vars.sh - Para o site
-
Execute o comando para criar o site
feature-gates.yamlConfigMap.cat > feature-gates.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: deploymentMode: "DaemonSetFallback" # or DaemonSet to force it confidential: "true" layeredImageDeployment: "false" EOF -
Aplique o ConfigMap.
oc apply -f feature-gates.yaml -
Execute o comando para criar o site
peer-pods-secret.yaml. Remova quaisquer variáveis de ambiente opcionais da seçãostringDataque sejam necessárias.cat > peer-pods-secret.yaml <<EOF apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: # either IBMCLOUD_API_KEY or IBMCLOUD_IAM_PROFILE_ID must be set # if you specify both the IBMCLOUD_API_KEY will be used # IBMCLOUD_IAM_ENDPOINT is optional IBMCLOUD_API_KEY: "$IBMCLOUD_API_KEY" IBMCLOUD_IAM_ENDPOINT: "https://iam.cloud.ibm.com/identity/token" IBMCLOUD_IAM_PROFILE_ID: "$IBMCLOUD_TRUSTED_PROFILE_ID" EOF -
Aplique o segredo ao cluster.
oc apply -f peer-pods-secret.yaml -
Execute o comando para criar o site
peer-pods-cm.yamlConfigMap. Remova quaisquer variáveis de ambiente opcionais da seçãodataque não tenham sido definidas.cat > peer-pods-cm.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "ibmcloud" IBMCLOUD_PODVM_IMAGE_ID: "$PODVM_IMAGE_ID" IBMCLOUD_PODVM_INSTANCE_PROFILE_LIST: "bx3dc-2x10" IBMCLOUD_PODVM_INSTANCE_PROFILE_NAME: "bx3dc-2x10" IBMCLOUD_RESOURCE_GROUP_ID: "$(ibmcloud is vpc "$VPC_ID" -json | jq -r .resource_group.id)" IBMCLOUD_SSH_KEY_ID: "$SSH_KEY_ID" IBMCLOUD_VPC_ID: "$VPC_ID" IBMCLOUD_VPC_SG_ID: "$(ibmcloud ks security-group ls --cluster $CLUSTER_NAME -json | jq -r '.[] | select(.type == "cluster") | .id')" CLOUD_CONFIG_VERIFY: "false" CRI_RUNTIME_ENDPOINT: "/run/cri-runtime/containerd.sock" ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN: "false" VXLAN_PORT: "" TUNNEL_TYPE: "" INITDATA: "" PEERPODS_LIMIT_PER_NODE: "10" EOFA configuração
PEERPODS_LIMIT_PER_NODEcontrola o número máximo de VSIs de pods de pares que podem ser agendados por nó de trabalho. O valor padrão é10. É possível aumentar esse valor com base na capacidade do nó de trabalho, mas observe que você também está restrito pelos limites do pod Kubernetes (110 pods por nó para um trabalhador 16x64 ) e pelos recursos de CPU disponíveis no nó de trabalho. Cada pod de pares consome aproximadamente 250m CPU e 120Mi memória no nó de trabalho para a construção do pod Kubernetes, embora a carga de trabalho real seja executada em um VSI separado. Para obter mais informações, consulte as Perguntas mais frequentes. -
Aplique o ConfigMap.
oc apply -f peer-pods-cm.yaml -
Execute o comando para criar o site
kata-runtime-settings.yamlKataConfig.cat > kata-runtime-settings.yaml <<EOF apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: kata-runtime-settings namespace: openshift-sandboxed-containers-operator spec: enablePeerPods: true logLevel: info #checkNodeEligibility: true #kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>' EOF -
Aplique o KataConfig.
oc apply -f kata-runtime-settings.yaml -
À medida que o Kata é instalado e os conjuntos de daemons são iniciados, você pode monitorar o progresso.
- Você pode dar uma olhada no projeto OperatorHub
openshift-sandboxed-containers-operatorpara ver que o KataConfig está em andamento. - Você pode executar o seguinte comando para ver os rótulos serem atualizados com o estado atual da instalação.
oc get nodes --output yaml|egrep "kata-ds-rpm-install|ibm-cloud.kubernetes.io/worker-id" ``` Possíveis estados: - `waiting_to_install`: A instalação do Kata está em fila de espera no nó. - `installing`: A instalação do Kata está em andamento. - `installed`: O Kata foi instalado com êxito no nó. - `waiting_for_reboot`: O nó deve ser reinicializado para concluir a instalação ou desinstalação. - `waiting_to_uninstall`: A desinstalação do Kata está na fila do nó. - `uninstalling`: A desinstalação do Kata está em andamento. - `uninstalled`: O Kata foi desinstalado com sucesso do nó. - Você pode dar uma olhada no projeto OperatorHub
-
Quando os rótulos estiverem atualizados e no estado
waiting_for_reboot, reinicie cada nó de trabalho, um de cada vez.
Quando você executar oc get nodes e cada nó de trabalho estiver no estado installed, a instalação estará concluída.
Monitoramento e ajuste dos limites dos pods de pares
Após a instalação, você pode monitorar a capacidade dos pods pares e ajustar a configuração PEERPODS_LIMIT_PER_NODE, se necessário.
-
Verifique o limite atual de pods de pares em todos os nós de trabalho:
oc get nodes -o json | jq -r '[.items[] | select (.status.allocatable["kata.peerpods.io/vm"] != null)| .status.allocatable["kata.peerpods.io/vm"] | tonumber] | add' -
Verifique os recursos alocados em cada nó de trabalho:
for n in $(oc get nodes -o name); do echo "=== $n ===" oc describe "$n" | sed -n '/Allocated resources:/,/Events:/p' done -
Contar o número de pods de pares em execução no momento:
oc get pods -A -o json | jq '.items[] | select(.spec.runtimeClassName == "kata-remote") | "\(.metadata.namespace)/\(.metadata.name)"' | wc -l -
Para aumentar o valor de
PEERPODS_LIMIT_PER_NODEapós a instalação:a. Atualize o arquivo
ConfigMap.oc -n openshift-sandboxed-containers-operator patch cm peer-pods-cm \ --type merge \ -p '{"data":{"PEERPODS_LIMIT_PER_NODE":"24"}}'b. Reinicie o conjunto de daemons do Cloud API Adapter.
oc -n openshift-sandboxed-containers-operator rollout restart daemonset/osc-caa-dsc. Verifique se o novo limite foi aplicado.
oc get nodes -o json | jq -r '[.items[] | select (.status.allocatable["kata.peerpods.io/vm"] != null)| .status.allocatable["kata.peerpods.io/vm"] | tonumber] | add'
Etapa 7: Configuração de uma autoridade de confiança
O atestado é uma parte essencial dos contêineres confidenciais. Você deve validar a segurança do código da cadeia de suprimentos, para que o código em execução no contêiner não seja modificado. Você pode aproveitar um chip Intel TDX e o protocolo
key-broker-service. A imagem do site podvm já contém o código do driver TDX em funcionamento e um kbs_client. No entanto, você deve configurar o INITDATA com os detalhes do trustee.
-
Selecione um administrador. Há muitas opções para o fiduciário em contêineres confidenciais.
-
Para fins de desenvolvimento, você pode lançar um VM para um administrador nele.
-
Para um serviço de nível de produção, você pode usar a Intel Trust Authority.
-
-
Se você selecionou o site VM para um trustee para fins de desenvolvimento, conclua estas etapas de configuração.
a. Insira o endereço IP do administrador no script a seguir e execute-o para definir a variável
INITDATA.export KBS_SERVICE_ENDPOINT="https://REPLACE_WITH_TRUSTEE_IP:8080" export INITDATA=$(cat <<EOF | gzip | base64 -w0 algorithm = "sha256" version = "0.1.0" [data] "aa.toml" = ''' [token_configs] [token_configs.coco_as] url = "$KBS_SERVICE_ENDPOINT" [token_configs.kbs] url = "$KBS_SERVICE_ENDPOINT" ''' "cdh.toml" = ''' socket = 'unix:///run/confidential-containers/cdh.sock' credentials = [] [kbc] name = "cc_kbc" url = "$KBS_SERVICE_ENDPOINT" ''' EOF )b. Verifique a variável de ambiente
$INITDATA.echo $INITDATAc. Adicione o valor da variável a
peer-pods-cm.yamlConfigMap no espaço de nomesopenshift-sandboxed-containers-operator.d. Reinicie o daemonset
osc-caa-dsno namespaceopenshift-sandboxed-containers-operator. Esse conjunto de daemons do Cloud API Adapter é usado para se comunicar com IBM Cloud.oc rollout restart daemonset.apps/osc-caa-dse. Execute o comando a seguir para visualizar os pods. Para cada pod
osc-caa-ds-<id>, examine a Idade de cada pod para verificar se o pod foi reiniciado.oc get podsSe um pod não for reiniciado, exclua o pod para recriá-lo.
oc delete pod/osc-caa-ds-<id>Visualize os pods novamente.
oc get podsf. Repita essas etapas para cada entrada de carga de trabalho de
INITDATA.g. O valor
INITDATApode ser aplicado a um contêiner individual como uma anotação, e o contêiner que é iniciado é configurado para usar o trustee. Essa anotação pode ser útil ao testar novos fiduciários ou ao garantir que as alterações emINITDATAnão danifiquem nenhum contêiner confidencial.Exemplo de anotação:
apiVersion: v1 kind: Pod metadata: name: mypod annotations: io.katacontainers.config.runtime.cc_init_data: $INITDATA spec: runtimeClassName: kata-remote
Etapa 8: executar uma carga de trabalho de contêiner confidencial
Depois que todos os rótulos forem atualizados para installed, implante uma carga de trabalho usando o nome da classe de tempo de execução kata-remote em um arquivo pod.yaml. Você pode usar o exemplo Hello
World como uma carga de trabalho de teste em um contêiner confidencial.
-
Crie um arquivo
pod.yaml.oc apply -f - <<EOF apiVersion: v1 kind: Pod metadata: labels: app: helloworld version: v1 name: helloworld spec: containers: - name: helloworld image: docker.io/istio/examples-helloworld-v1:1.0 ports: - containerPort: 5000 runtimeClassName: kata-remote EOF -
Monitore a implementação na lista Virtual Servers. Quando o VSI é criado, ele exibe o estado Em execução. Se o VSI parecer estar preso no estado Iniciando, verifique se há problemas nos registros.
a. Obtenha os nomes de pod.
oc get podsb. Obtenha os registros de um dos pods do Cloud API Adapter e procure por erros.
oc logs osc-caa-ds-<id> -
Verifique o pod executando o comando a seguir.
oc describe pod/helloworld -
Para verificar o atestado, execute o contêiner com o seguinte comando.
oc exec -it helloworld -- bashEm seguida, execute o seguinte comando
curlpara obter informações do administrador.curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1Quando terminar, você poderá sair do contêiner.
exit -
Se houver problemas, examine os registros no namespace
openshift-sandboxed-containers-operator.- Registros de pods gerenciados pelo controlador:
oc logs pod/controller-manager-<UNIQUE_ID> ``` - Registros de pods do adaptador de API da nuvem: ```sh {: pre} oc logs pod/osc-caa-ds-<UNIQUE_ID> ``` - Registros de aplicativos: Depende do local especificado.
A configuração dos contêineres confidenciais está concluída! Ainda precisa de ajuda? Confira a solução de problemas.
Remoção de cargas de trabalho e ferramentas
A conclusão dessas etapas na ordem errada pode deixar para trás recursos pelos quais você será cobrado, como um VSI.
Remoção de cargas de trabalho
-
Exclua as cargas de trabalho do cluster que usam contêineres confidenciais.
a. Mostrar todos os pods.
oc get pods -A -o json | jq '.items[] | select(.spec.runtimeClassName == "kata-remote") | "\(.metadata.namespace)/\(.metadata.name)"'b. Exclua os pods, o que exclui os VSIs implantados para eles.
oc delete -f pod.yamlSe você alterou o ConfigMaps anterior para configurações inválidas ou as credenciais foram removidas, o software não poderá concluir as chamadas de API para remover os recursos, e eles terão que ser removidos manualmente. A remoção manual só deve ser usada neste cenário, pois pode ser necessário criar um novo cluster OpenShift ou substituir os trabalhadores.
-
Excluir a configuração do Kata. O
kata-runtime-settings.yamlremove o Kata dos trabalhadores, que você pode observar enquanto os rótulos são atualizados.a. Monitore os rótulos dos nós até que eles estejam no estado
waiting_for_reboot.b. Reinicialize os trabalhadores, um de cada vez, para concluir a desinstalação do Kata no nó de trabalho.
c. Se outras cargas de trabalho estiverem sendo executadas nesse cluster, coloque o trabalhador em isolamento, drene-o e reinicie-o.
d. Aguarde até que a exclusão do
kata-runtime-settings.yamlseja concluída após a reinicialização para continuar na próxima etapa. Há processos que devem terminar a desinstalação após a reinicialização.Não continue se os recursos do
kata-runtime-settings.yamlnão forem excluídos. -
Exclua o arquivo ConfigMaps.
Desinstalando o operador
Depois de remover as cargas de trabalho, você pode desinstalar o OpenShift Sandboxed Containers Operator.
-
Em OperatorHub,, desinstale o operador.
-
Confirme que não há recursos restantes no espaço de nome
openshift-sandboxed-containers-operator. -
Exclua o namespace.