前面使用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/273447.html