我正在 COS(容器操作系统)实例上部署容器。非常简单。
我希望它每天重启。最好的方法是什么?我可以在虚拟机上设置一个简单的 CRON 选项卡吗?问题是每次重新部署虚拟机时都需要重新执行此操作。
我正在 COS(容器操作系统)实例上部署容器。非常简单。
我希望它每天重启。最好的方法是什么?我可以在虚拟机上设置一个简单的 CRON 选项卡吗?问题是每次重新部署虚拟机时都需要重新执行此操作。
遵循 GCP 提供的文档:https ://cloud.google.com/artifact-registry/docs/repositories/cleanup-policy
我在我的工件存储库上设置了清理策略,并启用了试运行选项,但无法使用该命令输出任何审计日志。
gcloud logging read 'protoPayload.serviceName="artifactregistry.googleapis.com" AND protoPayload.request.parent:"projects/gift-service-app-jm/locations/australia-southeast1/repositories/gcf-artifacts" AND protoPayload.request.validateOnly=true' \
--resource-names="projects/gift-service-app-jm" \
--project=gift-service-app-jm
我能够确认策略已设置,并且使用命令启用了试运行gcloud artifacts repositories describe gcf-artifacts
选项
{
"cleanupPolicies": {
"Delete Previous Versions": {
"action": "DELETE",
"condition": {
"olderThan": "864000s",
"tagState": "UNTAGGED"
},
"id": "Delete Previous Versions"
}
},
"cleanupPolicyDryRun": true,
"createTime": "2023-09-27T05:07:31.256470Z",
"description": "This repository is created and used by Cloud Functions",
"format": "DOCKER",
"labels": {
"goog-managed-by": "cloudfunctions"
},
"mode": "STANDARD_REPOSITORY",
"name": "projects/gift-service-app-jm/locations/australia-southeast1/repositories/gcf-artifacts",
"updateTime": "2024-07-10T05:39:56.088672Z"
}
以前有人遇到过这个问题吗?我已将所有者角色应用于我的 IAM 主体,但也尝试明确添加日志查看器和私有日志查看器角色。
我有一个带有启动脚本的 Google Cloud Compute Engine 实例模板。
在启动脚本中,服务器会生成证书。生成证书后,它会向 API 发送一条消息,告知中央系统有关证书的信息。请求如下所示:
curl --location 'https://my-side.com/hello?hostname=$hostname' \
--header 'Authorization: SUPER_SECRET_API_KEY'
API 密钥以原始文本形式存储在启动脚本中。这样可以吗,还是应该将其移至示例密钥存储?如果可以,那么我该如何读取启动脚本中的 API 密钥?
我在 GKE Autopilot 上运行的 Kubernetes 集群有一个不健康的节点。该节点有一个Ready
状态,但在其上运行的所有 Pod 都有一个CreateContainerError
状态,并且似乎在轮询容器映像时陷入困境。
例子:
(正常拉取 101 秒(x1326 超过 4 小时 49 分钟)kubelet 容器映像“gke.gcr.io/cluster-proportional-autoscaler:v1.8.10-gke.3@sha256:274afbfd520aef0933f1fefabddbb33144700982965f9e3632caabb055e912c6 “已经存在于机器上)。
kubernetes 升级时出现问题,因为我的帐户超出了配额(显然 1TB 的计算存储对于小型集群来说是不够的)。我获得了更多配额,但自动驾驶仪集群无法自行修复。
我“封锁”了该节点,将其标记为不可调度,并手动从中删除了我的 pod。新的 Pod 被安排在更健康的节点上,所以还不错。
现在我想打扫卫生。旧的 Pod 被困在Terminating
状态中,但强制删除它们会使它们消失。
我无法对kube-system
和gke-gmp-system
命名空间执行相同的操作。我看到“托管”pod 具有CreateContainerError
状态,并且它们正在循环中拉取容器映像。一个人也被某种Terminating
地位所困。
我想删除这个节点,显然你需要耗尽该节点并忽略名称空间中的错误kube-system
。我耗尽了节点,但它仍然存在。
如何删除不健康的节点?
我正在git clone
我的 Google Cloud Run 作业中克隆多个存储库(使用 ),其中之一使 Google Cloud 通过 exit 1 杀死容器。请参阅日志:
{
insertId: "xxx",
labels: {
instanceId: "xxx"
run.googleapis.com/execution_name: "xxx",
run.googleapis.com/task_attempt: "0",
run.googleapis.com/task_index: "0"
},
logName: "xxx/run.googleapis.com%2Fstderr",
receiveTimestamp: "2024-03-13T09:05:28.686787232Z",
resource: {
labels: {
job_name: "xxx",
location: "xxx",
project_id: "xxx"
},
type: "cloud_run_job"
},
textPayload: "Killed",
timestamp: "2024-03-13T09:05:28.685133Z"
}
克隆的存储库有 10.828 个文件,大小为 1.8 GB。内存和CPU使用率均未超过50%。它发生在 期间。git clone [email protected]:usr/bad_repo.git
我认为这与限制有关,但我没有找到任何东西。
重现步骤:
git clone -q --depth 1 --no-tags --filter=blob:limit=100k [email protected]:supabase/supabase.git
所有日志:
这是我第一次在 Google App Engine 上部署[或者至少尝试]。我已经构建了一个 Java Spring Boot 应用程序,配置了app.yaml
并执行了其他准备步骤。但是,当我运行时gcloud app deploy
,我收到以下错误消息:
ERROR: (gcloud.app.deploy) Error Response: [4] Timed out fetching pod.
我正在尝试在标准环境中部署。该错误发生在该Updating service [default]
步骤大约 5 分钟后。据我从日志来看,建造是成功的。我在网上找不到有关此特定错误的更多信息。
app.yaml (/src/main/appengine/app.yaml)
runtime: java11
env: standard
instance_class: B1
basic_scaling:
max_instances: 1
env_variables:
PROFILE: "prod"
TWILIO_SID: 0
TWILIO_KEY: 0
TWILIO_PHONE_FROM: 0
TWILIO_PHONE_TO: 0
我错过了什么吗?我可以仔细检查什么?
我有一个使用 Google 的 OAuth2.0 身份验证的 MVC .net core 6 Web 应用程序,但无法使用 Kubernetes 发布它。
项目背景:
它在本地正常编译和运行,包括创建 docker 映像并运行容器,但要在本地运行 docker 容器并拥有带有有效证书的 https 端口(我需要这个才能让 Google 的 OAuth 工作),我需要运行以下过程。
使本地证书可信的命令和过程序列(您只需在 docker 容器中运行即可执行此操作,无需直接运行项目):
创建本地证书 pfx: dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\Apresentacao.Web.pfx -p pa55w0rd!
在应用程序的 .csproj 中创建 UserScretsId 配置行:{SomeGuidIdHere}
在本地用户密码中输入证书密码: dotnet user-secrets set "Kestrel:Certificates:Development:Password" "pa55w0rd!"
使证书“受信任” dotnet dev-certs https --trust
运行 docker 容器,但传递一些必要的参数(在项目文件夹外的 powershell 或 bash 中运行):
docker run -p 8080:80 -p 8081:443 -e ASPNETCORE\_URLS="https://+;http://+" -e ASPNETCORE\_HTTPS\_PORT="8081" -e ASPNETCORE\_ENVIRONMENT=Development - v $env:APPDATA\microsoft\UserSecrets\\:/root/.microsoft/usersecrets -v $env:USERPROFILE\\.aspnet\https:/root/.aspnet/https/ admin
如果我不执行上述过程,或者执行“Docker run”而不传递使用 https 端口和证书所需的参数,则在运行容器时会收到以下返回结果:
warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Failed to determine the https port for redirect.
我的问题是: 在本地,我找到了处理 docker 容器、https 端口和 localhost 的 ssl 证书的解决方案,但是我使用 Git Hub 操作在 Google Cloud 上发布相同的应用程序来运行我的部署管道,并在云中我我将镜像 docker 保存在存储桶中并使用 kubernetes 创建服务。我们已经有其他应用程序在带有 Kubernetes 的 Google 云基础设施上运行,并且我们可以毫无问题地通过 Ingress 公开 URL 并使用 Google 提供的证书。
我用不同的配置进行了几次发布测试,直到我怀疑它可能是应用程序中的某些内容,我决定在没有 Google 身份验证配置的情况下进行发布测试,令我惊讶的是,该应用程序在 Kubernetes 中具有健康状态,并且可以在 URL 上使用正确使用 https。当我在项目的 Startup.cs 中再次包含 Google 身份验证时,我的问题又出现在 Kubernetes 容器中,并且在访问 URL 时,我得到的返回结果是 502。
以下是我如何配置 Google 身份验证: 在 Startup.cs 上
配置服务方法:
public void ConfigureServices(IServiceCollection services)
{
//Auth config google
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(options =>
{
options.ClientId = "{my_ClientId}";
options.ClientSecret = "{my_ClientSecret}";
});
...
}
配置方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/PaginaNaoEncontrada");
app.UseHsts();
}
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404)
{
context.Request.Path = "/Home/PaginaNaoEncontrada";
await next();
}
});
app.UseHttpsRedirection();
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = o => { o.Context.Response.Headers.Append("Cache-Control", $"public, max-age=10800"); }
});
app.UseUnobtrusiveAjax();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication(); //Important
}
在我的 HomeController.cs 中(第一次访问应用程序时我的第一个请求命中,并且我验证用户是否已通过身份验证)控制器上方的 [Authorize] 注释对于我在启动中添加的工作 .cs 是绝对必要的:
[Authorize]
public class HomeController : Controller
{ ...}
我对家庭指数的行动:
[HttpGet]
return View();
通过 Index 调用 LoginGoogle:
public ActionResult LoginGoogle(){
return Challenge(new AuthenticationProperties { RedirectUri = "/" }, "Google");}
为了发布到 Kubernetes,我有以下文件(我突出显示其中三个,因为我认为该站点最重要的设置都在其中):
我的部署看起来像这样:
apiVersion: apps/v1
我的 Ingress 看起来像这样:
apiVersion: networking.k8s.io/v1
我的服务如下所示:
apiVersion: v1
最近我对 Kubernetes 的 .yaml 文件进行了更改,我开始从服务接收更多日志,类似于如果我运行不带参数的“Docker run”命令来使用本地证书,我在本地收到的日志:最新容器日志: https://drive.google.com/file/d/1VcmiBe0LBuMr5B0VC5YivrvZdygZtEf5/view?usp=drive_link
在进行这些更改之前(主要在部署文件中),我在日志中收到以下返回: 以前的日志: https: //drive.google.com/file/d/16NoN1fhhmoGk2bZRWTY0oxqFBY3xH4Kj/view ?usp=drive_link
上面所示的日志下方只是有关 ResponseCoockies 的信息的无限循环,并且有关 https 端口的信息不会重复,直到进行新的部署为止。
当我们在配置了 Google 身份验证的情况下发布时,访问 URL 时服务如何响应:https: //drive.google.com/file/d/1jDCmZNFPvzRvnq2VeOr7yC79A9Cba1rf/view ?usp=drive_link
我的问题是,我当前是否正在配置 Kubernetes,或者是否缺少信任证书的某些内容?当我从应用程序中删除 Google 身份验证配置时,为什么部署会正常进行?(我删除了启动配置和控制器注释)
请务必注意,我的 OAuth 客户端 ID 凭据是正确的,因为我能够通过添加授权的 https 本地主机 URL 来进行测试,因此这也不会成为问题。我将在 Kubernetes 中配置的 URL 添加到授权使用客户端 ID OAuth 的 URL 列表中,如下所示: https: //drive.google.com/file/d/1Hzi74jJ6sZ7za5D3rFZcyDQRaIoW4jOS/view ?usp=drive_link
其他信息。
当我在没有 Google 身份验证配置的情况下发布应用程序时的屏幕截图,它保持正常运行,并且证书似乎已链接到 URL 并且安全:
https://drive.google.com/file/d/1RLocACa-TaCsmZo1S74sQoKrzvFgcfyx/view?usp=drive_link
使用 Ingress.yaml 进行部署时,它会在基础设施中创建负载平衡,并自动配置链接到静态 IP 的前端端点:
https://drive.google.com/file/d/1f1LyIzcDqUbEUEpPTh6VQqdwyshMeUVA/view?usp=drive_link
我们使用AWS服务来购买和托管域名,因此当访问我配置的URL时,我的DNS将解析为我的前端的IP,我配置了一个“记录名称”以重定向到该IP。这已经对其他应用程序完成了,并且有效,甚至当我们在没有身份验证的情况下发布此应用程序时它也有效......
以下是我在AWS托管区域中进行的注册: https://drive.google.com/file/d/1y8BIeK7RYywP95jPzpCGYkgZ7Lv-w7KG/view ?usp=drive_link
以及由 Google 提供的证书的详细信息,并且由于我对 IP 所做的映射,只有在与 AWS 建立通信时该证书才变为“活动”,如上所述。 https://drive.google.com/file/d/1Y9wLH_DDX-93iMY5eNwBN0VcDFbId5I1/view?usp=drive_link
预先感谢您的帮助
我们在 europe-west6(苏黎世)部署了一个 Google Cloud Function,它可以对 API 进行 HTTP 调用。在我们的服务器日志中,这些 HTTP 调用源自 IP 地址 35.203.247.36,该地址显示美国为来源。我期待来自瑞士的源 IP 地址。这会导致地理封锁配置出现一些问题。
我发现这个相关线程https://issuetracker.google.com/issues/72263361#comment91,它指出这应该按预期工作,但链接的 IP 范围似乎与我们的观察不同:
{
"ipv4Prefix": "34.65.0.0/16",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "34.104.110.0/23",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "34.124.46.0/23",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "35.216.128.0/17",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "35.220.44.0/24",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "35.235.216.0/21",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv4Prefix": "35.242.44.0/24",
"service": "Google Cloud",
"scope": "europe-west6"
}, {
"ipv6Prefix": "2600:1900:4160::/44",
"service": "Google Cloud",
"scope": "europe-west6"
}
为什么我们的 API 调用不是源自这些 IP 范围之一?
我知道我应该从 Google Cloud Console 创建一个带有 JSON 凭据的服务帐户密钥并赋予适当的角色。
然后我应该使用 kubectl 命令来创建秘密:
kubectl -n=NAMESPACE_NAME create secret docker-registry SECRET_NAME --docker-server HOST_NAME
--docker-username _json_key --docker-email ANY_VALID_EMAIL --docker-password="$(cat ~/key.json)"
但在所有示例中,我发现都提到了:
--docker-server 'gcr.io'
而我应该使用新的 Artifact Registry。
问题是我不清楚哪一个是 HOST_NAME 的正确路径:
我尝试了几次,但每次部署都无法下载映像。(我将带有凭据的机密添加到 SA,并且我确信该机密已在部署中安装并使用以尝试下载映像)。