【发布时间】:2021-09-21 00:20:59
【问题描述】:
我创建了一个 ASP.NET Core C# Kubernetes 微服务(命名:'DemoApi')和一个 Angular 前端应用程序(命名:'DemoApp')。 p>
尽管当我通过Docker for Desktop 或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(); }); }); }b. 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)。b.为 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 demoapidocker run --name demoapp-container --publish 4200:80 demoapp
✔️ 使用本地 Docker Swarm 模式工作
docker service create --name demoapi-svc -p 80:80 demoapidocker 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 获取信息。
【问题讨论】:
-
为了更好地理解这个问题,你试图在同一个 ip 地址和同一个端口与 Kubernetes 为 Docker Desktop 公开一个后端和一个前端?还是使用外部可用的两个不同 IP?
-
@AndD 查看 Kubernetes 部分,前端应用程序 (DemoApp) 应该在
http://localhost:30005可见,而后端应用程序 (DemoApi) 应该在http://localhost/demo可见。它们都是,但前端应用程序不显示来自后端应用程序的数据,因为它无法访问其 api 数据。 -
问题到底出在哪里?你检查过任何日志吗?你有任何http错误代码吗?你说它不起作用,但究竟发生了什么?您有任何错误、信息、警告吗?你用的是什么版本的 Kubernetes?为什么在
demoApi中使用type: LoadBalancer,在DemoApp中使用type: NodePort?您在集群中究竟设置了什么? -
@MikołajGłodziak 我为上述问题添加了更多详细信息,包括日志。感谢您的关注。关于您的问题: (1) 问题是 DemoApp 没有从 DemoApi 获取信息。 (2)我试图以不同的方式暴露不同的豆荚。我的最终目标是让 DemoApi 成为
ClusterIP(未公开),DemoApp 成为NodePort或LoadBalancer(公开)。 -
您使用的是哪个 Kubernetes 版本?我会尝试重现这个问题。
标签: kubernetes service yaml kubernetes-pod connectivity