在 PowerShell 中管理 Kubernetes 集群是一项重要任务,本文将介绍一些实用的 Kubernetes 管理技巧。
首先,让我们看看基本的 Kubernetes 操作:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | function Get-K8sClusterInfo {
 param(
 [string]$Context
 )
 
 try {
 $kubectl = "kubectl"
 if ($Context) {
 $kubectl += " --context=$Context"
 }
 
 $nodes = & $kubectl get nodes -o json | ConvertFrom-Json
 $pods = & $kubectl get pods --all-namespaces -o json | ConvertFrom-Json
 
 return [PSCustomObject]@{
 NodeCount = $nodes.items.Count
 PodCount = $pods.items.Count
 Namespaces = ($pods.items | Select-Object -ExpandProperty metadata | Select-Object -ExpandProperty namespace -Unique).Count
 NodeStatus = $nodes.items | ForEach-Object {
 [PSCustomObject]@{
 Name = $_.metadata.name
 Status = $_.status.conditions | Where-Object { $_.type -eq "Ready" } | Select-Object -ExpandProperty status
 Version = $_.status.nodeInfo.kubeletVersion
 }
 }
 }
 }
 catch {
 Write-Host "获取集群信息失败:$_"
 }
 }
 
 | 
Kubernetes 资源部署:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | function Deploy-K8sResource {
 param(
 [string]$ManifestPath,
 [string]$Namespace,
 [string]$Context,
 [switch]$DryRun
 )
 
 try {
 $kubectl = "kubectl"
 if ($Context) {
 $kubectl += " --context=$Context"
 }
 if ($Namespace) {
 $kubectl += " -n $Namespace"
 }
 if ($DryRun) {
 $kubectl += " --dry-run=client"
 }
 
 $command = "$kubectl apply -f `"$ManifestPath`""
 Invoke-Expression $command
 
 Write-Host "资源部署完成"
 }
 catch {
 Write-Host "部署失败:$_"
 }
 }
 
 | 
Kubernetes 日志收集:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 
 | function Get-K8sLogs {
 param(
 [string]$PodName,
 [string]$Namespace,
 [string]$Container,
 [int]$Lines = 100,
 [string]$Context,
 [datetime]$Since
 )
 
 try {
 $kubectl = "kubectl"
 if ($Context) {
 $kubectl += " --context=$Context"
 }
 if ($Namespace) {
 $kubectl += " -n $Namespace"
 }
 if ($Container) {
 $kubectl += " -c $Container"
 }
 if ($Since) {
 $kubectl += " --since=$($Since.ToString('yyyy-MM-ddTHH:mm:ssZ'))"
 }
 
 $command = "$kubectl logs $PodName --tail=$Lines"
 $logs = Invoke-Expression $command
 
 return [PSCustomObject]@{
 PodName = $PodName
 Container = $Container
 Logs = $logs
 Timestamp = Get-Date
 }
 }
 catch {
 Write-Host "日志收集失败:$_"
 }
 }
 
 | 
Kubernetes 资源监控:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 
 | function Monitor-K8sResources {
 param(
 [string]$Namespace,
 [string]$Context,
 [int]$Interval = 60,
 [int]$Duration = 3600
 )
 
 try {
 $kubectl = "kubectl"
 if ($Context) {
 $kubectl += " --context=$Context"
 }
 if ($Namespace) {
 $kubectl += " -n $Namespace"
 }
 
 $startTime = Get-Date
 $metrics = @()
 
 while ((Get-Date) - $startTime).TotalSeconds -lt $Duration {
 $pods = & $kubectl get pods -o json | ConvertFrom-Json
 $nodes = & $kubectl get nodes -o json | ConvertFrom-Json
 
 $metrics += [PSCustomObject]@{
 Timestamp = Get-Date
 PodCount = $pods.items.Count
 NodeCount = $nodes.items.Count
 PodStatus = $pods.items | Group-Object { $_.status.phase } | ForEach-Object {
 [PSCustomObject]@{
 Status = $_.Name
 Count = $_.Count
 }
 }
 NodeStatus = $nodes.items | Group-Object { $_.status.conditions | Where-Object { $_.type -eq "Ready" } | Select-Object -ExpandProperty status } | ForEach-Object {
 [PSCustomObject]@{
 Status = $_.Name
 Count = $_.Count
 }
 }
 }
 
 Start-Sleep -Seconds $Interval
 }
 
 return $metrics
 }
 catch {
 Write-Host "监控失败:$_"
 }
 }
 
 | 
Kubernetes 故障排查:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 | function Debug-K8sIssues {
 param(
 [string]$PodName,
 [string]$Namespace,
 [string]$Context,
 [switch]$IncludeEvents,
 [switch]$IncludeLogs
 )
 
 try {
 $kubectl = "kubectl"
 if ($Context) {
 $kubectl += " --context=$Context"
 }
 if ($Namespace) {
 $kubectl += " -n $Namespace"
 }
 
 $diagnostics = @{
 PodStatus = & $kubectl get pod $PodName -o json | ConvertFrom-Json
 PodDescription = & $kubectl describe pod $PodName
 }
 
 if ($IncludeEvents) {
 $diagnostics.Events = & $kubectl get events --field-selector involvedObject.name=$PodName
 }
 
 if ($IncludeLogs) {
 $diagnostics.Logs = & $kubectl logs $PodName
 }
 
 return [PSCustomObject]$diagnostics
 }
 catch {
 Write-Host "故障排查失败:$_"
 }
 }
 
 | 
这些技巧将帮助您更有效地管理 Kubernetes 集群。记住,在处理 Kubernetes 资源时,始终要注意集群的安全性和稳定性。同时,建议在处理大型集群时使用适当的资源限制和监控机制。