L B T

记 录 过 去 的 经 验

PostgreSQL 常用命令

命令 功能描述
\l 列出所有数据库
\c 数据库名,切换当前连接的数据库 (Connect)
\dt 列出当前数据库中所有的表 (Describe Tables)
\d 表名,查看指定表的结构(列名、类型、索引等)
\du 列出所有角色/用户
\dn 列出所有模式 (Schema)
\df 列出所有函数
\x 开启/关闭扩展显示模式(当列很多时,这会让查询结果按行显示,非常清晰)
\? 查看所有反斜杠命令的帮助
  • 创建数据库CREATE DATABASE db_name;

  • 删除数据库DROP DATABASE db_name;

  • 导出数据库 (终端执行)pg_dump -U 用户名 数据库名 > 备份文件.sql

  • 导入数据库 (终端执行) : psql -U 用户名 数据库名 < 备份文件.sql

Amazon WorkSpaces 主要支持两种核心串流协议:

  • **WSP(Amazon WorkSpaces Streaming Protocol)**,基于 NICE DCV(DCV 专门为高性能图形处理(如 CAD、3D 渲染)和低延迟交互设计) 技术。是 AWS 近年大力推广的云原生协议,旨在提供更现代化的用户体验。

    • 网络适应性强 :在网络条件不稳定或高延迟的环境下表现更好。
    • 双向音视频支持 :原生支持 网络摄像头 (Webcam) 透传,非常适合视频会议(如 Teams, Zoom)。
    • 防火墙友好 :通常通过 TCP/UDP 端口 443 运行,更容易穿透企业防火墙。
    • Web Access :如果你习惯使用浏览器访问桌面,WSP 的兼容性和性能远超 PCoIP(已经不支持 Web Access)。
    • 认证支持 :支持更高级的身份验证方式,如 WebAuthn 和智能卡。
  • PCoIP(传统协议) : 这是 WorkSpaces 最早采用的协议,技术非常成熟,由 Teradici 开发。

    • 优点:

      • 图形渲染精准 :在处理高对比度、像素密集型的图形任务(如图像编辑)时,色彩表现更精准。

      • 终端设备广泛 :支持 PCoIP Zero Client(零客户机)硬件,以及包括 iPad 和 Android 在内的更广泛的移动端 App。

      • 成熟稳定 :作为老牌协议,在极端负载下的稳定性经过了长期验证。

    • 缺点:

      • 音视频功能弱 :原生 PCoIP 客户端通常不支持网络摄像头透传。

      • 网络要求高 :对网络延迟较敏感,一旦丢包,体验下降明显。

      • Web 访问限制 :已不支持。

制作镜像

为统一 AWS Workspaces 中的用户桌面系统和软件环境,建议自制镜像,预装常用软件,配置相关权限。自制桌面镜像请参考以下步骤:

  1. 先启动一台基础版的 WorkSpace。

  2. 以管理员身份登录,手动安装所有必要软件,对系统进行必要配置,如语言、地区、输入法等。

    如果要从 Windows WorkSpace 创建映像,请在运行创建进程之前使用位于 C:\Program Files\Amazon\ImageChecker.exe 中的映像检查器验证映像。

  3. 完成配置后,回到 AWS WorkSpaces 控制台,选择该桌面。

  4. 点击 Actions -> Create Image(创建镜像)

  5. 镜像创建成功后,选择该镜像并点击 Actions -> Create Bundle(创建捆绑包)

    镜像创建成功后,可在 Amazon WorkSpaces -> WorkSpaces -> Image(映像) 中查看

后续操作 : 以后为新员工开通桌面时,直接选择这个 自定义捆绑包 ,所有人的软件环境将完全一致。

配置 Workspace 云桌面无管理员权限

如果要全局配置,使 Directory 中的用户登陆云桌面后不是管理员权限,可以通过 AWS WorkSpaces 的目录设置(Directory Settings)取消用户的本地管理员权限 。实施步骤参考:

  1. 登录 AWS WorkSpaces 控制台

  2. 在左侧导航栏选择 Directories(目录)

  3. 选择对应的目录 ID,点击 目录名称进入查看详情页。

  4. 找到 Local administrator setting(本地用户管理员权限) 选项。

  5. 取消勾选 Enable local administrator setting(启用本地管理员设置)

结果: 用户将作为标准用户登录,无法修改系统配置或安装需要管理员权限的软件。

控制台修改后,只对新部署的桌面生效

要使已存在的桌面也生效,可以使用以下方法:

  • 重新构建(Rebuild):系统会根据当前的目录(Directory)设置(即已禁用的管理员权限)重新初始化 C 盘。C 盘会被重置。虽然 D 盘(用户数据)会保留,但用户自行安装在 C 盘的软件、系统设置、浏览器书签(若未同步)等都会丢失。执行前必须通知员工备份。
  • 通过组策略(GPO)强制回收(推荐用此方法):如果不希望重置员工的 C 盘,可以通过 Windows 域控的组策略强制移除用户在 Administrators 组中的身份。

控制 AWS Workspace 客户端设备类型

如果要控制 AWS Workspace 桌面只能从某些设备登陆,可以修改 Directory 中的 问权限的设备类型

如果使用 Amazon Workspace Client,则只能使用一个账户登陆,如果要同时登陆不同的账户,可以使用 Web Access

默认情况下,Web Access 登陆 Workspace 后因为浏览器安全限制原因,没有使用本地系统剪切板权限,无法在云桌面和本地之间粘贴复制。如果想要在本地和 workspace 云桌面之间粘贴复制(前提是未做其他限制,如 GPO 禁止粘贴),只需配置浏览器权限,允许使用剪切板即可。操作方式为,在网站左上角允许使用剪切板,具体操作如图:

AWS Workspaces 中的 AD 域管理

AWS Workspaces 使用的 AD 通常有以下两种:

  • AWS Managed Microsoft AD : AWS 托管的 Microsoft AD 域控服务。
  • Simple AD : 本质上是基于 Samba 4 的兼容方案

无论哪种 AD,都不支持直接通过 AWS 控制台管理,必须通过一台 Windows 管理机(EC2 或 WorkSpace)远程操作。

以下步骤以管理 Simple AD 为例提供参考步骤:

  1. 启动一台 Windows Server 实例(推荐)或一台现有的 WorkSpace。

  2. 确保这台机器已经加入到您的 Simple AD 域名下。方便起见最好是部署在 Directory 中 Workspace 云桌面,其已经在域中。

  3. 以管理员账户登陆并安装工具:

    1. 在服务器管理器中,点击 添加角色和功能

    2. 功能 列表中,勾选 组策略(Group Policy Management)管理工具 以及 远程服务器管理工具 (Remote Server Administration Tools,RSAT) -> 角色管理工具(Role Administration Tools) -> AD DS 和 AD LDS 工具

      如果 Directory 配置了 禁用本地管理员设置 ,使用新部署的 Workspace 桌面会不具备管理员权限,无法安装工具。只需要有 域管理员账户密码即可解决 。在任务栏或开始菜单找到 Server Manager (服务器管理器) ,选择 Run as different user (以其他用户身份运行)

安装完成后,即可打开 Active Directory Users and Computers 工具查看 AD 域中的用户和计算机信息

要管理组策略,使用 Group Policy Management 工具

有些由 AWS WorkSpaces 的串流协议控制的功能,如 控制在 Workspace 云桌面和本地之间复制或传输文件 等,Windows 默认是不存在这些策略的,需要手动导入 AWS 提供的模板。AWS 定义的策略官方文档(Manage your Windows WorkSpaces in WorkSpaces Personal)

不同的云桌面串流协议(WSP(基于 DCV)、PCoIP)需要使用不同的组策略管理模板文件 ,要注意区分,具体可查看官方文档说明

使用 DCV WorkSpaces 时特有的组策略设置,必须将 DCV 的组策略管理模板 wsp.admxwsp.adml 文件添加到目录的域控制器的 WorkSpaces 中央存储区。

