kubernetes学习
文章平均质量分 82
hahachenchen789
后台开发,专注容器、k8s、云原生。
展开
-
使用devspace进行云原生开发
云原生开发的痛点:开发controller/crd operator时,需要在集群中运行测试。部署一般是利用pipeline或者二进制进行。而出现问题需进行调试时,一般只能通过打印日志,然后重新运行pipeline,生成新的镜像,然后更新pod。这样导致效率过低,简单的几行debug都需要走一遍全部流程。devspace是什么?DevSpace是Kubernetes的开源开发工具,可以让您更快地开发和部署云本地软件。官网:https://devspace.sh/安装(以mac原创 2021-10-12 21:46:30 · 642 阅读 · 0 评论 -
【万字长文】k8s client-go的informer设计实现详解
在开发controller时,用的最多的就是client-go的informer机制。该机制保证了消息的实时性,可靠性、顺序性。本文结合informer源码,对informer的设计实现进行详细解析。首先给出informer机制架构图(图片来自《k8s源码剖析》一书)核心组件:1、reflector从上图可以看到,reflector与api server直接交互,监听k8s资源,包括全量list,以及watch资源的变化事件,包括增删改。将对象放入deltafifo中。..原创 2021-07-01 17:58:40 · 2323 阅读 · 0 评论 -
mac+kind+ MetalLB实现集群load balance功能
使用kind安装k8s集群时,默认不提供load balance能力的。对于需要该能力的,kind官方给出了方案:使用metalLb。安装guo che原创 2021-06-08 22:04:59 · 748 阅读 · 1 评论 -
k8s client-go中的队列workqueue设计笔记
1、workqueue的去重和标记功能,利用set实现。workqueue中怎么实现set:利用golangtype empty struct{}type t interface{}type set map[t]empty其中empty是空类型, 因为sizeof(struct{})=0t是interface,泛型。表示支持多种类型。set用map实现,其中key为t,也就是泛型。empty为空。因为set的本质就是去重的数组,因此利用map的key不重复的特性实现。而value就原创 2021-05-08 17:58:59 · 1102 阅读 · 1 评论 -
k8s crd operator踩坑点
1、在函数中,有两种方式声明一个crd变量var a *appv1.deploymentb := new(appv1.deployment)区别,new是有初始化值的。因此 b != nil。但是a == nil。因此,new(appv1.deployment)可以作为client.get(ctx, b),进行赋值。但是如果要进行判断,用var比较好,不会进行初始化。2、crd的status字段,如果要更新,需要使用client.status().update()方法,而不能直接使.原创 2021-04-29 20:37:23 · 3511 阅读 · 5 评论 -
kubebuilder+code-generator开发crd operator
概览和k8s.io/code-generator类似,是一个码生成工具,用于为你的CRD生成kubernetes-style API实现。区别在于:Kubebuilder不会生成informers、listers、clientsets,而code-generator会。 Kubebuilder会生成Controller、Admission Webhooks,而code-generator不会。 Kubebuilder会生成manifests yaml,而code-generator不会。 Ku原创 2021-03-16 18:47:50 · 907 阅读 · 1 评论 -
集群使用calico的bgp+ipip混合模式部署
搭建方法:kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yamlwget https://docs.projectcalico.org/manifests/custom-resources.yamlvim custom-resources.yaml # 修改ipPools[0].cidr 为 kubeadm init 的 --pod-network-cidr 参数kubectl apply原创 2021-03-15 17:20:50 · 1375 阅读 · 1 评论 -
kubernetes源码分析-pod删除流程
在Node节点上,k8s是通过kubelet删除具体的pod。而用户删除pod一般通过kubectl delete pod 命令,或者利用http直接调用api-server暴露的接口去删除pod。因此在分析kubelet删除具体pod之前,先分析用户删除pod的命令是如何一步步传达给具体node上的(以kubectl delete pod 命令为例)。用户删除Pod流程k8s中采用cobra框架作为命令行的实现。kubectl delete操作通过NewCmdDelete中的RunDelete原创 2021-02-20 11:46:18 · 3277 阅读 · 0 评论 -
kubernetes源码分析-pod创建流程
前言首先放一张kubernetes的架构图。其中apiserver是整个架构的信息交互中心。所有组件都会与apisever交互。kubernetes中,每个node都部署了一个kubelet,通过kubelet实现对pod的创建、删除、更新等操作。Pod正式创建前的操作那么kubelet是怎么知道何时需要创建/删除一个pod以及对应的业务容器的呢?在kubernetes中,用户通过kubectl create/run 来部署各种应用、deployment等。kubectl接.原创 2021-02-20 11:15:34 · 1774 阅读 · 0 评论 -
kubernetes单节点集群搭建之CNI flannel网络安装
一、前言kubernetes集群搭建方法很多1.可以用第三方工具,比如minikube,kubeadm。2.也可以去kubernetes官网下release出的二进制bin文件。3.下载kubernetes源码,手动编译后生成二进制bin文件,该方法适用于需要对kubernetes源码进行改动或者二次开发的同学。本文采用第三种方法,即编译源码的方式。编译过程不在这详述...原创 2020-05-07 17:38:25 · 7537 阅读 · 1 评论 -
kubernetes-kubelet进程源码分析(二)
kubelet关键代码分析在上篇博文,我们分析了kubelet进程的启动流程,大致明白了kubelet的核心个哦你工作流程就是不断从Pod Source中获取与本节点相关的Pod,然后开始加工处理,所以我们先来分析Pod source部分代码。前面我们提到,kubelet可是同时支持三类Pod source,为了能够将不同的Pod source汇聚到一起统一处理,谷歌特地设计了Podconfi...原创 2019-02-20 23:53:16 · 421 阅读 · 0 评论 -
kubernetes-kubelet进程源码分析(一)
kubelet是运行在Minion节点上的重要守护进程,是工作在一线的重要工人,它才是负责实例化和启动一个具体Pod的幕后主导,并且掌管着本节点上的Pod和容器的全生命周期过程,定时向master汇报工作情况。此外kubelet进程也是一个server进程,它默认监听10250端口,接收并执行远程(master)发来的指令。进程启动过程kubelet进程的入口类源码位置如下:cmd/k...原创 2019-02-20 14:03:13 · 831 阅读 · 0 评论 -
kubernetes-kube-scheduler进程源码分析
kubernetes scheduler server是由kube-scheduler进程实现的,它运行在kubernetes的管理节点-Master上并主要负责完成从Pod到Node的调度过程。kubernetes scheduler server跟踪kubernetes集群中所有Node的资源利用情况,并采取合适的调度策略,确保调度的均衡性,避免集群中的某些节点过载。从某种意义来说,kuber...原创 2019-02-19 21:10:25 · 957 阅读 · 1 评论 -
kubernetes-kube-controller-manager进程源码分析
运行在Master节点上的第2个进程就是kube-controller-manager进程,即controller-manager server,kubernetes的核心进程之一,其主要目的是实现kubernetes集群的故障检测和恢复的自动化工作,比如内部组件EndpointController控制器负责Endpoints对象的创建和更新;ReplicationManager根据注册表中的Re...原创 2019-02-18 21:21:36 · 1175 阅读 · 0 评论 -
kubernetes-kube-apiserver进程源码分析
kubernetes API server是由kube-apiserver进程实现的,它运行在kubernetes的管理节点—master上并对外提供kubernetes Restful API服务,它提供的主要是与集群管理相关的API服务,例如校验pod、services、replication controller的配置并存储到后端的etcd server上。下面我们分别对其启动过程、关键代...原创 2019-02-17 20:22:30 · 2274 阅读 · 0 评论 -
kubernetes开发指南(REST&API)(一)
REST简介REST(representational state transfer)是由roy博士在他的论文中提出的一个术语,rest本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。基于web的架构实际上就是各种规范的集合,这些规范共同组成了web架构,比如HTTP、客户端服务器模式都是规范。每当我们在原有规范的基础上增加新的规范时,就会形成新的架构,而rest正是这样一种架构...原创 2019-02-16 21:58:45 · 5871 阅读 · 0 评论 -
kube-proxy进程源码分析
kube-proxy是运行在Minion节点上的另外一个重要的守护进程,你可以把它当做一个HAProxy,它充当了kubernetes中service的负载均衡器和服务代理的角色,下面我们分别对其启动过程、关键代码分析及设计总结等发面进行深入分析和讲解。进程启动过程kube-proxy进程的入口类源码位置如下:cmd/kube-proxy/proxy.go入口main()函数的逻辑...原创 2019-02-22 00:01:39 · 875 阅读 · 0 评论 -
为什么要用kubernetes
使用k8s的理由很多,最根本的一个理由就是:IT从来都是由一个新技术驱动的行业。 docker这个新兴的容器化技术当前已经被很多公司所采用,其从单机走向集群也称为必然,而云计算的蓬勃发展正在加速这一进程。kubernetes作为当前唯一被业界广泛认可和看好的docker分布式系统解决方案,可以预见,会有大量的新系统选择它,不管这些系统是运行在企业本地服务器还是被托管到公有云上。那...原创 2019-02-16 15:36:36 · 3394 阅读 · 4 评论 -
kubernetes-kubelet进程源码分析(三)
接着上篇博文,我们继续分析kubelet进程的另一个重要功能是如何实现的:定期同步Pod状态信息到API sever。先来看看Pod状态的数据结构定义:Pod的状态又5种:运行中(PodRunning)、等待中(PodPending)、正常终止(PodSucceeded)、异常停止(PodFailed)及未知状态(PodUnknown),最后一种状态很可能是由于Pod所在主机的通信...原创 2019-02-21 17:31:36 · 409 阅读 · 0 评论 -
k8s-kubectl进程源码分析
kubectl与之前的kubernetes进程不同,它不是一个后台运行的守护进程,而是kubernetes提供的一个命令行工具(CLI),它提供了一组命令来操作kubernetes集群。kubectl入口类源码位置如下:/cmd/kubectl/kubectl.gofunc main() { rand.Seed(time.Now().UTC().UnixNano()) command := ...原创 2018-06-13 17:06:32 · 1661 阅读 · 0 评论 -
kubernetes是什么
首先,它是全新的基于容器技术(docker,rocket)的分布式架构领先方案 。是谷歌保密了十几年的秘密武器-borg的一个开源版本。borg是谷歌内部使用的大规模集群管理系统。其次,kubernetes的设计思想是全自动管理,不必再费心于负载均衡器的选型和部署实施问题,不必再考虑引入或自己开发一个复杂的服务管理框架,也不必头疼于服务监控和故障处理模块的开发,将精力更加集中于业务本身,由于k8s...原创 2018-06-08 00:05:25 · 878 阅读 · 0 评论 -
k8s-kubelet功能源码分析
kubelet这是k8s中的一种服务,每个节点上都会运行kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理pod和pod中的容器。定期向master节点汇报资源使用情况。一、kubelet启动流程kubelet是作为一个cmd命令运行,因此接口源码也就是main入口,肯定在cmd文件夹中。cmd/kubelet/kubelet.gofunc main() { ...原创 2018-06-06 19:20:31 · 1087 阅读 · 0 评论 -
k8s源码架构目录分析
api: 输出接口文档用,基本是json源码build:构建脚本cmd:所有的二进制可执行文件入口代码,也就是各种命令的接口代码。pkg:项目diamante主目录,cmd只是接口,这里是具体实现。cmd类似业务代码,pkg类似核心plugin:插件test:测试相关的工具third_party:第三方工具docs:文档example:使用例子Godeps:项目依赖的Go的第三方包,比如docke...原创 2018-06-06 16:28:58 · 4213 阅读 · 2 评论 -
kubernetes组件与核心概念介绍
节点(Node):一个节点是一个运行 Kubernetes 中的主机。作为Kubernetes worker,通常称为Minion。每个节点都运行如下Kubernetes关键组件:Kubelet:是主节点代理。Kube-proxy:Service使用其将链接路由到Pod,如上文所述。Docker或Rocket:Kubernetes使用的容器技术来创建容器。容器组(Pod):一个 Pod 对应于由若...原创 2018-05-30 11:40:45 · 2412 阅读 · 0 评论 -
Kubernetes简介
Kubenetes(k8s)是一款由Google开发的开源的容器编排工具,在Google使用已经超过15年。那么k8s是用来解决集群容器运行时的什么问题呢?调度需要确保应用程序能够运行在它应该运行的地方。将应用运行在集群中正确的主机上对你的应用程序而言是很重要的一件事情,因为并不是集群中所有主机都是一样的。负载均衡需要保证来自客户端的负载(请求)能够均匀的分布到集群的节点当中。这对于你的应用程序能...原创 2018-05-30 10:40:04 · 686 阅读 · 0 评论 -
k8s简单实例-java web tomcat
此java web应用简单,是一个运行在Tomcat的Web App。如下图所示:通过浏览器http协议访问此应用,会显示一个表格的页面,数据来自数据库。此应用需要启动两个容器,web app容器和my sql容器,并且web app容器需要访问mysql容器。在docker时代,假设我们再一个宿主机上启动了这两个容器,则我们需要将mysql容器的IP地址通过环境变量的方式注入web app容器中...原创 2018-06-08 12:12:01 · 8979 阅读 · 6 评论 -
k8s基本概念与术语
k8s大部分概念比如Node,Pod、RC,service等都可以看做一种资源对象,几乎所有的资源对象都可以通过k8s提供的kubectl工具执行增,删,改,查等操作并将其保存在etcd中持久化存储。1.mastermaster指的是集群控制节点,来负责整个集群的管理和控制,基本上k8s的所有控制命令都是发给它。我们后面执行的命令基本都是在master节点上运行的。通常它会占据一个独立的x86服务...原创 2018-06-08 19:47:59 · 11457 阅读 · 1 评论 -
k8s安装与配置
一、k8s安装最简单的安装方法是使用yum install kubernetes命令,但仍需修改各组件的启动参数,才能完成配置。也可以下载二进制包,手动配置安装。k8s master节点安装部署etcd,kube-apiserver,kube-controller-manager,kube-scheduler服务进程,我们使用kubectl作为客户端与master进行交互操作。在工作Node上仅需...原创 2018-06-08 22:10:20 · 1017 阅读 · 0 评论 -
k8s-API server原理分析
我们都知道, k8s的API server核心功能是提供了k8s各类资源对象(Pod,RC,service)的增,删,改,查及HTTP REST接口。server是通过一个名为kube-apiserver的进程提供服务。该进程运行在master节点上,默认情况下,在本机8080端口提供REST服务。通常我们可以通过命令行工具kubectl来与API server交互。它们之间的接口是RES...原创 2018-06-09 10:57:57 · 13036 阅读 · 0 评论 -
k8s-controller manager原理分析
controller manager作为集群内部的管理控制中心,负责集群内的Node,Pod副本,服务端点(endpoint),命名空间(namespace)等的管理,当某个Node意外宕机,CM会及时发现此故障并执行自动化修复流程,确保集群始终处于预期的工作状态。如下图所示:CM内部包含了RC,node controller,namespace controller等多个控制器,每种控制器都负责...原创 2018-06-09 12:03:36 · 5547 阅读 · 0 评论 -
k8s-scheduler原理分析
scheduler在整个系统中承担了承上启下的重要功能,承上是指它负责接收controller manager创建新的Pod,为其安排一个落脚的目标Node,启下是指安置工作完成后,目标Node上的kubelet服务进程接管后继工作。也就是说scheduler的作用是通过调度算法为待调度Pod列表上的每一个Pod从Node列表中选择一个最合适的Node。k8s scheduler当前提供的默认调度...原创 2018-06-09 15:39:23 · 2420 阅读 · 0 评论 -
k8s-kubelet运行机制分析
在每个Node节点(又称minion)上都会启动一个kubelet服务进程,该进程用于处理Master节点下发到本节点的任务。管理Pod和Pod中的容器。每个kubelet进程会在API server注册节点自身信息,定期汇报节点资源使用情况。节点管理节点通过设置kubelet的启动参数--Register-node,来决定是否向API server注册自己。若该参数的值为true,则kubele...原创 2018-06-09 16:41:22 · 1253 阅读 · 0 评论 -
k8s-kube-proxy运行机制分析
在每个Node上都会运行一个kube-proxy服务进程,这个进程可以看做service的透明代理和负载均衡器。其核心功能是将某个service的访问请求转发到后端的某个Pod上。对每一个TCP类型的service,kube-proxy都会在本地Node上建立一个socketserver来负责接收请求,然后均匀发送到后端某个Pod端口上。这个过程默认采用Round Robin负载均衡算法。此外,s...原创 2018-06-09 17:48:37 · 4495 阅读 · 0 评论 -
k8s-kubelet进程初始化源码分析
kubelet命令的入口类源码位置如下:/cmd/kubelet/kubelet.go入口main函数如下:func main() { rand.Seed(time.Now().UTC().UnixNano()) command := app.NewKubeletCommand(server.SetupSignalHandler()) logs.InitLogs() defer logs...原创 2018-06-10 15:50:32 · 595 阅读 · 0 评论 -
转载《美团容器平台架构及容器技术实践》
文章转载处:https://www.kubernetes.org.cn/4823.html 背景:美团的容器集群管理平台叫做HULK。漫威动画里的HULK在发怒时会变成“绿巨人”,它的这个特性和容器的“弹性伸缩”很像,所以我们给这个平台起名为HULK。貌似有一些公司的容器平台也叫这个名字,纯属巧合。2016年,美团开始使用容器,当时美团已经具备一定的规模,在使用容器之前就已经存在的...转载 2019-02-15 17:10:03 · 375 阅读 · 0 评论 -
Kubernetes scheduler V2草案
大家都知道目前Kubernetes的调度器在可扩展性和性能上面还存在很多不足,在业界,不管是国内外大企业还是创业的新型云服务公司在面临调度的一系列本地化需求时都会自己定制或者使用webhook机制来兼容,但仍然要面临定制后不好和官方同步改动和webhook性能太差不够灵活的问题。所以,我们对更高可扩展性的调度器需求愈来愈强烈。下面是新更新的官方第二版调度器的设计草案,因为有些设计和我们内部的调度器...翻译 2018-06-20 21:53:04 · 496 阅读 · 0 评论