Kubernetes - Inspect Resources

Octopus.KubernetesRunScript exported 2020-04-22 by mcasperson belongs to ‘Kubernetes’ category.

Inspect K8S resources with common actions like get, describe and logs. Optionally create artifacts containing the output.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Resource

K8SInspectResource = pod

The type of Kubernetes resource to inspect. The list provided is not comprehensive, and any resource can be used if the field is bound.

Kubectl Verb

K8SInspectKubectlVerb = get

The action used to inspect the Kubernetes resource.

Resource Names

K8SInspectNames =

An optional line break separated list of resources to inspect. If left blank, all resources are inspected. An asterisk can be used as a wildcard.

Create Artifact

K8SInspectCreateArtifact = False

Check this to create an artifact capturing the output of the kubectl command.

Namespace

K8SInspectNamespace =

The Kubernetes namespace to inspect. Leave blank to use the default namespace of the Kubernetes target.

Script body

Steps based on this template will execute the following PowerShell script.

<#
    This script provides a general purpose method for querying Kubernetes resources. It supports common operations
    like get, describe, logs and output formats like yaml and json. Output can be captured as artifacts.
#>

<#
.Description
Execute an application, capturing the output. Based on https://stackoverflow.com/a/33652732/157605
#>
Function Execute-Command ($commandPath, $commandArguments)
{
  Write-Host "Executing: $commandPath $($commandArguments -join " ")"
  
  Try {
    $pinfo = New-Object System.Diagnostics.ProcessStartInfo
    $pinfo.FileName = $commandPath
    $pinfo.RedirectStandardError = $true
    $pinfo.RedirectStandardOutput = $true
    $pinfo.UseShellExecute = $false
    $pinfo.Arguments = $commandArguments
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = $pinfo
    $p.Start() | Out-Null
    [pscustomobject]@{
        stdout = $p.StandardOutput.ReadToEnd()
        stderr = $p.StandardError.ReadToEnd()
        ExitCode = $p.ExitCode
    }
    $p.WaitForExit()
  }
  Catch {
     exit
  }
}

<#
.Description
Find any resource names that match a wildcard input if one was specified
#>
function Get-Resources() 
{
    $names = $OctopusParameters["K8SInspectNames"] -Split "`n" | % {$_.Trim()}
    
    if ($OctopusParameters["K8SInspectNames"] -match '\*' )
    {
        return Execute-Command kubectl (@("-o", "json", "get", $OctopusParameters["K8SInspectResource"])) |
            # Select the stdout property from the execution
            Select-Object -ExpandProperty stdout |
            # Convert the output from JSON
            ConvertFrom-JSON | 
            # Get the items object from the kubectl response
            % {if ((Get-Member -InputObject $_ -Name items).Count -ne 0) {Select-Object -InputObject $_ -ExpandProperty items} else {$_}} |
            # Extract the name
            % {$_.metadata.name} |
            # Find any matching resources
            ? {$k8sName = $_; ($names | ? {$k8sName -like $_}).Count -ne 0}
    }
    else
    {
        return $names
    }
}

<#
.Description
Get the kubectl arguments for a given action
#>
function Get-KubectlVerb() 
{
    switch($OctopusParameters["K8SInspectKubectlVerb"])
    {
        "get json" {return ,@("-o", "json", "get")}
        "get yaml" {return ,@("-o", "yaml", "get")}
        "describe" {return ,@("describe")}
        "logs" {return ,@("logs")}
        "logs tail" {return ,@("logs", "--tail", "100")}
        "previous logs" {return ,@("logs", "--previous")}
        "previous logs tail" {return ,@("logs", "--previous", "--tail", "100")}
        default {return ,@("get")}
    }
}

<#
.Description
Get an appropiate file extension based on the selected action
#>
function Get-ArtifactExtension() 
{
   switch($OctopusParameters["K8SInspectKubectlVerb"])
    {
        "get json" {"json"}
        "get yaml" {"yaml"}
        default {"txt"}
    }
}

