Sécuriser avec GKE Sandbox


Ce document explique comment configurer Knative serving s'exécutant sur Google Kubernetes Engine (GKE) pour utiliser GKE Sandbox afin d'améliorer l'isolation de la charge de travail par rapport au noyau hôte.

Objectifs

  • Découvrir comment activer GKE Sandbox sur votre cluster Knative serving.
  • Déployer un service spécifié pour s'exécuter sur des nœuds en bac à sable.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Ajouter un pool de nœuds GKE Sandbox à un cluster Knative serving existant

Suivez la procédure pour ajouter un pool de nœuds permettant d'utiliser GKE Sandbox à votre cluster Knative serving existant. C'est là que les charges de travail pour lesquelles vous activez l'utilisation de GKE Sandbox s'exécutent.

Déployer une charge de travail sur le pool de nœuds GKE Sandbox

Une fois que vous disposez d'un cluster GKE avec un pool de nœuds compatible avec GKE Sandbox, mettez à jour votre configuration Knative serving. Mettez également à jour chaque spécification de service pour utiliser les nouveaux nœuds. Ces mises à jour ne sont requises qu'une seule fois.

Activer le flag de fonctionnalité de classe d'exécution

Dans cette section, vous activez la classe d'exécution Kubernetes à l'aide des options de fonctionnalité et d'extension Knative dans le ConfigMap config-features de l'espace de noms knative-serving. Pour activer la classe d'exécution, vous définissez l'option ConfigMap kubernetes.podspec-runtimeclassname sur enabled. Pour en savoir plus, consultez les sections Classe d'exécution Kubernetes et Configurer les options dans la documentation décrivant les fonctionnalités et extensions de Knative.

  1. Ouvrez le fichier ConfigMap config-features pour le modifier :

    kubectl edit configmap config-features -n knative-serving
    
  2. Ajoutez le flag de fonctionnalité kubernetes.podspec-runtimeclassname: enabled au champ data.

  3. Au lieu des étapes précédentes, vous pouvez exécuter la commande suivante pour corriger cette option dans vos fonctionnalités Knative :

    kubectl patch configmap config-features \
        --type='json' \
        -p="[{'op': 'replace', 'path': '/data/kubernetes.podspec-runtimeclassname', 'value': 'enabled'}]" \
        -n knative-serving
    
  4. Pour vérifier vos modifications, exécutez la commande suivante pour afficher le ConfigMap :

    kubectl get configmap config-features -n knative-serving -o yaml
    

    Le ConfigMap doit se présenter comme suit :

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: config-features
        namespace: knative-serving
        labels:
            serving.knative.dev/release: v0.22.0
    data:
        kubernetes.podspec-runtimeclassname: enabled
    

Déployer un service configuré pour s'exécuter dans GKE Sandbox

Une fois que vous avez activé le flag de fonctionnalité de classe d'exécution, vous pouvez créer des services qui spécifient un runtimeClassName dans la spécification. Définissez runtimeClassName sur gvisor pour indiquer qu'un service doit s'exécuter sur le pool de nœuds GKE Sandbox.

  1. Déployez une application Knative "Hello World" en exécutant la commande suivante :

    cat <<EOF | kubectl apply -f -
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
        name: helloworld-go
    spec:
        template:
            spec:
                runtimeClassName: gvisor
                containers:
                    -   image: gcr.io/knative-samples/helloworld-go
                        env:
                        -   name: TARGET
                            value: "gVisor User"
    EOF
    

    Si l'option de nom de classe d'exécution Kubernetes est activée, l'exécution de la commande devrait se terminer sans erreur.

  2. Obtenez les pods de votre service en cours d'exécution et leur classe d'exécution configurée en exécutant la commande suivante :

    kubectl get pods \
        -o=custom-columns='NAME:.metadata.name,RUNTIME CLASS:.spec.runtimeClassName,STATUS:.status.phase'
    

    La sortie doit ressembler à ceci :

    NAME                                              RUNTIME CLASS   STATUS
    helloworld-go-00001-deployment-55f58477f-fxm6m    gvisor          Running
    

Étape suivante

Après avoir vérifié que vous pouvez déployer des applications non approuvées sur votre pool de nœuds GKE Sandbox nouvellement créé, vous êtes prêt à ajouter runtimeClassName: gvisor aux spécifications Kubernetes pour les autres services non approuvés que vous souhaitez exécuter sur des pools de nœuds GKE Sandbox.

Autres ressources :