无损滚动更新机制

想要进行无损滚动更新需要保证一下3点 应用支持优雅退出(收到退出信号时不接收新请求并且要处理完已经接收到的请求) k8s正确配置readnessProbe就绪探针 添加生命周期函数preStop添加一定的延时, 比如preStop.exec.commend: ["/bin/sh", “-c”, “sleep 10”] 主要原因为Kubernetes 在终止 Pod 时的操作顺序是 标记 Pod 为 Terminating 状态:当 Kubernetes 接收到删除 Pod 的请求时,它会将 Pod 的状态设置为 Terminating 执行 preStop 钩子:如果 Pod 定义了 preStop 钩子,Kubernetes 会立即同步执行这个钩子 并行更新 Endpoint:在 Kubernetes 标记 Pod 为 Terminating 状态的同时,Endpoint Controller 会异步地从相关的服务端点(endpoints)中移除该 Pod 的 IP 地址。Kube-proxy 也会开始更新其网络规则,以停止向该 Pod 转发流量 发送 SIGTERM 信号:一旦 preStop 钩子完成,Kubernetes 会向 Pod 中的容器发送 SIGTERM 信号,告诉容器开始优雅地关闭 等待或强制终止:如果容器在终止宽限期(terminationGracePeriodSeconds)内没有关闭,Kubernetes 会发送 SIGKILL 信号强制终止容器。 注: 关于endpoint已经iptables或者ipvs的操作是kube-porxy的操作 关于pod停止和生命周期是kubelet的操作 所以会出现下面的问题(网络操作和pod生命周期是异步的) 添加延迟的原因主要是preStop和更新endpoint是异步进行,如果没有设置preStop就会出现修改endpoint和发送SIGTERM异步进行, 当应用收到SIGTERM时就不会接收新请求处理完老请求后退出,但是此时endpoint还有可能没有修改完成,就会导致一部分请求流入了即将退出的pod,而且无法响应请求,这时候这部分请求就会损失 ...

<span title='2024-09-11 15:44:16 +0800 +0800'>九月 11, 2024</span>

service中的几种port的区别

port : service暴露的端口,可以在集群内进行访问 nodePort : 可以在集群外访问service的端口 targetPort : pod内的container暴露的端口 一张图来理解

<span title='2023-05-22 15:00:31 +0800 +0800'>五月 22, 2023</span>

k8s 几种探针作用和用法

在 Kubernetes 中,探针(probes)是一种机制,用于检查容器是否处于正常状态以及容器是否可以接收流量。 Kubernetes 提供了三种类型的探针:存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。 以下是这三种探针的作用和用法: 存活探针(Liveness Probe) 作用:检查容器中的进程是否仍在运行。如果进程崩溃或停止响应,Kubernetes 将重启容器。 用法:建议在容器的生命周期中始终使用存活探针,以确保容器的可靠性。例如,可以配置一个存活探针来检查容器中的进程是否响应 HTTP 请求或 ping 命令。 示例 YAML 配置: livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 10 该配置文件指示 Kubernetes 发送一个 HTTP GET 请求到容器的 /healthz 路径,并在容器启动后的 5 秒后开始检查容器的运行状况。检查频率为每隔 10 秒发送一次。 就绪探针(Readiness Probe) 作用:检查容器是否准备好接收流量。如果容器尚未准备好接收流量,则 Kubernetes 将不会将流量发送到容器。 用法:建议在容器需要一些额外的时间来启动的情况下使用就绪探针。例如,可以配置一个就绪探针来检查容器是否存在必需的文件或数据库连接。 示例 YAML 配置: readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 该配置文件指示 Kubernetes 检查容器是否可以在 8080 端口接收 TCP 连接,并在容器启动后的 5 秒后开始检查容器的运行状况。检查频率为每隔 10 秒发送一次。 启动探针(Startup Probe) 作用:检查容器内部应用程序是否已经启动,成功后会运行存活和就绪探针。与存活探针和就绪探针不同,它们在容器启动时运行,并在容器启动完成后禁用。 用法:建议在容器启动时需要启动较长时间的应用程序时使用启动探针。例如,可以配置一个启动探针来检查容器中的某个进程或 Web 服务器是否已经启动。 ...

<span title='2023-05-12 11:03:18 +0800 +0800'>五月 12, 2023</span>

Swap开启和关闭