以下步骤参考官方文档 为 DCV(WSP 协议) 安装组策略管理模板文件

  1. 在正在运行的 Windows WorkSpace 中,复制 C:\Program Files\Amazon\WSP 目录中的 wsp.admxwsp.adml 文件。

  2. 在目录管理 WorkSpace 或已加入 WorkSpaces 目录的 Amazon EC2 实例上,打开 Windows 文件资源管理器,然后在地址栏中输入贵组织的完全限定域名 (FQDN),例如 \\example.com

  3. 打开 sysvol 文件夹。

  4. 打开带有 FQDN 名称的文件夹。

  5. 打开 Policies 文件夹。您现在应该位于 \\FQDN\sysvol\FQDN\Policies 中。

  6. 如果该文件尚不存在,请创建一个名为 PolicyDefinitions 的文件夹。

  7. 打开 PolicyDefinitions 文件夹。

  8. wsp.admx 文件复制到 \\FQDN\sysvol\FQDN\Policies\PolicyDefinitions 文件夹中。

  9. PolicyDefinitions 文件夹中创建名为 en-US 的文件夹。

  10. 打开 en-US 文件夹。

  11. wsp.adml 文件复制到 \\FQDN\sysvol\FQDN\Policies\PolicyDefinitions\en-US 文件夹中。

验证管理模板文件是否已正确安装

  1. 在目录管理 WorkSpace 或加入 WorkSpaces 目录的 Amazon EC2 实例上,打开组策略管理工具 ( gpmc.msc )。

  2. 展开 Forest(Forest:FQDN)。

  3. 展开域(Domains)。

  4. 展开您的 FQDN(例如, example.com )。

  5. 展开组策略对象(Group Policy Objects)。

  6. 选择默认域策略(Default Domain Policy),打开(右键单击)菜单,然后选择 编辑(Edit)

  7. 在组策略管理编辑器中,依次选择 计算机配置->策略->管理模板->Amazon 和 DCV

  8. 现在,您可以使用此 DCV 组策略对象来修改使用 DCV WorkSpaces 时特有的组策略设置。

执行以上操作后,再次打开组策略编辑器,会发现组策略中只剩 AWS DCV 相关的策略,AD 默认的所有策略都看不到了,这是因为中央存储(Central Store)的配置不完整导致的。

当你创建了中央存储(在 \\domain\SYSVOL\domain\Policies\PolicyDefinitions 创建了文件夹)后,组策略管理编辑器(GPMC)会强制只从该网络位置读取模板,而不再读取本地 C:\Windows\PolicyDefinitions 下的系统自带模板。如果你的中央存储文件夹里只放了 Amazon 的 wsp.admx/adml ,那么所有 Windows 原生的策略(如控制面板、网络、系统设置等)就会全部消失。


需要将本地域控制器上的所有原生 Windows 策略模板手动复制到中央存储中

  1. 在域控制器上打开:C:\Windows\PolicyDefinitions
  2. 全选该文件夹下的所有 .admx 文件(包含几百个文件,如 Search.admx , TerminalServer.admx 等)。
  3. 将它们复制到中央存储路径:\\<FQDN>\SYSVOL\<FQDN>\Policies\PolicyDefinitions\ (注:请确保你之前放 wsp.admx 的地方就在这里)。
  4. 将 ADML 语言文件(如 en-US )也同样复制过去。

环境信息

  • Centos 7
  • Prometheus Server 2.4
  • Node Exporter v1.4.0
  • Grafana v9.2.5

安装

在 Docker 中安装 Prometheus Server

创建 Prometheus Server 配置文件,如 /root/prometheus/prometheus.yml,内容如下 [1]

/data/prometheus/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ['localhost:9090']

使用 Docker 启动时挂载此文件,作为 Prometheus Server 的配置文件,之后需要修改配置,可以直接修改此文件。

docker run -d -p 9090:9090 \
--name prometheus \
-v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

启动后,可以通过 $Prometheus_IP:9090 访问 Prometheus Server UI

阅读全文 »

中国大陆地区部署不可用

IPSec 协议

使用 Docker 部署命令如下

docker run -d     --name ikev2-vpn     --restart=always     --cap-add=NET_ADMIN     -e "VPN_IPSEC_PSK=StrongPSK123"     -e "VPN_USER=myuser"     -e "VPN_PASSWORD=MyPass123"     -p 500:500/udp     -p 4500:4500/udp     hwdsl2/ipsec-vpn-server

在 iPhone 上前往 设置 -> 通用 -> VPN 与设备管理 -> VPN -> 添加 VPN 配置

  • 类型: IPsec
  • 描述随便填: (如 MyVPN)
  • 服务器 :
  • 本地 ID : 留空
  • 用户名 : myuser
  • 密码 : MyPass123
  • 密钥 : StrongPSK123

L2TP 协议

使用 Docker 部署命令如下

docker run -d   --name ikev2-vpn-l2tp   --restart=always   --cap-add=NET_ADMIN   --device=/dev/ppp   -e "VPN_IPSEC_PSK=StrongPSK123"   -e "VPN_USER=myuser"   -e "VPN_PASSWORD=MyPass123"   -p 500:500/udp   -p 4500:4500/udp   -p 1701:1701/udp   hwdsl2/ipsec-vpn-server

在 iPhone 上前往 设置 -> 通用 -> VPN 与设备管理 -> VPN -> 添加 VPN 配置

  • 类型: L2TP
  • 描述随便填: (如 MyVPN)
  • 服务器 :
  • 本地 ID : 留空
  • 用户名 : myuser
  • 密码 : MyPass123
  • 密钥 : StrongPSK123

Keycloak 是一个开源的身份和访问管理(IAM)解决方案。

Keycloak 官网链接

Kubernetes 中部署 Keycloak

  • Kubernetes 1.35
  • Kustomize Version: v5.7.1
  • Keycloak 26.x
  • Aurora RDS PostgreSQL

参考官方文档在 Kubernetes 中部署 Keycloak

下载 Keycloak 配置文件: https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yaml 并修改数据库相关配置,本示例使用 AWS Aurora PostgreSQL:

keycloak.yaml
## 要连接 RDS PostgreSQL,需要设置这些核心环境变量:
- name: KC_DB
value: postgres
- name: KC_DB_URL_HOST
value: <RDS_ENDPOINT>
- name: KC_DB_URL_DATABASE
value: <DB_NAME>
- name: KC_DB_USERNAME
valueFrom:
secretKeyRef:
name: keycloak-db-secret
key: username
- name: KC_DB_PASSWORD
valueFrom:
secretKeyRef:
name: keycloak-db-secret
key: password

本示例使用 Kustomize 部署,文档结构如下:

$ tree
.
├── base
│ ├── ingresses.yaml
│ ├── kustomization.yaml
│ ├── services.yaml
│ └── statefulset.yaml
└── overlays
├── dev
└── prod
└── kustomization.yaml

