How do I use Karpenter with Google Kubernetes Engine and Config Connector?
In this guide, we will set up Karpenter, an open-source Kubernetes cluster autoscaler, with Google Kubernetes Engine (GKE) and Config Connector. We will use Pulumi to define and manage our infrastructure as code.
Key Points:
- Setting up a GKE cluster.
- Installing Config Connector to manage GCP resources using Kubernetes.
- Deploying Karpenter to manage node scaling in the GKE cluster.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as k8s from "@pulumi/kubernetes";
// Create a GKE cluster
const cluster = new gcp.container.Cluster("my-gke-cluster", {
initialNodeCount: 1,
minMasterVersion: "1.21",
nodeVersion: "1.21",
nodeConfig: {
machineType: "e2-medium",
oauthScopes: ["https://www.googleapis.com/auth/cloud-platform"],
},
});
// Export the cluster's kubeconfig
export const kubeconfig = pulumi.
all([cluster.name, cluster.endpoint, cluster.masterAuth])
.apply(([name, endpoint, auth]) => {
const context = `${gcp.config.project}_${gcp.config.zone}_${name}`;
return `apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ${auth.clusterCaCertificate}
server: https://${endpoint}
name: ${context}
contexts:
- context:
cluster: ${context}
user: ${context}
name: ${context}
current-context: ${context}
kind: Config
preferences: {}
users:
- name: ${context}
user:
auth-provider:
config:
cmd-args: config config-helper --format=json
cmd-path: gcloud
expiry-key: '{.credential.token_expiry}'
token-key: '{.credential.access_token}'
name: gcp
`;
});
// Create a Kubernetes provider instance using the kubeconfig
const k8sProvider = new k8s.Provider("gkeK8s", {
kubeconfig: kubeconfig,
});
// Install Config Connector
const configConnector = new k8s.helm.v3.Chart("config-connector", {
chart: "configconnector-operator",
version: "1.46.0",
fetchOpts: {
repo: "https://storage.googleapis.com/cnrm/charts",
},
}, { provider: k8sProvider });
// Deploy Karpenter
const karpenterNamespace = new k8s.core.v1.Namespace("karpenter", {}, { provider: k8sProvider });
const karpenterServiceAccount = new k8s.core.v1.ServiceAccount("karpenter-sa", {
metadata: {
namespace: karpenterNamespace.metadata.name,
annotations: {
"iam.gke.io/gcp-service-account": "karpenter@my-project.iam.gserviceaccount.com",
},
},
}, { provider: k8sProvider });
const karpenterController = new k8s.helm.v3.Chart("karpenter", {
chart: "karpenter",
version: "0.5.0",
fetchOpts: {
repo: "https://charts.karpenter.sh",
},
values: {
serviceAccount: {
create: false,
name: karpenterServiceAccount.metadata.name,
},
controller: {
clusterName: cluster.name,
clusterEndpoint: cluster.endpoint,
},
},
}, { provider: k8sProvider });
export const clusterName = cluster.name;
export const clusterEndpoint = cluster.endpoint;
Summary
In this guide, we created a GKE cluster using Pulumi, installed Config Connector to manage GCP resources using Kubernetes, and deployed Karpenter to manage node scaling in the GKE cluster. Karpenter helps automatically scale your Kubernetes cluster based on workload requirements.
Deploy this code
Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.
Sign upNew to Pulumi?
Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.
Sign upThank you for your feedback!
If you have a question about how to use Pulumi, reach out in Community Slack.
Open an issue on GitHub to report a problem or suggest an improvement.