Posted in

Go语言环境搭建全链路实战(从下载到Hello World验证)

第一章:Go语言环境搭建全链路实战(从下载到Hello World验证)

下载与安装Go二进制包

访问官方下载页面 https://go.dev/dl/,根据操作系统选择对应安装包(如 macOS ARM64 选 go1.22.5.darwin-arm64.pkg,Ubuntu x86_64 选 go1.22.5.linux-amd64.tar.gz)。Windows 用户直接运行 .msi 安装向导;macOS/Linux 用户解压后将 go 目录移动至 /usr/local

# Linux/macOS 示例(需 sudo 权限)
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz

配置环境变量

确保 GOROOT 指向安装路径(默认 /usr/local/go),并将 $GOROOT/bin 加入 PATH。在 ~/.bashrc~/.zshrc 中添加:

export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/go  # 可选:自定义工作区路径

执行 source ~/.zshrc(或对应 shell 配置文件)使生效,验证安装:

go version  # 应输出类似 "go version go1.22.5 linux/amd64"
go env GOROOT  # 确认路径正确

创建并运行第一个Go程序

新建项目目录并初始化模块:

mkdir hello-world && cd hello-world
go mod init hello-world  # 生成 go.mod 文件

创建 main.go 文件:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!") // Go 程序入口必须是 main 包且含 main 函数
}

运行程序:

go run main.go  # 输出:Hello, World!

若需编译为可执行文件,使用 go build -o hello main.go,随后直接执行 ./hello

关键环境变量 作用说明
GOROOT Go 安装根目录,由安装程序自动设置,不建议手动修改
GOPATH 工作区路径(存放 src/pkg/bin),Go 1.16+ 后非必需,但影响 go get 行为
GO111MODULE 设为 on 强制启用模块模式(推荐),避免依赖 $GOPATH

所有步骤均支持离线验证:go versiongo envgo run 三者全部成功即表示环境就绪。

第二章:Go语言安装包获取与本地部署

2.1 Go官方发布渠道解析与版本选型策略

Go 的稳定发布始终通过 go.dev/dl 官方下载页统一分发,支持 macOS、Linux、Windows 多平台二进制包及源码归档。

主要发布类型

  • 稳定版(Stable):每6个月发布一次(如 go1.22.0),经全栈回归测试,推荐生产环境使用
  • 预发布版(RC):发布前2–3周提供 go1.22.0rc1,用于生态兼容性验证
  • 安全补丁版(Patch):如 go1.21.13,仅修复高危漏洞,不引入新特性

版本号语义解析

字段 示例 go1.22.0 说明
主版本 1 向后兼容性承诺锚点(迄今未变)
次版本 22 功能增量标识(对应年份Q2)
修订号 补丁级别(非零即含安全/关键修复)
# 查看当前安装版本及构建信息
go version -m $(which go)

输出含 goversion go1.22.0build id,可用于校验二进制完整性;-m 参数强制解析可执行文件元数据,避免环境变量干扰。

graph TD
    A[访问 go.dev/dl] --> B{选择目标平台}
    B --> C[下载 .tar.gz/.msi/.pkg]
    C --> D[校验 SHA256 签名]
    D --> E[解压并更新 PATH]

2.2 Windows平台MSI安装包全流程实操与注册表验证

创建基础MSI包(WiX Toolset)

使用candle + light编译.wxs源文件:

<!-- product.wxs -->
<Wix xmlns="http://wixtoolset.org/schemas/v4.0/wix">
  <Product Id="*" UpgradeCode="A1B2C3D4-E5F6-7890-G1H2-I3J4K5L6M7N8"
           Version="1.0.0" Language="1033" Name="DemoApp" Manufacturer="ITLab">
    <Package InstallerVersion="200" Compressed="yes"/>
    <Feature Id="MainFeature" Title="Main Application" Level="1">
      <Component Directory="INSTALLDIR" Guid="*">
        <File Source="app.exe" KeyPath="yes"/>
      </Component>
    </Feature>
  </Product>
</Wix>

candle product.wxs生成.wixobjlight product.wixobj链接为DemoApp.msiGuid="*"启用自动生成,KeyPath="yes"标记主文件用于组件状态判定。