if ($OctopusParameters["K8SInspectKubectlVerb"] -like "*logs*") 
{
    if ( -not @($OctopusParameters["K8SInspectResource"]) -like "pod*")
    {
        Write-Error "Logs can only be returned for pods, not $($OctopusParameters["K8SInspectResource"])"
    }
    else
    {
        Execute-Command kubectl (@("-o", "json", "get", "pods") + (Get-Resources)) |
            # Select the stdout property from the execution
            Select-Object -ExpandProperty stdout |
            # Convert the output from JSON
            ConvertFrom-JSON | 
            # Get the items object from the kubectl response
            % {if ((Get-Member -InputObject $_ -Name items).Count -ne 0) {Select-Object -InputObject $_ -ExpandProperty items} else {$_}} |
            # Get the pod logs for each container
            % {
                $podDetails = $_
                @{
                    logs=$podDetails.spec.containers | % {$logs=""} {$logs += (Select-Object -InputObject (Execute-Command kubectl ((Get-KubectlVerb) + @($podDetails.metadata.name, "-c", $_.name))) -ExpandProperty stdout)} {$logs}; 
                    name=$podDetails.metadata.name
                }                
            } |
            # Write the output
            % {Write-Host $_.logs; $_} |
            # Optionally capture the artifact
            % {
                if ($OctopusParameters["K8SInspectCreateArtifact"] -ieq "true") 
                {
                    Set-Content -Path "$($_.name).$(Get-ArtifactExtension)" -Value $_.logs
                    New-OctopusArtifact "$($_.name).$(Get-ArtifactExtension)"
                }
            }
    }      
}
else
{
    Execute-Command kubectl ((Get-KubectlVerb) + @($OctopusParameters["K8SInspectResource"]) + (Get-Resources)) |
        % {Select-Object -InputObject $_ -ExpandProperty stdout} |
        % {Write-Host $_; $_} |
        % {
            if ($OctopusParameters["K8SInspectCreateArtifact"] -ieq "true") 
            {
                Set-Content -Path "output.$(Get-ArtifactExtension)" -Value $_
                New-OctopusArtifact "output.$(Get-ArtifactExtension)"
            }
        }
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "53fe7e02-d003-4860-bf15-1122a128d7c0",
  "Name": "Kubernetes - Inspect Resources",
  "Description": "Inspect K8S resources with common actions like get, describe and logs. Optionally create artifacts containing the output.",
  "Version": 6,
  "ExportedAt": "2020-04-22T01:41:35.012Z",
  "ActionType": "Octopus.KubernetesRunScript",
  "Author": "mcasperson",
  "Packages": [],
  "Parameters": [
    {
      "Id": "8a1ebc8c-ddf3-42bb-be49-9b36ee417f5d",
      "Name": "K8SInspectResource",
      "Label": "Resource",
      "HelpText": "The type of Kubernetes resource to inspect. The list provided is not comprehensive, and any resource can be used if the field is bound.",
      "DefaultValue": "pod",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "pod|Pod\nservice|Service\ningress|Ingress\ndeployment|Deployment\nstatefulset|StatefulSet\ndaemonset|DaemonSet\nreplicaset|ReplicaSet\nconfigmap|ConfigMap\nsecret|Secret\nnode|Node\nvirtualservice|VirtualService\ngateway|Gateway\npersistentvolume|PersistentVolume\nserviceaccount|Service Account\nrolebinding|Role Binding\nclusterrolebinding|Cluster Role Binding\nrole|Role\nclusterrole|Cluster Role"
      }
    },
    {
      "Id": "735e2fa4-4f9a-4183-aafe-653f3f6fb103",
      "Name": "K8SInspectKubectlVerb",
      "Label": "Kubectl Verb",
      "HelpText": "The action used to inspect the Kubernetes resource.",
      "DefaultValue": "get",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "get|Get\nget json|Get JSON\nget yaml|Get YAML\nlogs|Pod Logs\nlogs tail|Pod Logs Tail\nprevious logs|Previous Pod Logs\nprevious logs tail|Previous Pod Logs Tail\ndescribe|Describe"
      }
    },
    {
      "Id": "9c9dcd65-07eb-4e7d-a61a-370d35d1cf76",
      "Name": "K8SInspectNames",
      "Label": "Resource Names",
      "HelpText": "An optional line break separated list of resources to inspect. If left blank, all resources are inspected. An asterisk can be used as a wildcard.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      }
    },
    {
      "Id": "4805afba-9ff9-45a6-b2c2-764c2d0e5240",
      "Name": "K8SInspectCreateArtifact",
      "Label": "Create Artifact",
      "HelpText": "Check this to create an artifact capturing the output of the kubectl command.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "da70800b-0ec2-4bef-918c-08ef88c9f411",
      "Name": "K8SInspectNamespace",
      "Label": "Namespace",
      "HelpText": "The Kubernetes namespace to inspect. Leave blank to use the default namespace of the Kubernetes target.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "<#\n    This script provides a general purpose method for querying Kubernetes resources. It supports common operations\n    like get, describe, logs and output formats like yaml and json. Output can be captured as artifacts.\n#>\n\n<#\n.Description\nExecute an application, capturing the output. Based on https://stackoverflow.com/a/33652732/157605\n#>\nFunction Execute-Command ($commandPath, $commandArguments)\n{\n  Write-Host \"Executing: $commandPath $($commandArguments -join \" \")\"\n  \n  Try {\n    $pinfo = New-Object System.Diagnostics.ProcessStartInfo\n    $pinfo.FileName = $commandPath\n    $pinfo.RedirectStandardError = $true\n    $pinfo.RedirectStandardOutput = $true\n    $pinfo.UseShellExecute = $false\n    $pinfo.Arguments = $commandArguments\n    $p = New-Object System.Diagnostics.Process\n    $p.StartInfo = $pinfo\n    $p.Start() | Out-Null\n    [pscustomobject]@{\n        stdout = $p.StandardOutput.ReadToEnd()\n        stderr = $p.StandardError.ReadToEnd()\n        ExitCode = $p.ExitCode\n    }\n    $p.WaitForExit()\n  }\n  Catch {\n     exit\n  }\n}\n\n<#\n.Description\nFind any resource names that match a wildcard input if one was specified\n#>\nfunction Get-Resources() \n{\n    $names = $OctopusParameters[\"K8SInspectNames\"] -Split \"`n\" | % {$_.Trim()}\n    \n    if ($OctopusParameters[\"K8SInspectNames\"] -match '\\*' )\n    {\n        return Execute-Command kubectl (@(\"-o\", \"json\", \"get\", $OctopusParameters[\"K8SInspectResource\"])) |\n            # Select the stdout property from the execution\n            Select-Object -ExpandProperty stdout |\n            # Convert the output from JSON\n            ConvertFrom-JSON | \n            # Get the items object from the kubectl response\n            % {if ((Get-Member -InputObject $_ -Name items).Count -ne 0) {Select-Object -InputObject $_ -ExpandProperty items} else {$_}} |\n            # Extract the name\n            % {$_.metadata.name} |\n            # Find any matching resources\n            ? {$k8sName = $_; ($names | ? {$k8sName -like $_}).Count -ne 0}\n    }\n    else\n    {\n        return $names\n    }\n}\n\n<#\n.Description\nGet the kubectl arguments for a given action\n#>\nfunction Get-KubectlVerb() \n{\n    switch($OctopusParameters[\"K8SInspectKubectlVerb\"])\n    {\n        \"get json\" {return ,@(\"-o\", \"json\", \"get\")}\n        \"get yaml\" {return ,@(\"-o\", \"yaml\", \"get\")}\n        \"describe\" {return ,@(\"describe\")}\n        \"logs\" {return ,@(\"logs\")}\n        \"logs tail\" {return ,@(\"logs\", \"--tail\", \"100\")}\n        \"previous logs\" {return ,@(\"logs\", \"--previous\")}\n        \"previous logs tail\" {return ,@(\"logs\", \"--previous\", \"--tail\", \"100\")}\n        default {return ,@(\"get\")}\n    }\n}\n\n<#\n.Description\nGet an appropiate file extension based on the selected action\n#>\nfunction Get-ArtifactExtension() \n{\n   switch($OctopusParameters[\"K8SInspectKubectlVerb\"])\n    {\n        \"get json\" {\"json\"}\n        \"get yaml\" {\"yaml\"}\n        default {\"txt\"}\n    }\n}\n\nif ($OctopusParameters[\"K8SInspectKubectlVerb\"] -like \"*logs*\") \n{\n    if ( -not @($OctopusParameters[\"K8SInspectResource\"]) -like \"pod*\")\n    {\n        Write-Error \"Logs can only be returned for pods, not $($OctopusParameters[\"K8SInspectResource\"])\"\n    }\n    else\n    {\n        Execute-Command kubectl (@(\"-o\", \"json\", \"get\", \"pods\") + (Get-Resources)) |\n            # Select the stdout property from the execution\n            Select-Object -ExpandProperty stdout |\n            # Convert the output from JSON\n            ConvertFrom-JSON | \n            # Get the items object from the kubectl response\n            % {if ((Get-Member -InputObject $_ -Name items).Count -ne 0) {Select-Object -InputObject $_ -ExpandProperty items} else {$_}} |\n            # Get the pod logs for each container\n            % {\n                $podDetails = $_\n                @{\n                    logs=$podDetails.spec.containers | % {$logs=\"\"} {$logs += (Select-Object -InputObject (Execute-Command kubectl ((Get-KubectlVerb) + @($podDetails.metadata.name, \"-c\", $_.name))) -ExpandProperty stdout)} {$logs}; \n                    name=$podDetails.metadata.name\n                }                \n            } |\n            # Write the output\n            % {Write-Host $_.logs; $_} |\n            # Optionally capture the artifact\n            % {\n                if ($OctopusParameters[\"K8SInspectCreateArtifact\"] -ieq \"true\") \n                {\n                    Set-Content -Path \"$($_.name).$(Get-ArtifactExtension)\" -Value $_.logs\n                    New-OctopusArtifact \"$($_.name).$(Get-ArtifactExtension)\"\n                }\n            }\n    }      \n}\nelse\n{\n    Execute-Command kubectl ((Get-KubectlVerb) + @($OctopusParameters[\"K8SInspectResource\"]) + (Get-Resources)) |\n        % {Select-Object -InputObject $_ -ExpandProperty stdout} |\n        % {Write-Host $_; $_} |\n        % {\n            if ($OctopusParameters[\"K8SInspectCreateArtifact\"] -ieq \"true\") \n            {\n                Set-Content -Path \"output.$(Get-ArtifactExtension)\" -Value $_\n                New-OctopusArtifact \"output.$(Get-ArtifactExtension)\"\n            }\n        }\n}\n",
    "Octopus.Action.KubernetesContainers.Namespace": "#{if K8SInspectNamespace}#{K8SInspectNamespace}#{/if}#{unless K8SInspectNamespace}#{Octopus.Action.Kubernetes.Namespace}#{/unless}"
  },
  "Category": "Kubernetes",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/k8s-inspect-resource-pwsh.json",
  "Website": "/step-templates/53fe7e02-d003-4860-bf15-1122a128d7c0",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Wednesday, April 22, 2020