Kubernetes 是一个开源的容器编排平台,它提供了一系列功能来管理和部署容器化应用程序。以下是 Kubernetes 的一些主要功能:
总之,Kubernetes 是一个强大的容器编排平台,提供了一系列功能来管理和部署容器化应用程序。它可以简化容器化应用程序的部署、管理和扩展,提高应用程序的可靠性、可扩展性和安全性。
Kubernetes与spring cloud存在功能重叠,以下只说spring cloud不具备的功能。
Kubernetes容器编排主要是通过各种控制器(Controller)和调度器(Scheduler)来实现的。
此外,Kubernetes还提供了各种调度器(Scheduler),如Default Scheduler、In-tree Cloud Provider Scheduler和Out-of-tree Cloud Provider Scheduler等,它们负责在集群中调度和分配资源,以及在运行时根据Pod的亲和性和反亲和性规则将Pod调度到合适的节点上。
Kubernetes通过探针liveness probe来判断应用程序是否存活。下面我们通过介绍pod来了解探针。
Pod是Kubernetes中最小的部署单元,它包含一个或多个容器。Pod的状态可以是以下几种1:
Pod的重启策略是指当Pod内的某个容器异常退出或健康检查失败时,kubelet根据设定的策略自动重启该容器。
Pod的重启策略包括以下三种:
Kubernetes的探针类型有三种,分别如下:
Kubernetes的三种探针都支持三种探测方法。
探针探测结果有以下值
好的,以下是一个使用httpGet探测方式的Kubernetes ReadinessProbe的配置示例:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: my-app
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: my-app
- template:
- metadata:
- labels:
- app: my-app
- spec:
- containers:
- - name: my-container
- image: my-image
- ports:
- - containerPort: 8080
- readinessProbe:
- httpGet:
- path: /healthz
- port: 8080
- httpHeaders:
- - name: User-Agent
- value: curl/7.64.1
- initialDelaySeconds: 10
- timeoutSeconds: 1```
在上面的示例中,我们定义了一个名为my-app的Deployment资源,其中包含了一个名为my-container的容器。容器的端口号为8080,并且配置了一个ReadinessProbe来探测容器的状态。
在ReadinessProbe的配置中,我们使用了httpGet探测方式。具体来说,我们指定了一个路径为/healthz,端口号为8080的HTTP Get请求来进行探测。我们还指定了User-Agent为curl/7.64.1,初始延迟时间为10秒,超时时间为1秒。如果HTTP Get请求返回的状态码在200-399之间,则表示探测成功,否则表示失败。
Kubernetes的服务发现和负载均衡主要通过以下方式实现:
Service有三种类型:
另外,也可以讲已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建Service的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint1。
在Kubernetes中,应用升级策略主要有以下几种
下面主要说一下最常用的滚动更新
Kubernetes滚动更新流程是指对部署中的Pod进行逐步替换,以达到平滑更新的目的。
这样,就完成了这一组 Pod 的版本升级过程。
像这样,将一个集群中正在运行的多个 Pod 版本,交替地逐一升级的过程,就是“滚动更新”。
使用 Deployment 进行滚动更新是一种方便而可靠的方式,可以确保服务的连续性和可用性。在更新过程中,需要密切监控服务的性能和可用性,并及时采取措施来解决任何问题。
总的来说,Kubernetes 提供了一系列功能和特性,以帮助用户更好地管理应用程序和服务的更新和部署。这些功能可以根据用户的需求进行配置和使用。
在Kubernetes中,滚动更新通常是通过逐步替换旧版本的Pod来升级服务。如果一个正在处理的Pod需要被停止,但该Pod正在处理的程序还没有完成,可能会导致数据丢失或者服务中断。
为了处理这种情况,Kubernetes提供了几种策略来控制滚动更新的过程:
terminationGracePeriodSeconds
参数进行配置。RollingUpdateStrategy
参数进行配置。根据具体的需求和服务特性,你可以选择适合的滚动更新策略来处理正在处理的Pod需要被停止的情况。确保在滚动更新过程中,为Pod提供足够的优雅关闭时间或使用就地升级策略,以确保服务的可用性和数据的一致性。
Kubernetes滚动更新时,新旧两个版本的Pod不会同时存在。
滚动更新时,Kubernetes会逐步将旧版本Pod替换为新版本Pod,这个过程是逐步进行的,而不是一次性完成的。在替换过程中,旧版本Pod会被逐步停用和删除,同时新版本Pod会被逐步创建和启动。因此,在滚动更新过程中,只有新版本Pod是处于启动状态的,而旧版本Pod会被逐步停用并最终被删除。
Kubernetes滚动更新时,新版Pod不是立即可用,而是需要经过一段时间的启动和健康检查过程 。在每次调整过程中,容器创建和销毁完成后会进行一段时间的健康检查,确保新版本Pod可以正常工作。如果新版本Pod没有通过健康检查,那么滚动更新会失败,Kubernetes会启动回滚更新,把Pod版本回退到旧版本。
在滚动更新过程中,只有新版本Pod的接口是存在的,而旧版本Pod的接口会逐渐被停用并最终被删除。在这个过程中,如果客户端仍然使用旧版本的接口,而新版本的Pod还没有完全替换旧版本的Pod,那么客户端可能会遇到服务不可用的错误。
滚动更新时,Kubernetes会逐步将旧版本Pod替换为新版本Pod。这个过程是逐步进行的,每次只更新一部分,因此在这个过程中会出现新旧Pod同时存在的时刻。但是,由于滚动更新是逐步进行的,因此在这个过程中只有新版本Pod的接口是可用的,而旧版本Pod的接口会逐渐被停用并最终被删除。
存在服务器被压垮的风险。
前提
确定发布计划:
重要性和影响力分析:
发布计划:
确定批次数量: 每个模块有3个节点,因此需要发布5个批次,每个批次发布一个模块的一个节点。
创建Deployment: 在Kubernetes中创建5个Deployment,分别用于管理每个功能模块的微服务生命周期。以下是创建用户模块Deployment的示例命令:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: user-microservice
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: user-microservice
- template:
- metadata:
- labels:
- app: user-microservice
- spec:
- containers:
- - name: user-microservice
- image: user-microservice:v1.0
- ports:
- - containerPort: 8080
- apiVersion: v1
- kind: PodTemplate
- metadata:
- name: user-microservice-template
- spec:
- template:
- metadata:
- labels:
- app: user-microservice
- spec:
- containers:
- - name: user-microservice
- image: user-microservice:v1.0
- env:
- - name: USER_DB_HOST
- value: mydatabasehost.example.com # 用户数据库的主机名和域名
- ports:
- - containerPort: 8080
- apiVersion: apps/v1beta2
- kind: Deployment
- metadata:
- name: user-microservice
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: user-microservice
- strategy:
- rollingUpdate:
- maxUnavailable: 1 # 每次只更新一个节点(即最多有一个节点不可用)
- maxSurge: 1 # 最大增加一个节点(即最多增加一个节点)和重启机制配置信息如下:maxUnavailable:表示每次升级可以有多少节点无法访问(1表示每次只升级一个节点) maxSurge:表示每次升级可以有多少节点同时启动新的Pod(也就是新增节点数),这个数值应该与maxUnavailable保持一定的差值(例如1)以避免新旧Pod同时运行出现问题。如上面描述,maxUnavailable为1,maxSurge也为1,表示每次升级只有一个节点无法访问,同时新增一个节点。如果升级过程中出现问题,可以回滚到上一个版本。回滚操作可以通过执行kubectl rollout undo命令来实现。例如,要回滚用户模块的部署,可以执行以下命令:kubectl rollout undo deployment/user-microservice。
Kubernetes对资源的管理主要通过资源请求(requests)和资源限制(limits)来实现,具体如下:
在Kubernetes中,还可以通过一些高级特性进行更细致的资源管理,例如使用LimitRange对象定义Pod或容器的默认资源请求和限制,或者自定义资源类型等。
在Kubernetes中,可以通过以下方式限制资源:
- apiVersion: v1
- kind: Pod
- metadata:
- name: cpu-demo
- namespace: cpu-example
- spec:
- containers:
- - name: cpu-demo-ctr
- image: v1.0
- resources:
- limits:
- cpu: "2"
- requests:
- cpu: "1"
- apiVersion: v1
- kind: Pod
- metadata:
- name: mem-demo
- namespace: mem-example
- spec:
- containers:
- - name: mem-demo-ctr
- image: v1.0
- resources:
- limits:
- memory: "4Gi"
- requests:
- memory: "2Gi"
在 Kubernetes 集群中,可以通过设置资源限制来控制容器可以使用的计算资源,例如 CPU 和内存。如果容器使用的资源超过了这些限制,将会出现以下情况:
因此,在使用 Kubernetes 集群时,需要合理设置容器的资源限制,以避免出现上述问题。如果需要容器使用更多的资源,可以考虑增加集群资源或者对 Pod 进行特殊配置。
Kubernetes 提供了多种方法来实现自动扩展和收缩。以下是其中两种常见的方法:
除了上述两种方法,还可以使用 Kubernetes 自定义控制器或第三方扩展工具来实现自动扩展和收缩。无论采用哪种方法,都需要根据应用的需求和资源使用情况来合理设置扩展和收缩策略,以确保集群的稳定和高效运行。
Horizontal Pod Autoscaler(HPA)是 Kubernetes 中的一个自动伸缩控制器,用于根据 CPU 或内存等资源使用情况自动调整 Pod 的副本数量。
以下是一个简单的 HPA 示例:
- apiVersion: autoscaling/v2beta2
- kind: HorizontalPodAutoscaler
- metadata:
- name: my-hpa
- spec:
- scaleTargetRef:
- apiVersion: apps/v1
- kind: Deployment
- name: my-deployment
- minReplicas: 1
- maxReplicas: 10
- metrics:
- - resource:
- name: cpu
- target:
- type: Utilization
- averageUtilization: 50
在这个示例中,我们定义了一个名为 “my-hpa” 的 HPA,它关联到一个名为 “my-deployment” 的 Deployment。HPA 将根据 “my-deployment” 中 Pod 的 CPU 利用率,自动调整副本数量,最小副本数为 1,最大副本数为 10。当 CPU 利用率达到 50% 时,HPA 将自动增加副本数量,直到达到最大副本数;反之,当 CPU 利用率下降时,HPA 将自动减少副本数量,直到达到最小副本数。
需要注意的是,HPA 需要与 Kubernetes API Server 和 Kubernetes Controller Manager 配合使用,才能实现自动伸缩功能。您需要在 Kubernetes 集群中正确配置和启动这些组件。
在 Kubernetes 中,自动扩展可以通过 Kubernetes API 服务器进行配置。以下是一个简单的示例,展示了如何使用 Kubernetes API 服务器配置自动扩展:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: my-deployment
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: my-app
- template:
- metadata:
- labels:
- app: my-app
- spec:
- containers:
- name: my-app
- image: my-image:v1
- ports:
- - containerPort: 8080
在上面的示例中,scaleTargetRef
字段指定了要进行自动扩展的 Deployment 资源对象的名称和 API 版本。minReplicas
和maxReplicas
字段分别指定了最小副本数和最大副本数。metrics
字段指定了要使用的扩展指标,在这个示例中,我们使用了 CPU 使用率作为扩展指标。
当 CPU 使用率达到 80%时,Kubernetes 会自动扩展 Deployment 中的副本数量,将副本数量增加到最大副本数(在这个示例中为 10)。当 CPU 使用率下降到低于 80%时,Kubernetes 会自动减少副本数量,将副本数量减少到最小副本数(在这个示例中为 1)。
Horizontal Pod Autoscaler 和 Kubernetes Deployment 都是 Kubernetes 中用于自动扩展的重要资源对象,但它们的使用场景和复杂程度略有不同。
Kubernetes Deployment 是一种更通用的资源对象,它可以用于部署和管理应用程序的多个实例。通过 Kubernetes Deployment,您可以定义应用程序的副本数量、容器配置、滚动更新等信息,从而实现应用程序的自动化部署和扩展。
Horizontal Pod Autoscaler 则是专门用于自动扩展 Pod 副本数量的资源对象。它通过监控 Pod 的资源使用情况(如 CPU 利用率)来动态调整 Pod 的副本数量,以满足业务需求。Horizontal Pod Autoscaler 通常与 Kubernetes Deployment 配合使用,以实现 Pod 副本数量的自动扩展。
因此,哪种方式更简单取决于您的具体需求和使用场景。如果您需要更灵活的扩展策略,或者需要对应用程序进行更复杂的管理,那么 Kubernetes Deployment 可能更适合您。如果您只需要简单地自动扩展 Pod 副本数量,那么 Horizontal Pod Autoscaler 可能更简单。
无论您选择哪种方式,都需要对 Kubernetes 集群进行充分的测试和调优,以确保其能够满足您的业务需求。
- apiVersion: networking.k8s.io/v1beta1
- kind: Ingress
- metadata:
- name: my-ingress
- annotations:
- # 定义负载均衡器的类型为 roundrobin
- # 使用这个注解可以设置负载均衡策略
- # 可选的负载均衡策略有 'RoundRobin', 'LeastRequests', 'WeightedRoundRobin', 'WeightedLeastRequests' 等
- nginx.ingress.kubernetes.io/affinity: "cookie"
- nginx.ingress.kubernetes.io/session-cookie-name: "my-affinity-cookie"
- spec:
- rules:
- - host: example.com
- http:
- paths:
- - path: /
- backend:
- serviceName: my-service
- servicePort: 80
其他功能暂时先不写了。
参考文章: