k8s设置标签(k8s的配置文件)

k8s设置标签(k8s的配置文件)

1. k8s设置标签

微服务架构上篇

1. grpc技术介绍

2. grpc+protobuf+网关实战

3. etcd技术介绍

4. 基于etcd的服务发现与注册

5. 基于etcd的分布式锁实战

2. 微服务架构中篇

1. k8s架构介绍

2. 基于k8s的容器化部署

3. 基于k8s的Deployment工作负载

4. 基于k8s的ingress实战

5. 基于ingress和service实现灰度发布

6. 常见的服务治理策略

3. 微服务架构下篇

分布式链路追踪实战

干货:

什么是APM

什么是Opentracing

什么是SpanID

什么是TraceID

基于zipkin构建链路追踪

1. 什么是APM

APM(Application Performance Management,即应用性能管理,在分布式领域也称为分布式跟踪管理)对企业的应用系统进行实时监控,它是用于实现对应用程序性能管理和故障管理的系统化的解决方案。

APM核心功能:

服务调用跟踪

应用系统存活检测

监控告警

开源APM管理工具:

ZipKin

PinPoint

SkyWalking

Prometheus

我们这篇文章主要是讲解APM的核心功能之一:服务调用跟踪,用到的工具是ZipKin,本来想用Prometheus搭建一个监控平台,想来想去比较简单,大家直接在本地就可以搭建单机版的监控平台。

2. 什么是Opentracing

OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。

不过OpenTracing并不是标准。因为CNCF不是官方标准机构,但是它的目标是致力为分布式追踪创建更标准的API和工具。

3. 什么是TraceID

一个trace代表了一个事务或者流程在(分布式)系统中的执行过程,而这个过程会有唯一ID去标识,这个唯一ID就是Trace ID,通俗解释就是一个API请求的完整调用流程。

4. 什么是SpanID

一个span代表在分布式系统中完成的单个工作单元,这个工作单元有唯一ID去标识,这个唯一ID就是Span ID。也包含其他span的“引用”,这允许将多个spans组合成一个完整的Trace。

通俗解释就是在Trace这样一个完整调用的流程中,Span扮演的角色就是每次执行的一次IO或者非IO操作。所以你通过Trace找到整个链路,然后从链路中找到确定的Span,这样就可以准确定位一次问题或者性能查询。

5. 其他名称解释

Span tags(跨度标签)可以理解为用户自定义的Span注释。便于查询、过滤和理解跟踪数据。

Span logs(跨度日志)可以记录Span内特定时间或事件的日志信息。主要用于捕获特定Span的日志信息以及应用程序本身的其他调试或信息输出。

SpanContext 代表跨越进程边界,传递到子级Span的状态。常在追踪示意图中创建上下文时使用。

6. 案例

执行时间的上下文,服务间的层次关系,服务间串行或并行调用链,结合以上信息,在实际场景中我们可以通过整个系统的调用链的上下文、性能等指标信息,一下子就能够发现系统的痛点在哪儿。

7. 什么是ZipKin

Zipkin是分布式追踪系统。它的作用是收集解决微服务架构中的延迟问题所需的时序数据。它管理这些数据的收集和查找。

Zipkin的设计基于Google Dapper论文。

8. 基于ZipKin构建链路追踪

首先在基于之前的项目之中,把server.go修改一下,让其支持分布式链路追踪。server.go:

至此我们的grpc服务就有了链路追踪功能,接下来我们演示下,启动server.go:k8s-grpc-demo go run cmd/svr/svr.go -port 50004

然后启动客户端:k8s-grpc-demo go run cmd/cli/cli.go

我们可以看下server.go的日志:图片我们发现日志完美记录到ZipKin中,接下来我们看下ZipKin地址:图片当我们点击RUN QUERY的时候可以看到如下:图片当我们点击某一个Trace的时候,就进入这个Trace的整个调用链路详情中:

这样我就基于gRPC + Opentracing + Zipkin的分布式链路追踪系统就搭建完成了,大家下去可以自己尝试下。

2. k8s的配置文件

liveness与readiness的探针工作方式源码解析

liveness和readiness作为k8s的探针,可以对应用进行健康探测。

二者支持的探测方式相同。主要的探测方式支持http探测,执行命令探测,以及tcp探测。

探测均是由kubelet执行。

由kubelet,通过CRI接口的ExecSync接口,在对应容器内执行拼装好的cmd命令。获取返回值。

kubelet是根据执行命令的退出码来决定是否探测成功。当执行命令的退出码为0时,认为执行成功,否则为执行失败。如果执行超时,则状态为Unknown。

http探测是通过kubelet请求容器的指定url,并根据response来进行判断。

当返回的状态码在200到400(不含400)之间时,也就是状态码为2xx和3xx是,认为探测成功。否则认为失败。

tcp探测是通过探测指定的端口。如果可以连接,则认为探测成功,否则认为失败。

探测失败的可能原因

执行命令探测失败的原因主要可能是容器未成功启动,或者执行命令失败。当然也可能docker或者docker-shim存在故障。

由于http和tcp都是从kubelet自node节点上发起的,向容器的ip进行探测。

