.NET Core + Kubernetes:快速体验

Kubernetes 是目前非常主流的容器编排工具,在应用创建、应用部署、应用扩容、应用更新等方面都非常的方便,而且在应用故障时,也可以快速自愈。所以基于微服务架构下的产品,了解 Kubernetes 的使用是非常必要的,我猜测很多人都曾经多次打算自己搭建 Kubernetes 环境,部署个服务试试效果,但却因为很多原因一次次从入门到放弃,这里应该有部分原因是因 Kubernetes 的入门成本相对较高,概念较多,搭建略复杂,所以往往一开始就死在了环境搭建上,导致很多预定的目标都没能实现。

关于 Kubernetes 概念上的内容这里不再赘述,但概念的部分又是在使用中必须优先掌握的知识,所以建议先通过查看资料对整体架构和使用方式有一定了解后再动手实际操作。

集群搭建

这里将搭建 Kubernetes 集群环境来进行测试,3 台 Linux 服务器(1个Master,2个Node)。网上有很多 Kubernetes 集群搭建的文章,找了很多最终发现还是李振良的基于 kubeadm 30分钟部署一个Kubernetes集群 视频教程对初学者来说较为靠谱,虽然有些操作命令在实际生产环境需要调整,但作为学习来说问题不大,更多细节的优化还是交给更专业的运维人员吧。

为了省去操作系统的安装我直接在腾讯云购买了 3台 2C4G 的机器,选择按量计费模式大半天也就几块钱(不是广告,只是人懒)。基于云服务器搭建需提前在控制台的安全组设置好以下几点:

  1. 3台服务器内网互通;
  2. 允许服务器访问外网,需要下载相关依赖内容;
  3. 允许客户端机器通过服务器外网IP访问;

具体安装操作步骤完全参考视频教程即可,但我能肯定有些人还是可能会出各种奇葩问题,只能祝你好运了,以下几点这里备注一下:

  • kubeadm init 和 pod 网络插件只需要在 Master 节点操作;
  • kubeadm init 中的 --apiserver-advertise-address 设置为内网地址;
  • 通过 hostname k8s-master 可修改 hostname 名称;

最终通过命令 kubectl get nodes 查看集群中各节点是否已全部 Ready。

构建 .NET Core 服务镜像

接下来将直接在 Windows 环境(镜像构建基于 Windows 还是 Linux 理论上是没有区别的)下构建 .NET Core 服务的 Docker 镜像,所以首先需要安装 Docker for Windows,安装成功后启动 Docker。

创建一个 API 类型 ASP.NET Core Web 应用程序,启用 Docker 支持,会在项目下自动生成 Dockerfile 文件,命令主要涉及 dotnet restoredotnet publish

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["K8SDemo/K8SDemo.csproj", "K8SDemo/"]
RUN dotnet restore "K8SDemo/K8SDemo.csproj"
COPY . .
WORKDIR "/src/K8SDemo"
RUN dotnet build "K8SDemo.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "K8SDemo.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "K8SDemo.dll"]

在 Dockerfile 文件右键菜单点击生成 Docker 镜像,这与直接在 sln 解决方案文件所在的目录下执行 docker build -f .\K8SDemo\Dockerfile . 本质是一样的,只是 VS 已内置好了,执行成功后在 cmd 窗口中通过 docker images 查看当前存在的 Docker 镜像。

为了能在 Kubernetes 集群中能获取到这个镜像,现将 k8sdemo 镜像推送到个人 docker hub 公开仓库(实际开发中应该是公司的私有镜像仓库)。

  1. 如果还没有 docker hub 账号,需要先 注册
  2. cmd 窗口通过命令 docker login -u 用户名 -p 密码 登录;
  3. 设置 Tag docker tag k8sdemo:latest 用户名/k8sdemo:1.0.0,因为推送目标只能是当前用户下;
  4. 推送到 docker hub 仓库 docker push 用户名/k8sdemo:1.0.0

部署

以下操作在 Master 节点进行

  1. 创建服务配置文件 k8sdemo.yaml,配置暂且不详细介绍,后续再针对性说明,先简单理解为通过镜像 beckjin/k8sdemo:1.0.0 创建了服务,并将容器内 80 端口映射到服务器某个端口上(NodePort 方式映射的端口会在 30000~32767 范围内随机一个):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: k8sdemo
    spec:
    replicas: 1
    selector:
    matchLabels:
    name: k8sdemo
    template:
    metadata:
    labels:
    name: k8sdemo
    spec:
    containers:
    - name: k8sdemo
    image: beckjin/k8sdemo:1.0.0
    ports:
    - containerPort: 80
    imagePullPolicy: IfNotPresent
    ---
    kind: Service
    apiVersion: v1
    metadata:
    name: k8sdemo
    spec:
    type: NodePort
    ports:
    - port: 80
    targetPort: 80
    selector:
    name: k8sdemo
  2. 通过命令 kubectl apply -f k8sdemo.yaml 创建服务

    配置中指定了当依赖的镜像不存在时会自动拉取,但如果拉取资源的速度较慢,启动完成的时间可能会比较久,可通过命令 kubectl get podskubectl describe pod 名称 查看具体 pod 详细描述。

  3. 通过命令 kubectl get pod,svc 查看服务运行的端口

    接着就可以通过 http://${外网IP}:31741/WeatherForecast 调用 API 接口查看效果。

  4. 如果需要扩容或缩容,调整配置文件中的 replicas 节点值,重新 kubectl apply -f k8sdemo.yaml 即可;

  5. 通过命令 kubectl delete -f k8sdemo.yaml 可删除服务;

总结

其实很长一段时间都在尝试自己把玩一下 Kubernetes,说实话阻力确实不少,特别是看到很多基于二进制文件的搭建介绍,简直了。所以好的指导教程确实可以给我们带来事半功倍的效果,作为入门学习我们并不需要多么强大和安全的测试环境,基本套路都是先玩起来,再深入研究。

如果对你有帮助就好