k8如何正确作

然后我们需要获取访问 kibana 的用户名和密码,用户名默认是elastic,可以通过如下方式获取访问密码:

Kubernetes(简称k8s)是一种流行的容器编排工具,用于部署、管理和扩展容器化应用程序。您需要学习和掌握Kubernetes的使用方法和经验才能正确使用。

查看pod日志(查看pod日志命令)查看pod日志(查看pod日志命令)


查看pod日志(查看pod日志命令)


查看pod日志(查看pod日志命令)


比如,启动tomcat时,端口被占用。

在开始使用Kubernetes之前,需要了解Kubernetes的核心概念和术语,例如Pod、Serv、ReplicaSet、Deployment等。需要了解Kubernetes的架构,包括Master和Node的角色以及它们之间的交互方式,如何安装和配置Kubernetes,以及如何访问Kubernetes集群,选择一个合适的Kubernetes管理工具,例如kubectl、Helm等,遵循实践,例如使用标签和注释、定期备份等,注意安全性和可靠性,例如使用安全证书、网络隔离等,了解如何调试和故障排除,例如查看日志、执行命令等,了解如何扩展和升级Kubernetes集群,例如增加、更新镜像等。

总之,学习和掌握Kubernetes需要一定的时间和经验否则, mode 的默认值是 DISABLE , 将导致客户端的 proxy sidecar 发出纯HTTP请求而不是TLS加密请求。 因为服务端的 proxy sidecar 期望加密的请求,所以客户端发出的请求与服务端期望接受的请求发生冲突。,但只要您有足够的耐心和实践,就可以逐步掌握正确的作方式。

运维调试:Istio

抓取的地址为caisor的地址,取的pod的mem分为rss、cached、used、total

Istio 生成以下类型的 emetry(遥测信息) ,以提供整体服务网格可观察性:

(TODO 待补充)

在 IstioOperator CR 中增加如下配置:

Requests可能由于各种原因而被拒绝。 理解为什么拒绝请求的方法是检查 Envoy的访问日志 。 默认情况下,访问日志输出到容器的标准输出。 运行以下命令以查看日志:

在默认访问日志默认格式中,在返回码后面有 Envoy response flags 和 Mixer policy status 。

如果您使用的是自定义日志格式,请确保包括 %RESPONSE_FLAGS% 和 %DYNAMIC_METADATA(istio.mixer:status)%

常见的 response flags 有:

常见的 Mixer Policy status 有:

Envoy的当前版本实现中,可能需要多达100个请求才能遵守按权重分发流量

如果路由规则对于Book示例而言运行良好,但是类似的“版本路由规则”对您自己的应用程序没有影响,则可能需要您对您的Kubernetes服务需要稍作更改。

Kubernetes服务必须遵守某些限制,才能利用 Istio 的L7路由功能。 有关详细信息,请参阅Pod和服务要求。

另一个潜在的可能是路线规则的生效速度有些缓慢。 Kubernetes上的 Istio实现 使用 最终一致的算法 来确保所有Envoy sidecar具有一致的配置,包括所有路由规则。 配置更改将需要一些时间才能传播到所有 sidecars。 在大型部署中,传播将花费更长的时间,并且可能会有几秒钟的延迟时间。

如果在应用DestinationRule后对服务的请求立即生成 HTTP 503错误 ,并且错误一直持续到您删除或还原DestinationRule,则DestinationRule可能会导致服务的 TLS冲突 。

例如,如果你在集群全局配置了双向TLS,那么 DestinationRule必须包含如下的 trafficPolicy :比如,我们将集群升级到2个,只需要设置spec.nodes[0].nodeCount=2即可:

设您使用 ingress gateway 和相应的VirtualServ访问内部服务。 例如,您的VirtualServ看起来像这样:

你还有一个 VirutalServ 定义将流量路由到特定的subset,如下所示:

在这种情况下,您会注意到,通过入口向helloworld服务的请求将不会定向到子集v1,而是将继续使用默认的 round-robin routing(轮询路由) 。