所以探测失败的原因除了应用容器的问题外,还可能是从node到容器ip的网络不通。

liveness与readiness的原理区别

探测方式相同,那么liveness与readiness有什么区别?首先,二者能够起到的作用不同。

liveness主要用来确定何时重启容器。liveness探测的结果会存储在livenessManager中。

kubelet在syncPod时,发现该容器的liveness探针检测失败时,会将其加入待启动的容器列表中,在之后的操作中会重新创建该容器。

readiness主要来确定容器是否已经就绪。只有当Pod中的容器都处于就绪状态,也就是pod的condition里的Ready为true时,kubelet才会认定该Pod处于就绪状态。而pod是否处于就绪状态的作用是控制哪些Pod应该作为service的后端。如果Pod处于非就绪状态,那么它们将会被从service的endpoint中移除。

readiness检查结果会通过SetContainerReadiness函数,设置到pod的status中,从而更新pod的ready condition。

liveness和readiness除了最终的作用不同,另外一个很大的区别是它们的初始值不同。

liveness的初始值为成功。这样防止在应用还没有成功启动前,就被误杀。如果在规定时间内还未成功启动,才将其设置为失败,从而触发容器重建。

而readiness的初始值为失败。这样防止应用还没有成功启动前就向应用进行流量的导入。如果在规定时间内启动成功,才将其设置为成功,从而将流量向应用导入。

liveness与readiness二者作用不能相互替代。

例如只配置了liveness,那么在容器启动,应用还没有成功就绪之前,这个时候pod是ready的(因为容器成功启动了)。那么流量就会被引入到容器的应用中,可能会导致请求失败。虽然在liveness检查失败后,重启容器,此时pod的ready的condition会变为false。但是前面会有一些流量因为错误状态导入。

当然只配置了readiness是无法触发容器重启的。

因为二者的作用不同,在实际使用中,可以根据实际的需求将二者进行配合使用。

3. k8s功能点列表

k8s是一个docker容器管理工具。

它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统。

在docker的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能

2.----k8s的优势:

a,容器编排

b,轻量级

c,开源

d,弹性伸缩

e,负载均衡

k8s的核心功能

自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

4. k8s的使用

搭建Openstack之前原则上不需要对服务器本身做任何虚拟化,除非你是在虚拟机之上再搭建Openstack,个人建议计算节点和存储节点直接跑裸机,其它的控制服务比如api服务、scheduler服务等,如果不要求高性能,可以考虑放在虚拟机。

我下面表述都假定不考虑对服务器做任何虚拟化的情况(某些服务可以考虑跑容器上)。

5. k8s官方文档

1、nacos

应用内/外:属于外部应用,侵入性小

ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍)

版本迭代:目前仍然进行版本迭代

集成支持:支持Dubbo 、SpringCloud、K8S集成

访问协议:HTTP/动态DNS/UDP

雪崩保护:支持雪崩保护

界面:中文界面,符合国人习惯

上手:极易,中文文档,案例,社区活跃

2、consul 应用内/外:属于外部应用,侵入性小

ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。

版本迭代:目前仍然进行版本迭代

集成支持:支持SpringCloud K8S集成

访问协议:HTTP/DNS

雪崩保护:不支持雪崩保护

界面:英文界面,不符合国人习惯

上手:复杂一点

6. k8s管理页面

手机绘图密码忘记了,无法进入手机,可以通过硬格的方式清除绘图密码,步骤:

一:关机,同时按住手机音量+键和开机键(也称电源键)直至出现fastboot模式。

二:按音量-(方向下)键选择RecoveryMode,用开机键(也称电源键)确认,等几秒进入Recovery模式。

三:音量下键,将光亮条移动至wipedata/factoryreset电源键确认。确认后会出现几个"NO"与"Yes--deletealluserdata"组成的画面,音量下键移动光亮条移动至Yes--deletealluserdata电源键确认。

四:确认后画面回到Recovery模式界面,再次移动亮度条至wipecachepartition,电源键确认。

五:完毕后自动回到Recovery模式画面,选择rebootsystemnow,电源键确认,手机自动重启,重启后还原到手机初始状态。硬格结束,绘图密码也没有了,建议使用简单的绘图密码。

7. k8s如何给节点打上标签

k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

1、故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。这是docker或普通云主机是不能做到的

2、资源调度:当node节点上的cpu、内存不够用的时候,可以扩充node节点,新建的pod就会被kube-schedule调度到新扩充的node节点上

3、资源隔离:创建开发、运维、测试三个命名空间,切换上下文后,开发人员就只能看到开发命名空间的所有pod,看不到运维命名空间的pod,这样就不会造成影响,互不干扰

传统的主机或只有docker环境中,登录进去就会看到所有的服务或者容器

4、因为采用docker容器,进程之间互不影响,

5、安全:不同角色有不同的权限,查看pod、删除pod等操作;RBAC认证增加了k8s的安全

快速精准地部署应用程序

限制硬件用量仅为所需资源

Kubernetes 的优势

可移动: 公有云、私有云、混合云、多态云

可扩展: 模块化、插件化、可挂载、可组合

自修复: 自动部署、自动重启、自动复制、自动伸缩

负载均衡

k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。。。

推荐阅读