Below you will find pages that utilize the taxonomy term “K8s”
April 29, 2024
kubernetes 网络中DNS解析原理
"\u003cp\u003e当我们通过域名(例如 \u003ca href=\"https://www.example.com\"\u003ewww.example.com\u003c/a\u003e)访问一个网站时,第一步就是通过DNS服务器找到目的服务器IP地址(例如 93.184.215.14),接着再将请求数据包发送到这个 IP 服务器。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2024/04/watermark%2Ctype_ZmFuZ3poZW5naGVpdGk%2Cshadow_10%2Ctext_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwNzcyMQ%3D%3D%2Csize_16%2Ccolor_FFFFFF%2Ct_70.jpeg\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e而要想通过 DNS 服务器进行域名,必须得先知道 DNS 服务器地址才行,而这一般是通过读取配置文件实现,在 \u003ccode\u003e*nux\u003c/code\u003e 操作系统中,DNS 服务器一般配置在 \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e文件,如\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003esearch default.svc.cluster.local svc.cluster.local cluster.local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003enameserver 10.96.0.10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eoptions ndots:5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e用户可以通过 nameserver 指定多个 DNS 服务器,依次对域名进行解析,如果解析成功,则解析操作立即中止,如果解析不到的话,则将回退到公网 DNS 服务器进行解析,这个公网 DNS 服务器一般是由网络运营商来定的,用户不需要关心。如果公网 DNS 仍解析失败的话,则直接响应域名无法解析,此时用户将无法正常访问域名。\u003c/p\u003e\n\u003ch1 id=\"什么是-fqdn\"\u003e什么是 FQDN\u003c/h1\u003e\n\u003cp\u003e在介绍域名解析前, …\u003c/p\u003e"
April 22, 2024
Kubernetes集群扩缩容方案
"\u003cp\u003e动态扩缩容主要包括两个层级的动态扩缩容。一个层级是应用本身级别的扩缩容,如HPA、VPA。当应用负载过高时,可以通过HPA多部署几个Pods副本;或者通过VPA对当前Pod硬件资源进行扩容,以此来减少应用负载。\u003c/p\u003e\n\u003cp\u003e另一层是对集群自身的扩容,如 worker 节点的扩容。如部署Pods应用时,如果出现无可用节点资源可用时,则通过 Cluster Autoscaler 加入一些新的节点,并在新节点上重建Pods。\u003c/p\u003e\n\u003cp\u003e本文主要看一下应用这个层级的扩缩容方案。\u003c/p\u003e\n\u003ch1 id=\"水平扩展hpa--垂直扩展vpa\"\u003e水平扩展HPA \u0026amp;\u0026amp; 垂直扩展VPA\u003c/h1\u003e\n\u003ch2 id=\"hpa\"\u003eHPA\u003c/h2\u003e\n\u003cp\u003e在 Kubernetes 中,\u003ca href=\"https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/\"\u003eHPA\u003c/a\u003e(HorizontalPodAutoscaler)也称为水平扩缩容,它将根据当前应用程序工作负载,自动更新工作负载资源 (例如 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/\"\u003eDeployment\u003c/a\u003e 或者 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/\"\u003eStatefulSet\u003c/a\u003e)以满足当前需求。简单讲的话,就是如果集群检测到当前应用程序的n个Pod负载如果比较高的话,就再创建几个Pod副本,以减少当前负载,也就是我们平时说的水平扩容。相反如果应用程序Pod负载比较低的话,则将Pod副本数量进行减少,节省服务器资源,这个就是水平缩容。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2024/04/image-20240424145020517.png\" alt=\"image-20240424145020517\"\u003e\u003c/p\u003e\n\u003cp\u003e它的工 …\u003c/p\u003e"
April 10, 2024
kubernetes中overlay网络与underlay网络的区别
"\u003cp\u003eKubernetes 中的 overlay 网络和 underlay 网络是两个不同的网络层面。\u003c/p\u003e\n\u003ch1 id=\"underlay-网络\"\u003eUnderlay 网络\u003c/h1\u003e\n\u003cp\u003e在 Kubernetes 网络架构中,Underlay 网络是指承载 Kubernetes 网络流量的物理网络或底层网络。这个网络通常由物理交换机、路由器和其他网络硬件组成,它们之间通过各种路由协议(例如 OSPF、BGP 等)连接在一起组成的传统网络。\u003c/p\u003e\n\u003cp\u003eUnderlay 网络负责为 Kubernetes 节点提供基本的网络连接,它为上层的 overlay 网络提供支持。\u003c/p\u003e\n\u003cp\u003e总之,Kubernetes 的网络流量,例如 Pod 到 Pod、Pod 到 Service 等都将在这个 Underlay 网络上进行传输。\u003c/p\u003e\n\u003ch1 id=\"overlay-网络\"\u003eOverlay 网络\u003c/h1\u003e\n\u003cp\u003e对于 \u003ccode\u003eOverlay\u003c/code\u003e 网络也被称为 \u003ccode\u003e覆盖网络\u003c/code\u003e,想必只要接触过一点 kubernetes 网络知识的同学都不陌生,它主用来解决 \u003cstrong\u003e不同节点\u003c/strong\u003e 中 \u003cstrong\u003ePod\u003c/strong\u003e 之间通讯的一种网络解决方案。\n\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2024/04/image_1chvp7s4g15n0134iv1tvag1mkd8g.png\" alt=\"Overlay\"\u003e\u003c/p\u003e\n\u003cp\u003e在上图可以看到 \u003ccode\u003eOverlay\u003c/code\u003e 网络是构建在 \u003ccode\u003eunderlay\u003c/code\u003e 网络之上的一层虚拟网络,它通过封装数据包(如VXLAN)通过物理网络进行传输,到达目标网络 …\u003c/p\u003e"
March 19, 2024
如何实现访问k8s集群服务之原理
"\u003cp\u003e当我们想将 k8s 集群里的服务向外暴露时,一般是将 k8s service 指定 \u003ccode\u003eLoadBalancer\u003c/code\u003e类型。目前大多数云厂商会绑定云平台的负载均衡器,并为其分配一个固定的公网 IP 从而向外提供服务。而对于我们自建的 kubernetes 裸机集群则只能选择类似 MetalLB 这类解决方案,这种情况下如何让用户可以通过这个 IP 访问到自建 k8s 的服务呢,本文来分析一下其实现原理。\u003c/p\u003e\n\u003cp\u003e本文的环境安装了 MetallB,它指定分配 IP Pool 为内网 IP 地址,实验环境为 \u003ca href=\"https://blog.haohtml.com/posts/install-kubernetes-in-raspberry-pi/\"\u003ehttps://blog.haohtml.com/posts/install-kubernetes-in-raspberry-pi/\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"将外部请求流入集群节点\"\u003e将外部请求流入集群节点\u003c/h1\u003e\n\u003cp\u003e当我们需要访问一台机器时,无论是使用 IP 地址还是域名,最终都需要将其解析为 IP 地址。而要真正建立连接并传输数据,我们必须获取目标 IP 地址对应的 MAC 地址,这是由于 TCP/IP 协议分层机制决定的。\u003c/p\u003e\n\u003cp\u003e在 TCP/IP 协议栈的链路层,数据是通过封装成数据帧的方式在局域网内传输的。数据帧中包含了目标 MAC 地址,用于标识应该将数据 …\u003c/p\u003e"
February 2, 2024
Raspberry Pi 安装Kubernetes
"\u003cp\u003e这里是 arm64 架构,\u003cstrong\u003e树莓派 4B\u003c/strong\u003e, 四核八 G 内存 配置,系统为 Ubuntu 22.04.1 LTS\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ uname -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLinux ubuntu 5.15.0-1049-raspi \u003cspan style=\"color:#75715e\"\u003e#52-Ubuntu SMP PREEMPT Thu Mar 14 08:39:42 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cat /etc/issue\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUbuntu 22.04.1 LTS \u003cspan style=\"color:#ae81ff\"\u003e\\n\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\l\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"环境检查\"\u003e环境检查\u003c/h2\u003e\n\u003cp\u003e由于 k8s 会使用 8080 和 6443 这两个端口,因此要保证端口可用,然后禁用 swap。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo swapoff -a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e最后对安装环境初始化,参考 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\"\u003ehttps://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"安装-docker\"\u003e安装 Docker\u003c/h2\u003e\n\u003cp\u003e参考 \u003ca href=\"https://docs.docker.com/engine/install/ubuntu/\"\u003ehttps://docs.docker.com/engine/install/ubuntu/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e安装成功后,修改 \u003ccode\u003ecgroupdriver\u003c/code\u003e 为 \u003ccode\u003esystemd\u003c/code\u003e, …\u003c/p\u003e"
January 12, 2024
使用kubectl create service 命令无法为pod创建service问题
"\u003cp\u003e在做一个试验时,无意中发现使用 \u003ccode\u003ekubectl create service\u003c/code\u003e 命令无法为一个通过 \u003ccode\u003edeployment\u003c/code\u003e 创建出来的pod创建对应的 \u003ccode\u003eservice\u003c/code\u003e, 感觉有点奇怪,经过分析才明白怎么回事,这里将过程记录一下。\u003c/p\u003e\n\u003cp\u003e这里需要说明一下,本文操作全部是通过 \u003ccode\u003ekubectl create\u003c/code\u003e 命令来完成的,并没有使用 \u003ccode\u003ekubectl apply -f pod.yaml\u003c/code\u003e 这种方式。\u003c/p\u003e\n\u003cp\u003e这里先创建一个实验命名空间 \u003ccode\u003elab\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl create ns lab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e首先创建一个\u003ccode\u003edeployment\u003c/code\u003e 对象\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl create deployment test --image\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003enginx:1.23-alpine --replicas\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e --port\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e80\u003c/span\u003e -n lab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e确认创建成功\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ kubectl get deploy,pod -n lab\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNAME READY UP-TO-DATE AVAILABLE AGE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeployment.apps/test 2/2 \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2 …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
December 2, 2023
pod sandbox 创建netns源码分析
"\u003cp\u003e在上一篇《\u003ca href=\"https://blog.haohtml.com/archives/33163/\"\u003e创建Pod源码解析\u003c/a\u003e》文中,我们大概介绍了Pod的整体创建过程。其中有一步很重要,就是在创建三类容器之前必须先创建一个 \u003ccode\u003e sandbox\u003c/code\u003e (\u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kuberuntime/kuberuntime_manager.go#L1079\"\u003e源码\u003c/a\u003e),本篇就来分析一下sandbox这一块的 \u003ccode\u003enetns\u003c/code\u003e 实现过程。\u003c/p\u003e\n\u003cp\u003e对 \u003ccode\u003esandbox\u003c/code\u003e 的创建由 \u003ccode\u003ekubelet\u003c/code\u003e 组件通过调用 \u003ca href=\"https://kubernetes.io/zh-cn/docs/concepts/architecture/cri/\"\u003eCRI\u003c/a\u003e 容器运行时服务来实现的,对于容器运行的实现目前市面上有多个,如 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker\"\u003eDocker Engine\u003c/a\u003e(不推荐)、 \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd\"\u003econtainerd\u003c/a\u003e、\u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cri-o\"\u003eCRI-O\u003c/a\u003e 等,由于目前生产环境中选择 containerd 的占大多数,所以这里我们以 \u003ccode\u003econtainerd\u003c/code\u003e 为例来看一下其实现过程。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go\"\u003ehttps://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e对 sandbox 的创建是由 cri 服务调用 \u003ccode\u003eRunPodSandbox()\u003c/code\u003e方法来实现的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// RunPodSandbox creates and starts a pod-level sandbox. …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
August 19, 2023
k8s 中 CRD controller 开发教程
"\u003cp\u003e本文主要介绍 \u003ccode\u003ecrd controller\u003c/code\u003e 的基本开发过程,让每一个刚接触k8s开发的同学都可以轻松开发自己的控制器。\u003c/p\u003e\n\u003ch1 id=\"kubebuilder-简介\"\u003ekubebuilder 简介\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003ekubebuilder\u003c/code\u003e 是一个帮助开发者快速开发 \u003ccode\u003ekubernetes API\u003c/code\u003e 的脚手架命令行工具,其依赖 \u003ccode\u003econtroller-tools\u003c/code\u003e 和 \u003ccode\u003econtroller-runtime\u003c/code\u003e 两个库。其中 \u003ccode\u003econtroller-runtime\u003c/code\u003e 简化 \u003ccode\u003ekubernetes controller\u003c/code\u003e 的开发,并且对 \u003ccode\u003ekubernetes\u003c/code\u003e 的几个常用库进行了二次封装, 以简化开发工程。而 \u003ccode\u003econtroller-tool\u003c/code\u003e 主要功能是代码生成。\u003c/p\u003e\n\u003cp\u003e下图是使用 \u003ccode\u003ekubebuilder\u003c/code\u003e 的工作流程图:\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/08/76264fc22f097ec97349461e383ed996.webp\" alt=\"format%2Cpng\"\u003e\u003c/p\u003e\n\u003ch1 id=\"安装-kubebuilder\"\u003e安装 kubebuilder\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# download kubebuilder and install locally.\n➜ curl -L -o kubebuilder \u0026#34;https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)\u0026#34;\n➜ chmod +x kubebuilder …\u003c/code\u003e\u003c/pre\u003e"
August 3, 2023
apiserver 中的webhook开发教程
"\u003cp\u003ek8s: v1.27.3\u003c/p\u003e\n\u003ch2 id=\"what-are-they.wp-block-heading\"\u003e什么是准入控制插件?\u003ca href=\"https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#what-are-they\"\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e准入控制器\u003c/strong\u003e 是一段代码,它会在请求通过\u003cstrong\u003e认证\u003c/strong\u003e和\u003cstrong\u003e鉴权\u003c/strong\u003e之后、对象被持久化之前拦截到达 API 服务器的请求。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/08/6ca5dd6b207691069de1cf4df59cc6ad.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e准入控制器可以执行 \u003cstrong\u003e变更(Mutating)\u003c/strong\u003e 和或 \u003cstrong\u003e验证(Validating)\u003c/strong\u003e 操作。 变更(mutating)控制器可以根据被其接受的请求更改相关对象;验证(validating)控制器则不行。\u003c/p\u003e\n\u003cp\u003e准入控制器限制创建、删除、修改对象的请求。 准入控制器也可以阻止自定义动作,例如通过 API 服务器代理连接到 Pod 的请求。 准入控制器\u003cstrong\u003e不会\u003c/strong\u003e (也不能)阻止读取(\u003cstrong\u003eget\u003c/strong\u003e、\u003cstrong\u003ewatch\u003c/strong\u003e 或 \u003cstrong\u003elist\u003c/strong\u003e)对象的请求。\u003c/p\u003e\n\u003cp\u003e某些控制器既是变更准入控制器又是验证准入控制器。如果两个阶段之一的任何一个控制器拒绝了某请求,则整个请求将立即被拒绝,并向最终用户返回错误。\u003c/p\u003e\n\u003cp\u003eKubernetes 1.27 中的准入控制器由下面的\u003ca href=\"https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do\"\u003e列表\u003c/a\u003e组成, 并编译进 \u003ccode\u003ekube-apiserver\u003c/code\u003e 可执行文件,并且只能由集群管理员配置。 在该列表中,有两个特殊的控制器:\u003ccode\u003eMutatingAdmissionWebhook\u003c/code\u003e 和 \u003ccode\u003eValidatingAdmissionWebhook\u003c/code\u003e。 它们 …\u003c/p\u003e"
August 1, 2023
k8s之kube-controller-manager 源码分析
"\u003cp\u003eKubernetes 控制器管理器(\u003ccode\u003ekube-controller-manager\u003c/code\u003e)是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 在机器人和自动化的应用中,控制回路是一个永不休止的循环,用于调节系统状态。 在 Kubernetes 中,每个控制器是一个控制回路,通过 API 服务器监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。\u003c/p\u003e\n\u003cp\u003e本文不对 \u003ccode\u003ekube-controller-manager\u003c/code\u003e 管理的每个控制器的执行原理做介绍,只是从全局观看一下kube-controller-manager 启动每个控制器的整体实现过程。\u003c/p\u003e\n\u003cp\u003ek8s: v1.27.3\u003c/p\u003e\n\u003cp\u003e文件: \u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/cmd/kube-controller-manager/app/controllermanager.go\"\u003ecmd/kube-controller-manager/app/controllermanager.go\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"控制器选项初始化\"\u003e控制器选项初始化\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// cmd/kube-controller-manager/app/controllermanager.go#L104\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
July 31, 2023
k8s调度器插件开发教程
"\u003cp\u003e上一篇 \u003ca href=\"https://blog.haohtml.com/archives/33138\"\u003e《k8s调度器 kube-scheduler 源码解析》\u003c/a\u003e 大概介绍一调度器的内容,提到扩展点的插件这个概念,下面我们看看如何开发一个自定义调度器。\u003c/p\u003e\n\u003cp\u003e本文源码托管在 \u003ca href=\"https://github.com/cfanbo/sample-scheduler\"\u003ehttps://github.com/cfanbo/sample-scheduler\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"插件机制\"\u003e插件机制\u003c/h1\u003e\n\u003cp\u003e在Kubernetes调度器中,共有两种插件机制,分别为 \u003ccode\u003ein-tree\u003c/code\u003e 和 \u003ccode\u003eout-of-tree\u003c/code\u003e。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIn-tree插件(内建插件):这些插件是作为Kubernetes核心组件的一部分直接编译和交付的。它们与Kubernetes的源代码一起维护,并与Kubernetes版本保持同步。这些插件以静态库形式打包到kube-scheduler二进制文件中,因此在使用时不需要单独安装和配置。一些常见的in-tree插件包括默认的调度算法、Packed Scheduling等。\u003c/li\u003e\n\u003cli\u003eOut-of-tree插件(外部插件):这些插件是作为独立项目开发和维护的,它们与Kubernetes核心代码分开,并且可以单独部署和更新。本质上,out-of-tree插件是基于Kubernetes的调度器扩展点进行开发的。这些插件以独立的二进制文件 …\u003c/li\u003e\u003c/ol\u003e"
July 28, 2023
k8s调试之 kube-apiserver 组件
"\u003cp\u003e上一节\u003ca href=\"https://blog.haohtml.com/archives/34402\"\u003e《GoLand+dlv进行远程调试》\u003c/a\u003e我们介绍了如何使用 \u003ccode\u003eGoLand\u003c/code\u003e 进行远程调试,本节我们就以 \u003ccode\u003ekube-apiserver\u003c/code\u003e 为例演示一下调试方法。\u003c/p\u003e\n\u003ch1 id=\"服务器环境\"\u003e服务器环境\u003c/h1\u003e\n\u003cp\u003e作为开发调试服务器,需要安装以下环境\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e安装 \u003ccode\u003eGolang\u003c/code\u003e 环境,国内最好设置 \u003ccode\u003eGOPROXY\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e安装 \u003ccode\u003edlv\u003c/code\u003e 调试工具\u003c/li\u003e\n\u003cli\u003e安装 \u003ccode\u003eDocker\u003c/code\u003e 环境, 同时安装 \u003ccode\u003econtainerd\u003c/code\u003e 服务(对应官方教程中的 \u003ccode\u003econtainerd.io\u003c/code\u003e 安装包)并设置代理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"同步代码本地\"\u003e同步代码(本地)\u003c/h1\u003e\n\u003cp\u003e以下为我们本机环境设置。\u003c/p\u003e\n\u003cp\u003e本机下载 \u003ca href=\"https://github.com/kubernetes/kubernetes\"\u003ekubernetes\u003c/a\u003e 仓库\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone --filter\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eblob:none https://github.com/kubernetes/kubernetes.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e这里指定 –filter=bold:none 可以实现最小化下载\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这里 k8s 项目目录为 \u003ccode\u003e/Users/sxf/workspace/kubernetes\u003c/code\u003e, 对应远程服务器目录为 \u003ccode\u003e/home/sxf/workspace/kubernetes\u003c/code\u003e,如图所示\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/d2b5ca33bd970f64a6301fa75ae2eb22-6.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e映射关系配置\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/d2b5ca33bd970f64a6301fa75ae2eb22-7.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e同时选择自动上传 \u003ccode\u003eAutomatic upload (Always)\u003c/code\u003e 菜单,这 …\u003c/p\u003e"
July 18, 2023
kubelet 源码之 Plugin注册机制
"\u003cp\u003e上一篇\u003ca href=\"https://blog.haohtml.com/archives/33188\"\u003e《Kubelet 服务引导流程》\u003c/a\u003e我们讲了kubelet的大概引导流程, 本节我们看一下 \u003ccode\u003ePlugins\u003c/code\u003e 这一块的实现源码。\u003c/p\u003e\n\u003cp\u003eversion: v1.27.3\u003c/p\u003e\n\u003ch1 id=\"插件模块入口\"\u003e插件模块入口\u003c/h1\u003e\n\u003cp\u003e入口文件 \u003ccode\u003e/pkg/kubelet/kubelet.go\u003c/code\u003e中的 \u003ccode\u003eNewMainKubelet()\u003c/code\u003e 函数,\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eNewMainKubelet\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003ekubeCfg\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ekubeletconfiginternal\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eKubeletConfiguration\u003c/span\u003e,\u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e) (\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003eKubelet\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003eerror\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e// 插件管理器 /pkg/kubelet/kubelet.go#L811-L814\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003eklet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003epluginManager\u003c/span\u003e = \u003cspan style=\"color:#a6e22e\"\u003epluginmanager\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eNewPluginManager\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003eklet\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003egetPluginsRegistrationDir\u003c/span\u003e(), \u003cspan style=\"color:#75715e\"\u003e/* sockDir */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003ekubeDeps\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eRecorder\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里第一个参数 \u003ccode\u003eklet.getPluginsRegistrationDir() …\u003c/code\u003e\u003c/p\u003e"
July 7, 2023
kube-proxy 源码解析
"\u003cp\u003ek8s版本:v1.17.3\u003c/p\u003e\n\u003ch1 id=\"组件简介\"\u003e组件简介\u003c/h1\u003e\n\u003cp\u003ekube-proxy是Kubernetes中的一个核心组件之一,它提供了一个网络代理和负载均衡服务,用于将用户请求路由到集群中的正确服务。\u003c/p\u003e\n\u003cp\u003ekube-proxy的主要功能包括以下几个方面:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e服务代理:kube-proxy会监听Kubernetes API服务器上的服务和端口,并将请求转发到相应的后端Pod。它通过在节点上创建iptables规则或使用IPVS(IP Virtual Server)进行负载均衡,以保证请求的正确路由。\u003c/li\u003e\n\u003cli\u003e负载均衡:当多个Pod实例对外提供相同的服务时,kube-proxy可以根据负载均衡算法将请求分发到这些实例之间,以达到负载均衡的目的。它可以基于轮询、随机、源IP哈希等算法进行负载均衡。\u003c/li\u003e\n\u003cli\u003e故障转移:如果某个Pod实例不可用,kube-proxy会检测到并将其自动从负载均衡轮询中移除,从而保证用户请求不会被转发到不可用的实例上。\u003c/li\u003e\n\u003cli\u003e会话保持(Session Affinity):kube-proxy可以通过设置会话粘性(Session Affinity)来将同一客户端的请求转发到同一Pod实例,从而保持会话状态的一致性。\u003c/li\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ol\u003e"
June 11, 2023
创建Pod源码解析
"\u003cp\u003e在上一篇\u003ca href=\"https://blog.haohtml.com/archives/33188\"\u003e《Kubelet 服务引导流程》\u003c/a\u003e中我们介绍了 \u003ccode\u003ekubelet\u003c/code\u003e 服务启动的大致流程,其中提到过对 Pod 的管理,这一节将详细介绍一下对Pod的相关操作,如创建、修改、删除等操作。建议先了解一下上节介绍的内容。\u003c/p\u003e\n\u003cp\u003e在 \u003ccode\u003ekubelet\u003c/code\u003e 启动的时候,会通过三种 pod source 方式来获取 pod 信息:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003efile: 这种方式只要针对 staticPod 来处理,定时观察配置文件是否发生变更情况来写入 pod\u003c/li\u003e\n\u003cli\u003ehttp方式: 就是通过一个http请求一个 URL 地址,用来获取 \u003ccode\u003esimple Pod\u003c/code\u003e 信息\u003c/li\u003e\n\u003cli\u003eclientSet: 这种方式直接与 APIServer 通讯,对 pod 进行watch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e上面这三种 \u003ccode\u003epod source\u003c/code\u003e ,一旦有pod 的变更信息,将直接写入一个 \u003ccode\u003ekubetypes.PodUpdate\u003c/code\u003e 这个 \u003ccode\u003echannel\u003c/code\u003e(参考: \u003ca href=\"https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kubelet.go#L278-L313\"\u003ehttps://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/kubelet/kubelet.go#L278-L313\u003c/a\u003e),然后由下面我们要讲的内容进行读取消费。\u003c/p\u003e\n\u003cp\u003e对于pod 的操作除了这 …\u003c/p\u003e"
June 11, 2023
k8s调度器 kube-scheduler 源码解析
"\u003cp\u003e版本号:v1.27.2\u003c/p\u003e\n\u003cp\u003eKubernetes 调度程序作为一个进程与其他主组件(例如 API 服务器)一起运行。它与 API 服务器的接口是监视具有空 \u003ccode\u003ePodSpec.NodeName\u003c/code\u003e 的 Pod,并且对于每个 Pod,它都会发布一个 \u003ccode\u003eBinding\u003c/code\u003e,指示应将 Pod 调度到哪里。\u003c/p\u003e\n\u003ch1 id=\"调度过程\"\u003e调度过程\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e +-------+\n +---------------+ node 1|\n | +-------+\n |\n +----\u0026gt; | Apply pred. filters\n | |\n | | +-------+\n | +----+----------\u0026gt;+node 2 |\n | | +--+----+\n | watch | |\n | | | …\u003c/code\u003e\u003c/pre\u003e"
May 21, 2023
树莓派安装 kubernetes v1.27.2
"\u003cp\u003eUbuntu 22.04.2 LTS\nARM64位系统\nkubernetes v1.27.2\u003c/p\u003e\n\u003cp\u003e以前写过一篇安装教程 \u003ca href=\"https://blog.haohtml.com/archives/30924\"\u003ehttps://blog.haohtml.com/archives/30924\u003c/a\u003e ,当时安装的版本是 \u003ccode\u003e\u0026lt; v1.24.0\u003c/code\u003e 版本,由于k8s 从 \u003ccode\u003ev1.24.0\u003c/code\u003e 版本开始,弃用了 \u003ccode\u003eDockershim\u003c/code\u003e 因此没有办法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 作为运行时,因此如果还想继续使用旧的运行时的话,则需要安装一个 \u003ccode\u003ecri-docker\u003c/code\u003e 的软件, 本文主要是介绍(版本 \u003ccode\u003e\u0026gt;=v1.24.0\u003c/code\u003e )继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 的安装方法,这里以最新版本 \u003ccode\u003ev1.27.1\u003c/code\u003e 为例。\u003c/p\u003e\n\u003ch2 id=\"安装环境初始化\"\u003e安装环境初始化\u003c/h2\u003e\n\u003cp\u003e以下内容来自: \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\"\u003ehttps://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e执行下述指令:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat \u003cspan style=\"color:#e6db74\"\u003e\u0026lt;\u0026lt;EOF | sudo tee /etc/modules-load.d/k8s.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eoverlay\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003ebr_netfilter\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
February 15, 2023
kubernetes 之 client-go 之 informer 工作原理源码解析
"\u003cp\u003e本文主要介绍有关 \u003ccode\u003eclient go\u003c/code\u003e 架构实现原理,在整个client-go架构中有一个很重要的组件就是 \u003ccode\u003einformer\u003c/code\u003e,本节我们重点对其进行一些介绍。\u003c/p\u003e\n\u003ch1 id=\"informer-机制\"\u003eInformer 机制\u003c/h1\u003e\n\u003cp\u003e采用 k8s HTTP API 可以查询集群中所有的资源对象并 Watch 其变化,但大量的 HTTP 调用会对 API Server 造成较大的负荷,而且网络调用可能存在较大的延迟。除此之外,开发者还需要在程序中处理资源的缓存,HTTP 链接出问题后的重连等。为了解决这些问题并简化 Controller 的开发工作,K8s 在 client go 中提供了一个 \u003ccode\u003einformer\u003c/code\u003e 客户端库,可以视其为一个组件。\u003c/p\u003e\n\u003cp\u003e在 Kubernetes 中,\u003ccode\u003eInformer\u003c/code\u003e 可以用于监视 Kubernetes API 服务器中的资源并将它们的当前状态缓存到本地(\u003ccode\u003eindex -\u0026gt; store)\u003c/code\u003e ,这样就避免了客户端不断地向 API 服务器发送请求,直接从本地即可。\u003c/p\u003e\n\u003cp\u003e相比直接采用 HTTP Watch,使用 Kubernetes Informer 有以下优势:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e减少 API 服务器的负载:通过在本地缓存资源信 …\u003c/li\u003e\u003c/ul\u003e"
October 9, 2021
k8s解决证书过期问题
"\u003cp\u003e在k8s中的时间会提示证书过期问题,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubectl get nodes\nUnable to connect to the server: x509: certificate has expired or is not yet valid\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里我们介绍一下续期方法。\u003c/p\u003e\n\u003cp\u003e注意:当前集群通过 kubeadm 命令创建。\u003c/p\u003e\n\u003cp\u003ekubeadm 安装得证书默认为 1 年,\u003cstrong\u003e注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复\u003c/strong\u003e。\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e这里先查看一下测试集群的证书过期时间\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubeadm certs check-expiration\n[check-expiration] Reading configuration from the cluster...\n[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;\n\nCERTIFICATE …\u003c/code\u003e\u003c/pre\u003e"
August 16, 2021
k8s安装负载均衡器:Metallb
"\u003cp\u003e在使用kubenetes的过程中,如何将服务开放到集群外部访问是一个重要的问题。当使用云平台(阿里云、腾讯云、AWS等)的容器服务时,我们可以通过配置 service 为 \u003cstrong\u003eLoadBalancer\u003c/strong\u003e 模式来绑定云平台的负载均衡器,从而实现外网的访问。但是,如果对于自建的 kubernetes裸机集群,这个问题则要麻烦的多。\u003c/p\u003e\n\u003cp\u003e祼机集群不支持负载均衡的方式,可用的不外乎NodePort、HostNetwork、ExternalIPs等方式来实现外部访问。但这些方式并不完美,他们或多或少都存在的一些缺点,这使得裸机集群成为Kubernetes生态系统中的二等公民。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/metallb/metallb\"\u003eMetalLB\u003c/a\u003e 旨在通过提供与标准网络设备集成的Network LB实施来解决这个痛点,从而使裸机群集上的外部服务也尽可能“正常运行”,减少运维上的管理成本。它是一种纯软件的解决方案,参考 \u003ca href=\"https://kubernetes.github.io/ingress-nginx/deploy/baremetal/\"\u003ehttps://kubernetes.github.io/ingress-nginx/deploy/baremetal/\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e从 v0.13.0 版本开始,官方对解决方案进行了部分调整,操作步骤简洁一些,建议使用最新版本, …\u003c/p\u003e"
July 31, 2021
在linux下安装Kubernetes
"\u003cp\u003e环境 ubuntu18.04 64位\u003c/p\u003e\n\u003cp\u003eKubernetes v1.21.3\u003c/p\u003e\n\u003cp\u003e这里需要注意,本教程安装的k8s版本号 \u003ccode\u003e\u0026lt;- v1.24.0\u003c/code\u003e,主要是因为从v1.24.0以后移除了 \u003ccode\u003eDockershim\u003c/code\u003e,无法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e,后续将默认采用 \u003ca href=\"https://containerd.io/\"\u003econtainerd\u003c/a\u003e ,它是一个从 CNCF 毕业的项目。如果仍想使用原来 \u003ccode\u003eDocker Engine\u003c/code\u003e 的方式可以安装 \u003ca href=\"https://github.com/Mirantis/cri-dockerd\"\u003ecri-dockerd\u003c/a\u003e ,它是 Dockershim 的替代品。\u003c/p\u003e\n\u003cp\u003e如果你想将现在 Docker Engine 的容器更换为 \u003ccode\u003econtainerd\u003c/code\u003e,可以参考官方迁移教程 \u003ca href=\"https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/\"\u003e将节点上的容器运行时从 Docker Engine 改为 containerd\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为了解决国内访问一些国外网站慢的问题,本文使用了国内阿里云的镜像。\u003c/p\u003e\n\u003ch1 id=\"更换apt包源\"\u003e更换apt包源\u003c/h1\u003e\n\u003cp\u003e这里使用aliyun镜像 , 为了安全起见,建议备份原来系统默认的 /etc/apt/sources.list 文件\u003c/p\u003e\n\u003cp\u003e编辑文件 /etc/apt/sources.list,将默认网址 或 替换为\u003c/p\u003e\n\u003cp\u003e更新缓存\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo apt-get clean all\n$ sudo …\u003c/code\u003e\u003c/pre\u003e"
April 29, 2021
初识kubernetes 组件
"\u003cp\u003e对于一个刚刚接触 kubernetes(k8s)的新手来说,想好更好的学习它,首先就要对它有一个大概的认知,所以本文我们先以全局观来介绍一个 kubernetes。\u003c/p\u003e\n\u003ch2 id=\"kubernetes-架构-8ee9f2fa987eccb490cfaa91c6484f67kubernetes-架构图\"\u003ekubernetes 架构 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/56aec9997240192091adad3e14358736-52.png\" alt=\"8ee9f2fa987eccb490cfaa91c6484f67\"\u003ekubernetes 架构图\u003c/h2\u003e\n\u003cp\u003ekubernets 整体可以分为两大部分,分别为 \u003ccode\u003eMaster\u003c/code\u003e 和 \u003ccode\u003eNode\u003c/code\u003e ,我们一般称其为节点,这两种角色分别对应着控制节点和计算节点,根据我们的经验可以清楚的知道 Master 是控制节点。\u003c/p\u003e\n\u003ch2 id=\"master-节点\"\u003eMaster 节点\u003c/h2\u003e\n\u003cp\u003e控制节点 \u003ccode\u003eMaster\u003c/code\u003e 节点由三部分组成,分别为 \u003ccode\u003eController Manager\u003c/code\u003e 、 \u003ccode\u003eAPI Server\u003c/code\u003e 和 \u003ccode\u003eScheduler\u003c/code\u003e ,它们相互紧密协作,每个部分负责不同的工作职责。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtroller-manager\u003c/code\u003e 全称为 kube-controler-manager 组件,主要用来负责容器编排。如一个容器(实际上是 pod,pod 是最基本的调度单元。一般一个 pod 里会部署一个容器服务)服务可以指定副本数量,如果实际运行的副本数据与期望的不一致,则会自动再启动几个容器副本,最终实现期望的数量。这个组件,就是一系列控制器的集合。我们可以 …\u003c/li\u003e\u003c/ul\u003e"
March 28, 2020
k8s中的Service与Ingress
"\u003cp\u003e集群中的服务要想向外提供服务,就不得不提到Service和Ingress。 下面我们就介绍一下两者的区别和关系。\u003c/p\u003e\n\u003ch1 id=\"service\"\u003eService\u003c/h1\u003e\n\u003cp\u003e必须了解的一点是对 Service 的访问只有在 Kubernetes 集群内有效,而在集群之外是无效的。\u003c/p\u003e\n\u003cp\u003eService可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。对于Service 的工作原理请参考\u003c/p\u003e\n\u003cp\u003e当需要从集群外部访问k8s里的服务的时候,方式有四种:\u003ccode\u003eClusterIP\u003c/code\u003e(默认)、\u003ccode\u003eNodePort\u003c/code\u003e、\u003ccode\u003eLoadBalancer\u003c/code\u003e、\u003ccode\u003eExternalName\u003c/code\u003e 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下面我们介绍一下这几种方式的区别\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"一clusterip\"\u003e\u003cstrong\u003e一、ClusterIP\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e该方式是指通过集群的内部 IP 暴露服务,但此服务只能够在集群内部可以访问,这种方式也是默认的 ServiceType。\u003c/p\u003e\n\u003cp\u003e我们先看一下最简单的Service定义\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapiVersion: v1\nkind: Service\nmetadata:\n name: hostnames\nspec:\n selector:\n app: hostnames\n ports:\n - name: …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2020
mac下利用minikube安装Kubernetes环境
"\u003cp\u003e本机为mac环境,安装有brew工具,所以为了方便这里直接使用brew来安装minikube工具。同时本机已经安装过VirtualBox虚拟机软件。\u003c/p\u003e\n\u003cp\u003eminikube是一款专门用来创建k8s 集群的工具。\u003c/p\u003e\n\u003ch2 id=\"一安装minikube\"\u003e一、安装minikube\u003c/h2\u003e\n\u003cp\u003e参考 , 在安装minkube之前建议先了解一下minikube需要的环境。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先安装一个虚拟化管理系统,如果还未安装,则在 HyperKit、VirtualBox 或 VMware Fusion 三个中任选一个即可,这里我选择了VirtualBox。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如果你想使用hyperkit的话,可以直接执行 \u003cstrong\u003ebrew install hyperkit\u003c/strong\u003e 即可。\u003c/p\u003e\n\u003cp\u003e对于支持的driver_name有效值参考, 目前\u003cstrong\u003edocker\u003c/strong\u003e尚处于实现阶段。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install minikube\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看版本号\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ minikube version\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eminikube version: v1.8.2\ncommit: eb13446e786c9ef70cb0a9f85a633194e62396a1\u003c/p\u003e\n\u003cp\u003e安装kubectl命令行工具\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install kubectl\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"二启动minikube-创建集群\"\u003e二、启 …\u003c/h2\u003e"
July 29, 2019
kubernetes dashboard向外网提供服务
"\u003cp\u003e目前新版本的 kubernetes dashboard ()安装了后,为了安全起见,默认情况下已经不向外提供服务,只能通过 \u003ca href=\"http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\"\u003e\u003ccode\u003ehttp://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\u003c/code\u003e\u003c/a\u003e 本机访问。在我们学习过程中,总有些不方便,这时我们可以利用 \u003ccode\u003ekubectl proxy\u003c/code\u003e 命令来实现。\u003c/p\u003e\n\u003cp\u003e首先我们看一下此命令的一些想着参数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜ ~ kubectl proxy -h\nTo proxy all of the kubernetes api and nothing else, use:\n\n $ kubectl proxy --api-prefix=/\n\nTo proxy only part of the kubernetes api and also some static files:\n\n $ kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/\n\nThe above …\u003c/code\u003e\u003c/pre\u003e"
October 11, 2018
Kubernetes学习资源
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/1f57f5934f4db11b6e9e473ffd043b03.jpeg\" alt=\"\"\u003ek8s guide\u003c/p\u003e\n\u003ch2 id=\"准备\"\u003e准备\u003c/h2\u003e\n\u003cp\u003e对于一个新手来说,第一步是必须了解什么是 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/\"\u003ekubernetees\u003c/a\u003e、 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/architecture/\"\u003e设计架构\u003c/a\u003e 和相关 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/\"\u003e概念\u003c/a\u003e。只有在了解了这些的情况下,才能更好的知道k8s中每个组件的作用以及它解决的问题。\u003c/p\u003e\n\u003ch2 id=\"安装工具\"\u003e安装工具\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://minikube.sigs.k8s.io/\"\u003eminikube\u003c/a\u003e 参考 \u003ca href=\"https://minikube.sigs.k8s.io/docs/start/\"\u003ehttps://minikube.sigs.k8s.io/docs/start/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://kind.sigs.k8s.io/docs/\"\u003ekind\u003c/a\u003e 参考 \u003ca href=\"https://kind.sigs.k8s.io/docs/user/quick-start/\"\u003ehttps://kind.sigs.k8s.io/docs/user/quick-start/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以上是安装k8s环境的两种推荐方法,这里更推荐使用kind。主要原因是 \u003ccode\u003eminikube\u003c/code\u003e 只支持单个节点,而 \u003ccode\u003ekind\u003c/code\u003e 可以支持多个节点,这样就可以实现在一台电脑上部署的环境与生产环境一样,方便大家学习。\u003c/p\u003e\n\u003cp\u003e要实现管理控制 Kubernetes 集群资源如pod、node、service等的管理,还必须安装一个命令工具 \u003ca href=\"https://kubernetes.io/zh/docs/reference/kubectl/kubectl/\"\u003ekubectl\u003c/a\u003e ,请参考: \u003ca href=\"https://kubernetes.io/zh/docs/tasks/tools/\"\u003ehttps://kubernetes.io/zh/docs/tasks/tools/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"学习文档\"\u003e学习文档\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eKubernetes 文档 \u003ca href=\"https://kubernetes.io/zh/docs/home/\"\u003ehttps://kubernetes.io/zh/docs/home/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlay with …\u003c/li\u003e\u003c/ul\u003e"