辽宁城市建设网站,下载好的字体怎么安装到wordpress,天津市建设网官网,10个免费货源网站“ [LOG] ASP.NET Core on K8S Starting...”在上一篇《单节点环境搭建》中#xff0c;通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境#xff0c;接下来就是动人心弦的部署ASP.NET Core API到K8S了。但是#xff0c;在部署之前#xff0c;我还是把基本… “ [LOG] ASP.NET Core on K8S Starting...”在上一篇《单节点环境搭建》中通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境接下来就是动人心弦的部署ASP.NET Core API到K8S了。但是在部署之前我还是把基本的一些概念快速地简单地不求甚解地过一下。01—K8S集群相关概念 1集群 首先K8S集群也是需要多台服务器组成作为容器的编排管理平台只有一个节点在生产环境是不够的。 2Node 其次Node作为K8S集群中的工作节点一个Node可以是VM或物理机它运行真正的应用程序。 K8S中的Node又分为Master和Worker和Hadoop集群中的NameNode和DataNode类似简而言之就是一个是负责调度维护集群状态的一个是负责干活运行容器的。 3资源 在K8S每个组件比如PodService等开放对外暴露的都是一组RESTful API所以我们所有对于组件的操作都可以通过RESTful API来完成因此我们可以将其看作是资源。 4Kubectl Kubectl是一个客户端命令行工具使用它可以连接K8S集群和进行交互。 如下图所示我们通过kubectl输入命令与远程的K8S集群连接而这些命令本质是通过调用API访问Master节点提供的API通过这些API去操作所谓的集群中的“资源”对这些资源进行创建POST修改PUT删除DELETE等操作。02—三大核心对象 1Pod Pod是K8S最基本的操作单元包含一个或多个紧密相关的容器一个Pod可以被一个容器化的环境看作是应用层的“逻辑宿主机” 换句话说在K8S中创建调度和管理的最小单位就是Pod而非容器Container多个容器之间的挂载是可以共享的Pod通过提供更高层次的抽象提供了更加灵活的部署和管理模式 2Service Service是一个抽象概念它定义了逻辑集合下访问Pod组的策略。通过使用Service我们就可以不用关心这个服务下面的Pod的增加和减少、故障重启等只需通过Service就能够访问到对应服务的容器即通过Service来暴露Pod的资源。 这样说可能还是有点难懂举个例子假设我们的一个服务Service A下面有3个Pod我们都知道Pod的IP都不是持久化的重启之后就会有变化。那么Service B想要访问Service A的Pod它只需跟绑定了这3个Pod的Service A打交道就可以了无须关心下面的3个Pod的IP和端口等信息的变化。换句话说就像一个Service Discovery服务发现的组件你无须关心具体服务的URL只需知道它们在服务发现中注册的Key就可以通过类似Consul、Eureka之类的服务发现组件中获取它们的URL一样还是实现了负载均衡效果的URL。 3Deployment Deployment主要负责Pod的编排例如我们可以使用下面的yaml文件来创建一个DeploymentapiVersion: apps/v1
kind: Deployment
metadata: name: nginx-deployment labels: app: nginx
spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.12.2 ports: - containerPort: 80 熟悉Docker-Compose的朋友应该对这个yaml不陌生可以看到Deployment定义了Pod内容包括Pod数量、更新方式、使用的镜像资源限制容器中的映射端口等等。03—Service的几种类型 1ClusterIP ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务集群内的其它应用都可以访问该服务但是集群外部无法访问它。 因此这种服务常被用于内部程序互相的访问且不需要外部访问那么这个时候用ClusterIP就比较合适如下面的yaml文件所示apiVersion: v1
kind: Service
metadata:
name: my-internal-service
selector:
app: my-app
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP 那么如果需要从外部访问呢比如我们在开发模式下总得调试吧可以启用K8S的代理模式$ kubectl proxy --port8080 如此一来便可以通过K8S的API来访问了例如下面这个URL就可以访问在yaml中定义的这个my-internal-service了http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/ 2NodePort 除了只在内部访问的服务我们总有很多是需要暴露出来公开访问的服务吧。在ClusterIP基础上为Service在每台机器上绑定一个端口这样就可以通过NodeIP:NodePort来访问这些服务。例如下面这个yaml中定义了服务为NodePort类型apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
selector:
app: my-app
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCPPS这种方式顾名思义需要一个额外的端口来进行暴露且端口范围只能是 30000-32767如果节点/VM 的 IP 地址发生变化你需要能处理这种情况。 3LoadBalancer LoadBalancer 服务是暴露服务到 internet 的标准方式它借助Cloud Provider创建一个外部的负载均衡器并将请求转发到NodeIP:NodePort向节点导流。 例如下面这个yaml中定义type为LoadBalancerkind: Service
apiVersion: v1
metadata: name: my-service
spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 clusterIP: 10.0.171.239 loadBalancerIP: 78.11.24.19 type: LoadBalancer
status: loadBalancer: ingress: - ip: 146.148.47.155PS每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址每个用到的 LoadBalancer 都需要付费这将是比较昂贵的花费。04—小结 本文主要快速地不完全地不求甚解地过了一下K8S中的一些重要的基本概念目的是为下一篇部署ASP.NET Core API到K8S有一个必要的认知。参考资料