.netcore 通过Flurl验证k8s内部访问与获取环境变量 电脑版发表于:2020/4/14 10:52  >#.netcore验证k8s内部访问与获取环境变量 [TOC] <br/> 创建k8s-name项目 ------------ <br/> >#### 项目结构如下  <br/> >#### 实验过程 ```flow st=>start: k8s-demo项目为起始点|current op=>operation: 请求ValuesController控制器Get接口|approved:>https://k8s-demo/Values[blank] op1=>operation: 执行框2| in=>inputoutput: 通过INameService接口去请求name-api数据|approved:>https://name-api/Values[blank] cond=>condition: 请求结果 e=>operation: 报错|past e2=>end: 返回结果|past st->op->in->cond cond(no)->e cond(yes)->op1->e2 ``` >#### 环境设置 安装 Flurl 相关包 ```bash dotnet add package Flurl --version 3.0.0-pre3 dotnet add package Flurl.Http --version 3.0.0-pre3 ``` >#### 内容如下 <br/> <font style="color:green;font-size:18px">**INameService.cs**</font> <br/> ```csharp public interface INameService { Task<string> GetName(); } ``` <br/> <font style="color:green;font-size:18px">**NameService.cs**</font> <br/> ```csharp public class NameService:INameService { private readonly string _nameUrl = "http://name-api/name"; public async Task<string> GetName() { return await _nameUrl.GetStringAsync(); } } ``` <br/> <font style="color:green;font-size:18px">**Startup.cs**</font>--><font style="color:purple;font-size:18px">**ConfigureServices**</font> <br/> ```csharp public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSingleton<INameService,NameService>(); } ``` <br/> <font style="color:green;font-size:18px">**ValuesController.cs**</font> <br/> ```csharp [ApiController] [Route("[controller]")] public class ValuesController : ControllerBase { private readonly INameService _nameService; public ValuesController(INameService nameService){ _nameService = nameService; } [HttpGet] public async Task<ActionResult<string>> Get(){ return "hello," + await _nameService.GetName(); } } ``` <br/> <font style="color:lightblue;font-size:18px">**Dockerfile**</font> <br/> ```bash FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY . k8s-demo/ RUN pwd RUN ls RUN dotnet restore "k8s-demo/k8s-demo.csproj" COPY . . WORKDIR "/src/k8s-demo" RUN pwd RUN ls RUN mkdir -p /app/build RUN mkdir -p /app/publish RUN dotnet build "k8s-demo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "k8s-demo.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "k8s-demo.dll"] ``` <br/> <font style="color:purple;font-size:18px">**Deploy.yaml**</font> <br/> ```bash apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo namespace: netcore labels: name: k8s-demo spec: replicas: 2 selector: matchLabels: name: k8s-demo template: metadata: labels: name: k8s-demo spec: containers: - name: k8s-demo image: aidasi/k8sdemoapi:latest ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: k8s-demo namespace: netcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: k8s-demo ``` <br/> 创建name-api项目 ------------ <br/> >#### 项目结构如下  >#### 实验过程 ```flow st=>start: name-api项目为起始点|current op=>inputoutput: 请求http://name-api/Values|approved:>https://name-api/Values[blank] e=>operation: 请求结果|past st->op->e ``` >#### 内容如下 <br/> <font style="color:green;font-size:18px">**NameController.cs**</font> 环境变量参考:https://kubernetes.io/zh/docs/concepts/services-networking/service/ <br/> ```csharp [ApiController] [Route("[controller]")] public class NameController : ControllerBase { [HttpGet] public ActionResult<string> Get(){ var host = Environment.GetEnvironmentVariable("NAME_API_SERVICE_HOST"); if(string.IsNullOrEmpty(host)) return "empty"; return host; } } ``` <br/> <font style="color:lightblue;font-size:18px">**Dockerfile**</font> <br/> ```bash FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY . name-api/ RUN dotnet restore "name-api/name-api.csproj" COPY . . WORKDIR "/src/name-api" RUN mkdir -p /app/build RUN mkdir -p /app/publish RUN dotnet build "name-api.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "name-api.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "name-api.dll"] ``` <br/> <font style="color:purple;font-size:18px">**Deploy.yaml**</font> <br/> ```bash apiVersion: apps/v1 kind: Deployment metadata: name: name-api namespace: netcore labels: name: name-api spec: replicas: 2 selector: matchLabels: name: name-api template: metadata: labels: name: name-api spec: containers: - name: name-api image: aidasi/name-api:v1 ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: name-api namespace: netcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: name-api ``` <br/> 发布k8s-name与name-api项目 ------------ <br/> >#### 发布k8s-name项目到 aidasi/k8sdemoapi:v2 <br/> 1. 通过 **Xftp** 上传项目 <br/>  <br/> 2. 到指定目录下生成项目 <br/>  `docker build -t aidasi/k8sdemoapi:v2 .`  <br/> >#### 发布name-api项目到 aidasi/name-api:v1 <br/> 同理 <br/> `docker build -t aidasi/name-api:v1 .` <br/>  <br/> >#### 查看所有镜像结果 <br/>  <br/> >#### 上传所有镜像 <br/> `docker push aidasi/name-api:v1` `docker push aidasi/k8sdemoapi:v2` <br/>  <br/>  <br/> 部署项目 ------------ <br/> >#### 部署name-api项目到k8s中 `kubectl apply -f deploy.yaml` <br/>  <br/> >#### 接下来把k8s-demo从v1更新到v2 `kubectl apply -f deploy.yaml` <br/>  >#### 测试一下 `kubectl proxy`  <br/>  >为什么这里是empty呢? 我当时写代码的时候把环境变量 Name_API_SERVICE_HOST 写错成 Name_API_SERVICE_HOST 了 但我已经在代码中做好修改了 所以大家访问的结果应该是 hello,(Pod ip) >Hub已经更新了,请大家放心 <br/> >#### 扩展进入pod指令 `kubectl -n netcore exec -it name-api-d47996547-hcpdj -c name-api -- sh` <br/>  <br/> 靓仔,给个关注嘛!!!