connections

Posted by 夏泽民

并发测试的时候,go一直报错Error 1040: Too many connections。 原因在MySQL连接数已经超过最大限制,执行SQLSHOW VARIABLES LIKE “max_connections”; 最大连接数是默认值151。



api-resources

Posted by 夏泽民

Binding: 已弃用。用于记录一个object和另一个object的绑定关系。实际上主要用于将pod和node关系,所以在1.7版本后已经改为在pods.bindings中记录了。 ComponentStatus: 是一个全局的list(即不受命名空间影响),记录了k8s中所有的组件的的相关信息,比如创建时间,现在状态等。 Configmap: 是一种用于记录pod本身或其内部配置信息的API资源,可以认为是通过API形式存储的配置文件。 Endpoints: 用于记录每个service的pod的真实物理ip和port的对应关系,包括service是TCP还是UDP等。 Event: 用于记录集群中的事件,可以认为类似于日志里的一条记录。 LimitRange: 用于记录各个命名空间中的pod或container对每种资源的使用限制,一般被包含在pod的定义中。 Namespace: 是一个全局的list,保存集群中所有的命名空间。 Node: 是一个全局的list,详细记录了每个节点的name, labels, PodCIDR, host IP, hostname, 总资源(cpu,内存),可分配资源,各心跳状态(网络,内存,硬盘,PID数量,kubelet等),kubelet的物理port,各k8s组件image信息,node环境信息(os, CRI version, kubeProxy version, kubelet version等)。 PersistentVolumeClaim: 记录用户对持久化存储的要求。 PersistentVolume: 是一个全局的object,记录了所有的持久化存储设备的信息(类似于node) Pod: 是对于使用k8s的开发者而言最重要的资源,其中包含ownerReference (Node, Demonset等),containers相关信息(image,启动命令,probe,资源信息,存储信息,结束时行,是否接受service注入环境变量为等),网络设置(dns设置,port设置等),集群调度相关信息(优先级,tolerations,affinity,重启规则等),pod状态(hostIP,podIP,启动时间等) PodTemplate: 一般是被包含在其它资源中的一部分,比如Jobs, DaemonSets, Replication Controllers。其初始化刚被创建的pod的k8s相关的信息,一般是label等。 Replication Controller: 是系统内建的最常用的controller,用来保证Pod的实际运行数量满足定义。如果不足则负责创建,如果过多则通知一些pod terminate。 ResourceQuota: 用于记录和限制某个namespace的中的总的资源消耗,一般用于多用户下利用namespace对资源进行限制。 Secrets: 实际上将文件内容通过base64编码后存在etcd中。在Pod中container启动时可以将secretes作为文件挂载在某一路径下,如此避免重要信息存储在image中。 ServiceAccout: 用于授权集群内的pod访问apiServer。 Service: 非常重要且常见的资源,用于对外提供统一的Service IP和port,将流量负载均衡调整至集群中多个pod。重要的配置有:cluster IP,port,selector(选择转发流量的目的pod),sessionAffinity等。这里提供的负载均衡是L3 TCP的。 MutatingWebhookConfiguration: 不明(内部object) ValidatingWebhookConfiguration: 不明(内部object) CustomerResourceDefinitions: 自定义资源也是非常重要的一种资源,是各种k8s插件能够存在的基础。比如当要实现Clico之类的自定义插件时,首先需要考虑的就是apiServer如何能够处理相关的请求信息。自定义资源的定义便是apiServer处理资源的依据。这个话题比较复杂,在这里不详细讨论。 APIService: 定义API服务的资源。一个API请求有两种形式,/apis/GROUP/VERSION/这种不被包含在namespace中的(即全局的)和/apis/GROUP/VERSION/namespaces/NAMESPACE/这种被包含在namespace中的。当一个请求到达apiServer后,必然需要有相应的代码去处理它。每一对GROUP和VERSION确定一种API,响应每一种API请求的代码被抽象为一种服务(service)。想象一下自定义资源的相关API请求到达apiServer后如何被处理呢?相关的service也是自定义的并且运行在master中,k8s正是根据APIService来正确地将请求与正确的service关联。在这里可以定义service名称,安全设置,优先级等。 ControllerRevision: 是一个beta功能,用于Controller保存自己的历史状态便于更新和回滚。 Daemenset: 常见的Pod set种类,用于控制每种pod状态(数量,计算资源使用,probe等)在定义的范围内,且在每node上最多有一个。 Replicaset: 常见的Pod set种类但现在基本上不直接使用,用于控制每种pod的状态(数量,计算资源使用,probe等)在定义的范围内。一个Replicasets中的各个pod都应是等同的、可互换的,即对外表现完全相同。就好比所有的氢原子(1质子0中子)都是不可区分的。 Deployment: 最常见的Pod set种类,可以拥有Replicasets和Pod。用于控制拥有的资源的状态(数量,计算资源使用,probe等)在定义的范围内。 StatefulSet: 常见的Pod set种类。和Deployment的区别之处是它控制的pod不是可互换的而是在整个生命周期有不变的标签。这样,每个pod可以有自己的DNS名,存储等。即使pod被删除后这些信息也会被恢复。 TokenReview: 不明,似乎和apiServer的Webhook的token授权相关。 LocalSubjectAccessReview: 不明(内部object),和一个命名空间对用户/组的授权检查相关。 SelfSubjectAccessReview: 不明(内部object),和当前用户检查自己是否有权限对一个命名空间进行操作相关。 SelfSubjectRulesReivew: 不明(内部object),含有当前用户在一个命名空间内能进行的操作的列表。和apiServer的授权安全模式相关 SubjectAccessReviews: 不明(内部object),和用户/组的授权检查相关,并不限定于某个命名空间。 HorizontalPodAutoScaler: 控制Pod set(比如Deployment)的pod数量的资源。可以根据pod的CPU、内存、自定义数据动态调节pod数量。在这里可以找到相关的例子。 CronJob: 定时运行Job pod的资源。 Job: 常见的Pod set种类,会创建一定数量的pod,仅当特定数量的pod成功结束后这个Job才算成功结束。创建的pod在结束后不会被重启。 CertificateSigningRequests: 可以认为是一个接口,便于Pod等资源申请获得一个X.509证书。这个证书应该被controller approve或者被手动approve,之后被合适的对象签名。具体可以参考这里。 Lease: 是一个在1.13版本中加入的资源类型,用于Node向master通知自己的心跳信息。之前的版本中kebulet是通过更新NodeStatus通知master心跳,后来发现NodeStatus太大了而心跳信息更新频繁,导致master压力较大,于是增加了Lease这种资源。 EndpointSlice: 是含有一个service的Endpoint的部分信息的资源。原因和Lease类似,对于含有较多信息的service(比如有很多pod分布在多个node上)一个endpoint object可能会比较大而且被频繁访问,所以这种情况下会有多个endpointSlice被创建减轻master的压力。 Event: 描述一个集群内的事件的资源,含有message,event,reason,报告来源等详细的信息。 Ingresse (APIGroup=extensions): 将被deprecated。 Ingresse (APIGroup=http://networking.k8s.io): 可以简单理解为是定义loadbalancer的资源。其中含有一系列规则,定义了不同url的对应后端,SSL termination等。为什么这个新的API会取代前面那个APIGroup=extensions的Ingress API呢?我查了很多地方没有找到具体的文字解释,但是可以推测是Ingress正式成为k8s的网络模块的一部分,对应的server(代码)从extensions迁移到http://networking.k8s.io。 NetworkPolicy: 定义了那些网络流量可以去哪些pod的资源。一个NetworkPolicy可以指定一组pods,定义只有满足了特定条件(比如源/目的IP,port,pod名等)的网络流量可以被相应的pod收发。 RuntimeClass: 这是2019年讨论加入的新API资源。文档说明其目的是将容器运行时(Container Runtime)环境的属性暴露给k8s的控制层,便于在一个集群或节点中支持多种容器运行时环境。这样便于未来创建更具有兼容性的k8s集群。 PodDisruptionBudget: 这一个API资源使用户可以对一组pod定义“k8s可以容忍的实际running状态的pod数量与预期的差距”。考虑这样一个情景:一集群中某个service后一共有5个相同pod处理其流量,要求至少有一半的pod是可用的,但其中3个pod由于调度运行在node A上。如果出现node A突然故障等情况导致服务不可用,暂时没有好的办法处理这种不可避免地意外情况(或者需要让调度算法知道这些pod应该被尽量均匀分布在个节点上,但目前k8s没有功能强制这种调度)。但除此之外还有很多可以避免的意外情况,比如在集群维护或者其它事件的处理过程中,集群管理员可能drain node A,导致三个pod同时被结束从而影响业务。针对这种可避免的意外,若一组pod的数量因为可避免的k8s操作将会低于可容忍程度(在PodDisruptionBudget中定义),那么这个命令会被阻止并返回失败。 PodSecurityPolicy: 定义了一个pod在集群中被创建/运行/更新时需要满足的条件。 ClusterRole: 定义了集群中policy rule的一些常见集合,比如system-node等,用于控制账户权限。 ClusterRoleBinding: 定义了某个账户/组对ClusterRole的引用,用于赋权。 Roles: 和前面ClusterRole类似,但是顾名思义ClusterRole是和集群账户相关,Role则被用于其它的账户(比如controller使用的service account) RoleBindings: 定义了某个账户/组对Role的引用,用于赋权。 PriorityClass: 定义了pod优先级名称和对应值的映射。比如system-cluster-critical对应的优先级为2000000000。值越大代表优先级越高,那么当集群资源不足等情况发生必须终止一些pod时,优先级小的pod会先被终止。为什么不直接用数值代表优先级呢?因为这样子很容易出现确定随意性。比如开发人员A开发了一个非常重要的pod,于是在代码中将其优先级的值设置为9999。但是集群集群管理员B可能认为9999是一个小数字,他创建的随便一个pod的优先级都是999999+。于是需要PriorityClass来进行优先级的统一管理和比较。 CSIDriver: 定义了集群中容器存储驱动的API资源。CSI代表的是Container Storage Interface,即容器存储接口。k8s应该可以利用各种各样的存储服务,各家云厂商的活开源的。k8s如何知道怎么去用这些存储服务呢?那么就是通过这个CSIDriver资源找到相应的驱动。 CSINode: 前面CSIDriver产生的节点相关的信息便存在CSINode中。 StorageClass: 定义了可以存在的存储类型的API资源。 Volumeattachments: 定义了对一个node分配/回收存储空间的请求的API资源。 NetworkSets: 接下来的都是Calico自定义API资源,就不一一分析了,都与网络协议/安全/管理相关。 NetworkPolicies: Calico自定义API资源 IPPools: Calico自定义API资源 IPAMHandles: Calico自定义API资源 IPAMConfigs: Calico自定义API资源 IPAMBlocks: Calico自定义API资源 HostEndpoints: Calico自定义API资源 GlobalNetworkSets: Calico自定义API资源 GlobalNetworkPolicies: Calico自定义API资源 FelixConfiguration: Calico自定义API资源 ClusterInformation: Calico自定义API资源 BlockAffinity: Calico自定义API资源 BGPPeer: Calico自定义API资源 BGPConfiguration: Calico自定义API资源 https://zhuanlan.zhihu.com/p/115903242



UUID

Posted by 夏泽民

由于Base64编码使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符。所以才有Base64名字的由来。Base64相当于使用64进制来表示数据,相同长度位数的情况下要比16进制表示更多的内容



NewIncomingContext

Posted by 夏泽民

在 gRPC 中对于 metadata 进行了区别,分为了传入和传出用的 metadata,这是为了防止 metadata 从入站 RPC 转发到其出站 RPC 的情况(详见 issues #1148),针对此提供了两种方法来分别进行设置,如下:



prefix查询

Posted by 夏泽民

prefix 查询是一个词级别的底层的查询,它不会在搜索之前分析查询字符串,它假定传入前缀就正是要查找的前缀。



Search

Popular posts

Anything in here will be replaced on browsers that support the canvas element

Recent posts

This blog is maintained by 夏泽民

Get in touch with me at 465474307@qq.com

Subscribe to our mailing list

* indicates required