以 gateway host(例如myapp)作为入口的请求将激活 myapp VirtualServ 中的规则,该规则会将流量路由到helloworld服务的任意endpoint。

以 helloworld.default.svc.cluster.local 作为入口的的内部请求才会激活 helloworld VirtualServ 中的规则,该规则会将流量路由到 subset v1 。

要控制以 gateway host(例如myapp)作为入口的请求,还需要在 myapp VirtualServ 中包括子集规则:

或者将这两个 VirtualServ 合并成一个:

检查 ulimit -a 。 很多系统有默认最多打开 1024个fd(file descriptor) 的限制,这会导致 Envoy 的 assert失败并crash,错误信息如下:

请确保提高了该限制,例如 ulimit -n 16384

Envoy需要upstream服务是 HTTP/1.1 或 HTTP/2 。

例如当你使用Nginx作为上游服务的web server时,你需要设置nginx的 proxy__version 1.1 指令,因为nginx的该指令默认值是 1.0

示例

很多traffic管理问题都是由不正确的 TLS配置 导致的。

如果你将 HTTPS请求 发送到声明为HTTP的服务,则 Envoy sidecar 将在转发请求时尝试将请求解析为HTTP,这将失败,因为HTTP意外地被加密。

例如你有如下的 ServEntry 定义:

当你发送 HTTPS请求,例如 c , 你会得到一个错误如下 c: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

Envoy的 access log 会显示一个 400 DPE 的错误

要修复这个问题,修改 ServEntry 定义如下:

将 virtual serv 绑定到 gateway 时,可能会发生两种常见的TLS不匹配:

gateway终结了TLS而virtual serv配置了TLS路由示例

设你有如下的配置:

上面的这个配置, gateway 终结了TLS,而 virtual serv 使用了基于TLS的路由规则, 这个路由规则不会生效 ,因为当路由规则被 evaluted(评估) 时,TLS已经被终结。

使用这个配置,你会得到 404状态码 。

你可以通过 istioctl proxy-config routes 命令来确认这个信息

gateway passthrough TLS ,而 virtual serv 没有配置 TLS路由示例

上面的这个配置, gateway passthrough TLS,而 virtual serv 没有使用基于TLS的路由规则, 这个路由规则不会生效

你可以通过 istioctl proxy-config listener 和 istioctl proxy-config routes 命令来确认这个信息

当配置 Istio 执行 TLS origination 时,你需要确保发送到 sidecar 的请求是纯文本的, sidecar 随后发起 TLS origination

定你有如下的配置

使用此配置, Sidecar 希望应用程序在端口443上发送TLS流量(例如 c ),但它还将在转发请求之前执行 TLS origination 。 这将导致请求被双重加密。

