前面使用kind快速搭建本地k8s集群 介绍了使用kind搭建k8s集群,这节介绍使用kind搭建的k8s集群中部署.net core 的api应用程序。
1. 准备AspNetCore WebApi项目
项目结构如下:

添加一个Controller,返回当前其中一个IP:
namespace WebApiK8S.Test.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
public string Get()
{
var hostName = Dns.GetHostName();
var hostIP = Dns.GetHostEntry(hostName).AddressList;
return hostIP[0].ToString();
}
}
}
编写Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 COPY . . ENTRYPOINT ["dotnet", "WebApiK8S.Test.dll"]
#指定基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#配置工作目录 相当于cd
WORKDIR /app
#暴露容器端口,此端口与程序运行路径一致,可
EXPOSE 5000
#复制文件到工作目录
COPY . .
#ENV :配置系统环境变量,比如程序环境环境等在这里配置(开发、预发、线上环境)
#这里是配置程序运行端口,如果程序不使用默认的80端口这里一定要设置(程序运行端口)
ENV ASPNETCORE_URLS http://+:5000
#设置时间为中国上海,默认为UTC时间
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#启动程序
ENTRYPOINT ["dotnet", "AspNetCoreDeployInK8S.dll"]
折叠
2、制作镜像
项目编译后拖到Centos系统中

制作镜像
cd /home/website/WebApiK8S.Test/ docker build -t webapik8stest .


3、编写发布应用的demoDeployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo-deployment
labels:
k8s-app: k8s-demo-web
spec:
replicas: 2
selector:
matchLabels:
k8s-app: k8s-demo-web
template:
metadata:
labels:
k8s-app: k8s-demo-web
spec:
containers:
- name: k8s-demo
image: webapik8stest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: k8s-demo-web
name: k8s-demo-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
name: http
nodePort: 30000
selector:
k8s-app: k8s-demo-web
4. 新建K8s集群,暴露80、443、30000端口
用kind创建K8s时,是相当在本地运行了一个容器,而K8s Cluster就运行在这个容器中。
所以,如果想从外部访问kind K8s的话,就需要把这个容器的端口(K8s的端口)暴露出来。
为了下一步测试,我们重新创建一个新的K8s cluster并且把80、443、30000端口暴露出来。
运行下列命令删除现在的k8s cluster
kind delete cluster --name tsk8s

运行下列命令创建新的k8s cluster
cat <<EOF | kind create cluster --name tsk8s --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- containerPort: 30000
hostPort: 30000
protocol: TCP
EOF
说明:
- extraPortMappings:把K8s容器(相当于K8s所在的服务器)端口暴露出来,这里暴露了80、443、30000
- node-labels:只允许Ingress controller运行在有”ingress-ready=true”标签的node上
运行结果

这时可以看到80、443、30000端口已经暴露出来了

注意:如果是在公司代理环境下,我们要在K8s容器中设置代理,才可以正常进行下面的测试,设置代理请参考上一篇文章《代理环境下在WSL2中用Kind创建Kubernetes集群》”
5. 添加镜像
不能直接使用主机上的镜像,需要导入到kind的节点(容器中)
kind load docker-image webapik8stest --name tsk8s

说明:
- webapik8stest:创建的镜像名
- tsk8s:创建的集群名
6. 创建deployment
将demoDeployment.yaml文件拖到Centos系统中

创建deployment并查看pod,svc状态:
kubectl create -f demoDeployment.yaml kubectl get svc,pod -o wide

从上图可以看到对外暴露pod的端口为30000,且该api运行了两个副本。
7、在浏览器访问api
http://192.168.192.140:332/api/test

http://192.168.192.140:30000/WeatherForecast

curl http://192.168.192.140:30000/WeatherForecast

访问成功,证明我们的aspnetcore应用成功部署在K8S上!
鸣谢:
https://blog.csdn.net/weixin_42758299/article/details/120908185
https://www.cnblogs.com/roluodev/p/13824191.html
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/273447.html