kubernetes - Docker Desktop 上的 Kubernetes - 使用两个 pod 之间的服务的本地连接问题
问题描述
我创建了一个 ASP.NET Core C# Kubernetes Microservice (Named: 'DemoApi')和一个 Angular Frontend app (Named: 'DemoApp')。
尽管它在我运行两个容器时都可以通过Docker for Desktop
or运行,但在运行时Docker Swarm Mode
我似乎遇到了一些连接问题Kubernetes on Docker Desktop
。
为了澄清这个问题,我可以同时显示
- 前端应用程序位于
http://localhost:30005
- 后端应用程序位于
http://localhost/demo
但是在使用 Kubernetes 运行 Pod 时,前端应用程序不会显示它应该从 API 后端获取的数据。
尽管我进行了搜索,但我找不到与我类似的问题。可能是什么问题呢?任何帮助将不胜感激。
以下是我采取的步骤的简短摘要:
定义应用程序以相互读取。
一个。演示API:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddCors(options => { options.AddPolicy("AllowAngularDevClient", builder => { builder .WithOrigins("http://localhost:4200") .AllowAnyHeader() .AllowAnyMethod(); }); options.AddPolicy("AllowAngularClient", builder => { builder .WithOrigins("http://localhost") .AllowAnyHeader() .AllowAnyMethod(); }); }); }
湾。DemoApp(下
app.component.ts
):export class AppComponent { title = 'DemoApp'; response = "No data loaded, yet"; constructor(private http: HttpClient) { this.http.get('http://localhost/demo', {responseType: 'text'}).subscribe((response: any) => { console.log(response); this.response = response; }); }
将应用程序构建到映像中
一个。使用默认的 Visual Studio docker 支持构建 ASP.NET Core C#(使用解决方案资源管理器,右键单击 dockerfile >
Build Docker Image
)。湾。为 Angular 应用程序创建了一个
dockerfile
,如下所示:FROM node:14-alpine as build-step RUN mkdir -p /app WORKDIR /app COPY package.json /app RUN npm install COPY . /app RUN npm run build --prod FROM nginx:1.21.0-alpine COPY --from=build-step /app/dist/DemoApp /usr/share/nginx/html
然后运行命令
docker build -t demoapp .
✔️ 使用本地 Docker for Desktop 工作
docker run --name demoapi-container demoapi
docker run --name demoapp-container --publish 4200:80 demoapp
✔️ 使用本地 Docker Swarm 模式工作
docker service create --name demoapi-svc -p 80:80 demoapi
docker service create --name demoapp-svc -p 4200:80 demoapp
❌ 在 Docker 桌面上使用本地 Kubernetes 不起作用
- 演示API:
apiVersion: v1 kind: Pod metadata: name: demo-api-pod labels: name: demo-api-pod app: demo-api spec: containers: - name: demo-api-container image: demoapi:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: demoapi labels: name: demo-api-svc app: demo-api spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: name: demo-api-pod app: demo-api
- 演示应用:
apiVersion: v1 kind: Pod metadata: name: demo-angular-pod labels: name: demo-angular-pod app: demo-angular spec: containers: - name: demo-angular-container image: demoapp:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: demoapp labels: name: demo-angular-svc app: demo-angular spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30005 selector: name: demo-angular-pod app: demo-angular
编辑:感谢@darwinawardee 的建议,我从头开始完全重新配置了所有内容:
在我的 DemoApi 应用程序中,我已添加到控制器中:
options.AddPolicy("AllowAngularKubernetesClient",
builder =>
{
builder
.WithOrigins("http://demoapp").WithOrigins("demoapp").WithOrigins("http://localhost:30005")
.AllowAnyHeader()
.AllowAnyMethod();
});
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowAngularKubernetesClient");
[...]
}
在我的 DemoApp 应用程序中,我添加了app.component.ts
:
constructor(private http: HttpClient)
{
this.http.get('http://demoapi/demo', {responseType: 'text'}).subscribe((response: any) => {
console.log(response + " -- from Kubernetes Cluster.");
this.response = response;
});
}
并重新构建图像。
我已经完成了相同的过程,但 DemoApp 没有从 DemoApi 获取信息。
解决方案
您将面临网络路由问题。
在 Kubernetes 中,每个部署都将在分配有自己的 IP 地址的 pod 中运行,每个部署的关联服务也是如此(负载平衡跨 pod 的流量)。Kubernetes 维护一个内部 DNS用于服务之间的路由。一个服务可以通过它的完整路径 servicename.namespace.svc.cluster-domain.example 或在命名空间内通过 servicename 本身来访问。
因此,对于到达 DemoApi 的流量,您将 DemoApp 查询 http://DemoApi/demo 而不是 http://localhost/demo。
推荐阅读
- node.js - 与解构一起使用的 Sinon 存根函数
- scala - Scala如何获取Map的键,其中值为List
- unity3d - AR通过不同的相机传递相同的物体
- django - 在 Django 模型中将 html 类设置为 TextField
- javascript - 如何在 MEAN Stack 中为表单设置默认值?
- security - 谷歌云错误报告权限
- android - 未能找到用户 0 的提供程序 null;预计会为此授权 Android Oreo 找到有效的 ContentProvider
- c# - C# 内存分配和链表实现
- node.js - NodeJs-如何在 PdfKit 模块中使用波斯文本?
- mongodb - 如何使用聚合函数 mongo db-query