安装与注册表写入验证

MSI默认在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{GUID}写入卸载元数据。可通过PowerShell快速验证:

Get-ItemProperty "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*" |
  Where-Object {$_.DisplayName -eq "DemoApp"} |
  Select DisplayName, DisplayVersion, InstallDate, UninstallString

关键注册表路径对照表

注册表位置 用途 是否由MSI自动写入
HKLM\SOFTWARE\Classes\MyApp.File\shell\open\command 文件关联 否(需CustomAction)
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{GUID} 卸载入口 是(必需)
HKLM\SYSTEM\CurrentControlSet\Services\MyService 服务配置 否(需ServiceInstall表)

安装流程可视化

graph TD
  A[编写.wxs源码] --> B[candle编译为.wixobj]
  B --> C[light链接为.msi]
  C --> D[msiexec /i DemoApp.msi /l*v log.txt]
  D --> E[验证HKLM\...\Uninstall\{GUID}]

2.3 macOS平台Homebrew与.pkg双路径安装对比实践

安装方式本质差异

Homebrew 采用源码编译或预编译二进制(bottle)注入 /opt/homebrew(Apple Silicon)或 /usr/local(Intel),全程由 brew 管理依赖图与版本生命周期;.pkg 安装器则通过 Installer.app 执行脚本,将文件写入系统受保护路径(如 /Applications/usr/bin),绕过 Homebrew 的沙箱控制。

典型安装命令对比

# Homebrew 方式(自动解析依赖、可回滚)
brew install wget --debug  # --debug 输出详细解析日志

# .pkg 方式(静默安装,无依赖感知)
sudo installer -pkg wget-1.21.4.pkg -target /  # -target 指定卷宗根路径

--debug 参数揭示 Homebrew 如何递归解析 curlopenssl 等隐式依赖;-target / 强制写入根卷,但可能触发 SIP 保护导致 /usr/bin 写入失败。

权限与可维护性对照

维度 Homebrew .pkg
升级机制 brew update && brew upgrade 需厂商提供新版 pkg 或手动卸载
卸载粒度 brew uninstall wget(干净) pkgutil --pkgs \| grep wgetsudo pkgutil --forget(残留风险高)

环境隔离示意

graph TD
    A[用户执行 brew install] --> B[Homebrew 解析 bottle URL]
    B --> C[下载至 /opt/homebrew/var/cache]
    C --> D[解压至 /opt/homebrew/Cellar/wget/1.21.4]
    D --> E[创建符号链接到 /opt/homebrew/bin/wget]
    F[.pkg 安装] --> G[运行 preinstall 脚本]
    G --> H[直接 cp 到 /usr/local/bin/wget]
    H --> I[无版本目录隔离,覆盖即丢失旧版]

2.4 Linux平台源码编译安装深度剖析(含GCC依赖与构建参数调优)

源码编译本质是将人类可读的C/C++代码,经预处理、编译、汇编、链接四阶段,转化为可执行二进制。其核心依赖链为:glibcbinutilsGCC(自身需用旧版GCC构建)。

关键构建参数语义解析

./configure \
  --prefix=/opt/myapp \        # 安装根路径,影响后续RPATH和pkg-config搜索
  --enable-shared \            # 生成共享库(.so),减小体积并支持运行时加载
  --with-system-zlib \         # 复用系统zlib而非静态捆绑,避免符号冲突与安全更新滞后
  CFLAGS="-O2 -march=native -flto=auto"  # 启用LTO跨模块优化,提升性能约5–12%

-flto=auto 触发GCC在链接时重做全程序优化;-march=native 激活CPU特有指令集(如AVX2),但牺牲可移植性。

典型依赖关系图

graph TD
  A[源码 tarball] --> B[autogen.sh / configure]
  B --> C[Makefile 生成]
  C --> D[make -j$(nproc)]
  D --> E[make install]
  E --> F[/opt/myapp/bin/]
参数类别 示例 影响维度
架构优化 -march=skylake 性能/兼容性权衡
调试支持 -g -O0 体积增大300%,禁用优化
安全加固 -fstack-protector-strong 防止栈溢出攻击