base/statefulset.yaml 内容如下,主要参考官网安装文档(https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yaml

base/statefulset.yaml
apiVersion: apps/v1
# Use a stateful setup to ensure that for a rolling update Pods are restarted with a rolling strategy one-by-one.
# This prevents losing in-memory information stored redundantly in two Pods.
kind: StatefulSet
metadata:
name: keycloak
labels:
app: keycloak
spec:
serviceName: keycloak-discovery
# Run with one replica to save resources, or with two replicas to allow for rolling updates for configuration changes
replicas: 2
selector:
matchLabels:
app: keycloak
template:
metadata:
labels:
app: keycloak
spec:
containers:
- name: keycloak
image: quay.io/keycloak/keycloak:26.5.4
args: ["start"]
env:
# 初始管理员账户和密码
- name: KC_BOOTSTRAP_ADMIN_USERNAME
value: "admin"
- name: KC_BOOTSTRAP_ADMIN_PASSWORD
value: "admin"
# In a production environment, add a TLS certificate to Keycloak to either end-to-end encrypt the traffic between
# the client or Keycloak, or to encrypt the traffic between your proxy and Keycloak.
# Respect the proxy headers forwarded by the reverse proxy
# In a production environment, verify which proxy type you are using, and restrict access to Keycloak
# from other sources than your proxy if you continue to use proxy headers.
- name: KC_PROXY_HEADERS
value: "xforwarded"
- name: KC_HTTP_ENABLED
value: "true"
# In this explorative setup, no strict hostname is set.
# For production environments, set a hostname for a secure setup.
- name: KC_HOSTNAME_STRICT
value: "false"
- name: KC_HEALTH_ENABLED
value: "true"
- name: 'KC_CACHE'
value: 'ispn'
# Passing the Pod's IP primary address to the JGroups clustering as this is required in IPv6 only setups
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
# Instruct JGroups which DNS hostname to use to discover other Keycloak nodes
# Needs to be unique for each Keycloak cluster
- name: KC_CACHE_EMBEDDED_NETWORK_BIND_ADDRESS
value: '$(POD_IP)'
- name: 'KC_DB_URL_DATABASE'
value: 'keycloak'
- name: 'KC_DB_URL_HOST'
value: '<RDS_endpoint>'
- name: 'KC_DB'
value: 'postgres'
# In a production environment, use a secret to store username and password to the database
- name: 'KC_DB_PASSWORD'
value: '<RDS_PASSWORD>'
- name: 'KC_DB_USERNAME'
value: '<RDS_USERNAME>'
ports:
- name: http
containerPort: 8080
- name: jgroups
containerPort: 7800
- name: jgroups-fd
containerPort: 57800
startupProbe:
httpGet:
path: /health/started
port: 9000
periodSeconds: 1
failureThreshold: 600
readinessProbe:
httpGet:
path: /health/ready
port: 9000
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /health/live
port: 9000
periodSeconds: 10
failureThreshold: 3
resources:
limits:
cpu: 2000m
memory: 2000Mi
requests:
cpu: 500m
memory: 1700Mi

base/services.yaml 内容如下:

base/services.yaml
apiVersion: v1
kind: Service
metadata:
name: keycloak
labels:
app: keycloak
spec:
ports:
- protocol: TCP
port: 8080
targetPort: http
name: http
## 主要用于 ALB 健康检查
- name: management
port: 9000
targetPort: 9000
selector:
app: keycloak
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: keycloak
name: keycloak-discovery
spec:
selector:
app: keycloak
clusterIP: None
type: ClusterIP

base/ingresses.yaml 内容如下:

base/ingresses.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/healthcheck-path: /health/ready
alb.ingress.kubernetes.io/healthcheck-port: "9000" # 健康检查(Health Check)端口和 web 端口(8080)不同
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' # admin console 必须使用 https
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-east-1::certificate/f2cd4604-4791-43dd-8d33-545210272f1c
name: keycloak-web-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- backend:
service:
name: keycloak
port:
number: 8080
path: /
pathType: Prefix
host: keycloak.example.com

base/kustomization.yaml 内容如下:

base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- statefulset.yaml
- services.yaml
- ingresses.yaml

overlays/prod/kustomization.yaml 内容如下

overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: keycloak

resources:
- ../../base

执行以下命令查看最终生成的配置:

$ kubectl kustomize overlays/prod/

Kustomize 是专为 Kubernetes 设计的声明式配置管理工具,允许用户通过分层和声明式方式定制和管理应用程序配置,无需直接修改原始清单文件。Kustomize 已集成到 kubectl ,成为 Kubernetes 原生配置管理方案。

Kustomize 提供多种声明式配置管理能力,适用于复杂的 Kubernetes 应用场景:

  • 配置合并与分层管理

    Kustomize 采用 基础配置( base覆盖配置( overlay 的分层架构:

    • 基础配置(base) :应用的通用资源定义
    • 覆盖配置(overlay) :针对特定环境或需求的定制,支持修改、添加或删除基础内容
  • 声明式配置与复用

    Kustomize 使用 YAML 格式的 kustomization.yaml 文件描述定制规则,支持:

    • 资源引用与组合
    • 名称前后缀统一管理
    • 标签与注释批量添加
    • 环境变量与配置映射替换
    • 镜像标签动态修改

    通过组件与补丁(patches),实现配置的复用与跨项目共享,降低维护成本。

  • 多环境配置管理

    Kustomize 天然支持多环境部署,可为开发、测试、生产等环境创建专属覆盖(overlay)配置,实现一套基础配置适配多环境。

关键特性

  • 无模板定制 :无需模板语言即可修改清单
  • 基于覆盖(overlay)的配置 :通过补丁实现变体
  • 资源生成 :自动生成 ConfigMapsSecrets
  • 资源转换 :内置或自定义转换器
  • 插件系统 :支持多种插件扩展,扩展资源生成与转换能力。插件类型包括:
    • Generators :如 ConfigMapGeneratorSecretGenerator
    • Transformers :如 PatchTransformerNamespaceTransformer
    • Validators :资源校验插件
  • 变量替换 :运行时数据注入

自 Kubernetes 1.14 起,Kustomize 已内置于 kubectl ,提供原生配置管理能力。 kubectl 内置 Kustomize 版本随 Kubernetes 版本变化。

$ kubectl version --client
Client Version: v1.35.0
Kustomize Version: v5.7.1

Kustomize 相关常用命令

直接应用配置:

kubectl apply -k overlays/dev
kubectl apply --kustomize overlays/dev

预览生成的清单:

kubectl kustomize overlays/prod

查看配置差异:

kubectl diff -k overlays/prod

删除应用的资源:

kubectl delete -k overlays/dev
阅读全文 »

将源站的内容主动预取到 CDN 节点,用户首次访问可直接命中缓存,即提升首次访问速度,又能有效缓解源站压力。

  • 数据格式:请求和响应都支持 json/xml,xml 的参数与 json 的参数基本一致,json 的参数是驼峰分隔,xml 的参数是“-”分隔,详见示例。
  • 限制说明:每个账号的预取并发是 10,调高并发会增加回源的压力,请联系技术支持人员评估。
阅读全文 »

场景

远程登录 windows 失败,报错:

由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开,请跟服务器管理员联系

解决方法

  1. 打开 cmd,执行以下命令远程登录无法登录的 Windows 主机
    mstsc /v:1.1.1.1 /admin
  2. 打开注册表


3. 找到路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod.如果超过120天后RCM下面会有一个GracePeriod,先备份这项注册表,再删除除了默认的的注册表项。

  1. 重启电脑后生效.

环境信息

  • centos7 5.4.212-1.el7
  • kubernetes Server Version: v1.25.0
  • Helm 3.10.0

Helm 定位为 Kubernetes 包管理器 或者 Kubernetes App Store ,就如 RHEL 中的 yum/dnf 。主要组件如下:

  • helm : 纯客户端工具,负责模板渲染、插件执行和 OCI 交互。
  • kstatus 状态检查器 : 集成 kstatus 标准,替代了以前简单的 wait 逻辑。它能更精准地判断资源(如 Deployment, StatefulSet )是否真正“就绪”。
  • OCI 存储库 : Helm 4 进一步强化了对 OCI(Docker 镜像仓库协议)的支持,支持通过 Digest (散列值) 安装 Chart,确保供应链安全。
  • slog 日志系统 : 内部采用 Go 语言的结构化日志 slog ,方便集成到现代化的可观测性平台。

核心概念

  • Chart : 软件包。它是一系列 YAML 模板的集合,定义了应用如何运行所需的所有资源和信息。
  • Repository(仓库) : 存放 Chart 的地方(类似 Docker Hub 或应用商店),如 https://artifacthub.io/packages/search?kind=0
  • Release : 运行中的实例。你用同一个 Chart 安装了两次,就会产生两个独立的 Release。

Helm 4 支持将复杂的配置拆分到多个 YAML 文档中,或者在一次命令中传入多个文件

helm install my-release ./my-chart -f values-base.yaml -f values-override.yaml

Helm 4 能够直接运行 Helm 3 的 Chart,无需修改代码。

安装

  1. 下载 需要的版本

    wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz
  2. 解压

    tar -xf helm-v3.10.0-linux-amd64.tar.gz
  3. 在解压目中找到 helm 程序,移动到需要的目录中

    cp linux-amd64/helm /usr/local/bin/
  4. 验证

    $ helm version
    version.BuildInfo{Version:"v3.10.0", GitCommit:"ce66412a723e4d89555dc67217607c6579ffcb21", GitTreeState:"clean", GoVersion:"go1.18.6"}

helm 常用管理命令

安装 Release

首先要添加仓库,告诉 Helm 去哪里下载软件包(Chart)。最常用的是 Bitnami 仓库 或者 Artifact Hub

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

搜索/查看 Repo 中可用的 Charts

$ helm search repo hashicorp/vault
NAME CHART VERSION APP VERSION DESCRIPTION
hashicorp/vault 0.25.0 1.14.0 Official HashiCorp Vault Chart
hashicorp/vault-secrets-operator 0.1.0 0.1.0 Official Vault Secrets Operator Chart

安装 Chart,安装时可以为 Release 起个名字(如 vault),也可以不指定名字,让 Helm 自动生成 helm install bitnami/mysql --generate-name

要在安装 Chart 之前自定义配置,可以通过 YAML 配置自定义选项。 要想知道有哪些配置可用,可以使用命令 helm show values 查看

$ helm install vault hashicorp/vault --version 0.25.0
NAME: vault
LAST DEPLOYED: Mon Jul 10 14:59:13 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
Thank you for installing HashiCorp Vault!

Now that you have deployed Vault, you should look over the docs on using
Vault with Kubernetes available here:

https://www.vaultproject.io/docs/


Your release is named vault. To learn more about the release, try:

$ helm status vault
$ helm get manifest vault


$ helm install bitnami/mysql --generate-name
NAME: mysql-1612624192
LAST DEPLOYED: Sat Feb 6 16:09:56 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES: ...

查看 Chart 支持的自定义配置选项

## 先查看已安装的 Repo
$ helm repo list
NAME URL
eks https://aws.github.io/eks-charts
prometheus-community https://prometheus-community.github.io/helm-charts

## 查看目标 Repo 中有哪些 Charts
$ helm search repo prometheus-community
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/alertmanager 1.33.1 v0.31.1 The Alertmanager handles alerts sent by client ...
prometheus-community/alertmanager-snmp-notifier 2.1.0 v2.1.0 The SNMP Notifier handles alerts coming from Pr...
prometheus-community/jiralert 1.8.2 v1.3.0 A Helm chart for Kubernetes to install jiralert
prometheus-community/kube-prometheus-stack 82.1.0 v0.89.0 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/kube-state-metrics 7.1.0 2.18.0 Install kube-state-metrics to generate and expo...

## 查看目标 Chart 支持哪些自定义配置选项
$ helm show values prometheus-community/kube-prometheus-stack | more
# Default values for kube-prometheus-stack.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

## Provide a name in place of kube-prometheus-stack for `app:` labels
##
nameOverride: ""

## Override the deployment namespace
##
namespaceOverride: ""

## Provide a k8s version to auto dashboard import script example: kubeTargetVersionOverride: 1.26.6
##
kubeTargetVersionOverride: ""

## Allow kubeVersion to be overridden while creating the ingress
##
kubeVersionOverride: ""

## Provide a name to substitute for the full names of resources
##
fullnameOverride: ""
...
defaultRules:
create: true
rules:
alertmanager: true
etcd: true
configReloaders: true
general: true
k8sContainerCpuUsageSecondsTotal: true
k8sContainerMemoryCache: true
k8sContainerMemoryRss: true
k8sContainerMemorySwap: true
k8sContainerResource: true
k8sContainerMemoryWorkingSetBytes: true
k8sPodOwner: true
kubeApiserverAvailability: true
kubeApiserverBurnrate: true
kubeApiserverHistogram: true
kubeApiserverSlos: true
kubeControllerManager: true
kubelet: true
kubeProxy: true
kubePrometheusGeneral: true
kubePrometheusNodeRecording: true
kubernetesApps: true
kubernetesResources: true
kubernetesStorage: true
kubernetesSystem: true
kubeSchedulerAlerting: true
kubeSchedulerRecording: true
kubeStateMetrics: true
network: true
node: true
nodeExporterAlerting: true
nodeExporterRecording: true
prometheus: true
prometheusOperator: true
windows: true
...

查看已经安装的 Release 使用了哪些自定义参数,可以使用命令 helm get values <release-name>

$ helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aws-load-balancer-controller kube-system 1 2026-02-17 15:47:38.190164778 +0800 HKT deployed aws-load-balancer-controller-3.0.0 v3.0.0
eks-monitor monitoring 14 2026-02-21 02:23:09.462138692 +0000 UTC deployed kube-prometheus-stack-82.2.0 v0.89.0

$ helm get values -n monitoring eks-monitor
USER-SUPPLIED VALUES:
alertmanager:
alertmanagerSpec:
replicas: 1
config:
global:
resolve_timeout: 5m
receivers:
- name: "null"
- name: telegram
telegram_configs:
- bot_token: 7750349799:AAE6KDqMIfNE4Pb9WEM2XiIQ50FadioGkW8
chat_id: -5293873506
message: "\U0001F6A8 <b>{{ .CommonAnnotations.summary }}</b>\n\n<b>Alert:</b>
{{ .CommonLabels.alertname }}\n<b>Cluster:</b> {{ .CommonLabels.cluster
}}\n<b>Namespace:</b> {{ .CommonLabels.namespace }}\n<b>Severity:</b> {{
.CommonLabels.severity }}\n\n<b>Description:</b>\n{{ .CommonAnnotations.description
}}\n"
parse_mode: HTML
send_resolved: false
route:
group_by:
- alertname
- cluster
group_wait: 10s
receiver: telegram
repeat_interval: 1h
enabled: true
defaultRules:
disabled:
KubeCPUOvercommit: true
KubeMemoryOvercommit: true
grafana:
enabled: false
...

查看所有已安装的 Release

$ helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aws-load-balancer-controller kube-system 1 2026-02-17 15:47:38.190164778 +0800 +0800 deployed aws-load-balancer-controller-3.0.0 v3.0.0
eks-monitor monitoring 14 2026-02-21 02:23:09.462138692 +0000 UTC deployed kube-prometheus-stack-82.2.0 v0.89.0

卸载指定的 Release

$ helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
cert-manager cert-manager 1 2022-11-01 09:57:11.373366484 +0800 CST failed cert-manager-v1.7.1 v1.7.1
rancher cattle-system 1 2022-11-01 10:05:07.370131566 +0800 CST failed rancher-2.6.9 v2.6.9

$ helm uninstall rancher -n cattle-system
W1101 10:21:32.764269 11113 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W1101 10:21:34.043445 11113 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W1101 10:21:39.809766 11113 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
release "rancher" uninstalled

更新指定的 Release

helm upgrade my-web bitnami/nginx -f my-values.yaml

helm upgrade --install my-web bitnami/nginx -f my-values.yaml

回滚到上一个 Release 版本

回滚使用命令 helm rollback [RELEASE] [REVISION] ,可以通过命令 helm history [RELEASE]

每次 install, upgrade, rollback 都会更新 REVISOION

$ helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aws-load-balancer-controller kube-system 1 2026-02-17 15:47:38.190164778 +0800 HKT deployed aws-load-balancer-controller-3.0.0 v3.0.0
eks-monitor monitoring 14 2026-02-21 02:23:09.462138692 +0000 UTC deployed kube-prometheus-stack-82.2.0 v0.89.0

$ helm history eks-monitor -n monitoring
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
5 Thu Feb 19 15:21:40 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
6 Thu Feb 19 15:24:23 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
7 Thu Feb 19 15:34:16 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
8 Thu Feb 19 15:37:33 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
9 Thu Feb 19 15:40:24 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
10 Thu Feb 19 15:46:54 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
11 Thu Feb 19 17:29:21 2026 superseded kube-prometheus-stack-82.1.0 v0.89.0 Upgrade complete
12 Sat Feb 21 02:00:26 2026 superseded kube-prometheus-stack-82.2.0 v0.89.0 Upgrade complete
13 Sat Feb 21 02:10:58 2026 superseded kube-prometheus-stack-82.2.0 v0.89.0 Upgrade complete
14 Sat Feb 21 02:23:09 2026 deployed kube-prometheus-stack-82.2.0 v0.89.0 Upgrade complete

$ helm rollback eks-monitor -n monitoring 13

要在更新(upgrade)或者回滚(rollback)后强制重建 Pod,可以使用选项 --recreate-pods

查看已添加的的 Repo

$ helm repo ls
NAME URL
rancher-stable https://releases.rancher.com/server-charts/stable
jetstack https://charts.jetstack.io
hashicorp https://helm.releases.hashicorp.com

查看已安装的 Repo 中可用的 Charts

$ helm search repo hashicorp/vault -l
NAME CHART VERSION APP VERSION DESCRIPTION
hashicorp/vault 0.25.0 1.14.0 Official HashiCorp Vault Chart
hashicorp/vault 0.24.1 1.13.1 Official HashiCorp Vault Chart
hashicorp/vault 0.24.0 1.13.1 Official HashiCorp Vault Chart
hashicorp/vault 0.23.0 1.12.1 Official HashiCorp Vault Chart
hashicorp/vault 0.22.1 1.12.0 Official HashiCorp Vault Chart
hashicorp/vault 0.22.0 1.11.3 Official HashiCorp Vault Chart

$ helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/alertmanager 1.33.1 v0.31.1 The Alertmanager handles alerts sent by client ...
prometheus-community/alertmanager-snmp-notifier 2.1.0 v2.1.0 The SNMP Notifier handles alerts coming from Pr...
prometheus-community/jiralert 1.8.2 v1.3.0 A Helm chart for Kubernetes to install jiralert
prometheus-community/kube-prometheus-stack 82.2.0 v0.89.0 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/kube-state-metrics 7.1.0 2.18.0 Install kube-state-metrics to generate and expo...
prometheus-community/prom-label-proxy 0.17.2 v0.12.1 A proxy that enforces a given label in a given ...
prometheus-community/prometheus 28.9.1 v3.9.1 Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter 5.3.0 v0.12.0 A Helm chart for k8s prometheus adapter

helm search hub 可以搜索 Artifact Hub 中公开可用的 Charts

$ helm search hub wordpress
URL CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress 7.6.7 5.2.4 Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-... v0.6.3 v0.6.3 Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-... v0.7.1 v0.7.1 A Helm chart for deploying a WordPress site on ...

不指定名称搜索 helm search hub 将会列出 Artifact Hub 上所有可用的 Charts 链接(不是具体的 Helm Reop),要展示 Helm Repo 可以使用选项 helm search hub --list-repo-url

查看 Release 状态

$ helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aws-load-balancer-controller kube-system 1 2026-02-17 15:47:38.190164778 +0800 HKT deployed aws-load-balancer-controller-3.0.0 v3.0.0
eks-monitor monitoring 14 2026-02-21 02:23:09.462138692 +0000 UTC deployed kube-prometheus-stack-82.2.0 v0.89.0

$ helm status eks-monitor -n monitoring
NAME: eks-monitor
LAST DEPLOYED: Sat Feb 21 02:23:09 2026
NAMESPACE: monitoring
STATUS: deployed
REVISION: 14
TEST SUITE: None
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace monitoring get pods -l "release=eks-monitor"

Get Grafana 'admin' user password by running:

kubectl --namespace monitoring get secrets eks-monitor-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo

Access Grafana local instance:

export POD_NAME=$(kubectl --namespace monitoring get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=eks-monitor" -oname)
kubectl --namespace monitoring port-forward $POD_NAME 3000

Get your grafana admin user password by running:

kubectl get secret --namespace monitoring -l app.kubernetes.io/component=admin-secret -o jsonpath="{.items[0].data.admin-password}" | base64 --decode ; echo


Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.


$ helm status aws-load-balancer-controller -n kube-system
NAME: aws-load-balancer-controller
LAST DEPLOYED: Tue Feb 17 15:47:38 2026
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

查看 Chart 的具体信息

使用命令 helm show chart 或则 helm show all 查看 Chart 详细信息,里面包含了关于 Chart 配置的详细信息和结构。

$ helm show chart prometheus-community/prometheus
annotations:
artifacthub.io/license: Apache-2.0
artifacthub.io/links: |
- name: Chart Source
url: https://github.com/prometheus-community/helm-charts
- name: Upstream Project
url: https://github.com/prometheus/prometheus
apiVersion: v2
appVersion: v3.9.1
dependencies:
- condition: alertmanager.enabled
name: alertmanager
repository: https://prometheus-community.github.io/helm-charts
version: 1.33.*
- condition: kube-state-metrics.enabled
name: kube-state-metrics
repository: https://prometheus-community.github.io/helm-charts
version: 7.1.*
- condition: prometheus-node-exporter.enabled
name: prometheus-node-exporter
repository: https://prometheus-community.github.io/helm-charts
version: 4.51.*
- condition: prometheus-pushgateway.enabled
name: prometheus-pushgateway
repository: https://prometheus-community.github.io/helm-charts
version: 3.6.*
description: Prometheus is a monitoring system and time series database.
...


Chart 结构

当你想要自己写 Chart 时,你会看到这样的文件夹结构(使用 helm create my-chart 生成):

my-chart/
├── Chart.yaml # 项目信息(版本、描述)
├── values.yaml # 默认配置(最核心文件!所有的变量都写在这里)
├── charts/ # 依赖的其他子 Chart
└── templates/ # YAML 模板文件夹
├── deployment.yaml # K8s 资源模板
└── service.yaml # 暴露服务的模板

AWS 虚拟私有云 VPC

在进入具体的网络配置前,必须理解 AWS 的地理隔离:

  • 区域 (Region) :地理上的独立区域(如新加坡、弗吉尼亚)。区域之间完全隔离。

  • 可用区 (Availability Zone, AZ) :一个区域内由多个物理机房组成。AZ 之间通过高速、低延迟光纤连接。高可用架构必须跨 AZ 部署。跨 AZ 之间的流量需要付费。

VPC 是你在 AWS 云中的逻辑隔离网络。你可以完全控制其 IP 地址范围、子网、路由表和网络网关。

核心组件:

  • CIDR 范围 :你为 VPC 定义的私有 IP 地址块(如 10.0.0.0/16 )。

  • 子网 (Subnets) :将 VPC 划分为更小的网段。子网必须位于特定的可用区内。

  • 公有子网 (Public Subnet) :路由指向互联网网关 (IGW),实例可以有公网 IP。

  • 私有子网 (Private Subnet) :没有指向 IGW 的直接路由,通常通过 NAT 网关 访问外网

公有子网私有子网 在配置上几乎一摸一样,唯一区别在于: 该子网关联的路由表(Route Table)中默认路由(0.0.0.0/0)是如何配置的。

  • 公有子网 (Public Subnet) 其路由表中默认路由(0.0.0.0/0)指向 互联网网关 (Internet Gateway, ID 格式通常为 igw-xxxxxx) 。由于它直接连接到互联网大门,且子网内的实例拥有公网 IP,因此外部用户可以主动访问它,它也可以直接访问外部。
  • 私有子网 (Private Subnet) 其路由表中默认路由(0.0.0.0/0)指向 NAT 网关 (NAT Gateway, ID 格式通常为 nat-xxxxxx),或者干脆没有任何去往外网的路由 。它没有直通互联网的大门。它通过 NAT 网关(单向出口)实现“能出不能进”的效果。
    下图所示子网为 公有子网

  • 路由表(Route Tables) 分为主路由表和自定义路由表
    • 主路由表(Main route table) 随 VPC 自动生成,它控制未与任何其他路由表显式关联的所有子网的路由,也就是 VPC 中的默认路由。
    • 自定义路由表 为新建的路由表。
    • 一个子网只能关联一个路由表,一个路由表可以关联多个子网

流量如何进出

VPC 与外界互联网通信可以使用以下方式:

组件 作用 流量方向 用法说明|
Internet Gateway (IGW,互联网网关) 允许 VPC 连接互联网。 双向 (In/Out) 实例必须分配公网 IP 或弹性 IP (EIP)
NAT Gateway (NAT 网关) 允许私有实例上外网,但防止外部主动连接。 单向 (Outbound only) 仅需私有 IP
VPC Peering (对等连接) 连接两个不同的 VPC,使其像在一个网络内通信。 跨 VPC
Transit Gateway 充当“中央枢纽”,连接数千个 VPC 和本地网络。 复杂网络拓扑
Virtual Private Gateway 用于建立 VPN 连接。 混合云

部署 NAT Gateway 网关并关联子网

通过 NAT Gateway 可以实现子网中的实例的对外互联网出口 IP 都是 NAT Gateway 绑定的 EIP,子网中的实例对互联网不可见。NAT Gateway 典型使用场景:

  • 为了安全,生产环境通常将 EKS 工作节点、RDS 数据库缓存服务器(Redis) 放在私有子网中,这些资源不需要(也不应该)被互联网直接访问。
  • 应用需要调用外部服务(如支付网关、银行接口或第三方 API)时,对方的防火墙通常需要你提供一个白名单 IP。由于 EKS 节点是动态变化的,IP 并不固定。
  • 减少受攻击面,防止外部扫描。

以下为创建 NAT Gateway 并关联子网的相关步骤:

正确的整体架构
VPC
├── Public Subnet
│ ├── NAT Gateway(有 EIP)
│ └── Route Table (Public RT)
│ └── 0.0.0.0/0 → Internet Gateway

└── Private Subnet
├── EC2 / ECS / EKS Node
└── Route Table (Private RT)
└── 0.0.0.0/0 → NAT Gateway

关键点:

  • NAT Gateway 必须在公有子网
  • 私有子网的默认路由指向 NAT Gateway
  1. 确认 Public Subnet 存在

    VPC 默认的 Main Route Table 已经满足这个条件,其默认网关为 Internet Gateway

  2. 创建 NAT Gateway

    NAT gateways 标签页面中,点击 Create NAT gatewayConnectivity type 选择 PublicElastic IP (EIP) association 选择 手动分配 EIP(Manual)

    创建完成后,状态应为 Available 。在路由表(Route Tables)中,这时会多一个路由表,其 Edge associations(边缘关联) 关联到了刚刚创建的 NAT Gateway

  3. 创建一个新的子网(私有、Private Subnet)

    VPC → Subnets → Create subnet 标签页面中创建新的子网, 不要勾选 Auto-assign public IPv4 ,如此处于此子网中的实例,不会为其分配公网地址

  4. 创建 Private Route Table

    VPC → Route tables → Create route table 标签页面中创建新的路由表,本示例名为 private-rt

  5. 配置路由规则

    选择刚刚创建的新路由表 private-rt,在 Routes编辑路由(Edit Routes) ,添加一条路由规则:

    | Destination | Target          |
    | ----------- | --------------- |
    | 0.0.0.0/0 | NAT Gateway |

  6. 关联 Private Subnet

    选择刚刚创建的新路由表 private-rt,在 Subnet associations(子网关联)Edit subnet associations(编辑子网关联) ,选择目标子网进行关联

  7. 最终的 VPC 整体路由可以在 VPC 的 Resource map 中进行检查

EKS 中的授权机制

Kubernetes 原生提供 RBAC(Role-Based Access Control) 来控制集群中的 用户和服务账户(ServiceAccount) 对资源的访问权限。

对象 描述
Role 命名空间级别(Namespace)权限,指定某个命名空间内允许的操作和资源类型。
ClusterRole 集群级别权限,可以跨命名空间使用。
RoleBinding 将 Role 绑定到一个用户或 ServiceAccount。
ClusterRoleBinding 将 ClusterRole 绑定到一个用户或 ServiceAccount。

核心字段

  • apiGroups :资源所属 API 组,例如 "" 代表 core API

  • resources :允许访问的资源类型,如 pods、deployments。

  • verbs :允许的操作,如 get, list, create, delete

RBAC 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: dev
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: ServiceAccount
name: my-serviceaccount
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
  • RBAC 控制的是 Kubernetes 资源访问权限

  • RBAC 对象绑定的是 Kubernetes 用户或 ServiceAccount,而不是 AWS IAM 用户

概念 全称 解决的问题 作用范围
RBAC Role-Based Access Control 决定 “用户/进程” 在 K8s 集群内能做什么(如:查看 Pod) K8s 集群内部
Role Kubernetes Role RBAC 的一部分,定义一组具体的集群内操作权限 命名空间 (Namespace)
IRSA IAM Roles for Service Accounts 决定 “Pod 里的应用” 对 AWS 外部资源(如 S3/RDS)的访问权限 AWS 云环境

AWS IAM Role 是 AWS 层面的权限机制,用于授权 AWS 资源访问,例如 S3、DynamoDB、Secrets Manager 等。

AWS IAM Role 的特点:

  • 可以被 IAM 用户、服务或 EC2/EKS Pod 假设(Assume)。

  • 权限通过 IAM Policy 定义。

AWS IAM Role 在 EKS 中的应用:

  • 管理集群本身访问 AWS 资源,例如节点组(NodeGroup)访问 S3。

  • 可以通过 IAM 用户/Role 管理集群级别的操作权限,例如 eks:DescribeCluster

💡 核心点:IAM Role 本身无法直接控制 Kubernetes 资源,它管理的是 AWS 资源访问。

IRSA(IAM Roles for Service Accounts) 是 AWS EKS 引入的将 Kubernetes ServiceAccount 与 AWS IAM Role 绑定,实现 Pod 级别的 AWS 权限控制的机制。其大致原理如下:

  • EKS 集群开启 OIDC Provider
  • 创建 IAM Role 并信任该 OIDC Provider
  • Role 上定义 IAM Policy(如访问 S3)
  • Kubernetes ServiceAccount 指定注解 eks.amazonaws.com/role-arn
  • Pod 使用该 ServiceAccount 时自动获取 Role 权限

实践建议:

  • 不要在 Pod 内放 AWS AccessKey,使用 IRSA。

  • 最小权限原则:

    • RBAC:只给 Pod 或用户真正需要的 Kubernetes 权限。

    • IAM Role / IRSA:只给访问 AWS 资源的最小权限。

  • 多集群管理:可以通过 ClusterRole + RoleBinding 管理跨命名空间权限。

  • 审计:

    • 使用 CloudTrail 监控 IRSA 调用。

    • Kubernetes API Server 日志审计 RBAC 权限。

AWS 虚拟私有云 VPC

在进入具体的网络配置前,必须理解 AWS 的地理隔离:

  • 区域 (Region) :地理上的独立区域(如新加坡、弗吉尼亚)。区域之间完全隔离。

  • 可用区 (Availability Zone, AZ) :一个区域内由多个物理机房组成。AZ 之间通过高速、低延迟光纤连接。高可用架构必须跨 AZ 部署。跨 AZ 之间的流量需要付费。

VPC 是你在 AWS 云中的逻辑隔离网络。你可以完全控制其 IP 地址范围、子网、路由表和网络网关。

核心组件:

  • CIDR 范围 :你为 VPC 定义的私有 IP 地址块(如 10.0.0.0/16 )。

  • 子网 (Subnets) :将 VPC 划分为更小的网段。子网必须位于特定的可用区内。

  • 公有子网 (Public Subnet) :路由指向互联网网关 (IGW),实例可以有公网 IP。

  • 私有子网 (Private Subnet) :没有指向 IGW 的直接路由,通常通过 NAT 网关 访问外网

公有子网私有子网 在配置上几乎一摸一样,唯一区别在于: 该子网关联的路由表(Route Table)中默认路由(0.0.0.0/0)是如何配置的。

  • 公有子网 (Public Subnet) 其路由表中默认路由(0.0.0.0/0)指向 互联网网关 (Internet Gateway, ID 格式通常为 igw-xxxxxx) 。由于它直接连接到互联网大门,且子网内的实例拥有公网 IP,因此外部用户可以主动访问它,它也可以直接访问外部。
  • 私有子网 (Private Subnet) 其路由表中默认路由(0.0.0.0/0)指向 NAT 网关 (NAT Gateway, ID 格式通常为 nat-xxxxxx),或者干脆没有任何去往外网的路由 。它没有直通互联网的大门。它通过 NAT 网关(单向出口)实现“能出不能进”的效果。
    下图所示子网为 公有子网

  • 路由表(Route Tables) 分为主路由表和自定义路由表
    • 主路由表(Main route table) 随 VPC 自动生成,它控制未与任何其他路由表显式关联的所有子网的路由,也就是 VPC 中的默认路由。
    • 自定义路由表 为新建的路由表。
    • 一个子网只能关联一个路由表,一个路由表可以关联多个子网

流量如何进出

VPC 与外界互联网通信可以使用以下方式:

组件 作用 流量方向 用法说明|
Internet Gateway (IGW,互联网网关) 允许 VPC 连接互联网。 双向 (In/Out) 实例必须分配公网 IP 或弹性 IP (EIP)
NAT Gateway (NAT 网关) 允许私有实例上外网,但防止外部主动连接。 单向 (Outbound only) 仅需私有 IP
VPC Peering (对等连接) 连接两个不同的 VPC,使其像在一个网络内通信。 跨 VPC
Transit Gateway 充当“中央枢纽”,连接数千个 VPC 和本地网络。 复杂网络拓扑
Virtual Private Gateway 用于建立 VPN 连接。 混合云

部署 NAT Gateway 网关并关联子网

通过 NAT Gateway 可以实现子网中的实例的对外互联网出口 IP 都是 NAT Gateway 绑定的 EIP,子网中的实例对互联网不可见。NAT Gateway 典型使用场景:

  • 为了安全,生产环境通常将 EKS 工作节点、RDS 数据库缓存服务器(Redis) 放在私有子网中,这些资源不需要(也不应该)被互联网直接访问。
  • 应用需要调用外部服务(如支付网关、银行接口或第三方 API)时,对方的防火墙通常需要你提供一个白名单 IP。由于 EKS 节点是动态变化的,IP 并不固定。
  • 减少受攻击面,防止外部扫描。

以下为创建 NAT Gateway 并关联子网的相关步骤:

正确的整体架构
VPC
├── Public Subnet
│ ├── NAT Gateway(有 EIP)
│ └── Route Table (Public RT)
│ └── 0.0.0.0/0 → Internet Gateway

└── Private Subnet
├── EC2 / ECS / EKS Node
└── Route Table (Private RT)
└── 0.0.0.0/0 → NAT Gateway

关键点:

  • NAT Gateway 必须在公有子网
  • 私有子网的默认路由指向 NAT Gateway
  1. 确认 Public Subnet 存在

    VPC 默认的 Main Route Table 已经满足这个条件,其默认网关为 Internet Gateway

  2. 创建 NAT Gateway

    NAT gateways 标签页面中,点击 Create NAT gatewayConnectivity type 选择 PublicElastic IP (EIP) association 选择 手动分配 EIP(Manual)

    创建完成后,状态应为 Available 。在路由表(Route Tables)中,这时会多一个路由表,其 Edge associations(边缘关联) 关联到了刚刚创建的 NAT Gateway

  3. 创建一个新的子网(私有、Private Subnet)

    VPC → Subnets → Create subnet 标签页面中创建新的子网, 不要勾选 Auto-assign public IPv4 ,如此处于此子网中的实例,不会为其分配公网地址

  4. 创建 Private Route Table

    VPC → Route tables → Create route table 标签页面中创建新的路由表,本示例名为 private-rt

  5. 配置路由规则

    选择刚刚创建的新路由表 private-rt,在 Routes编辑路由(Edit Routes) ,添加一条路由规则:

    | Destination | Target          |
    | ----------- | --------------- |
    | 0.0.0.0/0 | NAT Gateway |

  6. 关联 Private Subnet

    选择刚刚创建的新路由表 private-rt,在 Subnet associations(子网关联)Edit subnet associations(编辑子网关联) ,选择目标子网进行关联

  7. 最终的 VPC 整体路由可以在 VPC 的 Resource map 中进行检查

EKS 中的授权机制

Kubernetes 原生提供 RBAC(Role-Based Access Control) 来控制集群中的 用户和服务账户(ServiceAccount) 对资源的访问权限。

对象 描述
Role 命名空间级别(Namespace)权限,指定某个命名空间内允许的操作和资源类型。
ClusterRole 集群级别权限,可以跨命名空间使用。
RoleBinding 将 Role 绑定到一个用户或 ServiceAccount。
ClusterRoleBinding 将 ClusterRole 绑定到一个用户或 ServiceAccount。

核心字段

  • apiGroups :资源所属 API 组,例如 "" 代表 core API

  • resources :允许访问的资源类型,如 pods、deployments。

  • verbs :允许的操作,如 get, list, create, delete

RBAC 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: dev
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: ServiceAccount
name: my-serviceaccount
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
  • RBAC 控制的是 Kubernetes 资源访问权限

  • RBAC 对象绑定的是 Kubernetes 用户或 ServiceAccount,而不是 AWS IAM 用户

概念 全称 解决的问题 作用范围
RBAC Role-Based Access Control 决定 “用户/进程” 在 K8s 集群内能做什么(如:查看 Pod) K8s 集群内部
Role Kubernetes Role RBAC 的一部分,定义一组具体的集群内操作权限 命名空间 (Namespace)
IRSA IAM Roles for Service Accounts 决定 “Pod 里的应用” 对 AWS 外部资源(如 S3/RDS)的访问权限 AWS 云环境

AWS IAM Role 是 AWS 层面的权限机制,用于授权 AWS 资源访问,例如 S3、DynamoDB、Secrets Manager 等。

AWS IAM Role 的特点:

  • 可以被 IAM 用户、服务或 EC2/EKS Pod 假设(Assume)。

  • 权限通过 IAM Policy 定义。

AWS IAM Role 在 EKS 中的应用:

  • 管理集群本身访问 AWS 资源,例如节点组(NodeGroup)访问 S3。

  • 可以通过 IAM 用户/Role 管理集群级别的操作权限,例如 eks:DescribeCluster

💡 核心点:IAM Role 本身无法直接控制 Kubernetes 资源,它管理的是 AWS 资源访问。

IRSA(IAM Roles for Service Accounts) 是 AWS EKS 引入的将 Kubernetes ServiceAccount 与 AWS IAM Role 绑定,实现 Pod 级别的 AWS 权限控制的机制。其大致原理如下:

  • EKS 集群开启 OIDC Provider
  • 创建 IAM Role 并信任该 OIDC Provider
  • Role 上定义 IAM Policy(如访问 S3)
  • Kubernetes ServiceAccount 指定注解 eks.amazonaws.com/role-arn
  • Pod 使用该 ServiceAccount 时自动获取 Role 权限

实践建议:

  • 不要在 Pod 内放 AWS AccessKey,使用 IRSA。

  • 最小权限原则:

    • RBAC:只给 Pod 或用户真正需要的 Kubernetes 权限。

    • IAM Role / IRSA:只给访问 AWS 资源的最小权限。

  • 多集群管理:可以通过 ClusterRole + RoleBinding 管理跨命名空间权限。

  • 审计:

    • 使用 CloudTrail 监控 IRSA 调用。

    • Kubernetes API Server 日志审计 RBAC 权限。

RDS 创建流程

本示例以 PostgreSQL 为例

  1. 创建子网组 (Subnet Group) 。RDS 需要在至少两个可用区(AZ)中运行。
    1. 进入 Aurora and RDS 控制台 -> Subnet groups -> Create DB subnet group
    2. 选择你的 VPC,并添加该 VPC 下位于不同 AZ 的子网。
  2. 创建安全组 (Security Group)
    1. 创建一个名为 rds-ops-sg 的安全组。
    2. 入站规则: 允许来自客户端流量访问 5432 端口(不要暴露给 0.0.0.0/0 )。
  3. 启动 PostgreSQL 实例
    1. Aurora and RDS 控制台 -> Databases -> Create database
    2. Engine options -> Engine type 选择 PostgreSQL
    3. Templates 生产环境选 Production ,测试选 Dev/Test
    4. Availability and durability 根据需求和场景选择数据库实例的可用性
    5. 设置 DB instance identifier(实例名)、Master username(管理员账户用户名) 等信息
    6. Instance configuration(运行实例配置) ,选择数据库实例运行的环境
    7. Connectivity(连接) ,设置 VPC(配置后不可更改)。 Public access(公网访问) 决定数据库实例是否可以在公网中访问,设置后可更改。
  4. PostgreSQL 实例启动成功后,即可通过 Endpoint & port 连接实例。

环境信息

  • Centos-7 3.10.0-1062.9.1
  • Docker 19.03.15
  • containerd.io-1.4.13
  • kubectl-1.25.0
  • kubeadm-1.25.0
  • kubelet-1.25.0

kubectl 常用命令汇总

查询命令汇总

kubectl get nodes -o wide

kubectl get pods -A -o wide

kubectl get deployments -A -o wide

kubectl get daemonsets -A -o wide

kubectl get replicasets -A -o wide

kubectl get services -A -o wide

kubectl get endpointslices -A -o wide

kubectl get ingresses -A -o wide

kubectl get ingressclass -A -o wide

kubectl get deployments,replicasets,pods,services,endpointslices,ingresses

kubectl get configmaps -A

kubectl get storageclasses -o wide

kubectl get pv -o wide

kubectl get pvc -o wide

kubectl get pods -l app=nginx,env=prod

# 查看过往相关所有事件,在排查 Pod 重启原因时非常有用
kubectl get events -n default --sort-by='.metadata.creationTimestamp'

## 启动一个临时测试 Pod ,使用完后自动删除
kubectl run netshoot-tmp --image=nicolaka/netshoot -it --rm -- /bin/bash

## 拷贝文件到容器中
kubectl cp file.tar -n prometheus grafana-766bf65cb7-h92m6:/tmp

删除命令汇总

kubectl delete service -n <namespace> <name>

kubectl delete ingress -n <namespace> <name>

kubeadm 常用命令

kubeadm 命令官方参考文档

创建集群

kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
选项 说明 示例
--pod-network-cidr 指定 pod 的 cidr,安装 CNI 插件时,配置的 CIDR 要和此处一致
--service-cidr service 使用的 CIDR
--cri-socket 配置集群使用的 CRI,不指定时系统会扫描主机,如果有多个可用 CRI,会出现提示
--apiserver-advertise-address 手动配置 api-server 的 Advertise IP 地址。
不配置的情况下,系统默认选择主机上的默认路由对应网卡上面的 IP
--control-plane-endpoint 配置 api-server 的共享地址,可以是域名或者负载均衡器的 IP
单节点的 Master 后期需要扩展为多节点(高可用)时,需要有此配置,否则不支持(kubeadm)扩展

添加节点到集群

kubeadm join 172.31.10.19:6443 --token 8ca35s.butdpihinkdczvqb --discovery-token-ca-cert-hash sha256:b2793f9a6bea44a64640f99042f11c4ff6 \ 
--cri-socket=unix:///var/run/cri-dockerd.sock

其中的 token 可以在 master 上使用以下命令查看

$ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
8ca35s.butdpihinkdczvqb 19h 2022-09-14T02:54:55Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token

默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

kubeadm token create

如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它[1]

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
阅读全文 »

版本信息

  • Centos-7 3.10.0-1160
  • Docker Engine 19.03.15
  • jenkinsci/blueocean Jenkins 2.346.3

安装步骤

下载镜像

官方镜像仓库 中搜索 jenkinsci/blueocean,下载最新镜像

docker pull jenkinsci/blueocean

启动 jenkins 容器

创建数据目录

mkdir /data/JenkinsData_blueocean
chmod 777 /data/JenkinsData_blueocean

启动 jenkins 容器

docker run -d -p 8080:8080 --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/JenkinsData_blueocean/:/var/jenkins_home/ \
-u root \
jenkinsci/blueocean
  • -v /var/run/docker.sock:/var/run/docker.sock - 在需要使用 Jenkins 构建 Docker 镜像时,Jenkins 容器中的 docker 客户端需要连接到宿主机的 Docker server
  • -v /data/JenkinsData_blueocean/:/var/jenkins_home/ - 数据持久化到宿主机目录
  • -u root - 容器中使用 root 用户运行,要使用 Jenkins 构建 Docker 镜像时,默认的 jenkins 用户无权限访问 /var/run/docker.sock
阅读全文 »

简单来说,Amazon CloudWatch 是 AWS 的全家桶级监控和观察平台。是一个用于收集、监控、分析和响应 AWS 资源及应用程序运行数据的托管服务。无论你的代码运行在虚拟机(EC2)、容器(ECS/EKS)还是无服务器环境(Lambda)中,它都能提供实时的数据洞察。

CloudWatch 的功能可以概括为以下四大支柱:

  • 指标 (Metrics)

    • 概念 :指标是反映系统性能的时间序列数据(如 CPU 利用率、磁盘读写、网络流量)。

    • AWS 指标 :大多数 AWS 服务会自动向 CloudWatch 发送免费的基础指标。

    • 自定义指标 :你可以推送自己应用的特定数据(如:每分钟下单量)。

      要查看所需服务(如 EC2)的 CloudWatch 监控指标(Metrics),只需要在 CloudWatch 控制面板中选择对应的服务即可

  • 日志 (Logs)

    • 集中化管理 :收集来自 EC2 实例、Lambda 函数、CloudTrail 或其他来源的日志文件。

    • 日志分析 (Logs Insights) :支持类 SQL 语法的快速查询,几秒钟内就能从 GB 级别的日志中找出特定的错误代码。

  • 报警 (Alarms)

    • 阈值触发 :设定一个界限(例如:CPU > 80% 持续 5 分钟),达到时触发操作。

    • 自动化响应 :报警可以发送通知(通过 SNS 邮件/短信),或者执行自动操作(如:Auto Scaling 自动增加机器,或者重启故障实例)。

      要创建报警(Alarms),在 CloudWatch 控制面板左侧点击 报警 (Alarms) -> 创建报警(Create Alarm) ,根据提示 选择指标(Select Metric) , 配置 触发条件(Conditions) , 配置 动作(Actions) 可以发送通知(Notification)或者执行脚本、自动扩容等。

  • 事件 (Events / EventBridge)

    • 状态监听 :监听 AWS 资源的状态变更。

    • 定时任务 :相当于云端的 crontab ,可以定时触发某个 Lambda 函数或脚本。

CloudWatch 默认提供了很多 Dashboard,也可以自定义自己喜欢的仪表盘(Create Dashboard)

阅读全文 »

AWS 里 安全组(Security Group, SG)不是“防火墙规则表”,而是一套 关系型访问控制架构

安全组是在 网络接口 (ENI) 级别运行的,而不是在子网级别。这意味着即使两个实例在同一个子网内,如果它们的安全组规则不允许通信,它们也无法互相访问。

AWS 安全组(Security Group, SG)有以下关键特性

关键特性 说明
有状态 (Stateful) 如果你允许入站请求,响应流量会自动允许流出,不受出站规则限制。
白名单机制 默认拒绝所有流量。你只能添加“允许”规则,不能设置“拒绝”规则。
即时生效 修改规则后,变更会立即应用到所有关联的资源上。
拓扑关系 安全组之间可以 互相引用,形成拓扑关系。也可以包含 自引用规则(self-referencing SG rule),在规则中引用自身安全组

安全组可以绑定到:

  • EC2 实例

  • ENI(弹性网卡)

  • ALB / NLB

  • RDS

  • EKS Pod(通过 ENI / SG for Pod)

  • 📌 一个资源可以绑多个 SG,多个 SG 规则没有顺序概念

  • 📌 一个 SG 也可以被多个资源复用

引用安全组作为源(Security Group Referencing)

这是 AWS 架构设计中最优雅的功能之一。在设置规则时,源(Source)不仅可以是 IP 地址(如 10.0.0.5/32),还可以是 另一个安全组 ID 。典型场景如下:

  • 场景 :Web 层服务器需要访问数据库层。为 Web 层服务器创建一个安全组,如 sg-web-servers

  • 做法 :在数据库安全组中添加规则:允许来自安全组 sg-web-servers 的 3306 端口访问。

  • 好处 :当 Web 层实例由于自动缩容(Auto Scaling)增加或减少时,你不需要手动更新 IP 地址列表,权限会自动随安全组标签流转。不关心 IP 变化,不关心实例扩缩容,只关心 角色之间的通信关系

阅读全文 »

如上图所示,在每个数据中心部署单独的 Prometheus Server,用于采集当前数据中心监控数据。并由一个中心的 Prometheus Server 负责聚合多个数据中心的监控数据。这一特性在 Promthues 中称为 Federation (联邦集群)。

Prometheus Federation (联邦集群)的核心在于每一个 Prometheus Server 都包含一个用于获取当前实例中监控样本的接口 /federate。对于中心 Prometheus Server 而言,无论是从其他的 Prometheus 实例还是 Exporter 实例中获取数据实际上并没有任何差异。

以下配置示例在中心 Prometheus Server 配置其抓取其他 Prometheus Server 的指标,必须至少有一个 match 配置,以指定要抓取的目标 Prometheus Server 的 Job 名称,可以使用正则表达式匹配抓取任务

scrape_configs:
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true # 保留 Leaf 上抓取的指标的标签
honor_timestamps: false # 强制使用 Master 的当前时间,防止时间差导致无法抓取指标
metrics_path: '/federate'
params:
'match[]':
- '{__name__=~".+"}' # 抓取所有指标
static_configs:
- targets:
- '192.168.77.11:9090'
- '192.168.77.12:9090'

__name__ 是 Prometheus 特殊的预定义标签,表示指标的名称
使用以下配置采集目标 Prometheus Server 的所有指标

params:
'match[]':
- '{job=~".+"}'

Master Prometheus 的 Explorer(Web)中不会出现 Leaf 抓取的 Target,可以使用具体的指标如 up 等检查是否抓取到了数据

Master prometheus 上面测试 match 是否能抓取指标:

# curl -G 'http://43.13.23.59:9090/federate' --data-urlencode 'match[]={__name__=~".+"}' | tail

scrape_series_added{Project="CDN",instance="110.120.64.15:9100",job="cdn_node_exporter"} 0 1770621129341
scrape_series_added{Project="CDN",instance="110.120.0.7:9100",job="cdn_node_exporter"} 0 1770621132594
# TYPE up untyped
up{Project="CDN",instance="110.120.64.6:9100",job="cdn_node_exporter"} 1 1770621137089
up{Project="CDN",instance="localhost:9100",job="cdn_node_exporter"} 0 1770621124836
up{Project="CDN",instance="110.120.64.17:9100",job="cdn_node_exporter"} 1 1770621132241

环境信息

  • Centos 7.9.2009
  • docker-ce-19.03.15
  • docker-20.10.9

Docker 安装

yum 安装 docker

安装 yum 源,docker官方 centos 安装文档

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 docker

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

yum 离线安装 docker

参考链接下载rpm安装包

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.15-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.15-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.13-3.1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

安装 docker

yum localinstall -y containerd.io-1.4.13-3.1.el7.x86_64.rpm \
docker-ce-cli-19.03.15-3.el7.x86_64.rpm \
docker-ce-19.03.15-3.el7.x86_64.rpm \
docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

以上 2 条命令可以使用以下 1 条命令完成

yum localinstall -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.15-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.15-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.13-3.1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

Docker 26 安装,适用于 Centos 8Rocky Linux 8

yum localinstall -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-26.1.3-1.el8.x86_64.rpm https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-cli-26.1.3-1.el8.x86_64.rpm https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.6.32-3.1.el8.x86_64.rpm https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el8.x86_64.rpm

启动docker

systemctl enable docker --now
阅读全文 »