网站搭建运营,上海市上海中学校服,网站的建设时间,WordPress微信域名防封源码通过 .NET Core Kubernetes#xff1a;Deployment 文章的介绍#xff0c;我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务#xff0c;每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址#xff0c;然后通过一个独立的 Endpoint#xff08;Pod IP ContainerP… 通过 .NET Core KubernetesDeployment 文章的介绍我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址然后通过一个独立的 EndpointPod IP ContainerPort进行访问。但在提供服务时并不能依赖 Pod 的 Endpoint首先 Pod IP 会随着 Pod 的重建而变化另外同一组 Pod 更希望是以整体对外提供高可用服务组内的 Pod 在进行动态伸缩、滚动更新等操作后并不能影响服务稳定性。因此Kubernetes 中的 Service 对象就是解决此问题的核心Service 代理 Pod 集合对外表现是为一个访问入口它提供了一个虚拟的 IP 地址ClusterIP和端口来自 ClusterIP 端口 的请求将被负载均衡器 kube-proxy转发到后端某个 Pod 中的容器。所以借助 Service 的能力非常方便的实现了服务发现与负载均衡。本文将主要介绍 Kubernetes 中各 Service 类型的使用目前有以下四种类型ClusterIP默认类型自动分配一个仅集群内部可以访问的虚拟 IP也可使用 ClusterIP 字段指定固定 IP选择此类型意味着只想这个服务在集群内部才可以被访问NodePort在 ClusterIP 基础上在集群的每一个节点绑定一个端口这样就可以通过任意的:NodePort 来访问服务LoadBalancer在 NodePort 的基础上通过创建一个外部的负载均衡器将流量转发到每个节点:NodePort。因为如果外部所有客户端都访问一个 NodeIP该节点的压力将会很大LoadBalancer 则可解决此问题ExternalName把集群外部的服务引入到集群内部来在集群内部直接使用。没有任何类型代理被创建这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持下面分别对这几种类型的使用方式进行介绍在创建 Service 之前还是先通过 Deployment 控制器创建一组 Pod配置文件 k8sdemo-deployment.yaml 如下apiVersion: apps/v1
kind: Deployment
metadata:name: k8sdemo-deployment
spec:replicas: 3selector:matchLabels:name: k8sdemotemplate:metadata:labels:name: k8sdemospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.0.0ports:- containerPort: 80imagePullPolicy: IfNotPresent
ClusterIP 类型创建 k8sdemo-service.yaml 文件配置如下主要是 ports 和 selector 字段的设置指定了 80 端口port 映射到 Pod ContainerPort targetPort 端口最终将通过 ClusterIP:80 访问服务。selector 字段指定将 label 含 name:k8sdemo 的 Pod 作为这个 Service 指向的目标服务。apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80 # Service PorttargetPort: 80 # Pod ContainerPortselector:name: k8sdemo# clusterIP: 10.1.19.92 # 取消注释指定IP
执行命令 kubectl apply -f k8sdemo-service.yaml 创建 Service然后通过 kubectl get service 查看服务状态从上图可以看出 k8sdemo-service 被分配的 ClusterIP 是 10.1.19.96所以可以在服务器上通过 curl http://10.1.19.96/WeatherForecast 来访问接口。因为 ClusterIP 默认是自动分配的所以每次重建会变化如果需要固定可通过 ClusterIP 字段设置。对于只需在集群内部提供的服务ClusterIP 类型已足够。NodePort 类型基于 ClusterIP 类型中使用的配置文件 k8sdemo-service.yaml增加 type: NodePort 配置重新创建 Service如下apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80targetPort: 80# nodePort: 30080 # 取消注释指定端口selector:name: k8sdemotype: NodePort
从上图可以看出除了类型变了 PORT(S也变成了 80:30231/TCP即将 Service 的 80 端口与集群中各节点的 30231 端口进行映射所以最终可以通过集群内任意的 NodeIP:30231 来访问整个过程为Client NodeIP:NodePort ClusterIP:ServicePort PodIP:ContainerPort。NodePort 默认分配的是 30000-32767 范围内随机选择的一个端口实际使用时可以通过 nodePort 字段指定。请求结果如下注192.168.124.10 是集群内某一台的 IPLoadBalancer 类型通过 NodePort 类型的使用介绍已经了解可以通过 NodeIP:NodePort 方式来服务访问而且 NodeIP 可以是集群内任意任何一台的 IP。而 LoadBalancer 则是在外层附加的负载均衡器使请求能分摊到集群内各个节点上。MetalLB 搭建要使用 LoadBalancer 类型会稍微复杂一些并不能只单纯的修改配置文件因为一般自建的 Kubernetes 集群默认并不支持 LoadBalancer所以它需要借助外部的负载均衡器来实现这里将使用 MetalLB[1] (v0.9.3)安装请参考 Installation By Manifest[2] 步骤不复杂但需要确保依赖镜像下载顺利完成后查看 Pod 状态另外需要为 Metallb 设置地址池以及协议相关配置Metallb 会监控服务对象的变化当有新的 LoadBalancer 服务运行但没有可申请的负载均衡器时就会从配置的地址池中分配一个给该服务。这里以 Metallb Layer2 工作模式为例Metallb 支持 Layer2/BGP 两种工作模式创建一个资源类型为 ConfigMap 的配置文件 metallb-layer2-config.yaml内容如下apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 192.168.124.200-192.168.124.210 # IP 地址范围需与自己的集群环境对应
Layer2 工作模式原理图配置修改有了以上的准备工作后只需要在 Service 配置文件将 type 修改为 LoadBalancer 然后重新创建 Service如下apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80targetPort: 80selector:name: k8sdemotype: LoadBalancer
从上图可以看出TYPE 已是 LoadBalancer另外 EXTERNAL-IP 被分配为地址池中的 192.168.124.200接下来就可以通过这个 IP 进行访问了结果如下ExternalNameExternalName 类型比较特殊它没有 selector也没有定义任何的端口 对于运行在集群外部的服务它通过返回该外部服务的别名这种方式来提供服务如下apiVersion: v1
kind: Service
metadata:name: k8sdemo-external-service
spec:type: ExternalNameexternalName: mingdao.com
当访问 k8sdemo-external-service.default.svc.cluster.local 时集群的 DNS 服务将返回值为 mingdao.com 的 CNAME 记录访问这种类型的服务与其它的唯一不同的是重定向发生在 DNS 层而且不会进行代理或转发。进入 Kubernetes 集群的任意一个 Pod 中必须是集群内部才可访问如kubectl exec -it k8sdemo-deployment-68cb864ff6-fzzdq -- /bin/bash执行 curl -L http://k8sdemo-external-service.default.svc.cluster.local/ 即会重定向请求到 mingdao.com结果如下参考资料[1]MetalLB: https://metallb.universe.tf/[2]Installation By Manifest: https://metallb.universe.tf/installation/#installation-by-manifest