2.5 容器化环境(Docker)中Go SDK的轻量化部署方案

为降低镜像体积与启动延迟,推荐采用多阶段构建 + 静态链接编译策略:

# 构建阶段:编译Go二进制(含SDK依赖)
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-s -w' -o app .

# 运行阶段:仅含可执行文件的极简环境
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]

CGO_ENABLED=0 禁用Cgo确保纯静态链接;-s -w 剥离符号表与调试信息,使最终镜像压缩后

关键优化对比

优化项 传统单阶段 多阶段+静态链接
最终镜像大小 ~480 MB ~11.2 MB
启动耗时(冷启) 320 ms 47 ms

构建流程示意

graph TD
    A[源码与go.mod] --> B[Builder:编译静态二进制]
    B --> C[Alpine运行时]
    C --> D[无依赖、零共享库]

第三章:Go核心环境变量原理与作用域分析

3.1 GOPATH、GOROOT、GOBIN三者关系与生命周期管理

Go 早期依赖三个核心环境变量协同工作,它们定义了工具链、源码与二进制的边界。

三者职责划分

  • GOROOT:Go 安装根目录(如 /usr/local/go),存放编译器、标准库、go 命令本身;
  • GOPATH:用户工作区(默认 $HOME/go),含 src/(源码)、pkg/(编译缓存)、bin/(安装的可执行文件);
  • GOBIN:显式指定 go install 输出二进制路径,若未设则默认为 $GOPATH/bin

环境变量优先级示例

export GOROOT=/opt/go1.20
export GOPATH=$HOME/myproject
export GOBIN=$HOME/bin  # 覆盖默认 bin 路径

此配置下:go build 使用 /opt/go1.20 的工具链编译 $HOME/myproject/src/... 中的代码,go install 将生成的二进制写入 $HOME/bin完全绕过 $GOPATH/binGOBIN 优先级高于 GOPATH/bin,体现显式控制权上移。

生命周期演进对比

阶段 GOPATH 模式 Go Modules 模式
依赖存储 $GOPATH/pkg/mod 项目内 go.mod + $GOPATH/pkg/mod 共享缓存
构建作用域 全局工作区 当前模块(go.mod 目录树)
GOBIN 作用 仍控制 install 输出位置 不影响 go run,但 go install 仍受其约束
graph TD
    A[go command 执行] --> B{是否在 module-aware 模式?}
    B -->|是| C[忽略 GOPATH/src 路径解析<br/>依赖 go.mod 定位包]
    B -->|否| D[严格按 GOPATH/src 查找 import 路径]
    C --> E[GOBIN 决定 install 输出目标]
    D --> E

3.2 GO111MODULE与GOSUMDB在模块化开发中的协同机制

GO111MODULE 控制模块启用状态,GOSUMDB 则负责校验模块完整性,二者构成 Go 模块信任链的双支柱。

数据同步机制

go get 下载依赖时:

  • GO111MODULE=on,Go 启用模块模式,忽略 vendorGOPATH/src
  • 每次下载后自动向 GOSUMDB(默认 sum.golang.org)查询并验证 go.sum 中的哈希值。
# 启用模块并禁用校验(仅用于调试)
GO111MODULE=on GOSUMDB=off go get github.com/example/lib@v1.2.0

此命令跳过校验,但会警告 sum: disabled;生产环境严禁 GOSUMDB=off,否则失去防篡改能力。

协同流程

graph TD
    A[go get] --> B{GO111MODULE=on?}
    B -->|Yes| C[解析 go.mod]
    C --> D[下载模块 zip]
    D --> E[向 GOSUMDB 查询 checksum]
    E --> F[写入 go.sum 并校验]
环境变量 推荐值 作用
GO111MODULE on(推荐) 强制启用模块语义
GOSUMDB sum.golang.org 验证模块哈希,防供应链攻击

3.3 CGO_ENABLED与交叉编译环境变量的底层影响验证

CGO_ENABLED 的核心作用

