Below you will find pages that utilize the taxonomy term “k8s”
December 2, 2023
pod sandbox 创建netns源码分析
"在上一篇《创建Pod源码解析》文中,我们大概介绍了Pod的整体创建过程。其中有一步很重要,就是在创建三类容器之前必须先创建一个 sandbox (源码),本篇就来分析一下sandbox这一块的 netns 实现过程。\n对 sandbox 的创建由 kubelet 组件通过调用 CRI 容器运行时服务来实现的,对于容器运行的实现目前市面上有多个,如 Docker Engine(不推荐)、 containerd、CRI-O 等,由于目前生产环境中选择 containerd 的占大多数,所以这里我们以 containerd 为例来看一下其实现过程。\nhttps://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go\n对 sandbox 的创建是由 cri 服务调用 RunPodSandbox()方法来实现的。\n// RunPodSandbox creates and starts a pod-level sandbox. …"
August 19, 2023
k8s 中 CRD controller 开发教程
"本文主要介绍 crd controller 的基本开发过程,让每一个刚接触k8s开发的同学都可以轻松开发自己的控制器。\nkubebuilder 简介 kubebuilder 是一个帮助开发者快速开发 kubernetes API 的脚手架命令行工具,其依赖 controller-tools 和 controller-runtime 两个库。其中 controller-runtime 简化 kubernetes controller 的开发,并且对 kubernetes 的几个常用库进行了二次封装, 以简化开发工程。而 controller-tool 主要功能是代码生成。\n下图是使用 kubebuilder 的工作流程图:\n安装 kubebuilder # download kubebuilder and install locally. ➜ curl -L -o kubebuilder \u0026#34;https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)\u0026#34; ➜ chmod +x kubebuilder …"
August 3, 2023
apiserver 中的webhook开发教程
"k8s: v1.27.3\n什么是准入控制插件? 准入控制器 是一段代码,它会在请求通过认证和鉴权之后、对象被持久化之前拦截到达 API 服务器的请求。\n准入控制器可以执行 变更(Mutating) 和或 验证(Validating) 操作。 变更(mutating)控制器可以根据被其接受的请求更改相关对象;验证(validating)控制器则不行。\n准入控制器限制创建、删除、修改对象的请求。 准入控制器也可以阻止自定义动作,例如通过 API 服务器代理连接到 Pod 的请求。 准入控制器不会 (也不能)阻止读取(get、watch 或 list)对象的请求。\n某些控制器既是变更准入控制器又是验证准入控制器。如果两个阶段之一的任何一个控制器拒绝了某请求,则整个请求将立即被拒绝,并向最终用户返回错误。\nKubernetes 1.27 中的准入控制器由下面的列表组成, 并编译进 kube-apiserver 可执行文件,并且只能由集群管理员配置。 在该列表中,有两个特殊的控制器:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。 它们 …"
August 1, 2023
k8s之kube-controller-manager 源码分析
"Kubernetes 控制器管理器(kube-controller-manager)是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 在机器人和自动化的应用中,控制回路是一个永不休止的循环,用于调节系统状态。 在 Kubernetes 中,每个控制器是一个控制回路,通过 API 服务器监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。\n本文不对 kube-controller-manager 管理的每个控制器的执行原理做介绍,只是从全局观看一下kube-controller-manager 启动每个控制器的整体实现过程。\nk8s: v1.27.3\n文件: cmd/kube-controller-manager/app/controllermanager.go\n控制器选项初始化 // cmd/kube-controller-manager/app/controllermanager.go#L104 func …"
July 31, 2023
k8s调度器插件开发教程
"上一篇 《k8s调度器 kube-scheduler 源码解析》 大概介绍一调度器的内容,提到扩展点的插件这个概念,下面我们看看如何开发一个自定义调度器。\n本文源码托管在 https://github.com/cfanbo/sample-scheduler。\n插件机制 在Kubernetes调度器中,共有两种插件机制,分别为 in-tree 和 out-of-tree。\nIn-tree插件(内建插件):这些插件是作为Kubernetes核心组件的一部分直接编译和交付的。它们与Kubernetes的源代码一起维护,并与Kubernetes版本保持同步。这些插件以静态库形式打包到kube-scheduler二进制文件中,因此在使用时不需要单独安装和配置。一些常见的in-tree插件包括默认的调度算法、Packed Scheduling等。 Out-of-tree插件(外部插件):这些插件是作为独立项目开发和维护的,它们与Kubernetes核心代码分开,并且可以单独部署和更新。本质上,out-of-tree插件是基于Kubernetes的调度器扩展点进行开发的。这些插件以独立的二进制文件形 …"
July 28, 2023
k8s调试之 kube-apiserver 组件
"上一节《GoLand+dlv进行远程调试》我们介绍了如何使用 GoLand 进行远程调试,本节我们就以 kube-apiserver 为例演示一下调试方法。\n服务器环境 作为开发调试服务器,需要安装以下环境\n安装 Golang 环境,国内最好设置 GOPROXY 安装 dlv 调试工具 安装 Docker 环境, 同时安装 containerd 服务(对应官方教程中的 containerd.io 安装包)并设置代理 同步代码(本地) 以下为我们本机环境设置。\n本机下载 kubernetes 仓库\ngit clone --filter=blob:none https://github.com/kubernetes/kubernetes.git 这里指定 –filter=bold:none 可以实现最小化下载\n这里 k8s 项目目录为 /Users/sxf/workspace/kubernetes, 对应远程服务器目录为 /home/sxf/workspace/kubernetes,如图所示\n映射关系配置\n同时选择自动上传 Automatic upload (Always) 菜单,这样以后 …"
July 18, 2023
kubelet 源码之 Plugin注册机制
"上一篇《Kubelet 服务引导流程》我们讲了kubelet的大概引导流程, 本节我们看一下 Plugins 这一块的实现源码。\nversion: v1.27.3\n插件模块入口 入口文件 /pkg/kubelet/kubelet.go中的 NewMainKubelet() 函数,\nfunc NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,...) (*Kubelet, error) { ... // 插件管理器 /pkg/kubelet/kubelet.go#L811-L814 klet.pluginManager = pluginmanager.NewPluginManager( klet.getPluginsRegistrationDir(), /* sockDir */ kubeDeps.Recorder, ) ... } 这里第一个参数 klet.getPluginsRegistrationDir() 是返回 plugins 所在目录,默认位于kubelet …"
July 7, 2023
kube-proxy 源码解析
"k8s版本:v1.17.3\n组件简介 kube-proxy是Kubernetes中的一个核心组件之一,它提供了一个网络代理和负载均衡服务,用于将用户请求路由到集群中的正确服务。\nkube-proxy的主要功能包括以下几个方面:\n服务代理:kube-proxy会监听Kubernetes API服务器上的服务和端口,并将请求转发到相应的后端Pod。它通过在节点上创建iptables规则或使用IPVS(IP Virtual Server)进行负载均衡,以保证请求的正确路由。 负载均衡:当多个Pod实例对外提供相同的服务时,kube-proxy可以根据负载均衡算法将请求分发到这些实例之间,以达到负载均衡的目的。它可以基于轮询、随机、源IP哈希等算法进行负载均衡。 故障转移:如果某个Pod实例不可用,kube-proxy会检测到并将其自动从负载均衡轮询中移除,从而保证用户请求不会被转发到不可用的实例上。 会话保持(Session Affinity):kube-proxy可以通过设置会话粘性(Session Affinity)来将同一客户端的请求转发到同一Pod实例,从而保持会话状态的一致性。 网 …"
June 11, 2023
创建Pod源码解析
"在上一篇《Kubelet 服务引导流程》中我们介绍了 kubelet 服务启动的大致流程,其中提到过对 Pod 的管理,这一节将详细介绍一下对Pod的相关操作,如创建、修改、删除等操作。建议先了解一下上节介绍的内容。\n在 kubelet 启动的时候,会通过三种 pod source 方式来获取 pod 信息:\nfile: 这种方式只要针对 staticPod 来处理,定时观察配置文件是否发生变更情况来写入 pod http方式: 就是通过一个http请求一个 URL 地址,用来获取 simple Pod 信息 clientSet: 这种方式直接与 APIServer 通讯,对 pod 进行watch 上面这三种 pod source ,一旦有pod 的变更信息,将直接写入一个 kubetypes.PodUpdate 这个 channel(参考: https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kubelet.go#L278-L313),然后由下面我们要讲的内容进行读取消费。\n对于pod 的操作除了这一个 …"
June 11, 2023
k8s调度器 kube-scheduler 源码解析
"版本号:v1.27.2\nKubernetes 调度程序作为一个进程与其他主组件(例如 API 服务器)一起运行。它与 API 服务器的接口是监视具有空 PodSpec.NodeName 的 Pod,并且对于每个 Pod,它都会发布一个 Binding,指示应将 Pod 调度到哪里。\n调度过程 +-------+ +---------------+ node 1| | +-------+ | +----\u0026gt; | Apply pred. filters | | | | +-------+ | +----+----------\u0026gt;+node 2 | | | +--+----+ | watch | | | | | +------+ | +----------------------\u0026gt;+node 3| +--+---------------+ | +--+---+ | Pods in apiserver| | | +------------------+ | | | | | | +------------V------v--------+ | Priority function | …"
May 21, 2023
树莓派安装 kubernetes v1.27.2
"Ubuntu 22.04.2 LTS ARM64位系统 kubernetes v1.27.2\n以前写过一篇安装教程 https://blog.haohtml.com/archives/30924 ,当时安装的版本是 \u0026lt; v1.24.0 版本,由于k8s 从 v1.24.0 版本开始,弃用了 Dockershim 因此没有办法继续使用 Docker Engine 作为运行时,因此如果还想继续使用旧的运行时的话,则需要安装一个 cri-docker 的软件, 本文主要是介绍(版本 \u0026gt;=v1.24.0 )继续使用 Docker Engine 的安装方法,这里以最新版本 v1.27.1 为例。\n安装环境初始化 以下内容来自: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\n执行下述指令:\ncat \u0026lt;\u0026lt;EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo …"
February 15, 2023
kubernetes 之 client-go 之 informer 工作原理源码解析
"本方主要介绍有关 client go 架构实现原理,其中一个十分重要的组件就是 informer,它也是我们本文的重点,\nInformer 机制 采用 k8s HTTP API 可以查询集群中所有的资源对象并 Watch 其变化,但大量的 HTTP 调用会对 API Server 造成较大的负荷,而且网络调用可能存在较大的延迟。除此之外,开发者还需要在程序中处理资源的缓存,HTTP 链接出问题后的重连等。为了解决这些问题并简化 Controller 的开发工作,K8s 在 client go 中提供了一个 informer 客户端库,可以视其为一个组件。\n在 Kubernetes 中,Informer 可以用于监视 Kubernetes API 服务器中的资源并将它们的当前状态缓存到本地(index -\u0026gt; store) ,这样就避免了客户端不断地向 API 服务器发送请求,直接从本地即可。\n相比直接采用 HTTP Watch,使用 Kubernetes Informer 有以下优势:\n减少 API 服务器的负载:通过在本地缓存资源信息,Informer 减少了需要向 API 服务 …"
October 9, 2021
k8s解决证书过期问题
"在k8s中的时间会提示证书过期问题,如\n# kubectl get nodes Unable to connect to the server: x509: certificate has expired or is not yet valid 这里我们介绍一下续期方法。\n注意:当前集群通过 kubeadm 命令创建。\nkubeadm 安装得证书默认为 1 年,注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复。\n准备 这里先查看一下测试集群的证书过期时间\n# kubeadm certs check-expiration [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with \u0026#39;kubectl -n kube-system get cm kubeadm-config -o yaml\u0026#39; CERTIFICATE EXPIRES RESIDUAL TIME …"
August 16, 2021
k8s安装负载均衡器:Metallb
"在使用kubenetes的过程中,如何将服务开放到集群外部访问是一个重要的问题。当使用云平台(阿里云、腾讯云、AWS等)的容器服务时,我们可以通过配置 service 为 LoadBalancer 模式来绑定云平台的负载均衡器,从而实现外网的访问。但是,如果对于自建的 kubernetes裸机集群,这个问题则要麻烦的多。\n祼机集群不支持负载均衡的方式,可用的不外乎NodePort、HostNetwork、ExternalIPs等方式来实现外部访问。但这些方式并不完美,他们或多或少都存在的一些缺点,这使得裸机集群成为Kubernetes生态系统中的二等公民。\nMetalLB 旨在通过提供与标准网络设备集成的Network LB实施来解决这个痛点,从而使裸机群集上的外部服务也尽可能“正常运行”,减少运维上的管理成本。它是一种纯软件的解决方案,参考 https://kubernetes.github.io/ingress-nginx/deploy/baremetal/。\n从 v0.13.0 版本开始,官方对解决方案进行了部分调整,操作步骤简洁一些,建议使用最新版本, …"
July 31, 2021
在linux下安装Kubernetes
"环境 ubuntu18.04 64位\nKubernetes v1.21.3\n这里需要注意,本教程安装的k8s版本号 \u0026lt;- v1.24.0,主要是因为从v1.24.0以后移除了 Dockershim,无法继续使用 Docker Engine,后续将默认采用 containerd ,它是一个从 CNCF 毕业的项目。如果仍想使用原来 Docker Engine 的方式可以安装 cri-dockerd ,它是 Dockershim 的替代品。\n如果你想将现在 Docker Engine 的容器更换为 containerd,可以参考官方迁移教程 将节点上的容器运行时从 Docker Engine 改为 containerd\n为了解决国内访问一些国外网站慢的问题,本文使用了国内阿里云的镜像。\n更换apt包源 这里使用aliyun镜像 , 为了安全起见,建议备份原来系统默认的 /etc/apt/sources.list 文件\n编辑文件 /etc/apt/sources.list,将默认网址 或 替换为\n更新缓存\n$ sudo apt-get clean all $ sudo apt-get …"
April 29, 2021
初识kubernetes 组件
"对于一个刚刚接触kubernetes(k8s)的新手来说,想好更好的学习它,首先就要对它有一个大概的认知,所以本文我们先以全局观来介绍一个kubernetes。\nkubernetes架构 kubernetes 架构图 kubernets整体可以分为两大部分,分别为 Master 和 Node ,我们一般称其为节点,这两种角色分别对应着控制节点和计算节点,根据我们的经验可以清楚的知道 Master 是控制节点。\nMaster 节点 控制节点 Master 节点由三部分组成,分别为 Controller Manager 、 API Server 和 Scheduler ,它们相互紧密协作,每个部分负责不同的工作职责。\ncontroller-manager 全称为 kube-controler-manager 组件,主要用来负责容器编排。如一个容器(实际上是pod,pod是最基本的调度单元。一般一个pod里会部署一个容器服务)服务可以指定副本数量,如果实际运行的副本数据与期望的不一致,则会自动再启动几个容器副本,最终实现期望的数量。这个组件,就是一系列控制器的集合。 …"
March 28, 2020
k8s中的Service与Ingress
"集群中的服务要想向外提供服务,就不得不提到Service和Ingress。 下面我们就介绍一下两者的区别和关系。\nService 必须了解的一点是对 Service 的访问只有在 Kubernetes 集群内有效,而在集群之外是无效的。\nService可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。对于Service 的工作原理请参考\n当需要从集群外部访问k8s里的服务的时候,方式有四种:ClusterIP(默认)、NodePort、LoadBalancer、ExternalName 。\n下面我们介绍一下这几种方式的区别\n一、ClusterIP 该方式是指通过集群的内部 IP 暴露服务,但此服务只能够在集群内部可以访问,这种方式也是默认的 ServiceType。\n我们先看一下最简单的Service定义\napiVersion: v1 kind: Service metadata: name: hostnames spec: selector: app: hostnames ports: - name: default …"
March 28, 2020
mac下利用minikube安装Kubernetes环境
"本机为mac环境,安装有brew工具,所以为了方便这里直接使用brew来安装minikube工具。同时本机已经安装过VirtualBox虚拟机软件。\nminikube是一款专门用来创建k8s 集群的工具。\n一、安装minikube 参考 , 在安装minkube之前建议先了解一下minikube需要的环境。\n先安装一个虚拟化管理系统,如果还未安装,则在 HyperKit、VirtualBox 或 VMware Fusion 三个中任选一个即可,这里我选择了VirtualBox。 如果你想使用hyperkit的话,可以直接执行 brew install hyperkit 即可。\n对于支持的driver_name有效值参考, 目前docker尚处于实现阶段。\n$ brew install minikube 查看版本号\n$ minikube version minikube version: v1.8.2 commit: eb13446e786c9ef70cb0a9f85a633194e62396a1\n安装kubectl命令行工具\n$ brew install kubectl 二、启 …"
July 29, 2019
kubernetes dashboard向外网提供服务
"目前新版本的 kubernetes dashboard ()安装了后,为了安全起见,默认情况下已经不向外提供服务,只能通过 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 本机访问。在我们学习过程中,总有些不方便,这时我们可以利用 kubectl proxy 命令来实现。\n首先我们看一下此命令的一些想着参数\n➜ ~ kubectl proxy -h To proxy all of the kubernetes api and nothing else, use: $ kubectl proxy --api-prefix=/ To proxy only part of the kubernetes api and also some static files: $ kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/ The above lets you …"
October 11, 2018
Kubernetes学习资源
"k8s guide\n准备 对于一个新手来说,第一步是必须了解什么是 kubernetees、 设计架构 和相关 概念。只有在了解了这些的情况下,才能更好的知道k8s中每个组件的作用以及它解决的问题。\n安装工具 minikube 参考 https://minikube.sigs.k8s.io/docs/start/ kind 参考 https://kind.sigs.k8s.io/docs/user/quick-start/ 以上是安装k8s环境的两种推荐方法,这里更推荐使用kind。主要原因是 minikube 只支持单个节点,而 kind 可以支持多个节点,这样就可以实现在一台电脑上部署的环境与生产环境一样,方便大家学习。\n要实现管理控制 Kubernetes 集群资源如pod、node、service等的管理,还必须安装一个命令工具 kubectl ,请参考: https://kubernetes.io/zh/docs/tasks/tools/\n学习文档 Kubernetes 文档 https://kubernetes.io/zh/docs/home/ Play with …"