feat: support multiple ACR registries (openclawacr)
This commit is contained in:
+41
-32
@@ -132,41 +132,45 @@ class K8sManager:
|
||||
raise
|
||||
|
||||
def _copy_acr_secret_to_namespace(self, target_namespace: str):
|
||||
"""复制 ACR secret 到目标命名空间
|
||||
"""复制所有 ACR secrets 到目标命名空间
|
||||
|
||||
Args:
|
||||
target_namespace: 目标命名空间
|
||||
"""
|
||||
try:
|
||||
# 从 agent-manager 命名空间读取 acr-secret
|
||||
source_secret = self.v1.read_namespaced_secret(
|
||||
name="acr-secret",
|
||||
namespace="agent-manager"
|
||||
)
|
||||
|
||||
# 创建新的 secret(去除自动生成的字段)
|
||||
new_secret = client.V1Secret(
|
||||
metadata=client.V1ObjectMeta(
|
||||
name="acr-secret",
|
||||
namespace=target_namespace
|
||||
),
|
||||
data=source_secret.data,
|
||||
type=source_secret.type
|
||||
)
|
||||
|
||||
# 在目标命名空间创建 secret
|
||||
self.v1.create_namespaced_secret(
|
||||
namespace=target_namespace,
|
||||
body=new_secret
|
||||
)
|
||||
logger.info(f"✅ 已复制 ACR secret 到命名空间 {target_namespace}")
|
||||
except ApiException as e:
|
||||
if e.status == 404:
|
||||
logger.warning(f"⚠️ 源 ACR secret 不存在,跳过复制")
|
||||
elif e.status == 409:
|
||||
logger.info(f"ACR secret 已存在于命名空间 {target_namespace}")
|
||||
else:
|
||||
logger.error(f"❌ 复制 ACR secret 失败: {e}")
|
||||
# 需要复制的 ACR secrets 列表
|
||||
acr_secrets = ["acr-secret", "openclaw-acr-secret"]
|
||||
|
||||
for secret_name in acr_secrets:
|
||||
try:
|
||||
# 从 agent-manager 命名空间读取 secret
|
||||
source_secret = self.v1.read_namespaced_secret(
|
||||
name=secret_name,
|
||||
namespace="agent-manager"
|
||||
)
|
||||
|
||||
# 创建新的 secret(去除自动生成的字段)
|
||||
new_secret = client.V1Secret(
|
||||
metadata=client.V1ObjectMeta(
|
||||
name=secret_name,
|
||||
namespace=target_namespace
|
||||
),
|
||||
data=source_secret.data,
|
||||
type=source_secret.type
|
||||
)
|
||||
|
||||
# 在目标命名空间创建 secret
|
||||
self.v1.create_namespaced_secret(
|
||||
namespace=target_namespace,
|
||||
body=new_secret
|
||||
)
|
||||
logger.info(f"✅ 已复制 {secret_name} 到命名空间 {target_namespace}")
|
||||
except ApiException as e:
|
||||
if e.status == 404:
|
||||
logger.warning(f"⚠️ 源 {secret_name} 不存在,跳过复制")
|
||||
elif e.status == 409:
|
||||
logger.info(f"{secret_name} 已存在于命名空间 {target_namespace}")
|
||||
else:
|
||||
logger.error(f"❌ 复制 {secret_name} 失败: {e}")
|
||||
|
||||
def create_service(self, service_name: str, namespace: str, pod_selector: Dict[str, str],
|
||||
service_port: int, target_port: int) -> Dict:
|
||||
@@ -723,10 +727,15 @@ class K8sManager:
|
||||
ports=container_ports
|
||||
)
|
||||
|
||||
# 根据镜像来源选择合适的 imagePullSecrets
|
||||
image_pull_secrets = [client.V1LocalObjectReference(name="acr-secret")]
|
||||
if "openclawacr" in image:
|
||||
image_pull_secrets.append(client.V1LocalObjectReference(name="openclaw-acr-secret"))
|
||||
|
||||
pod_spec = client.V1PodSpec(
|
||||
containers=[container],
|
||||
restart_policy="Always",
|
||||
image_pull_secrets=[client.V1LocalObjectReference(name="acr-secret")]
|
||||
image_pull_secrets=image_pull_secrets
|
||||
)
|
||||
|
||||
# 构建标签(合并默认标签和用户自定义标签)
|
||||
|
||||
Reference in New Issue
Block a user