CGO_ENABLED 控制 Go 工具链是否启用 cgo 支持。值为 时强制禁用,生成纯静态链接的二进制;为 1(默认)则允许调用 C 代码,但依赖目标平台的 C 工具链。

交叉编译的关键约束

# 尝试在 Linux 上交叉编译 macOS 二进制(含 CGO)
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -o app-darwin main.go
# ❌ 失败:需 darwin/arm64 的 cc,本地无对应 C 编译器

逻辑分析CGO_ENABLED=1 会触发 CC_FOR_TARGET 查找(如 clang --target=arm64-apple-darwin),若未配置或不匹配,则报 exec: "clang": executable file not foundCGO_ENABLED=0 则跳过所有 C 依赖,仅用 Go 运行时。

环境变量组合行为对比

CGO_ENABLED GOOS/GOARCH 结果
darwin/arm64 ✅ 成功(纯 Go)
1 linux/amd64 ✅ 默认本地编译
1 windows/arm64 ❌ 需 MinGW-w64 工具链
graph TD
    A[go build] --> B{CGO_ENABLED=1?}
    B -->|Yes| C[调用 CC_FOR_TARGET]
    B -->|No| D[纯 Go 链接器]
    C --> E[检查 C 工具链可用性]
    E -->|失败| F[编译中断]

第四章:多平台环境变量配置与持久化落地

4.1 Windows系统PowerShell与CMD双终端下的PATH与GOPATH配置实操

环境变量差异本质

PowerShell 使用 $env:PATH$env:GOPATH,而 CMD 依赖 %PATH%%GOPATH%。二者不自动同步,需分别配置。

配置步骤(以 Go 1.22 为例)

  • 下载安装 Go 并解压至 C:\Go
  • 创建工作区:C:\Users\Alice\go
  • 设置 GOPATH(非必须但推荐显式声明)

PowerShell 配置(永久生效)

# 添加 Go bin 到 PATH,同时设置 GOPATH
$goBin = "C:\Go\bin"
$userGoPath = "C:\Users\Alice\go"
$env:PATH += ";$goBin;$userGoPath\bin"
$env:GOPATH = $userGoPath
# 写入当前用户配置文件
"if (`$null -eq `$env:GOPATH) { `$env:GOPATH = 'C:\Users\Alice\go' }" | Out-File -Append $PROFILE
"if (`$null -eq `$env:PATH -or !(`$env:PATH -like '*C:\Go\bin*')) { `$env:PATH += ';C:\Go\bin;C:\Users\Alice\go\bin' }" | Out-File -Append $PROFILE

逻辑分析$PROFILE 是 PowerShell 启动时自动执行的脚本;-Append 避免重复写入;条件判断防止多次叠加 PATH;$env: 前缀表示当前会话环境变量,仅对当前终端有效,故需持久化到配置文件。

CMD 配置(管理员权限运行)

setx PATH "%PATH%;C:\Go\bin;C:\Users\Alice\go\bin" /M
setx GOPATH "C:\Users\Alice\go" /M

/M 表示系统级写入(需管理员权限),否则仅影响当前用户。setx 不影响当前 CMD 窗口,新窗口生效。

双终端验证对比表

终端类型 查看 PATH 命令 查看 GOPATH 命令 是否立即生效
PowerShell $env:PATH $env:GOPATH 是(当前会话)
CMD echo %PATH% echo %GOPATH% 否(需新开窗口)

配置一致性保障流程

graph TD
    A[编辑 PowerShell $PROFILE] --> B[重启 PowerShell]
    C[执行 setx /M] --> D[重启 CMD]
    B --> E[运行 go env GOPATH]
    D --> E
    E --> F{输出一致?}
    F -->|是| G[配置完成]
    F -->|否| H[检查路径拼写与权限]

4.2 macOS Catalina+ zshrc与profile文件的优先级判定与安全写入

macOS Catalina 起默认 Shell 切换为 zsh,启动时加载顺序直接影响环境变量与函数定义的最终状态。

加载优先级链

zsh 启动时按以下顺序读取(首次匹配即停止):

  • /etc/zshenv~/.zshenv
  • /etc/zprofile~/.zprofile
  • /etc/zshrc~/.zshrc
  • /etc/zlogin~/.zlogin