你会得到一个错误 (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

要修复这个问题,你可以将 ServEntry 中的 protocol 更改为 HTTP

然后用 c 的方式发出请求

幸运的是从 Istio 1.8 开始,你可以向80端口发出请求,然后将请求重定向到 443以进行TLS发起, 如下所示:

使用相同的TLS证书配置多个 将导致利用 HTTP/2连接重用 的浏览器(即大多数浏览器) 在与一主机的建立连接之后 访问第二主机时产生 404错误 。

定你有如下配置:

由于两个由相同的工作负载(即 selector = istio: ingressgateway )提供服务,因此对两个服务( serv1.test 和 serv2.test )的请求都将解析为相同的IP。

当使用相同的 selector 配置多个 Gateway 时,如果它们都暴露了相同的 HTTPS 端口,你必须确保它们使用了不同的端口名称。否则后创建的Gateway会无效( 虽然不会报错 )

加入你有如下配置:

使用这个配置,发送到 myhost2 的请求会失败,因为两个 Gateway 使用了相同的端口名称 s , c 请求会产生如下的错误:

你可以通过检查 Pilot 的日志来确认发生了什么,如下所示:

要避免这个问题,可以将第二个gateway的端口名称修改(例如 s2 )

Istio被安装,并且所有的事情看起来都正常,除了Zipkin中没有数据

这可能是由一个已知的Docker问题引起的,就是容器内部的时间可能与主机上的时间显著不同。(这个问题在 OSX 作系统上出现)

你可以通过在容器内部和外部执行 date 命令来确认。

当你从本地web客户端连接到远端的Grafana时,如果你不能获取Grafana的输出,请确认本地客户端时间和服务端的时间是否相同

本地web客户端(例如 Chrome)影响Grafana的输出

Istio CNI插件 在Kubernetes Pod生命周期的网络设置阶段执行 Istio Mesh Pod流量重定向 ,从而消除了将Pod部署到Istio Mesh中的用户对 NET_ 和 NET_RAW 功能的要求。

Istio CNI插件 取代了 istio-init容器 提供的功能。

如果输出列表中缺少某个proxy,则表示该proxy当前未连接到Pilot实例,因此不会接收任何配置。

此外,如果proxy被标记为 stale(陈旧) ,则可能意味着存在网络问题或需要 扩充Pilot实例的数量 。

Istiod 使用灵活的 Introspection(自省)框架(称为 ControlZ )构建,这使得它很容易检查和作 istiod 实例 的内部状态。

Istiod 打开一个web端口,可以通过浏览器使用交互视图更改其状态,或者通过REST API的方式。

当 istiod 启动时,通过它的日志信息可以看到连接到 ControlZ 的IP和端口

你可以通过在本地使用 istioctl dashboard 命令开启对 Istio组件 的访问

然后打开浏览器

Istio组件使用灵活的日志框架构建,该日志框架提供了许多功能和控件,以帮助作这些组件并促进诊断。

启动组件时,可以通过传递 命令行选项 来控制这些日志记录功能。

1. Logging scopes

组件输出的日志消息按 scopes 分类。 scope 代表一组可以整体控制的相关日志消息。 根据组件提供的功能,不同的组件具有不同的 scopes 。 所有组件都有 default scope ,该scope用于未分类的日志消息。

例如,在撰写本文时, istioctl 具有24个 scope ,代表命令中的不同功能区域: ads, adsc, ysis, attributes, authn, authorization, cache, cli, default, grpcAdapter, installer, mcp, model, patch, processing, resource, secretfetcher, source, spiffe, tpath, translator, util, validation, validationController

Pilot-Agent,Pilot-Discovery和Istio Operator 具有它们自己的scopes,您可以通过查看它们的参考文档来发现它们。

每个scope都有一个的log ll 为以下之一:

none error warning debug

none 不产生任何输出, debug 则产生最多的输出

所有scopes的默认ll是

要控制输出的ll,可以使用 --log_output_ll 命令行选项,如下所示:

2. 控制输出位置

日志消息通常发送到组件的标准输出流。 使用 --log_target 选项,您可以将输出定向到任意数量的不同位置。 您可以为该选项提供一个用逗号分隔的文件系统路径列表,以及特殊值 stdout和stderr ,分别表示标准输出和标准错误流。

日志消息通常以人类友好的格式输出。 --log_as_json 选项可用于将输出强制转换为JSON,这样工具可以更轻松地进行处理。

Istio控制平面组件 可以自动管理 Log rotation ,这使将大型日志分解为较小的日志文件变得很简单。 使用 --log_rotate 选项,您可以指定用于rotation的基本文件名。 派生名称将用于单个日志文件。

使用 --log_rotate_max_age 选项可以指定文件rotation之前的天数,而使用 --log_rotate_max_size 选项可以指定文件rotation之前的大小(以megabytes为单位)。 , --log_rotate_max_backups 选项使您可以控制要保留的rotation文件数,较旧的文件将被自动删除。

3. 组件调试

使用 --log_caller 和 --log_stacktrace_ll 选项,您可以控制日志信息是否包括 programmer-ll 的信息。 当试图跟踪组件中的bug时,这很有用,但通常在日常作中不使用。

该命令被 pilot 使用, pilot 是 istiod 的一部分,所以你可以在 istiod pod内执行该命令

该命令被 istio-operator namespace中的 istio-operator deployment 使用,所以你可以在 istio-operator pod内执行该命令

该命令被注入的pod中的 istio-proxy container 使用,所以你可以在任意被注入的pod的 istio-proxy container 内执行该命令

k8s 如何使用kube-dns实现服务发现

为了能够获得磁盘的性能,ECK 支持每个使用 local如你有如下的配置 volume,关于在 EC记一次k8s中内存泄露的问题K 中使用 local volume 的方法可以查看下面几篇资料:

k8s中,写日志引起pod cache增加问题

通这是因为你将 protocol 声明成了 HTTP 而不是 HTTPS过压测得到:

k8s的limit限制,会计算rss+cache的值,写文件会导致cache不断增加,直到总量到达limit的限制值,此时cache会保持稳定。如果存在内存泄露,会导致rss不断增长,直到rss超过limit,会重启容器释放内存

3. Log rotation我们内存告警rss的值即可,告警数值为limit的80% P2,limit的90% P1

pod日志需要落盘吗

落盘,就是将数据写入到磁盘(存储介质)。

pod日志是否需要落盘取决于业务需求和日志管理方案。不同的落盘方式有不同的优缺点,影响日志采集的效果。有以下几种落盘方式。

2、访问网站时出现的日志信息,这里往往是代码程序出现bug。

1、EmptyDir模式:在Pod被分配到Node时创建一个空目录,用于存储日志文件,当Pod销毁时,目录中的数据也会被删除。这种方式配置简单,不需要指定宿主机目录,也不存在文件路径冲突的问题。有风险打满ECS磁盘,影响应用稳定性,而且需要依赖应用配置日志轮转的方式控制日志大小。

2、HostPath模式:将Node主机中的一个实际目录挂载到Pod中,用于存储日志文件,当Pod销毁时,目录中的数据仍会存在。这种方式文件安全性增加,除非磁盘损坏或ECS故障无法恢复,否则不会丢失日志数据。但是如果同一个应用的pod数量大于ACK数量,多个pod的日志会写入同一个日志文件,造成内容混乱,而且POD重启后,原ECS上的日志无法被应用管理,存在打满ECS系统盘的风险。

3、PVC模式:使用PersistentVolumeClaim(PVC)安装 ECK请求特定的存储大小和访问模式,并将其挂载到Pod中,用于存储日志文件。这种方式不会有打爆ECS盘的风险,也不需要额外的日志清理工具,而且无需保证ACK数大于应用POD数量。但是资源开销大,每个pod单独为日志挂盘,考虑到磁盘预留会浪费更多的磁盘资源,而且复杂度提高,每个pod单独挂盘,pvc数量多,增加运维管理成本。

日志实体类信息包括哪些内容?

每当您应用DestinationRule时,请确保 trafficPolicy TLS模式 与全局配置匹配。

日志实体类信息包括哪些内容?组件选择

使用kubectl create -f nginx-deployment.yaml指令创建,这样便可以得到两个运行nginx服务的Pod。待Pod运行之后查看一下它们的IP,并在k8s集群内通过podIP和containerPort来访问Nginx服务:

tomcat 日志信息

前言

tomcat的日志信息。

tomcat如何查看日志信息。

tomcat的日志信息包括哪些部分。

tomcat的日志信息包括哪些部分

1、启动/关闭tomcat时的日志信息,这里指的是tomcat本身的日志信息,往往是tomcat本身的问题。

tomcat如何查看日志信息

tomcat的日志信息文件,是放在安装目录/logs/目录下的。最常用的包括两部分,就是前面说的2种类型。

1、启动/关闭tomcat时的日志信息,在 catalina.2015-12-02.log文件里一个日志系统需要具备哪些功能。

每天都会生成一个新的单独的文件。

2、访问网站时的日志信息,在localhost.2015-12-02.log文件里。

只要那天有访问,就会生成一个新的单独的日志文件。

收起全文

使用 Elasticsearch Operator 快速部署 Elasticsearch 集群

要避免这个问题,你可以配置一个单独的 Gateway , 而不是两个( gw1 和 gw2 ) 。就像下面这样 :

同样的,对于 Elasticsearch 应用,现在也推出了基于 Kubernetes Operator 的应用:Elastic Cloud on Kubernetes (ECK),用户可使用该产品在 Kubernetes 上配置、管理和运行 Elasticsearch 集群。

如果首先访问 serv1.test ,它将返回通配符证书( .test ),指示与 serv2.test 的连接可以使用同一证书。 因此,Chrome和Firefox等浏览器将重复使用现有连接来请求对 serv2.test 的请求。 由于 Gateway gw1 没有 serv2.test 的路由,因此它将返回 404响应 。

Elastic Cloud on Kubernetes

Elastic Cloud on Kubernetes(ECK)是一个 Elasticsearch Operator,但远不止于同样可能是时间的问题此。 ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:

ECK 不仅能自动完成所有运行和集群管理任务,还专注于简化在 Kubernetes 上使用 Elasticsearch 的完整体验。ECK 的愿景是为 Kubernetes 上的 Elastic 产品和解决方案提供 SaaS 般的体验。

在 ECK 上启动的所有 Elasticsearch 集群都默认受到保护,这意味着在最初创建的那一刻便已启用加密并受到默认强密码的保护。

ECK 内构建了 Elastic Local Volume,这是一个适用于 Kubernetes 的集成式存储驱动器。ECK 中还融入了很多实践,例如在缩小规模之前对进行 drain 作,在扩大规模的时候对分片进行再平衡,等等。从确保在配置变动过程中不会丢失数据,到确保在规模调整过程中实现零中断。

当然前提是你要有一个已经可运行的 kubernetes 集群(1.11版本以上),确保你的每个上至少有4GB内存可以使用,因为我们知道 Elasticsearch 是比较消耗资源的。

首先在集群中安装 ECK 对应的 Operator 资源对象:

安装成功后,会自动创建一个 elastic- 的 namespace 以及一个 operator 的 Pod:

这个时候会安装上若干个 CRD 对象,当然这些 CRD 资源的就在上面的 elastic-operator-0 这个 Pod 中:

然后我们可以利用 CRD 对象来创建一个非常简单的单个 Elasticsearch 集群:(elastic.yaml)

但是执行上面的命令会出现超时的情况:Error from server (Timeout): error when creating "STDIN": Timeout: request did not complete within requested timeout 30s,创建不成功。这主要是因为 ECK 添加了一个 validation webhook 的 Admission,我们可以临时将这个对象删除:

然后重新执行上面的创建命令即可成功。创建成功后需要等一小会儿待镜像拉取成功,然后就可以看到一个前缀为elastic的 Pod 运行成功:

同样可以查看自定义的Elasticsearch这个 CRD 资源对象:

我们可以看到集群的相关信息。

注意属性spec.elasticsearchRef.name的值为上面我们创建的 Elasticsearch 对象的 name:elastic。直接添加这个资源对象即可:

我们可以去访问 kibana 来验证我们的集群,比如我们可以再添加一个 Ingress 对象:(ingress.yaml)

创建上面的 Ingress 对象:

接下来在浏览器中打开上面的kibana.qikqiak地址,正常就会跳转到登录页面了:

使用上面的用户名和密码登录即可进入 kibana dashboard 页面:

更新集群

上面我们部署的 Elasticsearch 集群是一个单的,我们可以直接修改 Elasticsearch 的资源清单文件来修改集群配置。ECK 会确保我们在现有集群上进行修改不会中断应用。

直接更新集群信息即可:

可以看到 elastic 这个 Elasticsearch 资源的状态是green,两个。

持久化

上面我们部署的集群默认是使用的emptyDir volume,我们知道emptyDir和 Pod 的生命周期是一致的,Pod 重建后数据肯定就没有了,在生产环境中肯定是不行的。

我们可以在集群中使用 PV/PVC 来进行持久化,同样,在上面的 Elasticsearch 资源对象中添加存储相关数据:

项目地址:

网吧电脑常见故障

通过 ECK 部署的所有集群都包括强大的基础(免费)级功能,例如可实现密集存储的冻结索引、Kibana Spaces、Canvas、Elastic Maps,等等。您甚至可以使用 Elastic Logs 和 Elastic Infrastructure 应用监测 Kubernetes 日志和基础设施。您可以获得在 Kubernetes 上使用 Elastic Stack 完整功能的体验。

解决思路如下:

要解决这个问题,你需要关闭并重启 Docker ,然后重新安装 Istio

一)电源,主板,cpu;当按下电源开关时,电源开始供电,电脑的指示灯亮起;如果这个时候没有反应,电源指示灯,风扇也都没有转动,先检查以下计算机的各个线路有没有问题,如果线路正常,那有可能是计算机的电源或者是主板出了问题,具体是哪个,可以打开机箱用电表测一下。如果测试没有问题,那就是cpu出现了问题,更换后进行测试。(二)内存,显卡等;电源刚开始供电的时候还是不稳定的,主板的控制芯片组会向cpu发出一个reset信号,也就是初始化,当电源供电稳定后,芯片会撤去reset信号,cpu马上会从地址FFFFOH处开始执行指令,这个地址在系统的bios地址范围内,一般的bios放在这里的是一条跳线指令,会跳到真正的启动代码处。系统bios的启动代码接下来做的就是t,也就是我们说得加电自检。它的主要任务是检测系统中的一些关键设备是否存在,能否正常工作,如显卡,内存等。如果这个时候系统的喇叭发出警报声,那就可能是内存或者显卡处问题了,具体错误类型一般可以从警报声的长短,以及次数判断。前边有位老大已经为大家列出了各种bios出错时的的表现;(三)显卡,内存;接下来,bios 将检查显卡bios,找到之后调用它的初始化代码,由显卡bios完成显卡的初始化。这时候,大多都能看到屏幕的上方会列出一些显卡的信息,如芯片类型,现存类型等;我们可以看到的个画面就是它;查找完其他的设备的bios之后,系统将显示启动画面,其中包括系统bios的类型,序列号,版本号等内容。接着,bios将检测cpu的类型,和工作频率,这时会将结果显示在屏幕上,接着,开始测试内存的容量(当然,这个时候,可以ESC跳过)显示容量。四)硬盘,光驱,(软驱);接下来,bios开始检测系统中安装的一些标准硬件设备,如:硬盘,光驱,软驱,串行和并行接口等;标准设备检测完以后,系统bios内部支持即插即用的代码将开始检测和配这系统中的即插即用设备。这个时候出现的问题,一般为不能启动,或者找不到硬盘,除线路接触不好外,一般为硬盘的物理损伤,也有可能是硬盘的主区信息丢失。这时候就要检查,并用软件重新建立或者恢复记录了; (五)硬盘;到此所有的硬件都已经检测配置完成,系统的bios会重新在屏幕上显示出一个系统配置表,会类出硬件相关的参数;接下来,系统的bios将更新系统配置数据,然后执行他的一项任务,既根据用户制定的启动顺序,从光盘,或者从硬盘启动;如果选择的是从硬盘启动,系统bios将读取并执行这个活动分区的分区记录,主记录接着从分区表中找到活动分区,然后,读取并执行分区记录;这个时候出错,那肯定是软件故障了,比如:文件,系统文件丢失,或者被修改;也可能包括硬盘出现物理坏道;完成以上检测后,你就可以听到进入系统的那一声美妙的声音了

同样,也可以用 CRD 对象 Kibana 来部署 kibana 应用:(kibana.yaml)