From 125e8f27dec5bdf4750c2b98288043eef73f67da Mon Sep 17 00:00:00 2001 From: Nelson Figueroa <30811275+nelsonfigueroa@users.noreply.github.com> Date: Thu, 22 Oct 2026 14:03:18 -0700 Subject: [PATCH 1/2] Fix Kubernetes YAML examples in the migration guide for yaml/v2 --- .../migrating-to-pulumi/from-kubernetes.md | 356 ++++++++---------- 1 file changed, 154 insertions(+), 202 deletions(-) diff --git a/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md b/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md index bb37a8c64c9c..606ca8f6a5a8 100644 --- a/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md +++ b/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md @@ -42,7 +42,13 @@ $ curl -L --remote-name \ https://raw.githubusercontent.com/kubernetes/examples/master/web/guestbook/all-in-one/guestbook-all-in-one.yaml ``` -This Pulumi program uses `ConfigFile` to read that YAML file, provision the resources inside it, and export the resulting IP addresses: +The guestbook's `redis-master` Deployment uses the `registry.k8s.io/redis:e2e` image, which has a Docker schema 1 manifest that containerd 2.1 and later can no longer pull. Switch it to the official `redis` image, as the comment in the file suggests: + +```bash +$ sed -i.bak 's|registry.k8s.io/redis:e2e|redis|' guestbook-all-in-one.yaml +``` + +This Pulumi program uses `ConfigFile` to read that YAML file and provision the resources inside it: {{< chooser language "typescript,python,go,csharp,java,yaml,hcl" >}} @@ -55,25 +61,16 @@ import * as k8s from "@pulumi/kubernetes"; const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { file: "guestbook-all-in-one.yaml", }); - -// Export the private cluster IP address of the frontend. -const frontend = guestbook.getResource("v1/Service", "frontend"); -export const privateIp = frontend.spec.clusterIP; ``` {{% /choosable %}} {{% choosable language python %}} ```python -import pulumi from pulumi_kubernetes.yaml.v2 import ConfigFile # Create resources from standard Kubernetes guestbook YAML example. guestbook = ConfigFile("guestbook", file="guestbook-all-in-one.yaml") - -# Export the private cluster IP address of the frontend. -frontend = guestbook.get_resource("v1/Service", "frontend") -pulumi.export("private_ip", frontend.spec["cluster_ip"]) ``` {{% /choosable %}} @@ -83,24 +80,20 @@ pulumi.export("private_ip", frontend.spec["cluster_ip"]) package main import ( - corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1" yamlv2 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/yaml/v2" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) func main() { pulumi.Run(func(ctx *pulumi.Context) error { - guestbook, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ + // Create resources from standard Kubernetes guestbook YAML example. + _, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ File: pulumi.String("guestbook-all-in-one.yaml"), }) if err != nil { return err } - // Export the private cluster IP address of the frontend. - frontend := guestbook.GetResource("v1/Service", "frontend", "").(*corev1.Service) - ctx.Export("privateIP", frontend.Spec.ClusterIP()) - return nil }) } @@ -110,13 +103,10 @@ func main() { {{% choosable language csharp %}} ```csharp -using System; -using System.Collections.Generic; using System.Threading.Tasks; -using Pulumi; using Pulumi.Kubernetes.Yaml.V2; -using Pulumi.Kubernetes.Core.V1; +using Pulumi.Kubernetes.Types.Inputs.Yaml.V2; class Program { @@ -129,13 +119,6 @@ class Program { File = "guestbook-all-in-one.yaml", }); - - // Export the private cluster IP address of the frontend. - var frontend = guestbook.GetResource("frontend"); - return new Dictionary - { - { "privateIp", frontend.Apply(fe => fe.Spec.Apply(spec => spec.ClusterIP)) }, - }; }); } } @@ -145,6 +128,8 @@ class Program {{% choosable language java %}} ```java +package myproject; + import com.pulumi.Context; import com.pulumi.Pulumi; import com.pulumi.kubernetes.yaml.v2.ConfigFile; @@ -196,50 +181,37 @@ resource "kubernetes_yaml_v2_config_file" "guestbook" { } ``` -`ConfigFile` exposes the objects it created as its `resources` output. HCL has no equivalent of the `getResource` helper the other languages use to pick one out by kind and name, so this program deploys the guestbook without exporting the frontend service's IP address. - {{% /choosable %}} {{< /chooser >}} -{{% choosable language "typescript,python,go,csharp,java,yaml" %}} - -As we can see here, the `getResource` function lets us retrieve an internal resource by type and name, so that we can interact with its properties. These will be strongly typed based on the resource type. Be careful using this, as it makes your code subject to the internal implementation details of the YAML configuration — however, it's often necessary to find the information you need, like the auto-assigned IP addresses. - -{{% /choosable %}} - -{{% choosable language "typescript,python,go,csharp,java,yaml" %}} - -Running `pulumi up` will deploy the resources and then export the resulting frontend service's auto-assigned cluster IP address: - -{{% /choosable %}} - -{{% choosable language hcl %}} - -Running `pulumi up` deploys the same resources. Because the HCL program exports nothing, its output omits the `Outputs` section shown here: - -{{% /choosable %}} +Running `pulumi up` deploys the resources: ```bash -Updating (dev) - - Type Name Status - + pulumi:pulumi:Stack pulumi-k8s-test-dev created - + └─ kubernetes:yaml:ConfigFile guestbook created - + ├─ kubernetes:core/v1:Service redis-replica created - + ├─ kubernetes:core/v1:Service frontend created - + ├─ kubernetes:core/v1:Service redis-master created - + ├─ kubernetes:apps/v1:Deployment redis-master created - + ├─ kubernetes:apps/v1:Deployment frontend created - + └─ kubernetes:apps/v1:Deployment redis-replica created +Updating (dev): -Outputs: - privateIp: "10.110.181.172" + Type Name Status + + pulumi:pulumi:Stack pulumi-k8s-test-dev created + + └─ kubernetes:yaml/v2:ConfigFile guestbook created + + ├─ kubernetes:apps/v1:Deployment guestbook:default/redis-replica created + + ├─ kubernetes:apps/v1:Deployment guestbook:default/frontend created + + ├─ kubernetes:core/v1:Service guestbook:default/redis-replica created + + ├─ kubernetes:core/v1:Service guestbook:default/redis-master created + + ├─ kubernetes:core/v1:Service guestbook:default/frontend created + + └─ kubernetes:apps/v1:Deployment guestbook:default/redis-master created Resources: + 8 created ``` +`ConfigFile` exposes the objects it creates through its `resources` output, but it doesn't provide a way to look up a single object by kind and name. To find a value that Kubernetes assigns at deploy time, like the frontend service's cluster IP address, query the cluster with `kubectl`: + +```bash +$ kubectl get service frontend +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +frontend NodePort 10.107.35.136 80:31533/TCP 10s +``` + ### Deploying multiple Kubernetes YAML files The `ConfigGroup` resource type works like `ConfigFile`. Instead of a single file, it accepts a `files` parameter that contains a list of file paths, file globs, and/or URLs from which to read the YAML configuration from. By default, the auto-generated resource names are prefixed with the name of the `ConfigGroup`, however you can specify a `resourcePrefix` to use a different prefix. One or more `transforms` callbacks can be supplied via `ResourceOptions` to arbitrarily rewrite resource configurations on-the-fly before deploying them. @@ -254,7 +226,13 @@ $ curl -L --remote-name \ $ popd ``` -This Pulumi program uses `ConfigGroup` to read these YAML files, provision the resources inside of them, and export the resulting IP addresses: +As with the single file, switch the `redis-master` Deployment to the official `redis` image: + +```bash +$ sed -i.bak 's|registry.k8s.io/redis:e2e|redis|' yaml/redis-master-deployment.yaml +``` + +This Pulumi program uses `ConfigGroup` to read these YAML files and provision the resources inside of them: {{< chooser language "typescript,python,go,csharp,java,yaml,hcl" >}} @@ -268,25 +246,16 @@ import * as path from "path"; const guestbook = new k8s.yaml.v2.ConfigGroup("guestbook", { files: [ path.join("yaml", "*.yaml") ], }); - -// Export the private cluster IP address of the frontend. -const frontend = guestbook.getResource("v1/Service", "frontend"); -export const privateIp = frontend.spec.clusterIP; ``` {{% /choosable %}} {{% choosable language python %}} ```python -import pulumi from pulumi_kubernetes.yaml.v2 import ConfigGroup # Create resources from standard Kubernetes guestbook YAML example. guestbook = ConfigGroup("guestbook", files=["yaml/*.yaml"]) - -# Export the private cluster IP address of the frontend. -frontend = guestbook.get_resource("v1/Service", "frontend") -pulumi.export("private_ip", frontend.spec["cluster_ip"]) ``` {{% /choosable %}} @@ -298,24 +267,20 @@ package main import ( "path/filepath" - corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1" yamlv2 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/yaml/v2" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) func main() { pulumi.Run(func(ctx *pulumi.Context) error { - guestbook, err := yamlv2.NewConfigGroup(ctx, "guestbook", &yamlv2.ConfigGroupArgs{ + // Create resources from standard Kubernetes guestbook YAML example. + _, err := yamlv2.NewConfigGroup(ctx, "guestbook", &yamlv2.ConfigGroupArgs{ Files: pulumi.StringArray{pulumi.String(filepath.Join("yaml", "*.yaml"))}, }) if err != nil { return err } - // Export the private cluster IP address of the frontend. - frontend := guestbook.GetResource("v1/Service", "frontend", "").(*corev1.Service) - ctx.Export("privateIP", frontend.Spec.ClusterIP()) - return nil }) } @@ -325,14 +290,11 @@ func main() { {{% choosable language csharp %}} ```csharp -using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Pulumi; using Pulumi.Kubernetes.Yaml.V2; -using Pulumi.Kubernetes.Core.V1; +using Pulumi.Kubernetes.Types.Inputs.Yaml.V2; class Program { @@ -345,13 +307,6 @@ class Program { Files = { Path.Combine("yaml", "*.yaml") }, }); - - // Export the private cluster IP address of the frontend. - var frontend = guestbook.GetResource("frontend"); - return new Dictionary - { - { "privateIp", frontend.Apply(fe => fe.Spec.Apply(spec => spec.ClusterIP)) }, - }; }); } } @@ -361,6 +316,8 @@ class Program {{% choosable language java %}} ```java +package myproject; + import com.pulumi.Context; import com.pulumi.Pulumi; import com.pulumi.kubernetes.yaml.v2.ConfigGroup; @@ -413,48 +370,27 @@ resource "kubernetes_yaml_v2_config_group" "guestbook" { } ``` -As with `ConfigFile`, HCL can't pick the frontend service out of the group's `resources` output, so this program exports no IP address. - {{% /choosable %}} {{< /chooser >}} -{{% choosable language "typescript,python,go,csharp,java,yaml" %}} - -Running `pulumi up` will deploy the resources in every YAML file and then export the resulting frontend service's auto-assigned cluster IP address: - -{{% /choosable %}} - -{{% choosable language hcl %}} - -Running `pulumi up` deploys the resources in every YAML file. Because the HCL program exports nothing, its output omits the `Outputs` section shown here: - -{{% /choosable %}} +Running `pulumi up` deploys the resources in every YAML file: ```bash -Updating (dev) - - Type Name Status - + pulumi:pulumi:Stack pulumi-k8s-test-dev created - + └─ kubernetes:yaml:ConfigGroup guestbook created - + ├─ kubernetes:yaml:ConfigFile foo-test/redis-replica-service.yaml created - + │ └─ kubernetes:core/v1:Service redis-replica created - + ├─ kubernetes:yaml:ConfigFile foo-test/frontend-deployment.yaml created - + │ └─ kubernetes:apps/v1:Deployment frontend created - + ├─ kubernetes:yaml:ConfigFile foo-test/redis-master-deployment.yaml created - + │ └─ kubernetes:apps/v1:Deployment redis-master created - + ├─ kubernetes:yaml:ConfigFile foo-test/frontend-service.yaml created - + │ └─ kubernetes:core/v1:Service frontend created - + ├─ kubernetes:yaml:ConfigFile foo-test/redis-master-service.yaml created - + │ └─ kubernetes:core/v1:Service redis-master created - + └─ kubernetes:yaml:ConfigFile foo-test/redis-replica-deployment.yaml created - + └─ kubernetes:apps/v1:Deployment redis-replica created +Updating (dev): -Outputs: - privateIp: "10.108.151.100" + Type Name Status + + pulumi:pulumi:Stack pulumi-k8s-test-dev created + + └─ kubernetes:yaml/v2:ConfigGroup guestbook created + + ├─ kubernetes:core/v1:Service guestbook:default/redis-replica created + + ├─ kubernetes:apps/v1:Deployment guestbook:default/redis-master created + + ├─ kubernetes:apps/v1:Deployment guestbook:default/redis-replica created + + ├─ kubernetes:apps/v1:Deployment guestbook:default/frontend created + + ├─ kubernetes:core/v1:Service guestbook:default/frontend created + + └─ kubernetes:core/v1:Service guestbook:default/redis-master created Resources: - + 14 created + + 8 created ``` ## Deploying Helm charts @@ -606,7 +542,7 @@ class Program {{< /chooser >}} -Similar to `ConfigFile` and `ConfigGroup` resource types shown above, all provisioned resources are available via the `getResource` function. +Unlike the `ConfigFile` and `ConfigGroup` resource types shown above, the Helm V3 `Chart` makes all provisioned resources available via the `getResource` function. After running `pulumi up`, we will see the resulting resources created, and the load balanced IP address will be printed: @@ -1162,7 +1098,10 @@ The Kubernetes Guestbook by default does not assign a load balancer for the fron {{% choosable language typescript %}} ```typescript -... +import * as k8s from "@pulumi/kubernetes"; + +// Create resources from standard Kubernetes guestbook YAML example, +// changing the frontend service to a load balancer. const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { file: "guestbook-all-in-one.yaml", }, { @@ -1174,20 +1113,19 @@ const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { props.spec = { ...props.spec, type: "LoadBalancer" }; return { props, opts: args.opts }; } + return undefined; }, ], }); - -// Export the public IP address the load balancer assigns to the frontend. -const frontend = guestbook.getResource("v1/Service", "frontend"); -export const publicIp = frontend.status.loadBalancer.ingress[0].ip; ``` {{% /choosable %}} {{% choosable language python %}} ```python -... +import pulumi +from pulumi_kubernetes.yaml.v2 import ConfigFile + def make_frontend_public(args): if (args.type_ == "kubernetes:core/v1:Service" and args.props.get("metadata", {}).get("name") == "frontend"): @@ -1197,91 +1135,101 @@ def make_frontend_public(args): props["spec"] = spec return pulumi.ResourceTransformResult(props=props, opts=args.opts) +# Create resources from standard Kubernetes guestbook YAML example, +# changing the frontend service to a load balancer. guestbook = ConfigFile("guestbook", file="guestbook-all-in-one.yaml", opts=pulumi.ResourceOptions(transforms=[make_frontend_public])) - -# Export the public IP address the load balancer assigns to the frontend. -frontend = guestbook.get_resource("v1/Service", "frontend") -pulumi.export("public_ip", frontend.status["load_balancer"]["ingress"][0]["ip"]) ``` {{% /choosable %}} {{% choosable language go %}} ```go -... -guestbook, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ - File: pulumi.String("guestbook-all-in-one.yaml"), -}, pulumi.Transforms([]pulumi.ResourceTransform{ - func(ctx context.Context, args *pulumi.ResourceTransformArgs) *pulumi.ResourceTransformResult { - if args.Type == "kubernetes:core/v1:Service" { - props := args.Props.ObjectValue() - meta := props["metadata"].ObjectValue() - if name, ok := meta["name"]; ok && name.StringValue() == "frontend" { - spec := props["spec"].ObjectValue() - spec["type"] = resource.NewStringProperty("LoadBalancer") - props["spec"] = resource.NewObjectProperty(spec) - return &pulumi.ResourceTransformResult{ - Props: resource.NewObjectProperty(props), - Opts: args.Opts, +package main + +import ( + "context" + + yamlv2 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/yaml/v2" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +func main() { + pulumi.Run(func(ctx *pulumi.Context) error { + // Create resources from standard Kubernetes guestbook YAML example, + // changing the frontend service to a load balancer. + _, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ + File: pulumi.String("guestbook-all-in-one.yaml"), + }, pulumi.Transforms([]pulumi.ResourceTransform{ + func(_ context.Context, args *pulumi.ResourceTransformArgs) *pulumi.ResourceTransformResult { + if args.Type == "kubernetes:core/v1:Service" { + meta, _ := args.Props["metadata"].(pulumi.Map) + spec, ok := args.Props["spec"].(pulumi.Map) + if ok && meta["name"] == pulumi.String("frontend") { + spec["type"] = pulumi.String("LoadBalancer") + return &pulumi.ResourceTransformResult{ + Props: args.Props, + Opts: args.Opts, + } + } } - } + return nil + }, + })) + if err != nil { + return err } + return nil - }, -})) -if err != nil { - return err + }) } - -// Export the private cluster IP address of the frontend. -frontend := guestbook.GetResource("v1/Service", "frontend", "").(*corev1.Service) -ctx.Export("privateIP", frontend.Spec.ClusterIP()) -ctx.Export("publicIP", frontend.Status.LoadBalancer().Ingress().Index(pulumi.Int(0)).Ip()) -... ``` {{% /choosable %}} {{% choosable language csharp %}} ```csharp -... -var guestbook = new ConfigFile("guestbook", new ConfigFileArgs -{ - File = "guestbook-all-in-one.yaml", -}, new ComponentResourceOptions -{ - ResourceTransformations = - { - (args) => { - if (args.Resource.GetResourceType() == "kubernetes:core/v1:Service") { - var props = args.Args as ImmutableDictionary - ?? ImmutableDictionary.Empty; - var meta = props.GetValueOrDefault("metadata") - as ImmutableDictionary - ?? ImmutableDictionary.Empty; - if (meta.TryGetValue("name", out var name) && (string)name == "frontend") { - var spec = props.GetValueOrDefault("spec") - as ImmutableDictionary - ?? ImmutableDictionary.Empty; - props = props.SetItem("spec", spec.SetItem("type", "LoadBalancer")); - return new ResourceTransformationResult(props, args.Options); - } - } - return null; - }, - }, -}); +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; + +using Pulumi; +using Pulumi.Kubernetes.Yaml.V2; +using Pulumi.Kubernetes.Types.Inputs.Yaml.V2; -// Export the cluster IP and the public IP assigned by the load balancer. -var frontend = guestbook.GetResource("frontend"); -return new Dictionary +class Program { - { "privateIp", frontend.Apply(fe => fe.Spec.Apply(spec => spec.ClusterIP)) }, - { "publicIp", frontend.Apply(fe => fe.Status.Apply(status => status.LoadBalancer.Ingress[0].Ip)) }, -}; -... + static Task Main() + { + return Pulumi.Deployment.RunAsync(() => + { + // Create resources from standard Kubernetes guestbook YAML example, + // changing the frontend service to a load balancer. + var guestbook = new ConfigFile("guestbook", new ConfigFileArgs + { + File = "guestbook-all-in-one.yaml", + }, new ComponentResourceOptions + { + ResourceTransforms = + { + (args, _) => + { + if (args.Type == "kubernetes:core/v1:Service" + && args.Args.GetValueOrDefault("metadata") is ImmutableDictionary meta + && meta.GetValueOrDefault("name") is "frontend" + && args.Args.GetValueOrDefault("spec") is ImmutableDictionary spec) + { + var props = args.Args.SetItem("spec", spec.SetItem("type", "LoadBalancer")); + return Task.FromResult(new ResourceTransformResult(props, args.Options)); + } + return Task.FromResult(null); + }, + }, + }); + }); + } +} ``` {{% /choosable %}} @@ -1298,29 +1246,33 @@ Transforms are not yet supported for the `ConfigFile` resource in Pulumi YAML. {{< /chooser >}} -After running `pulumi up`, we will see the `frontend` service replaced and that a `publicIp` is now assigned: +After running `pulumi up`, we will see the `frontend` service updated to a load balancer: ```bash $ pulumi up Updating (dev): - Type Name Status Info - pulumi:pulumi:Stack k8s-yaml-dev - └─ kubernetes:yaml:ConfigFile guestbook - +- └─ kubernetes:core:Service frontend replaced [diff: ~spec] - -Outputs: - ~ privateIp: "10.52.254.168" => "10.51.244.125" - + publicIp : "37.182.242.140" + Type Name Status Info + pulumi:pulumi:Stack pulumi-k8s-test-dev + └─ kubernetes:yaml/v2:ConfigFile guestbook + ~ └─ kubernetes:core/v1:Service guestbook:default/frontend updated [diff: ~spec] Resources: - +-1 replaced + ~ 1 updated 7 unchanged ``` -Afterwards, we can `curl` the `publicIp` and see our Guestbook up and running: +Once the load balancer is ready, `kubectl` shows its external IP address: + +```bash +$ kubectl get service frontend +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +frontend LoadBalancer 10.107.35.136 127.0.0.1 80:31533/TCP 24s +``` + +Afterwards, we can `curl` that address and see the Guestbook page: ```bash -$ curl http://$(pulumi stack output publicIp) +$ curl http://$(kubectl get service frontend -o jsonpath='{.status.loadBalancer.ingress[0].ip}') Guestbook From a612f1fb8bdd7f8e6406569aea99affe3d6a45cb Mon Sep 17 00:00:00 2001 From: Nelson Figueroa <30811275+nelsonfigueroa@users.noreply.github.com> Date: Thu, 22 Oct 2026 14:19:35 -0700 Subject: [PATCH 2/2] Remove example comments and note load balancer hostnames --- .../migrating-to-pulumi/from-kubernetes.md | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md b/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md index 606ca8f6a5a8..c62113f2bf46 100644 --- a/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md +++ b/content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md @@ -57,7 +57,6 @@ This Pulumi program uses `ConfigFile` to read that YAML file and provision the r ```typescript import * as k8s from "@pulumi/kubernetes"; -// Create resources from standard Kubernetes guestbook YAML example. const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { file: "guestbook-all-in-one.yaml", }); @@ -69,7 +68,6 @@ const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { ```python from pulumi_kubernetes.yaml.v2 import ConfigFile -# Create resources from standard Kubernetes guestbook YAML example. guestbook = ConfigFile("guestbook", file="guestbook-all-in-one.yaml") ``` @@ -86,7 +84,6 @@ import ( func main() { pulumi.Run(func(ctx *pulumi.Context) error { - // Create resources from standard Kubernetes guestbook YAML example. _, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ File: pulumi.String("guestbook-all-in-one.yaml"), }) @@ -114,7 +111,6 @@ class Program { return Pulumi.Deployment.RunAsync(() => { - // Create resources from standard Kubernetes guestbook YAML example. var guestbook = new ConfigFile("guestbook", new ConfigFileArgs { File = "guestbook-all-in-one.yaml", @@ -141,7 +137,6 @@ public class App { } public static void stack(Context ctx) { - // Create resources from standard Kubernetes guestbook YAML example. var guestbook = new ConfigFile("guestbook", ConfigFileArgs.builder() .file("guestbook-all-in-one.yaml") @@ -175,7 +170,6 @@ terraform { } } -# Create resources from standard Kubernetes guestbook YAML example. resource "kubernetes_yaml_v2_config_file" "guestbook" { file = "guestbook-all-in-one.yaml" } @@ -242,7 +236,6 @@ This Pulumi program uses `ConfigGroup` to read these YAML files and provision th import * as k8s from "@pulumi/kubernetes"; import * as path from "path"; -// Create resources from standard Kubernetes guestbook YAML example. const guestbook = new k8s.yaml.v2.ConfigGroup("guestbook", { files: [ path.join("yaml", "*.yaml") ], }); @@ -254,7 +247,6 @@ const guestbook = new k8s.yaml.v2.ConfigGroup("guestbook", { ```python from pulumi_kubernetes.yaml.v2 import ConfigGroup -# Create resources from standard Kubernetes guestbook YAML example. guestbook = ConfigGroup("guestbook", files=["yaml/*.yaml"]) ``` @@ -273,7 +265,6 @@ import ( func main() { pulumi.Run(func(ctx *pulumi.Context) error { - // Create resources from standard Kubernetes guestbook YAML example. _, err := yamlv2.NewConfigGroup(ctx, "guestbook", &yamlv2.ConfigGroupArgs{ Files: pulumi.StringArray{pulumi.String(filepath.Join("yaml", "*.yaml"))}, }) @@ -302,7 +293,6 @@ class Program { return Pulumi.Deployment.RunAsync(() => { - // Create resources from standard Kubernetes guestbook YAML example. var guestbook = new ConfigGroup("guestbook", new ConfigGroupArgs { Files = { Path.Combine("yaml", "*.yaml") }, @@ -329,7 +319,6 @@ public class App { } public static void stack(Context ctx) { - // Create resources from standard Kubernetes guestbook YAML example. var guestbook = new ConfigGroup("guestbook", ConfigGroupArgs.builder() .files("yaml/*.yaml") @@ -364,7 +353,6 @@ terraform { } } -# Create resources from standard Kubernetes guestbook YAML example. resource "kubernetes_yaml_v2_config_group" "guestbook" { files = ["yaml/*.yaml"] } @@ -1100,8 +1088,6 @@ The Kubernetes Guestbook by default does not assign a load balancer for the fron ```typescript import * as k8s from "@pulumi/kubernetes"; -// Create resources from standard Kubernetes guestbook YAML example, -// changing the frontend service to a load balancer. const guestbook = new k8s.yaml.v2.ConfigFile("guestbook", { file: "guestbook-all-in-one.yaml", }, { @@ -1135,8 +1121,6 @@ def make_frontend_public(args): props["spec"] = spec return pulumi.ResourceTransformResult(props=props, opts=args.opts) -# Create resources from standard Kubernetes guestbook YAML example, -# changing the frontend service to a load balancer. guestbook = ConfigFile("guestbook", file="guestbook-all-in-one.yaml", opts=pulumi.ResourceOptions(transforms=[make_frontend_public])) @@ -1157,8 +1141,6 @@ import ( func main() { pulumi.Run(func(ctx *pulumi.Context) error { - // Create resources from standard Kubernetes guestbook YAML example, - // changing the frontend service to a load balancer. _, err := yamlv2.NewConfigFile(ctx, "guestbook", &yamlv2.ConfigFileArgs{ File: pulumi.String("guestbook-all-in-one.yaml"), }, pulumi.Transforms([]pulumi.ResourceTransform{ @@ -1204,8 +1186,6 @@ class Program { return Pulumi.Deployment.RunAsync(() => { - // Create resources from standard Kubernetes guestbook YAML example, - // changing the frontend service to a load balancer. var guestbook = new ConfigFile("guestbook", new ConfigFileArgs { File = "guestbook-all-in-one.yaml", @@ -1269,6 +1249,8 @@ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.107.35.136 127.0.0.1 80:31533/TCP 24s ``` +On minikube, `minikube tunnel` assigns `127.0.0.1` as the external IP address. Some providers, like AWS, report a hostname instead of an IP address; on those clusters, replace `ip` with `hostname` in the `jsonpath` expression below. + Afterwards, we can `curl` that address and see the Guestbook page: ```bash