⚠️ 注意:~/.profile 仅在未找到 ~/.zprofile 时被 zsh 读取;若两者共存,~/.profile 被完全忽略。

安全写入实践

使用原子重定向避免中断导致配置损坏:

# 安全追加 PATH(避免重复)
printf '\nexport PATH="/opt/homebrew/bin:$PATH"\n' >> ~/.zshrc.tmp && \
  mv ~/.zshrc.tmp ~/.zshrc && \
  source ~/.zshrc
  • printf 避免 echo -e 的跨平台行为差异
  • .tmp 中转确保写入原子性,防止 source 时读到截断配置
  • source 在后台执行前验证语法:zsh -n ~/.zshrc

加载时机对比表

文件 登录 Shell 非登录 Shell 是否推荐用于 PATH
~/.zshrc ✅(交互式会话)
~/.zprofile ✅(登录初始化)
graph TD
    A[Terminal 启动] --> B{是否为登录 Shell?}
    B -->|是| C[读 ~/.zprofile]
    B -->|否| D[读 ~/.zshrc]
    C --> E[再读 ~/.zshrc]
    D --> F[完成初始化]

4.3 Linux Bash/Zsh下环境变量分层加载(/etc/profile.d/ vs ~/.bashrc)实战

Linux Shell 启动时按会话类型(登录/非登录、交互/非交互)触发不同配置文件链。关键差异在于加载时机与作用域:

加载顺序与作用域对比

