东莞网站建设做网站,陕西省建设网三类人员证书下载,乌苏市电力建设工程公司网站,对对联的网站本章节所有代码已上传至#xff1a;https://github.com/Seanwong933/.NET-Core-on-Kubernetes文末附有本人遇到过的 Docker 和 k8s 的故障排除。本文目标#xff1a;带领大家在 Kubernetes 上部署一个 .NET Core Api 的单节点集群。后续文章会帮助大家继续深入。安装 Kuberne… 本章节所有代码已上传至https://github.com/Seanwong933/.NET-Core-on-Kubernetes文末附有本人遇到过的 Docker 和 k8s 的故障排除。本文目标带领大家在 Kubernetes 上部署一个 .NET Core Api 的单节点集群。后续文章会帮助大家继续深入。安装 Kubernetes以下所有命令都要在管理员模式下执行。下载安装最新版 Docker for Windowshttps://hub.docker.com/editions/community/docker-ce-desktop-windows然后跑一下docker ps看安装成功没有没有就重启一下你的命令行工具或电脑环境变量没起作用。设置国内镜像 https://registry.docker-cn.com下载 docker 镜像并加载这一步是为了把 Kubernetes 所需要的依赖镜像先下载到本地相当于一个加速服务不过根据我的个人经验如果你不用这个加速的话基本没可能下得下来即使你有代理。git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.gitcd k8s-for-docker-desktop.\load_images.ps1打开 docker 开启 Kubernetes等待安装完成在 Powershell 中安装 kubectlkubectl 简单来说就是一个操作 Kubernetes 的工具。Install-Script -Name install-kubectl -Scope CurrentUser -Force然后在类似这样的位置中 E:\文档\WindowsPowerShell\Scripts 找到脚本并执行install-kubectl.ps1可能会报错不管不影响使用。或通过 Chocolatey 来安装推荐Chocolatey 是一个包管理器没有的同学自己装一下。choco install kubernetes-clikubectl version如果说找不到就跑一下choco search kubernetes-cli和choco list kubernetes-cli有时候会抽风。进入你的用户目录cd C:\users\yourusername创建.kube目录mkdir .kube进入cd .kube添加配置文件New-Item config -type file此时可以跑一下kubectl get nodes、kubectl get services检查安装效果三大组件POD Service Deployment在正式开始之前先粗略一下里面关键组件如果你看完还是啥也不明白可以配合这篇文章一起阅读十分钟带你理解Kubernetes核心概念PodKubernetes 中的最小单元一个 Pod 里面可以放很多个应用支持多容器在一个 Pod 中通过进程进行通信Service 服务Pod 的对外入口需要这个才能在外部访问 PodDeployment 部署表示用户对 Kubernetes 的一次更新操作通过部署模板将 Pod 跟 Service 绑定粗暴理解用 Deployment 可以部署 Pod然后通过 Service 来暴露对 Pod 的访问。Service 的三种类型ClusterIP一个集群内部服务默认情况外部无法访问需要通过 kubectl 的代理命令转发访问。NodePort在所有节点上开放一个特定端口将该端口的流量转发到对应的服务是开发时经常使用的暴露 Pod 的方法没有代理那么麻烦。LoadBalancerKubernetes 的负载均衡需要把你的负载均衡器你集群的负载均衡器或云服务商的与它关联起来就可以帮你转发流量了。安装 Kubernetes Dashboard顾名思义仪表盘嘛用来展示 Kubernetes 的各方面数据也可以做一些比较简单的操作。找回刚才的 k8s-for-docker-desktop 目录我们要用里面的配置文件来安装。kubectl create -f kubernetes-dashboard.yaml在配置文件中有一个namespace的配置指的是你服务的命名空间。然后我们来用命名空间练练手用kubectl get namespace获取你所有的命名空间用kubectl get deploy -n kube-system命令获取你这个空间下的部署用kubectl get service -n kube-system获取服务的内部地址上面的这些示例命令应该不会有什么问题接下来输入kubectl proxy将内部地址通过代理转发出来就可以看到dashboard了。如果你没有做什么特殊操作以下URL应该就能够访问到它http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login然后我们的dashboard就跑在其中一个pod下这个dashboard的访问地址很长所以接下来要把它配置成NodePort转发出来。把刚才的配置文件搞下来找到最后一坨把带注释的两句加进去1234567891011121314151617kind: ServiceapiVersion: v1metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-systemspec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30003 selector: k8s-app: kubernetes-dashboard删除deploy和service再创建一下kubectl delete deploy kubernetes-dashboard -n kube-systemkubectl delete svc kubernetes-dashboard -n kube-systemkubectl create -f .\kubernetes.dashboard.yaml这时会提示你有些东西已经存在了不管就是了。然后通过kubectl get svc -n kube-system可以看到你的新服务已经部署上去了这个时候再kubectl proxy访问一下 https://localhost:30003这里要注意的是默认分配的443端口也就是默认httpswindows下访问会被栏掉而mac下不会不过这不是重点学会改NodePort就行了。额外参考kubectl命令技巧大全初始化一个 .NET Core API 并 push 到 docker hub接下来我们放一下Kubernetes需要先学习一下如何部署一个.NET Core应用到Docker上并提交到 Docker Hub毕竟学会了走才能跑。创建一个web apidotnet new webapi -n k8s-demo修改一个action方便看效果然后本地测试一下看能不能跑通// GET api/values/5[HttpGet({id})]public ActionResultstring Get(int id){ return $你输入的是{id};}创建DockerfileFROM microsoft/dotnet:sdk AS build-envWORKDIR /appEXPOSE 80# Copy csproj and restore as distinct layersCOPY *.csproj ./RUN dotnet restore# Copy everything else and buildCOPY . ./RUN dotnet publish -c Release -o out# Build runtime imageFROM microsoft/dotnet:aspnetcore-runtimeWORKDIR /appCOPY --frombuild-env /app/out .ENTRYPOINT [dotnet, k8s-demo.dll] # 注意这里改一下dll名称在本地运行Docker镜像注意这里的dockerusername换成你的docker用户名。docker run -d -p 8080:80 --name k8s-demo dockerusername/k8s-demo .查看效果docker ps再进入对应的页面看一下http://127.0.0.1:8080/api/values/5登录 docker 以 push 你的镜像或者你本地登录过直接docker login即可docker login --username dockerusername推送镜像docker push dockerusername/k8s-demo把 .Net Core API 部署到 Kubernetes部署文件还记得之前说的三大组件吗这个文件就是用来部署 Kubernetes 集群的。同时我们这里用的是一个Yaml格式的文件Yaml是一个可以和Json无缝转换的配置文件类型字符串不需要加引号可以自动被识别字典前带-号注意Yaml是通过缩进来管理配置节点的子父级的所以不能随意缩进。以下是一个标准的 .net core api 的 kubernetes 部署文件部署Deployment跟Service两个组件。---kind: Deployment # 组件类型apiVersion: apps/v1metadata: name: hello-api namespace: netcore # 可指定不指定时使用默认命名空间 labels: name: hello-apispec: replicas: 2 # 部署两份叫 hello-api 的容器 selector: matchLabels: name: hello-api template: metadata: labels: name: hello-api spec: containers: - name: hello-api image: yourdockername/k8s-demo # docker hub 中的镜像名称修改为你的镜像名称 ports: - containerPort: 80 imagePullPolicy: Always---kind: ServiceapiVersion: v1metadata: name: hello-api namespace: netcorespec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: hello-api # 对应要映射的Pod我们将它命名为deploy.yaml记住修改yourdockername/k8s-demo为你的镜像名称。然后执行部署命令。kubectl create -f deploy.yaml如果这里指定了不存在的namespace要用kubectl create namespace命令创建。查看URL我的namespace就叫netcorekubectl get svc -n netcore打开这个页面试一下http://localhost:31295/api/values/5这个时候进入dashboard可以查看.net core的日志甚至可以执行命令。额外参考通过 kubectl explain path.to.nodes 查看各个配置文件节点的解释比如你要看metadata节点下的name节点的解释就执行kubectl explain metadata.name到这里就恭喜你已经成功部署了一个 Kubernetes 的单节点集群了下面我们继续深入介绍一下。Kubernetes 集群高级概念图左边是 Master 控制节点右边是 Worker 工作节点。Master部分从上到下依次来说kubectl → authentication → REST(apiserver)这一个流程是用户交互、认证、然后调用 Kubernetes 各种接口的一个流程kubectl xxxETCD右下角的ETCD是一个分布式数据库负责保存整个 Kubernetes 集群的状态scheduler负责调度比如创建一个 Pod找一个负载低一点的 CPU 存储而 ETCD 是只知道存储但不知道存哪儿好所以需要 Scheduler 来调度一下controller manager负责维护集群的状态比如故障检测、自动扩展、滚动更新等Worker部分Node表示集群中的一个主机单元可以是物理机也可以是虚拟机kubeletkubernetes 与 docker 的交互组件负责容器的各种操作、生命周期等ProxyProxy 负责网络转发Pod这个不用多说就是你创建的一个个容器而以上的这些组件其实也都是 docker 的镜像跑一下docker images就能看见各个组件的镜像。还有些图上没有的比如 container runtime负责镜像管理和容器的真正运行。Kubernetes 调度过程下图展现了一个完成的调度过程一步一步来说。kubectl 将创建 Deployment 资源这个命令发送到 API Server 会先将这个命令保存到ETCD中验证成功后直接返回因为这里采用的是异步调用。上一步验证完成后Controller Manager 收到通知Controller Manager 让 Deployment Controller 创建一个 ReplicaSet副本ReplicaSet Controller 收到通知创建 PodScheduler 收到通知将 Pod 分配到 Worker 中某一个合适的 Node 上然后 Kubelet 告诉 Docker 我要根据 Pod创建容器了它的镜像是什么版本是什么启动 Containers可以看到整个 Kubernetes 调度基本全都是在 Master 节点在做的所以 Master 节点绝对不能挂。下面大概介绍一下一套 Kubernetes 高可用集群大概是什么样的后续文章会继续教大家深入 Kubernetes。额外章节故障排除Unable to create: 已停止该运行的命令因为首选项变量“ErrorActionPreference”或通用参数设置为 Stop: 对象已存在。当你的 Docker 运行在 linux 容器模式下就可能会报这个错误。Unable to create: 已停止该运行的命令因为首选项变量“ErrorActionPreference”或通用参数设置为 Stop: 对象已存在。在 Docker.Core.Pipe.NamedPipeClient.Send(String action, Object[] parameters) 位置 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Core\pipe\NamedPipeClient.cs:行号 36在 Docker.Actions.DoStart(SynchronizationContext syncCtx, Boolean showWelcomeWindow, Boolean executeAfterStartCleanup) 位置 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Windows\Actions.cs:行号 92在 Docker.Actions.c__DisplayClass19_0.Startb__0() 位置 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Windows\Actions.cs:行号 74在 Docker.WPF.TaskQueue.c__DisplayClass19_0..ctorb__1() 位置 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.WPF\TaskQueue.cs:行号 59解决方案执行以下命令MOFCOMP %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof或删掉、卸载、禁用所有 在设备管理器 - 网络适配器下的 Hyper-V 虚拟网络适配器。参考地址https://github.com/docker/for-win/issues/1538https://community.spiceworks.com/how_to/122307-fix-error-managing-hyper-v-server-2012-r2-from-windows-10执行 docker ps 等命令时弹出error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.报这个有很多原因有可能是你混装了Docker for Windows和Docker Toolbox并混用了 Windows 容器模式跟 Linux 容器模式用以下方式应该可以解决卸载 Docker for Windows 和 Docker Toolbox关闭 Hyper-V 重启设备管理器 - 网络适配器 中卸载所有 Hyper-V 适配器跟 VirtualBox 适配器删除所有 AppData 等用户文件夹下的 Docker 相关文件清除所有关于 Docker 的环境变量重要然后开启 Hyper-V - 重启 - 重装Docker for Windows原文地址https://siegrain.netlify.com/kubernetes/windows-net-core-kubernetes/.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com