首页
视频
资源
登录
原
精
.netcore 通过Flurl验证k8s内部访问与获取环境变量
6290
人阅读
2020/4/14 10:52
总访问:
2654445
评论:
0
收藏:
1
手机
分类:
容器编排
![Kubernetes](https://img.tnblog.net/arcimg/hb/4027cd04790f47abbb576c3daffe67f4.png "Kubernetes") >#.netcore验证k8s内部访问与获取环境变量 [TOC] <br/> 创建k8s-name项目 ------------ <br/> >#### 项目结构如下 ![k8s-name的项目结构](https://img.tnblog.net/arcimg/hb/a679ae5d08e24eed948070f287b43ec7.png "k8s-name的项目结构") <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/> >#### 项目结构如下 ![name-api的项目结构](https://img.tnblog.net/arcimg/hb/b99a4b0c61824eb8a3ab4e2c879e23aa.png "name-api的项目结构") >#### 实验过程 ```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/> ![Xftp](https://img.tnblog.net/arcimg/hb/faae58d1f623449e8fa0048849fe96d0.png "Xftp") <br/> 2. 到指定目录下生成项目 <br/> ![项目截图](https://img.tnblog.net/arcimg/hb/0413434b4979436c81a6070f23091a48.png "项目截图") `docker build -t aidasi/k8sdemoapi:v2 .` ![项目build](https://img.tnblog.net/arcimg/hb/ee1bb199ecb74959b12377b8499470be.png "项目build") <br/> >#### 发布name-api项目到 aidasi/name-api:v1 <br/> 同理 <br/> `docker build -t aidasi/name-api:v1 .` <br/> ![name-api的发布](https://img.tnblog.net/arcimg/hb/7ac8775af5904494bf302074d8f0a8ef.png "name-api的发布") <br/> >#### 查看所有镜像结果 <br/> ![查看所有镜像](https://img.tnblog.net/arcimg/hb/ebc08eca6e854b409f1cdf0fa6b30924.png "查看所有镜像") <br/> >#### 上传所有镜像 <br/> `docker push aidasi/name-api:v1` `docker push aidasi/k8sdemoapi:v2` <br/> ![](https://img.tnblog.net/arcimg/hb/2b9ec61182f24eb5b02d14d48bdd786f.png) <br/> ![Hub查看](https://img.tnblog.net/arcimg/hb/97a781eac4f046aeac4fc39ed03ced4e.png "Hub查看") <br/> 部署项目 ------------ <br/> >#### 部署name-api项目到k8s中 `kubectl apply -f deploy.yaml` <br/> ![](https://img.tnblog.net/arcimg/hb/dd88bfd959e84ca887c2f2996a8dbcd4.png) <br/> >#### 接下来把k8s-demo从v1更新到v2 `kubectl apply -f deploy.yaml` <br/> ![](https://img.tnblog.net/arcimg/hb/83181d8f35954b5a9ae618c4c2bdb966.png) >#### 测试一下 `kubectl proxy` ![](https://img.tnblog.net/arcimg/hb/711284140c23466bbc4e758eef6b8275.png) <br/> ![](https://img.tnblog.net/arcimg/hb/9f214484c75f47cfac2d098d7b068e85.png) >为什么这里是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/> ![](https://img.tnblog.net/arcimg/hb/c852f78adea044e1a3c94e7c40a517ae.png) <br/> 靓仔,给个关注嘛!!!
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
171篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
4篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
Halcon
5篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术