文件位置 触发条件 生效范围 是否支持通配执行
/etc/profile 登录 Shell 首次读取 全局(所有用户)
/etc/profile.d/*.sh /etc/profile 显式调用 全局 ✅(按字典序)
~/.bashrc 交互式非登录 Shell(如终端新标签) 当前用户私有 ❌(需手动 source)

/etc/profile.d/ 的典型实践

# /etc/profile.d/java-env.sh
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"

逻辑分析:该脚本由 /etc/profile 中的 for i in /etc/profile.d/*.sh; do ... 循环自动 sourced。export 确保变量向子进程传递;$PATH 前置插入保证 java 命令优先匹配系统 JDK。

用户级覆盖机制

# ~/.bashrc 中追加(不覆盖全局,仅增强)
if [ -n "$JAVA_HOME" ]; then
  export MAVEN_HOME="$HOME/tools/apache-maven"
  export PATH="$MAVEN_HOME/bin:$PATH"
fi

参数说明[ -n "$JAVA_HOME" ] 判断全局变量已定义后再扩展,避免冲突;$HOME 确保路径用户隔离。

graph TD
  A[Login Shell] --> B[/etc/profile]
  B --> C[/etc/profile.d/*.sh]
  C --> D[~/.bash_profile]
  D --> E[~/.bashrc]
  F[Non-login Interactive Shell] --> E

4.4 IDE(VS Code / GoLand)中环境变量继承机制与调试会话覆盖技巧

IDE 启动时自动继承系统及 Shell 环境变量,但调试会话默认不继承终端启动时的动态变量(如 source .envrc 加载的值)。

环境变量加载优先级

  • 系统级(/etc/environment)→ 用户级(~/.profile)→ IDE 启动方式(桌面快捷方式 vs 终端 code .

调试会话覆盖策略

VS Code:通过 launch.json 显式注入
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch with ENV",
      "type": "go",
      "request": "launch",
      "mode": "test",
      "env": {
        "GIN_MODE": "debug",
        "DATABASE_URL": "sqlite://./test.db"
      }
    }
  ]
}

env 字段完全覆盖继承值,不合并;若需继承+扩展,须在 envFile 中声明基础变量文件(如 .env.debug),再用 env 覆盖关键项。

GoLand:运行配置中的 Environment Variables 面板
设置项 行为说明
Pass parent environment variables ✅ 启用则继承系统 + Shell 启动时变量
Environment variables 编辑框 键值对格式,后写覆盖先写,支持 $PATH 引用
graph TD
  A[IDE 启动] --> B{是否从终端执行?}
  B -->|是| C[继承当前 Shell 环境]
  B -->|否| D[仅加载系统/用户级静态变量]
  C --> E[调试会话默认继承 C]
  D --> F[需显式配置 env/envFile]

第五章:Hello World验证与环境健康度自检

执行首个容器化 Hello World

在完成 Kubernetes 集群部署与 Helm 工具链配置后,我们立即执行端到端验证。使用以下命令一键部署最小化 Nginx 服务并暴露至集群外部:

kubectl create deployment hello-world --image=nginx:1.25-alpine
kubectl expose deployment hello-world --port=80 --type=NodePort
kubectl get services hello-world -o wide

输出中 NODE_PORT 字段显示为 31287,结合任一工作节点 IP(如 192.168.10.12),通过 curl http://192.168.10.12:31287 成功返回 <h1>Welcome to nginx!</h1> —— 这标志着控制平面、网络插件(Calico)、CNI 与 kube-proxy 协同工作正常。

多维度健康度自检清单

检查项 命令示例 预期状态 异常响应示例
控制平面组件就绪 kubectl get componentstatuses Healthy UnknownUnhealthy
节点资源与条件 kubectl get nodes -o wide && kubectl describe node worker-01 Ready + MemoryPressure=False NotReadyDiskPressure=True
CoreDNS 解析能力 kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local 返回 10.96.0.1 server can't find ...: NXDOMAIN

自动化健康巡检脚本

以下 Bash 脚本整合了 7 类关键指标校验,支持定时注入 CronJob 并将结果写入 Prometheus Pushgateway:

#!/bin/bash
echo "=== Cluster Health Snapshot $(date) ==="
echo "API Server Latency: $(kubectl get --raw='/readyz?verbose' 2>/dev/null | grep 'etcd' | wc -l)/3 OK"
echo "Pods Running: $(kubectl get pods --all-namespaces --field-selector status.phase=Running | wc -l)"
echo "CoreDNS Endpoints: $(kubectl get endpoints -n kube-system coredns -o jsonpath='{.subsets[*].addresses[*].ip}' | wc -w)"

可视化诊断流程

通过 Mermaid 绘制故障定位路径,覆盖从服务不可达到底层组件失效的逐级下钻逻辑:

flowchart TD
    A[Service Unreachable] --> B{curl NodePort success?}
    B -->|Yes| C[Check Ingress Controller]
    B -->|No| D{Endpoint IPs exist?}
    D -->|No| E[Check kube-proxy logs]
    D -->|Yes| F[Check Pod readiness probe]
    F -->|Failed| G[Inspect container livenessProbe config]

真实故障复现:证书过期引发的级联失败

某生产集群在运行 366 天后出现 kubectl get nodes 卡顿。执行 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates 发现 notAfter=May 12 08:42:31 2024 GMT。手动轮换证书后,kubeadm certs renew apiserversystemctl restart kubelet 组合操作耗时 92 秒即恢复全部 API 响应能力,验证了证书生命周期管理必须纳入 CI/CD 流水线。

日志聚合验证要点

部署 Fluent Bit DaemonSet 后,检查其是否捕获关键组件日志:

  • 在 Kibana 中筛选 kubernetes.namespace_name: \"kube-system\" AND log: \"started\"
  • 确认每分钟内 kube-apiserverkube-controller-manageretcd 三条日志流时间戳偏差
  • calico-node 日志缺失,需核查 hostNetwork: true 设置与 /var/log/calico/ 目录挂载权限

网络策略连通性压测

创建测试命名空间并部署双向通信 Pod 对:

kubectl create ns net-test
kubectl run client --image=alpine:3.19 -n net-test -- sh -c "apk add curl && sleep 3600"
kubectl run server --image=nginx:1.25-alpine -n net-test --port=80
kubectl expose pod server -n net-test --port=80

随后应用 NetworkPolicy 限制仅 client 可访问 server,使用 kubectl exec client -n net-test -- curl -s -o /dev/null -w \"%{http_code}\" server 验证返回 200,而其他命名空间 Pod 执行相同命令返回 000,证实 Cilium 策略引擎生效。

Go语言老兵,坚持写可维护、高性能的生产级服务。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注