树莓派 /etc/dphys-swapfile 是 Raspberry Pi 上的一个文件,用于控制swap文件的设置和使用。该文件用于设置swap文件的大小、位置以及启用和禁用swap。 在 Raspberry Pi 上,如果想要使用swap文件,可以通过以下步骤配置和使用swap文件: 安装 dphys-swapfile 包,使用命令: sudo apt-get update sudo apt-get install dphys-swapfile 打开 /etc/dphys-swapfile 文件,配置swap文件的大小和位置。例如,将以下行: CONF_SWAPSIZE=100 #修改为0可关闭swap CONF_SWAPFILE=/var/swap 启用 sudo dphys-swapfile setup sudo dphys-swapfile swapon 禁用 sudo dphys-swapfile swapoff 其他linux 在Linux中,可以通过以下步骤关闭swap: 查看当前的swap情况,使用命令: swapon -s 如果没有任何输出,则说明当前系统没有启用swap。 如果系统启用了swap,需要先关闭swap,使用命令: swapoff -a 执行此命令会关闭所有swap分区。 临时禁用swap,使用命令: echo 0 > /proc/sys/vm/swappiness 执行此命令可以临时禁用swap,即使系统启用了swap,也不会自动将数据交换到swap分区。 永久禁用swap,可以修改/etc/fstab文件,注释掉swap分区的行,或者直接删除swap分区的行。例如,将以下行: #/dev/sda2 swap swap defaults 0 0

<span title='2023-02-23 15:37:31 +0800 +0800'>二月 23, 2023</span>

树莓派安装k8s

本地系统为树莓派官方64位系统 Raspberry Pi OS Lite 64(Debian GNU/Linux 11) 在master和node都需要执行的步骤 本机cgroup配置 在执行kubeadm init 时出现 missing required cgroup: memory时,可以在/boot/cmdline.txt(有的系统可能在/boot/firmware/cmdline.txt)中追加 cgroup_enable=memory cgroup_memory=1 cgroup_enable=memory: 启用Cgroup子系统中的内存控制 cgroup_memory=1: 将内存控制子系统的版本设置为1 在某些特定的发行版中,可能会出于兼容性或其他原因而禁用了Cgroup子系统中的内存控制功能,所以需要手动开启 关闭swap 网上很多教程通过编辑/etc/fstab编辑swap, 但是在树莓派系统中,并不使用fstab配置,正确的做法是 编辑/etc/dphys-swapfile 找到配置项CONF_SWAPSIZE (通过名称我们可以知道该配置项为swap大小)该值配置为0 使配置生效 sudo /etc/init.d/dphys-swapfile restart 或者 sudo reboot 重启 通过free -h命令查看swap大小 系统模块加载 # 必要的模块加载 # overlay 文件系统 # br_netfilter 网桥网络包过滤 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF # 这个命令会将 "overlay" 和 "br_netfilter" 内核模块的名称添加到 /etc/modules-load.d/k8s.conf 文件中,以便在系统启动时自动加载这些模块 sudo modprobe overlay sudo modprobe br_netfilter # sudo modprobe overlay:加载 overlay 的内核模块,该模块提供了用于 overlayfs 的文件系统类型。在使用容器化技术如 Docker 时,通常需要使用 overlayfs 进行容器镜像的存储和管理。因此,在启用容器化环境时,需要确保该模块已加载。 # sudo modprobe br_netfilter:加载 br_netfilter 的内核模块,该模块提供了用于 Linux 桥接网络的过滤和 NAT 功能。在使用 Kubernetes 集群时,通常需要将容器内部的网络流量转发到主机上的网络设备,以实现容器与外部网络的通信。因此,在启用 Kubernetes 集群时,需要确保该模块已加载。 # 开启转发和流量可观测(开机启动) # sysctl params required by setup, params persist across reboots # bridge-nf-call-iptables 让ip表可以看到桥接流量 # bridge-nf-call-ip6tables 让ip6表可以看到桥接流量 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 这个命令的作用是将其写入 /etc/sysctl.d/k8s.conf 文件中。在系统启动时,这些参数就会被自动设置。 # net.bridge.bridge-nf-call-iptables: 设置为 1,表示将 Linux 桥接网络中的 IP 数据包转发给 iptables 进行过滤。在使用 Kubernetes 时,需要启用此功能以实现网络策略等功能。 # net.bridge.bridge-nf-call-ip6tables: 设置为 1,表示将 Linux 桥接网络中的 IPv6 数据包转发给 ip6tables 进行过滤。 # net.ipv4.ip_forward: 设置为 1,表示启用 IPv4 数据包的转发功能。在使用 Kubernetes 时,需要启用此功能以实现跨节点的容器网络互通。 # Apply sysctl params without reboot(不用开机立刻生效) sudo sysctl --system CRI安装 根据官方文档配置环境doc ...

<span title='2022-10-05 20:49:13 +0800 +0800'>十月 5, 2022</span>