Présentation
Les charges de travail conteneurisées dans des environnements partagés sont exposées à des menaces que l'isolation traditionnelle des conteneurs ne peut pas contrer, notamment les administrateurs malveillants, les noyaux compromis et les attaques au niveau du micrologiciel.
Le projet Confidential Containers (CoCo) de la CNCF encapsule les pods Kubernetes dans des machines virtuelles confidentielles basées sur le matériel. Il chiffre la mémoire d'exécution pour la rendre inaccessible à l'hôte et fournit une attestation à distance afin de vérifier l'intégrité de l'environnement avant l'injection des secrets.
Cette rubrique vous guide tout au long du déploiement de CoCo sur une instance de matériel nu ecs.ebmg8i.48xlarge avec Intel TDX, afin de mettre en place un environnement d'exécution fiable et isolé pour vos charges de travail conteneurisées.
Architecture
Chaque pod Kubernetes s'exécute au sein d'une machine virtuelle confidentielle TDX qui protège les données lors de l'exécution. Tout le traitement s'effectue à l'intérieur de cette limite sécurisée.
Objectifs
Déployez un cluster CoCo mono-nœud (version v0.17.0).
Configurez un cluster Kubernetes mono-nœud (v1.32.0) à l'aide de Kubeadm.
Procédure
Étape 1 : Créer une instance de matériel nu TDX
Créez une instance de matériel nu Alibaba Cloud de 8e génération prenant en charge Intel TDX.
Accédez à la page d'achat d'instance.
Sélectionnez une méthode de facturation, une région et une zone de disponibilité. L'image communautaire requise n'est disponible que dans certaines zones. Pour cet exemple, sélectionnez Beijing Zone I.
Dans la section Instance, cliquez sur Elastic Bare Metal Server et sélectionnez le type d'instance
ecs.ebmg8i.48xlarge.-
Dans la section Image, sélectionnez Community Image et recherchez l'ID d'image
m-2ze2ucup4c5bvgx751lx. Cochez la case Confidential VM pour activer TDX.ImportantIl s'agit d'une image personnalisée basée sur Ubuntu avec des pilotes TDX préinstallés. L'utilisateur SSH par défaut est
ubuntu, et nonroot. Configurez les paramètres réseau, de stockage, de bande passante, de groupe de sécurité et de gestion. Consultez les Descriptions des éléments de configuration.
Vérifiez la configuration globale sur le côté droit de la page. Configurez les options telles que la durée de l'abonnement et assurez-vous que tous les paramètres répondent à vos besoins.
-
Cliquez sur Confirm Order pour créer l'instance.
La création de l'instance prend de 3 à 5 minutes. Accédez à la page Instances dans la console pour vérifier l'état. L'instance est prête lorsque son statut passe à Running.
Étape 2 : Préparer le nœud Kubernetes
Connectez-vous à l'instance et installez les logiciels requis pour la configurer en tant que cluster Kubernetes mono-nœud.
-
Installer containerd
# Update the package sources and install dependencies. sudo apt-get update sudo apt-get install -y ca-certificates curl # Add Docker's official GPG key. sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add Docker's APT repository. echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Install containerd. sudo apt-get update sudo apt-get install -y containerd.io -
Configurer containerd Générez le fichier de configuration par défaut et modifiez les paramètres clés pour assurer la compatibilité avec Kubernetes.
# Generate the default configuration file. sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # Replace the Kubernetes image registry with an Alibaba Cloud mirror to accelerate image pulls. sudo sed -i -E 's#registry.k8s.io#registry.aliyuncs.com/google_containers#g' /etc/containerd/config.toml # Change the cgroup driver to systemd to meet Kubernetes requirements. sudo sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml # Restart the containerd service to apply the changes. sudo systemctl restart containerd -
Configurer les paramètres du noyau Désactivez la partition swap et chargez les modules du noyau requis pour le réseau et l'exécution de Kubernetes.
# Temporarily disable swap. sudo swapoff -a # Permanently disable swap by commenting out the swap entry in the fstab file. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # Load the overlay and br_netfilter kernel modules. sudo modprobe overlay sudo modprobe br_netfilter # Configure the modules to load automatically at boot. sudo tee /etc/modules-load.d/k8s.conf <<EOF overlay br_netfilter EOF # Configure kernel parameters to allow IP forwarding and bridged traffic processing. sudo tee /etc/sysctl.d/kubernetes.conf <<EOT net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOT # Apply all sysctl configurations. sudo sysctl --system
Étape 3 : Installer un cluster Kubernetes mono-nœud
Utilisez kubeadm pour configurer un cluster Kubernetes mono-nœud.
-
Installer les composants Kubernetes Installez
kubeadm,kubeletetkubectl.# Add the GPG key for the Kubernetes APT repository. curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg # Add the Kubernetes APT repository. echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list # Install the Kubernetes tools. sudo apt-get update sudo apt-get install -y kubectl kubeadm kubelet sudo apt-mark hold kubelet kubeadm kubectl -
Initialiser le plan de contrôle Utilisez
kubeadm initpour initialiser le plan de contrôle.# Get the IP address of the primary network interface to use as the API server's advertise address. # Note: This command assumes the primary interface is eth0. If your environment is different, replace it with the correct IP address. NODE_IP=$(ip -o -4 addr show dev eth0 | awk '{split($4,a,"/");print a[1]}') # Initialize the cluster. sudo kubeadm init --pod-network-cidr=10.10.0.0/16 \ --apiserver-advertise-address ${NODE_IP} \ --kubernetes-version v1.32.0 \ --image-repository registry.aliyuncs.com/google_containersAprès l'initialisation, suivez les instructions affichées pour configurer les identifiants d'accès
kubectl.mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config -
Installer un plugin réseau Déployez le plugin CNI Flannel pour permettre la communication entre les pods.
# Install the Flannel network plugin. export KUBECONFIG=/etc/kubernetes/admin.conf FLANNEL_VERSION=v0.27.4 wget https://github.com/flannel-io/flannel/releases/download/${FLANNEL_VERSION}/kube-flannel.yml # Modify the Flannel manifest to set the correct pod network CIDR and use a regional image mirror. sed -i -E 's#([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]+#10.10.0.0/16#g' kube-flannel.yml sed -i -E 's#ghcr.io/flannel-io#confidential-ai-registry.cn-shanghai.cr.aliyuncs.com/product#g' kube-flannel.yml # Deploy Flannel. kubectl apply -f kube-flannel.yml -
Supprimer le taint du plan de contrôle Autorisez les charges de travail sur ce cluster mono-nœud en supprimant le taint
NoScheduledu nœud du plan de contrôle.NODE_NAME=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') kubectl taint nodes $NODE_NAME node-role.kubernetes.io/control-plane-
Étape 4 : Déployer les composants CoCo
Choisissez la méthode Helm chart ou Operator pour déployer CoCo.
Helm chart
Déployez CoCo à l'aide d'un chart Helm.
-
Installer Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh -
Configurer le chart Helm CoCo Clonez le dépôt de charts CoCo et créez un fichier
values.yamlpersonnalisé pour activer les environnements d'exécution TDX.# Clone the charts repository and check out the specified version. git clone https://github.com/confidential-containers/charts.git cd charts git reset --hard v0.17.0 # Create a TDX-specific configuration file. cat << EOF > values-tdx.yaml architecture: x86_64 # Point the CoCo image registry to a regional mirror address. kata-as-coco-runtime: image: reference: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy imagePullPolicy: Always k8sDistribution: k8s debug: false # Snapshotter configuration snapshotter: setup: ["nydus"] # Enable the TDX-related shims. shims: qemu-tdx: enabled: true supportedArches: - amd64 containerd: snapshotter: nydus forceGuestPull: false crio: guestPull: true agent: httpsProxy: "" noProxy: "" qemu-coco-dev: enabled: true supportedArches: - amd64 allowedHypervisorAnnotations: [] containerd: snapshotter: nydus forceGuestPull: false crio: guestPull: true agent: httpsProxy: "" noProxy: "" # Explicitly disable other unnecessary TEE shims. qemu-snp: enabled: false qemu-se: enabled: false # Enable RuntimeClass creation. runtimeClasses: enabled: true createDefault: false defaultName: "kata" # Default shim per architecture defaultShim: amd64: qemu-tdx EOF -
Déployer CoCo Installez CoCo avec Helm en utilisant votre configuration personnalisée.
helm install coco oci://ghcr.io/confidential-containers/charts/confidential-containers \ -f values-tdx.yaml \ --namespace coco-system \ --create-namespace \ --version 0.17.0 -
Créer le RuntimeClass Le chart Helm ne crée pas de RuntimeClass par défaut. Créez manuellement les objets
RuntimeClassrequis pour vos pods.cat <<EOF | kubectl apply -f - apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: kata-qemu-tdx handler: kata-qemu-tdx --- apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: kata-qemu-coco-dev handler: kata-qemu-coco-dev EOF
Operator
mkdir -p kustomize && cd kustomize
mkdir release && mkdir -p ccruntime/default
cat <<EOF > release/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- "github.com/confidential-containers/operator/config/release?ref=v0.17.0"
images:
- name: quay.io/confidential-containers/operator
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-operator
EOF
cat <<EOF > ccruntime/default/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- "github.com/confidential-containers/operator/config/samples/ccruntime/default?ref=v0.17.0"
images:
- name: quay.io/confidential-containers/reqs-payload
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-reqs-payload
- name: quay.io/kata-containers/kata-deploy-ci
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy-ci
- name: quay.io/kata-containers/kata-deploy
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy
EOF
# Allow the current node to act as a worker.
for NODE_NAME in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do
kubectl label node $NODE_NAME node.kubernetes.io/worker=
done
kubectl apply -k release
kubectl apply -k ccruntime/default
Étape 5 : Déployer et vérifier un pod d'exemple
Exécutez un pod d'exemple et vérifiez qu'il s'exécute dans une machine virtuelle confidentielle TDX.
-
Étiqueter le nœud Ajoutez une étiquette au nœud de travail pour indiquer la prise en charge de l'environnement d'exécution Kata.
NODE_NAME=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') kubectl label node $NODE_NAME katacontainers.io/kata-runtime=true -
Déployer un pod d'exemple Créez un pod qui utilise l'environnement d'exécution TDX via
runtimeClassNamedans sa sectionspec.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: coco-demo-pod spec: runtimeClassName: kata-qemu-tdx containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest name: hello-alinux command: - "sleep" - "infinity" EOF -
Vérifier le déploiement Confirmez que le pod est en cours d'exécution avec la classe d'exécution correcte.
# Wait for the pod status to become Running. kubectl get pod coco-demo-pod # Describe the pod and confirm that the "Runtime Class" field is "kata-qemu-tdx". kubectl describe pod coco-demo-pod | grep "Runtime Class" -
Vérifier l'activation de TDX Consultez les journaux du noyau sur l'instance de matériel nu pour confirmer l'initialisation de TDX.
# Run this command on the node. dmesg | grep -i tdxLa présence de messages tels que
TDX module initializeddans la sortie confirme que l'environnement TDX est actif et que l'environnement d'exécution Kata l'utilise pour les machines virtuelles confidentielles.
Coûts et risques
Répartition des coûts : Le coût principal provient de l'instance de matériel nu
ecs.ebmg8i.48xlarge. Ses spécifications élevées conviennent aux charges de travail de production ayant des exigences strictes en matière de sécurité et de performances, mais elles augmentent les coûts d'évaluation et de test.-
Limitations et risques :
Dépendance matérielle et régionale : Cette solution nécessite un type d'instance de matériel nu spécifique et des zones de disponibilité compatibles.
Point de défaillance unique : Ce tutoriel utilise un cluster mono-nœud, qui ne dispose pas de haute disponibilité. Les déploiements de production nécessitent un cluster multi-nœuds avec une architecture haute disponibilité.
Compatibilité des versions : Les versions de CoCo, de Kubernetes et des composants connexes sont étroitement couplées. Les mises à niveau nécessitent des tests de compatibilité approfondis.