前面使用kind快速搭建本地k8s集群 介绍了使用kind搭建k8s集群,这节介绍使用kind搭建的k8s集群中部署.net core 的api应用程序。
项目结构如下:
添加一个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"]折叠
项目编译后拖到Centos系统中
制作镜像
cd /home/website/WebApiK8S.Test/ docker build -t webapik8stest .
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
用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
说明:
运行结果
这时可以看到80、443、30000端口已经暴露出来了
注意:如果是在公司代理环境下,我们要在K8s容器中设置代理,才可以正常进行下面的测试,设置代理请参考上一篇文章《代理环境下在WSL2中用Kind创建Kubernetes集群》”
不能直接使用主机上的镜像,需要导入到kind的节点(容器中)
kind load docker-image webapik8stest --name tsk8s
说明:
将demoDeployment.yaml文件拖到Centos系统中
创建deployment并查看pod,svc状态:
kubectl create -f demoDeployment.yaml kubectl get svc,pod -o wide
从上图可以看到对外暴露pod的端口为30000,且该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