Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中
1.新建一个WebApi项目,并添加Dockerfile文件:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src Copy . . RUN dotnet restore RUN dotnet build -c Release -o /app FROM build as publish RUN dotnet publish -c Releease -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "k8s-demo.dll"]
编译一下,然后通过Docker打包成镜像:docker build -t wei/k8s-demo .
完成后通过docker images查看下:
然后将其推送到Docker仓库中,所以你需要去Docker官网注册一个账户,注册完成后进行登录:docker login --username xxx
xxx是你的用户名,接着会让你输入密码,验证成功后会提示Login Succeeded
将镜像推送到仓库这个步骤是不能省略的,因为编写K8s部署文件的时候,需要从仓库拉取镜像,因为服务器在国外,所以会有点慢。
还有一个问题就是你的镜像名字需要用你的Docker用户名开头,比如xxx/k8s-demo 这种,xxx是你Docker的用户名,不然上传会提示没有权限:
镜像推送到仓库之后我们就需要编写k8s的部署文件了 :deploy.yaml
kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: k8s-demo name: k8s-demo namespace: netcore spec: replicas: 2 selector: matchLabels: k8s-app: k8s-demo template: metadata: labels: k8s-app: k8s-demo spec: containers: - name: k8s-demo image: xxx/k8s-demo ports: - containerPort: 80 --- # ------------------- Service ------------------- # kind: Service apiVersion: v1 metadata: labels: k8s-app: k8s-demo name: k8s-demo namespace: netcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: k8s-app: k8s-demo
需要说明两个问题,标红的image就是我们推送到仓库的镜像,namespace是资源空间名称,也就是我们当前这个pod要运行的资源空间,所以我们需要创建一下这个资源空间:
kubectl create namespace netcore
创建完成后可以通过以下命令进行查看:kubectl get namespace netcore
然后我们就可以运行我们的部署文件了:kubectl create -f deploy.yaml
正常情况下会有两个提示,分别是deployment.apps "k8s-demo" created 和 service "k8s-demo" created
我在这步遇到的问题是yaml的格式问题,因为缩进不符合要求,折腾了好久,这个对格式的要求很严格,完成之后我们可以通过以下命令查看:kubectl get svc -n netcore
我上面图中已经有了,结果显示我的这个pod运行在31080端口,此时我们可以通过浏览器测试:
或者我们也可以通过k8s控制台查看,如果没启动代理的通过kubectl proxy命令启动代理,然后访问以下地址:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=netcore
将命名空间选到我们的netcore即可看到我们已经运行的服务k8s-demo,到此大功告成!!!
补充一下,当我们关机下次启动会发现k8s处于stop状态,这个时候我们需要重启下Docker,并使用以下命令切换到对应的Kubernetes context :
kubectl config use-context docker-for-desktop