如何解决Docker 桌面上的 Kubernetes - 在两个 Pod 之间使用服务的本地连接问题
我创建了一个 ASP.NET Core C# Kubernetes 微服务 (Named: 'DemoApi') 和一个 Angular 前端应用 (Named: 'DemoApp')。 >
尽管当我通过 Docker for Desktop
或 Docker Swarm Mode
运行两个容器时它可以工作,但当我通过 Kubernetes on Docker Desktop
运行时,我似乎遇到了一些连接问题。
为了澄清问题,我可以同时显示
- 位于
http://localhost:30005
的前端应用 - 位于
http://localhost/demo
的后端应用程序
但是在使用 Kubernetes 运行 Pod 时,前端应用程序不会显示它应该从 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 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
❌ 无法将本地 Kubernetes 用于 Docker 桌面
- DemoApi:
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获取信息。
这是使用原生 Chrome 的 Inspect > Network 选项卡的结果:
解决方法
您将面临网络路由问题。
在 Kubernetes 中,每个部署都将在一个 pod 中运行,该 pod 被分配了自己的 IP 地址,每个部署的相关服务也是如此(它在 pod 之间负载平衡流量)。 Kubernetes 维护一个 internal DNS 用于服务之间的路由。一个服务可以通过它的完整路由 servicename.namespace.svc.cluster-domain.example 或在命名空间内简单地通过 servicename 本身访问。
因此对于到达 DemoApi 的流量,您将 DemoApp 查询 http://DemoApi/demo 而不是 http://localhost/demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。