当前位置: 首页 > news >正文

平安车险官方保险网站wordpress4.7.0下载

平安车险官方保险网站,wordpress4.7.0下载,国家信用信息公示系统查询入口,云南做网站公司本文目录 二进制安装Kubernetes#xff08;k8s#xff09;v1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它#xff08;以ens33为例#xff09;方法一#xff1a;修改网卡配置方法二#xff1a;重新安装机器(本文为虚拟机) 2.克隆的虚拟机#xff0c… 本文目录 二进制安装Kubernetesk8sv1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它以ens33为例方法一修改网卡配置方法二重新安装机器(本文为虚拟机) 2.克隆的虚拟机修改UUID保证k8s集群每台机器UUID唯一 1.1.k8s基础系统环境配置1.配置IP2.设置主机名3.配置yum源4.安装一些必备工具4.1 下载离线所需文件(可选)CentOS7CentOS8Ubuntu 下载包和依赖 5.选择性下载需要工具(可选)6.关闭防火墙7.关闭SELinux8.关闭交换分区9.网络配置俩种方式二选一10.进行时间同步11.配置ulimit12.配置免密登录13.添加启用源14.升级内核至4.18版本以上15.安装ipvsadm16.修改内核参数17.所有节点配置hosts本地解析 2.k8s基本组件安装2.1.安装Containerd作为Runtime 推荐2.1.1 配置Containerd所需的模块2.1.2 加载模块2.1.3 配置Containerd所需的内核2.1.4 创建Containerd的配置文件2.1.5 启动并设置为开机启动2.1.6 配置crictl客户端连接的运行时位置 2.2 安装docker作为Runtime 不推荐2.2.1 解压docker程序2.2.2 创建containerd的service文件2.2.3 准备docker的service文件2.2.4 准备docker的socket文件2.2.5 配置加速器2.2.6 启动docker2.2.7 解压cri-docker2.2.8 写入启动cri-docker配置文件2.2.9 写入cri-docker的socket配置文件2.2.10 启动cri-docker 2.3.k8s与etcd下载及安装仅在master01操作2.3.1 解压k8s安装包2.3.2 查看版本2.3.3 将组件发送至其他k8s节点 2.3 创建证书相关文件(获取打包后文件的tar包) 3.相关证书生成3.1.生成etcd证书3.1.1 所有master节点创建证书存放目录3.1.2 master01节点生成etcd证书3.1.3 将证书复制到其他节点 3.2.生成k8s相关证书3.2.1 所有k8s节点(masterslave节点)创建证书存放目录3.2.2 master01节点生成k8s证书3.2.3 master01节点生成apiserver聚合证书3.2.4 master01节点生成controller-manage的证书3.2.5 master01节点生成kube-scheduler的证书3.2.6 master01节点生成admin的证书配置3.2.7 master01节点创建kube-proxy证书3.2.8 master01节点创建ServiceAccount Key ——secret3.2.9 将证书发送到其他master节点3.2.10 查看证书 4.k8s系统组件配置4.1.etcd配置4.1.1 master01配置4.1.2 master02配置4.1.3 master03配置 4.2.创建service4.2.1 创建etcd.service并启动4.2.2 创建etcd证书目录4.2.3 查看etcd状态 5.高可用配置5.1 NGINX高可用方案 (推荐)5.1.1 master01节点进行编译5.1.2 写入启动配置 5.2 keepalived和haproxy 高可用方案 (不推荐)5.2.1 安装keepalived和haproxy服务5.2.2 修改haproxy配置文件配置文件一样5.2.3 Master01配置keepalived master节点5.2.4 Master02配置keepalived backup节点5.2.5 Master03配置keepalived backup节点5.2.6 健康检查脚本配置lb主机5.2.7 启动服务5.2.8 测试高可用 6.k8s组件配置6.1.创建apiserver所有master节点6.1.1 master01节点配置6.1.2 master02节点配置6.1.3 master03节点配置6.1.4 启动apiserver所有master节点 6.2.配置kube-controller-manager service所有master节点6.2.1 启动kube-controller-manager并查看状态 6.3.配置kube-scheduler service所有master节点6.3.1 所有master节点配置且配置相同6.3.2 启动并查看服务状态 7.TLS Bootstrapping配置7.1 在master01上配置7.2 编写bootstrap.secret.yaml7.3 查看集群状态没问题的话继续后续操作 8.node节点配置8.1.在master01上将证书复制到其他节点8.2.kubelet配置8.2.1 当使用docker作为Runtime不推荐8.2.2 当使用Containerd作为Runtime 推荐8.2.3 所有k8s节点创建kubelet的配置文件8.2.4 启动kubelet8.2.5 查看集群8.2.6 查看容器运行时 8.3.kube-proxy配置8.3.1 将kubeconfig发送至其他节点8.3.2 所有k8s节点添加kube-proxy的service文件8.3.3 所有k8s节点添加kube-proxy的配置8.3.4 启动kube-proxy 9.安装网络插件9.0安装docker9.1 安装Calico推荐9.1.1 更改calico网段9.1.2 查看容器状态 9.2 安装cilium不推荐9.2.1 安装helm9.2.2 安装cilium9.2.3 查看9.2.4 下载专属监控面板9.2.5 下载部署测试用例9.2.6 查看pod9.2.7 修改为NodePort9.2.8 查看端口9.2.9 访问 10.安装CoreDNS10.1以下步骤只在master01操作10.1.1 修改文件 11.安装Metrics Server11.1 以下步骤只在master01操作11.1.1 安装Metrics-server11.1.2 稍等片刻查看状态 12.集群验证12.1 部署pod资源12.2 用pod解析默认命名空间中的kubernetes12.3 测试跨命名空间是否可以解析12.4 每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 5312.5 Pod和Pod之前要能通12.6 创建三个副本可以看到3个副本分布在不同的节点上用完可以删了 13.安装dashboard13.1更改dashboard的svc为NodePort如果已是请忽略13.2 修改yml中的dashboard镜像地址13.3 应用启动dashboard13.4 查看端口号13.5 创建token13.6 登录dashboard 14.ingress安装14.1 执行部署14.2 过滤查看ingress端口 15.IPv6测试16.安装命令行自动补全功能附录可选 二进制安装Kubernetesk8sv1.28.0 二进制安装比较复杂但是也比较稳定适用于线上环境使用。 本笔记参考自https://github.com/cby-chen/Kubernetes 针对文中内容有部分镜像无法拉取等还有一部分有点小问题自己有做一些小的提示、修改。建议参考本文安装即可。 介绍 kubernetesk8s二进制高可用安装部署支持IPv4IPv6双栈。 我使用IPV6的目的是在公网进行访问所以我配置了IPV6静态地址。 若您没有IPV6环境或者不想使用IPv6不对主机进行配置IPv6地址即可。 不配置IPV6不影响后续不过集群依旧是支持IPv6的。为后期留有扩展可能性。 若不要IPv6 不给网卡配置IPv6即可不要对IPv6相关配置删除或操作否则会出问题。 我安装的时候未进行IPV6网络的配置按照本文步骤可以正常完成 k8s 1.28 版本的安装教程可正常使用。如有其他问题出现请自行排查解决。我使用的版本是 CentOS 7.9 1.环境 主机名称IP地址说明软件192.168.1.60外网节点下载各种所需安装包Master01192.168.0.31master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxMaster02192.168.0.32master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxMaster03192.168.0.33master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxNode01192.168.0.34node节点kubelet、kube-proxy、nfs-client、nginxNode02192.168.0.35node节点kubelet、kube-proxy、nfs-client、nginx192.168.0.36VIP 网段 物理主机192.168.0.0/24 service10.96.0.0/12 pod172.16.0.0/12 Github博主的安装包https://ghproxy.com/https://github.com/cby-chen/Kubernetes/releases/download/v1.28.0/kubernetes-v1.28.0.tar 我自己准备的安装包https://pan.baidu.com/s/1qKe3Sj97WQI8gJp1Cx8Ipg?pwd4wbd 1.0.环境准备 1.Linux网卡没有eth0显示ens33或者其它以ens33为例 方法一修改网卡配置 1.使用命令 ip addr 查看 linux 是否有 eth0 网卡 2.vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的 NAME 和 DEVICE 项修改为 eth0ONBOOT需修改为yes 3.重命名网卡名称 cd /etc/sysconfig/network-scripts/ mv ifcfg-ens33 ifcfg-eth0 4.编辑 /etc/default/grub加入net.ifnames0 biosdevname0 到 GRUB_CMALINE_LINUX 变量中注意空格别遗漏 5.执行命令 grub2-mkconfig -o /boot/grub2/grub.cfg 重新生成GRUB配置并更新内核参数 6.执行命令reboot 重启系统 7.使用命令 ip addr 查看 eth0 网卡是否已经变更成功 方法二重新安装机器(本文为虚拟机) 安装系统时直接指定网卡名为 eth0     进入安装界面的时候选中第一个 Install CentOS 7。按下 Tab 键。敲空格让光标回到第二行。 输入 net.ifnames0 空格 biosdevname0 然后按回车就行。 中间要有空格哦 2.克隆的虚拟机修改UUID保证k8s集群每台机器UUID唯一 在每一台节点上执行如下操作 1.执行命令 uuidgen eth0 生成一个 UUID 2.执行命令 vi /etc/sysconfig/network-scripts/ifcfg-eth0 将UUID修改为新生成的 3.执行命令 service network restart重启网络 4.执行命令 nmcli con show查看UUID是否配置生效 1.1.k8s基础系统环境配置 1.1 步骤中的17步操作均在所有节点执行 1.配置IP 根据自身情况设定IP/UUID/eth0设定没问题了的话此步可忽略 # 注意 # 若虚拟机是进行克隆的那么网卡的UUID会重复 # 若UUID重复需要重新生成新的UUID # UUID重复无法获取到IPV6地址 # # 查看当前的网卡列表和 UUID # nmcli con show # 删除要更改 UUID 的网络连接 # nmcli con delete uuid 原 UUID # 重新生成 UUID # nmcli con add type ethernet ifname 接口名称 con-name 新名称 # 重新启用网络连接 # nmcli con up 新名称# 更改网卡的UUID ssh root192.168.0.31 nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0 ssh root192.168.0.32 nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0 ssh root192.168.0.33 nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0 ssh root192.168.0.34 nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0 ssh root192.168.0.35 nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0# 参数解释 # # ssh ssh root192.168.0.31 # 使用SSH登录到IP为192.168.0.31的主机使用root用户身份。 # # nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44 # 删除 UUID 为 708a1497-2192-43a5-9f03-2ab936fb3c44 的网络连接这是 NetworkManager 中一种特定网络配置的唯一标识符。 # # nmcli con add type ethernet ifname eth0 con-name eth0 # 添加一种以太网连接类型并指定接口名为 eth0连接名称也为 eth0。 # # nmcli con up eth0 # 开启 eth0 这个网络连接。 # # 简单来说这个命令的作用是删除一个特定的网络连接配置并添加一个名为 eth0 的以太网连接然后启用这个新的连接。# 修改静态的IPv4地址 ssh root192.168.0.31 nmcli con mod eth0 ipv4.addresses 192.168.0.31/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns 8.8.8.8; nmcli con up eth0 ssh root192.168.0.32 nmcli con mod eth0 ipv4.addresses 192.168.0.32/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns 8.8.8.8; nmcli con up eth0 ssh root192.168.0.33 nmcli con mod eth0 ipv4.addresses 192.168.0.33/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns 8.8.8.8; nmcli con up eth0 ssh root192.168.0.34 nmcli con mod eth0 ipv4.addresses 192.168.0.34/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns 8.8.8.8; nmcli con up eth0 ssh root192.168.0.35 nmcli con mod eth0 ipv4.addresses 192.168.0.35/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns 8.8.8.8; nmcli con up eth0# 参数解释 # # ssh root192.168.0.154 # 使用SSH登录到IP为192.168.0.154的主机使用root用户身份。 # # nmcli con mod eth0 ipv4.addresses 192.168.0.31/24 # 修改eth0网络连接的IPv4地址为192.168.0.31子网掩码为 24。 # # nmcli con mod eth0 ipv4.gateway 192.168.0.1 # 修改eth0网络连接的IPv4网关为192.168.0.1。 # # nmcli con mod eth0 ipv4.method manual # 将eth0网络连接的IPv4配置方法设置为手动。 # # nmcli con mod eth0 ipv4.dns 8.8.8.8 # 将eth0网络连接的IPv4 DNS服务器设置为 8.8.8.8。 # # nmcli con up eth0 # 启动eth0网络连接。 # # 总体来说这条命令是通过SSH远程登录到指定的主机并使用网络管理命令 (nmcli) 修改eth0网络连接的配置包括IP地址、网关、配置方法和DNS服务器并启动该网络连接。# 没有IPv6选择不配置即可 ssh root192.168.0.31 nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::10; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns 2400:3200::1; nmcli con up eth0 ssh root192.168.0.32 nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::20; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns 2400:3200::1; nmcli con up eth0 ssh root192.168.0.33 nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::30; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns 2400:3200::1; nmcli con up eth0 ssh root192.168.0.34 nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::40; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns 2400:3200::1; nmcli con up eth0 ssh root192.168.0.35 nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::50; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns 2400:3200::1; nmcli con up eth0# 参数解释 # # ssh root192.168.0.31 # 通过SSH连接到IP地址为192.168.0.31的远程主机使用root用户进行登录。 # # nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::10 # 使用nmcli命令修改eth0接口的IPv6地址为fc00:43f4:1eea:1::10。 # # nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1 # 使用nmcli命令修改eth0接口的IPv6网关为fc00:43f4:1eea:1::1。 # # nmcli con mod eth0 ipv6.method manual # 使用nmcli命令将eth0接口的IPv6配置方法修改为手动配置。 # # nmcli con mod eth0 ipv6.dns 2400:3200::1 # 使用nmcli命令设置eth0接口的IPv6 DNS服务器为2400:3200::1。 # # nmcli con up eth0 # 使用nmcli命令启动eth0接口。 # # 这个命令的目的是在远程主机上配置eth0接口的IPv6地址、网关、配置方法和DNS服务器并启动eth0接口。# 查看网卡配置 # nmcli device show eth0 # nmcli con show eth0 [rootlocalhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOnone DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFno IPV6_DEFROUTEyes IPV6_FAILURE_FATALno IPV6_ADDR_GEN_MODEstable-privacy NAMEeth0 UUID424fd260-c480-4899-97e6-6fc9722031e8 DEVICEeth0 ONBOOTyes IPADDR192.168.0.31 PREFIX24 GATEWAY192.168.8.1 DNS18.8.8.8 IPV6ADDRfc00:43f4:1eea:1::10/128 IPV6_DEFAULTGWfc00:43f4:1eea:1::1 DNS22400:3200::1 [rootlocalhost ~]# # 参数解释 # # TYPEEthernet # 指定连接类型为以太网。 # # PROXY_METHODnone # 指定不使用代理方法。 # # BROWSER_ONLYno # 指定不仅仅在浏览器中使用代理。 # # BOOTPROTOnone # 指定自动分配地址的方式为无即手动配置IP地址。 # # DEFROUTEyes # 指定默认路由开启。 # # IPV4_FAILURE_FATALno # 指定IPv4连接失败时不宣告严重错误。 # # IPV6INITyes # 指定启用IPv6。 # # IPV6_AUTOCONFno # 指定不自动配置IPv6地址。 # # IPV6_DEFROUTEyes # 指定默认IPv6路由开启。 # # IPV6_FAILURE_FATALno # 指定IPv6连接失败时不宣告严重错误。 # # IPV6_ADDR_GEN_MODEstable-privacy # 指定IPv6地址生成模式为稳定隐私模式。 # # NAMEeth0 # 指定设备名称为eth0。 # # UUID424fd260-c480-4899-97e6-6fc9722031e8 # 指定设备的唯一标识符。 # # DEVICEeth0 # 指定设备名称为eth0。 # # ONBOOTyes # 指定开机自动启用这个连接。 # # IPADDR192.168.0.31 # 指定IPv4地址为192.168.0.31。 # # PREFIX24 # 指定IPv4地址的子网掩码为24。 # # GATEWAY192.168.8.1 # 指定IPv4的网关地址为192.168.8.1。 # # DNS18.8.8.8 # 指定首选DNS服务器为8.8.8.8。 # # IPV6ADDRfc00:43f4:1eea:1::10/128 # 指定IPv6地址为fc00:43f4:1eea:1::10子网掩码为128。 # # IPV6_DEFAULTGWfc00:43f4:1eea:1::1 # 指定IPv6的默认网关地址为fc00:43f4:1eea:1::1。 # # DNS22400:3200::1 # 指定备用DNS服务器为2400:3200::1。2.设置主机名 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-master02 hostnamectl set-hostname k8s-master03 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02# 参数解释 # # 参数: set-hostname # 解释: 这是hostnamectl命令的一个参数用于设置系统的主机名。 # # 参数: k8s-master01 # 解释: 这是要设置的主机名将系统的主机名设置为k8s-master01。3.配置yum源 # 其他系统的源地址 # https://mirrors.tuna.tsinghua.edu.cn/help/# 对于 Ubuntu sed -i s/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list# 对于 CentOS 7 sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/centos|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo# 对于 CentOS 8 sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/$contentdir|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo# 对于私有仓库 sed -e s|^mirrorlist|#mirrorlist|g -e s|^#baseurlhttp://mirror.centos.org/\$contentdir|baseurlhttp://192.168.1.123/centos|g -i.bak /etc/yum.repos.d/CentOS-*.repo# 参数解释 # # 以上命令是用于更改系统软件源的配置以便从国内镜像站点下载软件包和更新。 # # 对于 Ubuntu 系统将 /etc/apt/sources.list 文件中的软件源地址 cn.archive.ubuntu.com 替换为 mirrors.ustc.edu.cn。 # # 对于 CentOS 7 系统将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉并将 baseurl 的值替换为 https://mirrors.tuna.tsinghua.edu.cn/centos。 # # 对于 CentOS 8 系统同样将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉并将 baseurl 的值替换为 https://mirrors.tuna.tsinghua.edu.cn/centos。 # # 对于私有仓库将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉并将 baseurl 的值替换为私有仓库地址 http://192.168.1.123/centos。 # # 这些命令通过使用 sed 工具和正则表达式对相应的配置文件进行批量的替换操作从而更改系统软件源配置。4.安装一些必备工具 # 对于 Ubuntu apt update apt upgrade -y apt install -y wget psmisc vim net-tools nfs-kernel-server telnet lvm2 git tar curl# 对于 CentOS 7 yum update -y yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl# 对于 CentOS 8 yum update -y yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl4.1 下载离线所需文件(可选) 在互联网服务器上安装一个一模一样的系统进行下载所需包 CentOS7 # 下载必要工具 yum -y install createrepo yum-utils wget epel*# 下载全量依赖包 repotrack createrepo wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp# 删除libseccomp rm -rf libseccomp-*.rpm# 下载libseccomp wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm# 创建yum源信息 createrepo -u -d /data/centos7/# 拷贝包到内网机器上 scp -r /data/centos7/ root192.168.0.31: scp -r /data/centos7/ root192.168.0.32: scp -r /data/centos7/ root192.168.0.33: scp -r /data/centos7/ root192.168.0.34: scp -r /data/centos7/ root192.168.0.35:# 在内网机器上创建repo配置文件 rm -rf /etc/yum.repos.d/* cat /etc/yum.repos.d/123.repo EOF [cby] nameCentOS-$releasever - Media baseurlfile:///root/centos7/ gpgcheck0 enabled1 EOF# 安装下载好的包 yum clean all yum makecache yum install /root/centos7/* --skip-broken -y#### 备注 ##### # 安装完成后可能还会出现yum无法使用那么再次执行 rm -rf /etc/yum.repos.d/* cat /etc/yum.repos.d/123.repo EOF [cby] nameCentOS-$releasever - Media baseurlfile:///root/centos7/ gpgcheck0 enabled1 EOF yum clean all yum makecache yum install /root/centos7/* --skip-broken -y#### 备注 ##### # 安装 chrony 和 libseccomp # yum install /root/centos7/libseccomp-2.5.1*.rpm -y # yum install /root/centos7/chrony-*.rpm -yCentOS8 # 下载必要工具 yum -y install createrepo yum-utils wget epel*# 下载全量依赖包 repotrack wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp# 创建yum源信息 createrepo -u -d /data/centos8/# 拷贝包到内网机器上 scp -r centos8/ root192.168.0.31: scp -r centos8/ root192.168.0.32: scp -r centos8/ root192.168.0.33: scp -r centos8/ root192.168.0.34: scp -r centos8/ root192.168.0.35:# 在内网机器上创建repo配置文件 rm -rf /etc/yum.repos.d/* cat /etc/yum.repos.d/123.repo EOF [cby] nameCentOS-$releasever - Media baseurlfile:///root/centos8/ gpgcheck0 enabled1 EOF# 安装下载好的包 yum clean all yum makecache yum install /root/centos8/* --skip-broken -y#### 备注 ##### # 安装完成后可能还会出现yum无法使用那么再次执行 rm -rf /etc/yum.repos.d/* cat /etc/yum.repos.d/123.repo EOF [cby] nameCentOS-$releasever - Media baseurlfile:///root/centos8/ gpgcheck0 enabled1 EOFyum clean all yum makecache yum install /root/centos8/* --skip-broken -yUbuntu 下载包和依赖 #!/bin/bashlogfile123.log ret function getDepends() {echo fileName is $1$logfile# use tr to del retapt-cache depends $1|grep Depends |cut -d: -f2 |tr -d echo $ret|tee -a $logfile } # 需要获取其所依赖包的包 libswget psmisc vim net-tools nfs-kernel-server telnet lvm2 git tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp# download libs dependen. deep in 3 i0 while [ $i -lt 3 ] ; dolet iecho $i# download libsnewlist for j in $libsdoadded$(getDepends $j)newlist$newlist $addedapt install $added --reinstall -d -ydonelibs$newlist done# 创建源信息 apt install dpkg-dev sudo cp /var/cache/apt/archives/*.deb /data/ubuntu/ -r dpkg-scanpackages . /dev/null |gzip /data/ubuntu/Packages.gz -r# 拷贝包到内网机器上 scp -r ubuntu/ root192.168.0.31: scp -r ubuntu/ root192.168.0.32: scp -r ubuntu/ root192.168.0.33: scp -r ubuntu/ root192.168.0.34: scp -r ubuntu/ root192.168.0.35:# 在内网机器上配置apt源 vim /etc/apt/sources.list cat /etc/apt/sources.list deb file:root/ ubuntu/# 安装deb包 apt install ./*.deb 5.选择性下载需要工具(可选) #!/bin/bash# 查看版本地址 # # https://github.com/containernetworking/plugins/releases/ # https://github.com/containerd/containerd/releases/ # https://github.com/kubernetes-sigs/cri-tools/releases/ # https://github.com/Mirantis/cri-dockerd/releases/ # https://github.com/etcd-io/etcd/releases/ # https://github.com/cloudflare/cfssl/releases/ # https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG # https://download.docker.com/linux/static/stable/x86_64/ # https://github.com/opencontainers/runc/releases/ # https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/ # https://github.com/helm/helm/tags # http://nginx.org/download/# Version numbers cni_plugins_versionv1.3.0 cri_containerd_cni_version1.7.3 crictl_versionv1.28.0 cri_dockerd_version0.3.4 etcd_versionv3.5.9 cfssl_version1.6.4 kubernetes_server_version1.28.0 docker_version24.0.5 runc_version1.1.9 kernel_version5.4.254 helm_version3.12.3 nginx_version1.25.2# URLs base_urlhttps://ghproxy.com/https://github.com kernel_urlhttp://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-${kernel_version}-1.el7.elrepo.x86_64.rpm runc_url${base_url}/opencontainers/runc/releases/download/v${runc_version}/runc.amd64 docker_urlhttps://download.docker.com/linux/static/stable/x86_64/docker-${docker_version}.tgz cni_plugins_url${base_url}/containernetworking/plugins/releases/download/${cni_plugins_version}/cni-plugins-linux-amd64-${cni_plugins_version}.tgz cri_containerd_cni_url${base_url}/containerd/containerd/releases/download/v${cri_containerd_cni_version}/cri-containerd-cni-${cri_containerd_cni_version}-linux-amd64.tar.gz crictl_url${base_url}/kubernetes-sigs/cri-tools/releases/download/${crictl_version}/crictl-${crictl_version}-linux-amd64.tar.gz cri_dockerd_url${base_url}/Mirantis/cri-dockerd/releases/download/v${cri_dockerd_version}/cri-dockerd-${cri_dockerd_version}.amd64.tgz etcd_url${base_url}/etcd-io/etcd/releases/download/${etcd_version}/etcd-${etcd_version}-linux-amd64.tar.gz cfssl_url${base_url}/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssl_${cfssl_version}_linux_amd64 cfssljson_url${base_url}/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssljson_${cfssl_version}_linux_amd64 helm_urlhttps://mirrors.huaweicloud.com/helm/v${helm_version}/helm-v${helm_version}-linux-amd64.tar.gz kubernetes_server_urlhttps://storage.googleapis.com/kubernetes-release/release/v${kubernetes_server_version}/kubernetes-server-linux-amd64.tar.gz nginx_urlhttp://nginx.org/download/nginx-${nginx_version}.tar.gz# Download packages packages($kernel_url$runc_url$docker_url$cni_plugins_url$cri_containerd_cni_url$crictl_url$cri_dockerd_url$etcd_url$cfssl_url$cfssljson_url$helm_url$kubernetes_server_url$nginx_url )for package_url in ${packages[]}; dofilename$(basename $package_url)if curl --parallel --parallel-immediate -k -L -C - -o $filename $package_url; thenecho Downloaded $filenameelseecho Failed to download $filenameexit 1fi done6.关闭防火墙 # Ubuntu忽略CentOS执行 systemctl disable --now firewalld7.关闭SELinux # Ubuntu忽略CentOS执行 setenforce 0 sed -i s#SELINUXenforcing#SELINUXdisabled#g /etc/selinux/config# 参数解释 # # setenforce 0 # 此命令用于设置 SELinux 的执行模式。0 表示关闭 SELinux。 # # sed -i s#SELINUXenforcing#SELINUXdisabled#g /etc/selinux/config # 该命令使用 sed 工具来编辑 /etc/selinux/config 文件。其中 -i 参数表示直接修改原文件而不是输出到终端或另一个文件。s#SELINUXenforcing#SELINUXdisabled#g 是 sed 的替换命令它将文件中所有的 SELINUXenforcing 替换为 SELINUXdisabled。这里的 # 是分隔符用于替代传统的 / 分隔符以避免与路径中的 / 冲突。8.关闭交换分区 sed -ri s/.*swap.*/#/ /etc/fstab swapoff -a sysctl -w vm.swappiness0cat /etc/fstab # /dev/mapper/centos-swap swap swap defaults 0 0# 参数解释 # # -ri: 这个参数用于在原文件中替换匹配的模式。-r表示扩展正则表达式-i允许直接修改文件。 # s/.*swap.*/#/: 这是一个sed命令用于在文件/etc/fstab中找到包含swap的行并在行首添加#来注释掉该行。 # /etc/fstab: 这是一个文件路径即/etc/fstab文件用于存储文件系统表。 # swapoff -a: 这个命令用于关闭所有启用的交换分区。 # sysctl -w vm.swappiness0: 这个命令用于修改vm.swappiness参数的值为0表示系统在物理内存充足时更倾向于使用物理内存而非交换分区。9.网络配置俩种方式二选一 # Ubuntu忽略CentOS执行# 方式一 # systemctl disable --now NetworkManager # systemctl start network systemctl enable network# 方式二 cat /etc/NetworkManager/conf.d/calico.conf EOF [keyfile] unmanaged-devicesinterface-name:cali*;interface-name:tunl* EOF systemctl restart NetworkManager# 参数解释 # # 这个参数用于指定不由 NetworkManager 管理的设备。它由以下两个部分组成 # # interface-name:cali* # 表示以 cali 开头的接口名称被排除在 NetworkManager 管理之外。例如cali0, cali1 等接口不受 NetworkManager 管理。 # # interface-name:tunl* # 表示以 tunl 开头的接口名称被排除在 NetworkManager 管理之外。例如tunl0, tunl1 等接口不受 NetworkManager 管理。 # # 通过使用这个参数可以将特定的接口排除在 NetworkManager 的管理范围之外以便其他工具或进程可以独立地管理和配置这些接口。10.进行时间同步 服务端31 客户端32-35服务端在31执行客户端在32-35执行 # 服务端 # apt install chrony -y yum install chrony -y cat /etc/chrony.conf EOF pool ntp.aliyun.com iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync allow 192.168.0.0/24 local stratum 10 keyfile /etc/chrony.keys leapsectz right/UTC logdir /var/log/chrony EOFsystemctl restart chronyd systemctl enable chronyd# 客户端 # apt install chrony -y yum install chrony -y cat /etc/chrony.conf EOF pool 192.168.0.31 iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync keyfile /etc/chrony.keys leapsectz right/UTC logdir /var/log/chrony EOFsystemctl restart chronyd systemctl enable chronyd#使用客户端进行验证 chronyc sources -v# 参数解释 # # pool ntp.aliyun.com iburst # 指定使用ntp.aliyun.com作为时间服务器池iburst选项表示在初始同步时会发送多个请求以加快同步速度。 # # driftfile /var/lib/chrony/drift # 指定用于保存时钟漂移信息的文件路径。 # # makestep 1.0 3 # 设置当系统时间与服务器时间偏差大于1秒时会以1秒的步长进行调整。如果偏差超过3秒则立即进行时间调整。 # # rtcsync # 启用硬件时钟同步功能可以提高时钟的准确性。 # # allow 192.168.0.0/24 # 允许192.168.0.0/24网段范围内的主机与chrony进行时间同步。 # # local stratum 10 # 将本地时钟设为stratum 10stratum值表示时钟的准确度值越小表示准确度越高。 # # keyfile /etc/chrony.keys # 指定使用的密钥文件路径用于对时间同步进行身份验证。 # # leapsectz right/UTC # 指定时区为UTC。 # # logdir /var/log/chrony # 指定日志文件存放目录。11.配置ulimit ulimit -SHn 65535cat /etc/security/limits.conf EOF * soft nofile 655360 * hard nofile 131072 * soft nproc 655350 * hard nproc 655350 * seft memlock unlimited * hard memlock unlimitedd EOF# 参数解释 # # soft nofile 655360 # soft表示软限制nofile表示一个进程可打开的最大文件数默认值为1024。这里的软限制设置为655360即一个进程可打开的最大文件数为655360。 # # hard nofile 131072 # hard表示硬限制即系统设置的最大值。nofile表示一个进程可打开的最大文件数默认值为4096。这里的硬限制设置为131072即系统设置的最大文件数为131072。 # # soft nproc 655350 # soft表示软限制nproc表示一个用户可创建的最大进程数默认值为30720。这里的软限制设置为655350即一个用户可创建的最大进程数为655350。 # # hard nproc 655350 # hard表示硬限制即系统设置的最大值。nproc表示一个用户可创建的最大进程数默认值为4096。这里的硬限制设置为655350即系统设置的最大进程数为655350。 # # seft memlock unlimited # seft表示软限制memlock表示一个进程可锁定在RAM中的最大内存默认值为64 KB。这里的软限制设置为unlimited即一个进程可锁定的最大内存为无限制。 # # hard memlock unlimited # hard表示硬限制即系统设置的最大值。memlock表示一个进程可锁定在RAM中的最大内存默认值为64 KB。这里的硬限制设置为unlimited即系统设置的最大内存锁定为无限制。12.配置免密登录 所有节点执行,满足各节点之间可以互相免密 # apt install -y sshpass yum install -y sshpass ssh-keygen -f /root/.ssh/id_rsa -P export IP192.168.0.31 192.168.0.32 192.168.0.33 192.168.0.34 192.168.0.35 export SSHPASS111111 for HOST in $IP;dosshpass -e ssh-copy-id -o StrictHostKeyCheckingno $HOST done# 这段脚本的作用是在一台机器上安装sshpass工具并通过sshpass自动将本机的SSH公钥复制到多个远程主机上以实现无需手动输入密码的SSH登录。 # # 具体解释如下 # # 1. apt install -y sshpass 或 yum install -y sshpass通过包管理器apt或yum安装sshpass工具使得后续可以使用sshpass命令。 # # 2. ssh-keygen -f /root/.ssh/id_rsa -P 生成SSH密钥对。该命令会在/root/.ssh目录下生成私钥文件id_rsa和公钥文件id_rsa.pub同时不设置密码即-P参数后面为空方便后续通过ssh-copy-id命令自动复制公钥。 # # 3. export IP192.168.0.31 192.168.0.32 192.168.0.33 192.168.0.34 192.168.0.35设置一个包含多个远程主机IP地址的环境变量IP用空格分隔开表示要将SSH公钥复制到这些远程主机上。 # # 4. export SSHPASS111111设置环境变量SSHPASS将sshpass所需的SSH密码在这里是111111赋值给它这样sshpass命令可以自动使用这个密码进行登录。 # # 5. for HOST in $IP;do遍历环境变量IP中的每个IP地址并将当前IP地址赋值给变量HOST。 # # 6. sshpass -e ssh-copy-id -o StrictHostKeyCheckingno $HOST使用sshpass工具复制本机的SSH公钥到远程主机。其中-e选项表示使用环境变量中的密码即SSHPASS进行登录-o StrictHostKeyCheckingno选项表示连接时不检查远程主机的公钥以避免交互式确认。 # # 通过这段脚本可以方便地将本机的SSH公钥复制到多个远程主机上实现无需手动输入密码的SSH登录。13.添加启用源 # Ubuntu忽略CentOS执行# 为 RHEL-8或 CentOS-8配置源 yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y sed -i smirrorlist#mirrorlistg /etc/yum.repos.d/elrepo.repo sed -i selrepo.org/linuxmirrors.tuna.tsinghua.edu.cn/elrepog /etc/yum.repos.d/elrepo.repo # 为 RHEL-7 SL-7 或 CentOS-7 安装 ELRepo yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y sed -i smirrorlist#mirrorlistg /etc/yum.repos.d/elrepo.repo sed -i selrepo.org/linuxmirrors.tuna.tsinghua.edu.cn/elrepog /etc/yum.repos.d/elrepo.repo # 查看可用安装包 yum --disablerepo* --enablerepoelrepo-kernel list available14.升级内核至4.18版本以上 centos7直接执行下面的v7整合命令即可。省的一行一行执行 也可以一行一行执行不执行整合命令 # Ubuntu忽略CentOS执行# 安装最新的内核 # 我这里选择的是稳定版kernel-ml 如需更新长期维护版本kernel-lt yum -y --enablerepoelrepo-kernel install kernel-ml# 查看已安装那些内核 rpm -qa | grep kernel# 查看默认内核 grubby --default-kernel# 若不是最新的使用命令设置 grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo)# 重启生效 reboot# v8 整合命令为 yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y ; sed -i smirrorlist#mirrorlistg /etc/yum.repos.d/elrepo.repo ; sed -i selrepo.org/linuxmirrors.tuna.tsinghua.edu.cn/elrepog /etc/yum.repos.d/elrepo.repo ; yum --disablerepo* --enablerepoelrepo-kernel list available -y ; yum --enablerepoelrepo-kernel install kernel-lt -y ; grubby --default-kernel ; reboot # v7 整合命令为 yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y ; sed -i smirrorlist#mirrorlistg /etc/yum.repos.d/elrepo.repo ; sed -i selrepo.org/linuxmirrors.tuna.tsinghua.edu.cn/elrepog /etc/yum.repos.d/elrepo.repo ; yum --disablerepo* --enablerepoelrepo-kernel list available -y ; yum --enablerepoelrepo-kernel install kernel-lt -y ; grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo) ; grubby --default-kernel ; reboot # 离线版本 yum install -y /root/cby/kernel-lt-*-1.el7.elrepo.x86_64.rpm ; grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo) ; grubby --default-kernel ; reboot 15.安装ipvsadm # 对于CentOS7离线安装 # yum install /root/centos7/ipset-*.el7.x86_64.rpm /root/centos7/lm_sensors-libs-*.el7.x86_64.rpm /root/centos7/ipset-libs-*.el7.x86_64.rpm /root/centos7/sysstat-*.el7_9.x86_64.rpm /root/centos7/ipvsadm-*.el7.x86_64.rpm -y# 对于 Ubuntu # apt install ipvsadm ipset sysstat conntrack -y# 对于 CentOS yum install ipvsadm ipset sysstat conntrack libseccomp -ycat /etc/modules-load.d/ipvs.conf EOF ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip EOFsystemctl restart systemd-modules-load.servicelsmod | grep -e ip_vs -e nf_conntrack #ip_vs_sh 16384 0 #ip_vs_wrr 16384 0 #ip_vs_rr 16384 0 #ip_vs 180224 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr #nf_conntrack 176128 1 ip_vs #nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs #nf_defrag_ipv4 16384 1 nf_conntrack #libcrc32c 16384 3 nf_conntrack,xfs,ip_vs# 参数解释 # # ip_vs # IPVS 是 Linux 内核中的一个模块用于实现负载均衡和高可用性。它通过在前端代理服务器上分发传入请求到后端实际服务器上提供了高性能和可扩展的网络服务。 # # ip_vs_rr # IPVS 的一种调度算法之一使用轮询方式分发请求到后端服务器每个请求按顺序依次分发。 # # ip_vs_wrr # IPVS 的一种调度算法之一使用加权轮询方式分发请求到后端服务器每个请求按照指定的权重比例分发。 # # ip_vs_sh # IPVS 的一种调度算法之一使用哈希方式根据源 IP 地址和目标 IP 地址来分发请求。 # # nf_conntrack # 这是一个内核模块用于跟踪和管理网络连接包括 TCP、UDP 和 ICMP 等协议。它是实现防火墙状态跟踪的基础。 # # ip_tables # 这是一个内核模块提供了对 Linux 系统 IP 数据包过滤和网络地址转换NAT功能的支持。 # # ip_set # 这是一个内核模块扩展了 iptables 的功能支持更高效的 IP 地址集合操作。 # # xt_set # 这是一个内核模块扩展了 iptables 的功能支持更高效的数据包匹配和操作。 # # ipt_set # 这是一个用户空间工具用于配置和管理 xt_set 内核模块。 # # ipt_rpfilter # 这是一个内核模块用于实现反向路径过滤用于防止 IP 欺骗和 DDoS 攻击。 # # ipt_REJECT # 这是一个 iptables 目标用于拒绝 IP 数据包并向发送方发送响应指示数据包被拒绝。 # # ipip # 这是一个内核模块用于实现 IP 封装在 IPIP-over-IP的隧道功能。它可以在不同网络之间创建虚拟隧道来传输 IP 数据包。16.修改内核参数 cat EOF /etc/sysctl.d/k8s.conf net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-iptables 1 fs.may_detach_mounts 1 vm.overcommit_memory1 vm.panic_on_oom0 fs.inotify.max_user_watches89100 fs.file-max52706963 fs.nr_open52706963 net.netfilter.nf_conntrack_max2310720net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_keepalive_probes 3 net.ipv4.tcp_keepalive_intvl 15 net.ipv4.tcp_max_tw_buckets 36000 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_max_orphans 327680 net.ipv4.tcp_orphan_retries 3 net.ipv4.tcp_syncookies 1 net.ipv4.tcp_max_syn_backlog 16384 net.ipv4.ip_conntrack_max 65536 net.ipv4.tcp_max_syn_backlog 16384 net.ipv4.tcp_timestamps 0 net.core.somaxconn 16384net.ipv6.conf.all.disable_ipv6 0 net.ipv6.conf.default.disable_ipv6 0 net.ipv6.conf.lo.disable_ipv6 0 net.ipv6.conf.all.forwarding 1 EOFsysctl --system# 这些是Linux系统的一些参数设置用于配置和优化网络、文件系统和虚拟内存等方面的功能。以下是每个参数的详细解释 # # 1. net.ipv4.ip_forward 1 # - 这个参数启用了IPv4的IP转发功能允许服务器作为网络路由器转发数据包。 # # 2. net.bridge.bridge-nf-call-iptables 1 # - 当使用网络桥接技术时将数据包传递到iptables进行处理。 # # 3. fs.may_detach_mounts 1 # - 允许在挂载文件系统时允许被其他进程使用。 # # 4. vm.overcommit_memory1 # - 该设置允许原始的内存过量分配策略当系统的内存已经被完全使用时系统仍然会分配额外的内存。 # # 5. vm.panic_on_oom0 # - 当系统内存不足OOM时禁用系统崩溃和重启。 # # 6. fs.inotify.max_user_watches89100 # - 设置系统允许一个用户的inotify实例可以监控的文件数目的上限。 # # 7. fs.file-max52706963 # - 设置系统同时打开的文件数的上限。 # # 8. fs.nr_open52706963 # - 设置系统同时打开的文件描述符数的上限。 # # 9. net.netfilter.nf_conntrack_max2310720 # - 设置系统可以创建的网络连接跟踪表项的最大数量。 # # 10. net.ipv4.tcp_keepalive_time 600 # - 设置TCP套接字的空闲超时时间秒超过该时间没有活动数据时内核会发送心跳包。 # # 11. net.ipv4.tcp_keepalive_probes 3 # - 设置未收到响应的TCP心跳探测次数。 # # 12. net.ipv4.tcp_keepalive_intvl 15 # - 设置TCP心跳探测的时间间隔秒。 # # 13. net.ipv4.tcp_max_tw_buckets 36000 # - 设置系统可以使用的TIME_WAIT套接字的最大数量。 # # 14. net.ipv4.tcp_tw_reuse 1 # - 启用TIME_WAIT套接字的重新利用允许新的套接字使用旧的TIME_WAIT套接字。 # # 15. net.ipv4.tcp_max_orphans 327680 # - 设置系统可以同时存在的TCP套接字垃圾回收包裹数的最大数量。 # # 16. net.ipv4.tcp_orphan_retries 3 # - 设置系统对于孤立的TCP套接字的重试次数。 # # 17. net.ipv4.tcp_syncookies 1 # - 启用TCP SYN cookies保护用于防止SYN洪泛攻击。 # # 18. net.ipv4.tcp_max_syn_backlog 16384 # - 设置新的TCP连接的半连接数半连接队列的最大长度。 # # 19. net.ipv4.ip_conntrack_max 65536 # - 设置系统可以创建的网络连接跟踪表项的最大数量。 # # 20. net.ipv4.tcp_timestamps 0 # - 关闭TCP时间戳功能用于提供更好的安全性。 # # 21. net.core.somaxconn 16384 # - 设置系统核心层的连接队列的最大值。 # # 22. net.ipv6.conf.all.disable_ipv6 0 # - 启用IPv6协议。 # # 23. net.ipv6.conf.default.disable_ipv6 0 # - 启用IPv6协议。 # # 24. net.ipv6.conf.lo.disable_ipv6 0 # - 启用IPv6协议。 # # 25. net.ipv6.conf.all.forwarding 1 # - 允许IPv6数据包转发。17.所有节点配置hosts本地解析 cat /etc/hosts EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.0.31 k8s-master01 192.168.0.32 k8s-master02 192.168.0.33 k8s-master03 192.168.0.34 k8s-node01 192.168.0.35 k8s-node02 192.168.0.36 lb-vip EOF2.k8s基本组件安装 注意 2.1 和 2.2 二选其一即可 2.1.安装Containerd作为Runtime 推荐 masternode所有节点安装 # https://github.com/containernetworking/plugins/releases/ # wget https://ghproxy.com/https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz mkdir ~/lzb cd lzb/#创建cni插件所需目录 mkdir -p /etc/cni/net.d /opt/cni/bin #解压cni二进制包 tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/# https://github.com/containerd/containerd/releases/ # wget https://ghproxy.com/https://github.com/containerd/containerd/releases/download/v1.7.3/cri-containerd-cni-1.7.3-linux-amd64.tar.gz#解压 tar -xzf cri-containerd-cni-*-linux-amd64.tar.gz -C /#创建服务启动文件 cat /etc/systemd/system/containerd.service EOF [Unit] Descriptioncontainerd container runtime Documentationhttps://containerd.io Afternetwork.target local-fs.target[Service] ExecStartPre-/sbin/modprobe overlay ExecStart/usr/local/bin/containerd Typenotify Delegateyes KillModeprocess Restartalways RestartSec5 LimitNPROCinfinity LimitCOREinfinity LimitNOFILEinfinity TasksMaxinfinity OOMScoreAdjust-999[Install] WantedBymulti-user.target EOF# 参数解释 # # 这是一个用于启动containerd容器运行时的systemd unit文件。下面是对该文件不同部分的详细解释 # # [Unit] # Descriptioncontainerd container runtime # 描述该unit的作用是作为containerd容器运行时。 # # Documentationhttps://containerd.io # 指向容器运行时的文档的URL。 # # Afternetwork.target local-fs.target # 定义了在哪些依赖项之后该unit应该被启动。在网络和本地文件系统加载完成后启动确保了容器运行时在这些依赖项可用时才会启动。 # # [Service] # ExecStartPre-/sbin/modprobe overlay # 在启动containerd之前执行的命令。这里的命令是尝试加载内核的overlay模块如果失败则忽略错误继续执行下面的命令。 # # ExecStart/usr/local/bin/containerd # 实际执行的命令用于启动containerd容器运行时。 # # Typenotify # 指定服务的通知类型。这里使用notify类型表示当服务就绪时会通过通知的方式告知systemd。 # # Delegateyes # 允许systemd对此服务进行重启和停止操作。 # # KillModeprocess # 在终止容器运行时时使用的kill模式。这里使用process模式表示通过终止进程来停止容器运行时。 # # Restartalways # 定义了当容器运行时终止后的重启策略。这里设置为always表示无论何时终止容器运行时都会自动重新启动。 # # RestartSec5 # 在容器运行时终止后重新启动之前等待的秒数。 # # LimitNPROCinfinity # 指定容器运行时可以使用的最大进程数量。这里设置为无限制。 # # LimitCOREinfinity # 指定容器运行时可以使用的最大CPU核心数量。这里设置为无限制。 # # LimitNOFILEinfinity # 指定容器运行时可以打开的最大文件数。这里设置为无限制。 # # TasksMaxinfinity # 指定容器运行时可以创建的最大任务数。这里设置为无限制。 # # OOMScoreAdjust-999 # 指定容器运行时的OOMOut-Of-Memory分数调整值。负数值表示容器运行时的优先级较高。 # # [Install] # WantedBymulti-user.target # 定义了服务的安装位置。这里指定为multi-user.target表示将服务安装为多用户模式下的启动项。2.1.1 配置Containerd所需的模块 cat EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF# 参数解释 # # containerd是一个容器运行时用于管理和运行容器。它支持多种不同的参数配置来自定义容器运行时的行为和功能。 # # 1. overlayoverlay是容器d默认使用的存储驱动它提供了一种轻量级的、可堆叠的、逐层增量的文件系统。它通过在现有文件系统上叠加文件系统层来创建容器的文件系统视图。每个容器可以有自己的一组文件系统层这些层可以共享基础镜像中的文件并在容器内部进行修改。使用overlay可以有效地使用磁盘空间并使容器更加轻量级。 # # 2. br_netfilterbr_netfilter是Linux内核提供的一个网络过滤器模块用于在容器网络中进行网络过滤和NAT转发。当容器和主机之间的网络通信需要进行DNAT或者SNAT时br_netfilter模块可以将IP地址进行转换。它还可以提供基于iptables规则的网络过滤功能用于限制容器之间或容器与外部网络之间的通信。 # # 这些参数可以在containerd的配置文件或者命令行中指定。例如可以通过设置--storage-driver参数来选择使用overlay作为存储驱动通过设置--iptables参数来启用或禁用br_netfilter模块。具体的使用方法和配置细节可以参考containerd的官方文档。2.1.2 加载模块 systemctl restart systemd-modules-load.service# 参数解释 # - systemctl: 是Linux系统管理服务的命令行工具可以管理systemd init系统。 # - restart: 是systemctl命令的一个选项用于重新启动服务。 # - systemd-modules-load.service: 是一个系统服务用于加载内核模块。 # # 将上述参数结合在一起来解释systemctl restart systemd-modules-load.service的含义 # 这个命令用于重新启动系统服务systemd-modules-load.service它是负责加载内核模块的服务。在重新启动该服务后系统会重新加载所有的内核模块。2.1.3 配置Containerd所需的内核 cat EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-ip6tables 1 EOF# 加载内核 sysctl --system# 参数解释 # # 这些参数是Linux操作系统中用于网络和网络桥接设置的参数。 # # - net.bridge.bridge-nf-call-iptables这个参数控制网络桥接设备是否调用iptables规则处理网络数据包。当该参数设置为1时网络数据包将被传递到iptables进行处理当该参数设置为0时网络数据包将绕过iptables直接传递。默认情况下这个参数的值是1即启用iptables规则处理网络数据包。 # # - net.ipv4.ip_forward这个参数用于控制是否启用IP转发功能。IP转发使得操作系统可以将接收到的数据包从一个网络接口转发到另一个网络接口。当该参数设置为1时启用IP转发功能当该参数设置为0时禁用IP转发功能。在网络环境中通常需要启用IP转发功能来实现不同网络之间的通信。默认情况下这个参数的值是0即禁用IP转发功能。 # # - net.bridge.bridge-nf-call-ip6tables这个参数与net.bridge.bridge-nf-call-iptables类似但是它用于IPv6数据包的处理。当该参数设置为1时IPv6数据包将被传递到ip6tables进行处理当该参数设置为0时IPv6数据包将绕过ip6tables直接传递。默认情况下这个参数的值是1即启用ip6tables规则处理IPv6数据包。 # # 这些参数的值可以通过修改操作系统的配置文件通常是/etc/sysctl.conf来进行设置。修改完成后需要使用sysctl -p命令重载配置文件使参数生效。2.1.4 创建Containerd的配置文件 # 参数解释 # # 这段代码是用于修改并配置containerd的参数。 # # 1. 首先使用命令mkdir -p /etc/containerd创建/etc/containerd目录如果该目录已存在则不进行任何操作。 # 2. 使用命令containerd config default | tee /etc/containerd/config.toml创建默认配置文件并将输出同时传递给/etc/containerd/config.toml文件。 # 3. 使用sed命令修改/etc/containerd/config.toml文件将SystemdCgroup参数的值从false改为true。-i参数表示直接在原文件中进行编辑。 # 4. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中SystemdCgroup参数的值是否已修改为true。 # 5. 使用sed命令修改/etc/containerd/config.toml文件将registry.k8s.io的地址替换为m.daocloud.io/registry.k8s.io。-i参数表示直接在原文件中进行编辑。 # 6. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中sandbox_image参数的值是否已修改为m.daocloud.io/registry.k8s.io。 # 7. 使用sed命令修改/etc/containerd/config.toml文件将config_path参数的值从改为/etc/containerd/certs.d。-i参数表示直接在原文件中进行编辑。 # 8. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中certs.d参数的值是否已修改为/etc/containerd/certs.d。 # 9. 使用mkdir命令创建/etc/containerd/certs.d/docker.io目录如果目录已存在则不进行任何操作。-p参数表示创建目录时如果父级目录不存在则自动创建父级目录。 # # 最后使用cat重定向操作符将内容写入/etc/containerd/certs.d/docker.io/hosts.toml文件。该文件会配置加速器其中server参数设置为https://docker.iohost参数设置为https://hub-mirror.c.163.com并添加capabilities参数。# 创建默认配置文件 mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml# 修改Containerd的配置文件 sed -i s#SystemdCgroup\ \\ false#SystemdCgroup\ \\ true#g /etc/containerd/config.toml cat /etc/containerd/config.toml | grep SystemdCgroup sed -i s#registry.k8s.io#m.daocloud.io/registry.k8s.io#g /etc/containerd/config.toml cat /etc/containerd/config.toml | grep sandbox_image sed -i s#config_path\ \\ \\#config_path\ \\ \/etc/containerd/certs.d\#g /etc/containerd/config.toml cat /etc/containerd/config.toml | grep certs.d# 配置加速器 mkdir /etc/containerd/certs.d/docker.io -pvcat /etc/containerd/certs.d/docker.io/hosts.toml EOF server https://docker.io [host.https://hub-mirror.c.163.com]capabilities [pull, resolve] EOF# 注意 # SystemdCgroup参数是containerd中的一个配置参数用于设置containerd在运行过程中使用的Cgroup控制组路径。Containerd使用SystemdCgroup参数来指定应该使用哪个Cgroup来跟踪和管理容器的资源使用。 # # Cgroup是Linux内核提供的一种资源隔离和管理机制可以用于限制、分配和监控进程组的资源使用。使用Cgroup可以将容器的资源限制和隔离以防止容器之间的资源争用和不公平的竞争。 # # 通过设置SystemdCgroup参数可以确保containerd能够找到正确的Cgroup路径并正确地限制和隔离容器的资源使用确保容器可以按照预期的方式运行。如果未正确设置SystemdCgroup参数可能会导致容器无法正确地使用资源或者无法保证资源的公平分配和隔离。 # # 总而言之SystemdCgroup参数的作用是为了确保containerd能够正确地管理容器的资源使用以实现资源的限制、隔离和公平分配。2.1.5 启动并设置为开机启动 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now containerd.service # 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。systemctl stop containerd.service # 停止运行中的docker.service单元即停止Docker守护进程。systemctl start containerd.service # 启动docker.service单元即启动Docker守护进程。systemctl restart containerd.service # 重启docker.service单元即重新启动Docker守护进程。systemctl status containerd.service # 显示docker.service单元的当前状态包括运行状态、是否启用等信息。2.1.6 配置crictl客户端连接的运行时位置 # https://github.com/kubernetes-sigs/cri-tools/releases/ # wget https://ghproxy.com/https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz#解压 tar xf crictl-v*-linux-amd64.tar.gz -C /usr/bin/ #生成配置文件 cat /etc/crictl.yaml EOF runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF#测试 systemctl restart containerd crictl info# 注意 # 下面是参数crictl的详细解释 # # crictl是一个用于与容器运行时通信的命令行工具。它是容器运行时接口CRI工具的一个实现可以对容器运行时进行管理和操作。 # # 1. runtime-endpoint: unix:///run/containerd/containerd.sock # 指定容器运行时的终端套接字地址。在这个例子中指定的地址是unix:///run/containerd/containerd.sock这是一个Unix域套接字地址。 # # 2. image-endpoint: unix:///run/containerd/containerd.sock # 指定容器镜像服务的终端套接字地址。在这个例子中指定的地址是unix:///run/containerd/containerd.sock这是一个Unix域套接字地址。 # # 3. timeout: 10 # 设置与容器运行时通信的超时时间单位是秒。在这个例子中超时时间被设置为10秒。 # # 4. debug: false # 指定是否开启调式模式。在这个例子中调式模式被设置为关闭即false。如果设置为true则会输出更详细的调试信息。 # # 这些参数可以根据需要进行修改以便与容器运行时进行有效的通信和管理。2.2 安装docker作为Runtime 不推荐 2.2.1 解压docker程序 # 二进制包下载地址https://download.docker.com/linux/static/stable/x86_64/ # wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.5.tgz#解压 tar xf docker-*.tgz #拷贝二进制文件 cp docker/* /usr/bin/2.2.2 创建containerd的service文件 #创建containerd的service文件,并且启动 cat /etc/systemd/system/containerd.service EOF [Unit] Descriptioncontainerd container runtime Documentationhttps://containerd.io Afternetwork.target local-fs.target[Service] ExecStartPre-/sbin/modprobe overlay ExecStart/usr/bin/containerd Typenotify Delegateyes KillModeprocess Restartalways RestartSec5 LimitNPROCinfinity LimitCOREinfinity LimitNOFILE1048576 TasksMaxinfinity OOMScoreAdjust-999[Install] WantedBymulti-user.target EOF# 参数解释 # # [Unit] # - Descriptioncontainerd container runtime指定服务的描述信息。 # - Documentationhttps://containerd.io指定服务的文档链接。 # - Afternetwork.target local-fs.target指定服务的启动顺序在网络和本地文件系统启动之后再启动该服务。 # # [Service] # - ExecStartPre-/sbin/modprobe overlay在启动服务之前执行的命令使用-表示忽略错误。 # - ExecStart/usr/bin/containerd指定服务的启动命令。 # - Typenotify指定服务的类型notify表示服务会在启动完成后向systemd发送通知。 # - Delegateyes允许服务代理其他服务的应答例如收到关机命令后终止其他服务。 # - KillModeprocess指定服务终止时的行为process表示终止服务进程。 # - Restartalways指定服务终止后是否自动重启always表示总是自动重启。 # - RestartSec5指定服务重启的时间间隔单位为秒。 # - LimitNPROCinfinity限制服务的最大进程数infinity表示没有限制。 # - LimitCOREinfinity限制服务的最大核心数infinity表示没有限制。 # - LimitNOFILE1048576限制服务的最大文件数指定为1048576。 # - TasksMaxinfinity限制服务的最大任务数infinity表示没有限制。 # - OOMScoreAdjust-999指定服务的OOMOut of Memory得分负数表示降低被终止的概率。 # # [Install] # - WantedBymulti-user.target指定服务的安装方式multi-user.target表示该服务在多用户模式下安装。# 设置开机自启 systemctl enable --now containerd.service2.2.3 准备docker的service文件 #准备docker的service文件 cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requiresdocker.socket containerd.service[Service] Typenotify ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways StartLimitBurst3 StartLimitInterval60s LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess OOMScoreAdjust-500[Install] WantedBymulti-user.target EOF# 参数解释 # # [Unit] # - Description: 描述服务的作用这里是Docker Application Container Engine即Docker应用容器引擎。 # - Documentation: 提供关于此服务的文档链接这里是Docker官方文档链接。 # - After: 说明该服务在哪些其他服务之后启动这里是在网络在线、firewalld服务和containerd服务后启动。 # - Wants: 说明该服务想要的其他服务这里是网络在线服务。 # - Requires: 说明该服务需要的其他服务这里是docker.socket和containerd.service。 # # [Service] # - Type: 服务类型这里是notify表示服务在启动完成时发送通知。 # - ExecStart: 命令启动该服务时会执行的命令这里是/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock即启动dockerd并指定一些参数其中-H指定dockerd的监听地址为fd://--containerd指定containerd的sock文件位置。 # - ExecReload: 重载命令当接收到HUP信号时执行的命令这里是/bin/kill -s HUP $MAINPID即发送HUP信号给主进程ID。 # - TimeoutSec: 服务超时时间这里是0表示没有超时限制。 # - RestartSec: 重启间隔时间这里是2秒表示重启失败后等待2秒再重启。 # - Restart: 重启策略这里是always表示总是重启。 # - StartLimitBurst: 启动限制次数这里是3表示在启动失败后最多重试3次。 # - StartLimitInterval: 启动限制时间间隔这里是60秒表示两次启动之间最少间隔60秒。 # - LimitNOFILE: 文件描述符限制这里是infinity表示没有限制。 # - LimitNPROC: 进程数限制这里是infinity表示没有限制。 # - LimitCORE: 核心转储限制这里是infinity表示没有限制。 # - TasksMax: 最大任务数这里是infinity表示没有限制。 # - Delegate: 修改权限这里是yes表示启用权限修改。 # - KillMode: 杀死模式这里是process表示杀死整个进程组。 # - OOMScoreAdjust: 用于调整进程在系统内存紧张时的优先级调整这里是-500表示将OOM分数降低500。 # # [Install] # - WantedBy: 安装目标这里是multi-user.target表示在多用户模式下安装。 # 在WantedBy参数中我们可以使用以下参数 # 1. multi-user.target指定该服务应该在多用户模式下启动。 # 2. graphical.target指定该服务应该在图形化界面模式下启动。 # 3. default.target指定该服务应该在系统的默认目标runlevel下启动。 # 4. rescue.target指定该服务应该在系统救援模式下启动。 # 5. poweroff.target指定该服务应该在关机时启动。 # 6. reboot.target指定该服务应该在重启时启动。 # 7. halt.target指定该服务应该在停止时启动。 # 8. shutdown.target指定该服务应该在系统关闭时启动。 # 这些参数可以根据需要选择一个或多个以告知系统在何时启动该服务。 2.2.4 准备docker的socket文件 #准备docker的socket文件 cat /etc/systemd/system/docker.socket EOF [Unit] DescriptionDocker Socket for the API[Socket] ListenStream/var/run/docker.sock SocketMode0660 SocketUserroot SocketGroupdocker[Install] WantedBysockets.target EOF# 这是一个用于Docker API的socket配置文件包含了以下参数 # # [Unit] # - Description描述了该socket的作用即为Docker API的socket。 # # [Socket] # - ListenStream指定了socket的监听地址该socket会监听在/var/run/docker.sock上即Docker守护程序使用的默认sock文件。 # - SocketMode指定了socket文件的权限模式此处为0660即用户和用户组有读写权限其他用户无权限。 # - SocketUser指定了socket文件的所有者此处为root用户。 # - SocketGroup指定了socket文件的所属用户组此处为docker用户组。 # # [Install] # - WantedBy指定了该socket被启用时的目标此处为sockets.target表示当sockets.target启动时启用该socket。 # # 该配置文件的作用是为Docker提供API访问的通道它监听在/var/run/docker.sock上具有root用户权限但只接受docker用户组的成员的连接并且其他用户无法访问。这样只有docker用户组的成员可以通过该socket与Docker守护进程进行通信。 2.2.5 配置加速器 # 配置加速器 mkdir /etc/docker/ -pv cat /etc/docker/daemon.json EOF {exec-opts: [native.cgroupdriversystemd],registry-mirrors: [https://docker.mirrors.ustc.edu.cn/],max-concurrent-downloads: 10,log-driver: json-file,log-level: warn,log-opts: {max-size: 10m,max-file: 3},data-root: /var/lib/docker } EOF# 该参数文件中包含以下参数 # # 1. exec-opts: 用于设置Docker守护进程的选项native.cgroupdriversystemd表示使用systemd作为Cgroup驱动程序。 # 2. registry-mirrors: 用于指定Docker镜像的镜像注册服务器。在这里有三个镜像注册服务器https://docker.m.daocloud.io、https://docker.mirrors.ustc.edu.cn和http://hub-mirror.c.163.com。 # 3. max-concurrent-downloads: 用于设置同时下载镜像的最大数量默认值为3这里设置为10。 # 4. log-driver: 用于设置Docker守护进程的日志驱动程序这里设置为json-file。 # 5. log-level: 用于设置日志的级别这里设置为warn。 # 6. log-opts: 用于设置日志驱动程序的选项这里有两个选项max-size和max-file。max-size表示每个日志文件的最大大小这里设置为10mmax-file表示保存的最大日志文件数量这里设置为3。 # 7. data-root: 用于设置Docker守护进程的数据存储根目录默认为/var/lib/docker这里设置为/var/lib/docker。 2.2.6 启动docker groupadd docker #创建docker组systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now docker.socket # 启用并立即启动docker.socket单元。docker.socket是一个systemd的socket单元用于接收来自网络的Docker API请求。systemctl enable --now docker.service # 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。systemctl stop docker.service # 停止运行中的docker.service单元即停止Docker守护进程。systemctl start docker.service # 启动docker.service单元即启动Docker守护进程。systemctl restart docker.service # 重启docker.service单元即重新启动Docker守护进程。systemctl status docker.service # 显示docker.service单元的当前状态包括运行状态、是否启用等信息。docker info #验证2.2.7 解压cri-docker # 由于1.24以及更高版本不支持docker所以安装cri-docker # 下载cri-docker # https://github.com/Mirantis/cri-dockerd/releases/ # wget https://ghproxy.com/https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz# 解压cri-docker tar xvf cri-dockerd-*.amd64.tgz cp -r cri-dockerd/ /usr/bin/ chmod x /usr/bin/cri-dockerd/cri-dockerd2.2.8 写入启动cri-docker配置文件 # 写入启动配置文件 cat /usr/lib/systemd/system/cri-docker.service EOF [Unit] DescriptionCRI Interface for Docker Application Container Engine Documentationhttps://docs.mirantis.com Afternetwork-online.target firewalld.service docker.service Wantsnetwork-online.target Requirescri-docker.socket[Service] Typenotify ExecStart/usr/bin/cri-dockerd/cri-dockerd --network-plugincni --pod-infra-container-imageregistry.aliyuncs.com/google_containers/pause:3.7 ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways StartLimitBurst3 StartLimitInterval60s LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess[Install] WantedBymulti-user.target EOF# [Unit] # - Description该参数用于描述该单元的功能这里描述的是CRI与Docker应用容器引擎的接口。 # - Documentation该参数指定了相关文档的网址供用户参考。 # - After该参数指定了此单元应该在哪些其他单元之后启动确保在网络在线、防火墙和Docker服务启动之后再启动此单元。 # - Wants该参数指定了此单元希望也启动的所有单元此处是希望在网络在线之后启动。 # - Requires该参数指定了此单元需要依赖的单元此处是cri-docker.socket单元。 # # [Service] # - Type该参数指定了服务的类型这里是notify表示当服务启动完成时向系统发送通知。 # - ExecStart该参数指定了将要运行的命令和参数此处是执行/usr/bin/cri-dockerd/cri-dockerd命令并指定了网络插件为cni和Pod基础设施容器的镜像为registry.aliyuncs.com/google_containers/pause:3.7。 # - ExecReload该参数指定在服务重载时运行的命令此处是发送HUP信号给主进程。 # - TimeoutSec该参数指定了服务启动的超时时间此处为0表示无限制。 # - RestartSec该参数指定了自动重启服务的时间间隔此处为2秒。 # - Restart该参数指定了在服务发生错误时自动重启此处是始终重启。 # - StartLimitBurst该参数指定了在给定时间间隔内允许的启动失败次数此处为3次。 # - StartLimitInterval该参数指定启动失败的时间间隔此处为60秒。 # - LimitNOFILE该参数指定了允许打开文件的最大数量此处为无限制。 # - LimitNPROC该参数指定了允许同时运行的最大进程数此处为无限制。 # - LimitCORE该参数指定了允许生成的core文件的最大大小此处为无限制。 # - TasksMax该参数指定了此服务的最大任务数此处为无限制。 # - Delegate该参数指定了是否将控制权委托给指定服务此处为是。 # - KillMode该参数指定了在终止服务时如何处理进程此处是通过终止进程来终止服务。 # # [Install] # - WantedBy该参数指定了希望这个单元启动的多用户目标。在这里这个单元希望在multi-user.target启动。2.2.9 写入cri-docker的socket配置文件 # 写入socket配置文件 cat /usr/lib/systemd/system/cri-docker.socket EOF [Unit] DescriptionCRI Docker Socket for the API PartOfcri-docker.service[Socket] ListenStream%t/cri-dockerd.sock SocketMode0660 SocketUserroot SocketGroupdocker[Install] WantedBysockets.target EOF# 该配置文件是用于systemd的单元配置文件(unit file)用于定义一个socket单元。 # # [Unit] # - Description表示该单元的描述信息。 # - PartOf表示该单元是cri-docker.service的一部分。 # # [Socket] # - ListenStream指定了该socket要监听的地址和端口这里使用了%t占位符表示根据单元的类型来决定路径。%t/cri-dockerd.sock表示将监听Unix域套接字cri-dockerd.sock。Unix域套接字用于在同一台主机上的进程之间通信。 # - SocketMode指定了socket文件的权限模式此处为0660即用户和用户组有读写权限其他用户无权限。 # - SocketUser指定了socket文件的所有者此处为root用户。 # - SocketGroup指定了socket文件的所属用户组此处为docker用户组。 # # [Install] # - WantedBy部分定义了该单元的安装配置信息。WantedBysockets.target表示当sockets.target单元启动时自动启动该socket单元。sockets.target是一个系统服务用于管理所有的socket单元。2.2.10 启动cri-docker systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now cri-docker.service # 启用并立即启动cri-docker.service单元。cri-docker.service是cri-docker守护进程的systemd服务单元。systemctl restart cri-docker.service # 重启cri-docker.service单元即重新启动cri-docker守护进程。systemctl status docker.service # 显示docker.service单元的当前状态包括运行状态、是否启用等信息。2.3.k8s与etcd下载及安装仅在master01操作 2.3.1 解压k8s安装包 # 下载安装包 # wget https://ghproxy.com/https://github.com/etcd-io/etcd/releases/download/v3.5.9/etcd-v3.5.9-linux-amd64.tar.gz # wget https://storage.googleapis.com/kubernetes-release/release/v1.28.0/kubernetes-server-linux-amd64.tar.gz# 解压k8s安装文件 cd ~/lzb tar -xf kubernetes-server-linux-amd64.tar.gz --strip-components3 -C /usr/local/bin kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}# 这是一个tar命令用于解压指定的kubernetes-server-linux-amd64.tar.gz文件并将其中的特定文件提取到/usr/local/bin目录下。 # # 命令的解释如下 # - tar用于处理tar压缩文件的命令。 # - -xf表示解压操作。 # - kubernetes-server-linux-amd64.tar.gz要解压的文件名。 # - --strip-components3表示解压时忽略压缩文件中的前3级目录结构提取文件时直接放到目标目录中。 # - -C /usr/local/bin指定提取文件的目标目录为/usr/local/bin。 # - kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}要解压和提取的文件名模式用花括号括起来表示模式中的多个可能的文件名。 # # 总的来说这个命令的作用是将kubernetes-server-linux-amd64.tar.gz文件中的kubelet、kubectl、kube-apiserver、kube-controller-manager、kube-scheduler和kube-proxy六个文件提取到/usr/local/bin目录下同时忽略文件路径中的前三级目录结构。# 解压etcd安装文件 tar -xf etcd*.tar.gz mv etcd-*/etcd /usr/local/bin/ mv etcd-*/etcdctl /usr/local/bin/# 这是一个将文件解压并移动到特定目录的命令。这是一个用于 Linux 系统中的命令。 # # - tar -xf etcd*.tar.gz这个命令将解压以 etcd 开头并以.tar.gz 结尾的文件。-xf 是使用 tar 命令的选项它表示解压文件并展开其中的内容。 # - mv etcd-*/etcd /usr/local/bin/这个命令将 etcd 文件移动到 /usr/local/bin 目录。mv 是移动命令它将 etcd-*/etcd 路径下的 etcd 文件移动到了 /usr/local/bin 目录。 # - mv etcd-*/etcdctl /usr/local/bin/这个命令将 etcdctl 文件移动到 /usr/local/bin 目录和上一条命令类似。 # # 总结起来以上命令将从名为 etcd*.tar.gz 的压缩文件中解压出 etcd 和 etcdctl 文件并将它们移动到 /usr/local/bin 目录中。# 查看/usr/local/bin下内容 ls /usr/local/bin/ containerd crictl etcdctl kube-proxy containerd-shim critest kube-apiserver kube-scheduler containerd-shim-runc-v1 ctd-decoder kube-controller-manager containerd-shim-runc-v2 ctr kubectl containerd-stress etcd kubelet2.3.2 查看版本 [rootk8s-master01 ~]# kubelet --version Kubernetes v1.28.0 [rootk8s-master01 ~]# etcdctl version etcdctl version: 3.5.9 API version: 3.5 [rootk8s-master01 ~]# 2.3.3 将组件发送至其他k8s节点 Masterk8s-master02 k8s-master03 Workk8s-node01 k8s-node02# 拷贝master组件提示输入yes for NODE in $Master; do echo $NODE; scp /usr/local/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy} $NODE:/usr/local/bin/; scp /usr/local/bin/etcd* $NODE:/usr/local/bin/; done# 该命令是一个for循环对于在$Master变量中的每个节点执行以下操作 # # 1. 打印出节点的名称。 # 2. 使用scp命令将/usr/local/bin/kubelet、kubectl、kube-apiserver、kube-controller-manager、kube-scheduler和kube-proxy文件复制到节点的/usr/local/bin/目录下。 # 3. 使用scp命令将/usr/local/bin/etcd*文件复制到节点的/usr/local/bin/目录下。# 拷贝work组件提示输入yes for NODE in $Work; do echo $NODE; scp /usr/local/bin/kube{let,-proxy} $NODE:/usr/local/bin/ ; done # 该命令是一个for循环对于在$Master变量中的每个节点执行以下操作 # # 1. 打印出节点的名称。 # 2. 使用scp命令将/usr/local/bin/kubelet和kube-proxy文件复制到节点的/usr/local/bin/目录下。2.3 创建证书相关文件(获取打包后文件的tar包) # 请查看Github仓库 或者进行获取已经打好的包(下载下来是所有的准备好的文件省去你一个个下载) https://github.com/cby-chen/Kubernetes/ https://github.com/cby-chen/Kubernetes/tags https://github.com/cby-chen/Kubernetes/releases/download/v1.27.3/kubernetes-v1.27.3.tar3.相关证书生成 master01节点执行 # master01节点下载证书生成工具 # wget https://ghproxy.com/https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl_1.6.4_linux_amd64 -O /usr/local/bin/cfssl # wget https://ghproxy.com/https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssljson_1.6.4_linux_amd64 -O /usr/local/bin/cfssljson# 软件包内有 cp cfssl_*_linux_amd64 /usr/local/bin/cfssl cp cfssljson_*_linux_amd64 /usr/local/bin/cfssljson# 添加执行权限 chmod x /usr/local/bin/cfssl /usr/local/bin/cfssljson3.1.生成etcd证书 3.1.1 所有master节点创建证书存放目录 mkdir /etc/etcd/ssl -p3.1.2 master01节点生成etcd证书 # 写入生成证书所需的配置文件 cat ca-config.json EOF {signing: {default: {expiry: 876000h},profiles: {kubernetes: {usages: [signing,key encipherment,server auth,client auth],expiry: 876000h}}} } EOF # 这段配置文件是用于配置加密和认证签名的一些参数。 # # 在这里有两个部分signing和profiles。 # # signing包含了默认签名配置和配置文件。 # 默认签名配置default指定了证书的过期时间为876000h。876000h表示证书有效期为100年。 # # profiles部分定义了不同的证书配置文件。 # 在这里只有一个配置文件kubernetes。它包含了以下usages和过期时间expiry # # 1. signing用于对其他证书进行签名 # 2. key encipherment用于加密和解密传输数据 # 3. server auth用于服务器身份验证 # 4. client auth用于客户端身份验证 # # 对于kubernetes配置文件证书的过期时间也是876000h即100年。cat etcd-ca-csr.json EOF {CN: etcd,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: etcd,OU: Etcd Security}],ca: {expiry: 876000h} } EOF # 这是一个用于生成证书签名请求Certificate Signing RequestCSR的JSON配置文件。JSON配置文件指定了生成证书签名请求所需的数据。 # # - CN: etcd 指定了希望生成的证书的CN字段Common Name即证书的主题通常是该证书标识的实体的名称。 # - key: {} 指定了生成证书所使用的密钥的配置信息。algo: rsa 指定了密钥的算法为RSAsize: 2048 指定了密钥的长度为2048位。 # - names: [] 包含了生成证书时所需的实体信息。在这个例子中只包含了一个实体其相关信息如下 # - C: CN 指定了实体的国家/地区代码这里是中国。 # - ST: Beijing 指定了实体所在的省/州。 # - L: Beijing 指定了实体所在的城市。 # - O: etcd 指定了实体的组织名称。 # - OU: Etcd Security 指定了实体所属的组织单位。 # - ca: {} 指定了生成证书时所需的CACertificate Authority配置信息。 # - expiry: 876000h 指定了证书的有效期这里是876000小时。 # # 生成证书签名请求时可以使用这个JSON配置文件作为输入根据配置文件中的信息生成相应的CSR文件。然后可以将CSR文件发送给CA进行签名以获得有效的证书。# 生成etcd证书和etcd证书的key如果你觉得以后可能会扩容可以在ip那多写几个预留出来 # 若没有IPv6 可删除可保留 cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare /etc/etcd/ssl/etcd-ca # 具体的解释如下 # # cfssl是一个用于生成TLS/SSL证书的工具它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。 # # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA证书颁发机构。CA是用于签发其他证书的根证书。etcd-ca-csr.json是一个JSON格式的配置文件其中包含了CA的详细信息如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。 # # | 符号表示将上一个命令的输出作为下一个命令的输入。 # # cfssljson是cfssl工具的一个子命令用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书即只生成证书文件不包含其他格式的文件。/etc/etcd/ssl/etcd-ca是指定生成的证书文件的路径和名称。 # # 所以这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书并将证书文件保存在/etc/etcd/ssl/etcd-ca路径下。cat etcd-csr.json EOF {CN: etcd,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: etcd,OU: Etcd Security}] } EOF # 这段代码是一个JSON格式的配置文件用于生成一个证书签名请求Certificate Signing RequestCSR。 # # 首先CN字段指定了该证书的通用名称Common Name这里设为etcd。 # # 接下来key字段指定了密钥的算法algo字段和长度size字段此处使用的是RSA算法密钥长度为2048位。 # # 最后names字段是一个数组其中包含了一个名字对象用于指定证书中的一些其他信息。这个名字对象包含了以下字段 # - C字段指定了国家代码Country这里设置为CN。 # - ST字段指定了省份State或地区这里设置为Beijing。 # - L字段指定了城市Locality这里设置为Beijing。 # - O字段指定了组织Organization这里设置为etcd。 # - OU字段指定了组织单元Organizational Unit这里设置为Etcd Security。 # # 这些字段将作为证书的一部分用于标识和验证证书的使用范围和颁发者等信息。cfssl gencert \-ca/etc/etcd/ssl/etcd-ca.pem \-ca-key/etc/etcd/ssl/etcd-ca-key.pem \-configca-config.json \-hostname127.0.0.1,k8s-master01,k8s-master02,k8s-master03,192.168.0.31,192.168.0.32,192.168.0.33 \-profilekubernetes \etcd-csr.json | cfssljson -bare /etc/etcd/ssl/etcd # 这是一条使用cfssl生成etcd证书的命令下面是各个参数的解释 # # -ca/etc/etcd/ssl/etcd-ca.pem指定用于签名etcd证书的CA文件的路径。 # -ca-key/etc/etcd/ssl/etcd-ca-key.pem指定用于签名etcd证书的CA私钥文件的路径。 # -configca-config.json指定CA配置文件的路径该文件定义了证书的有效期、加密算法等设置。 # -hostnamexxxx指定要为etcd生成证书的主机名和IP地址列表。 # -profilekubernetes指定使用的证书配置文件该文件定义了证书的用途和扩展属性。 # etcd-csr.json指定etcd证书请求的JSON文件的路径该文件包含了证书请求的详细信息。 # | cfssljson -bare /etc/etcd/ssl/etcd通过管道将cfssl命令的输出传递给cfssljson命令并使用-bare参数指定输出文件的前缀路径这里将生成etcd证书的.pem和-key.pem文件。 # # 这条命令的作用是使用指定的CA证书和私钥根据证书请求的JSON文件和配置文件生成etcd的证书文件。3.1.3 将证书复制到其他节点 master01节点操作 Masterk8s-master02 k8s-master03 for NODE in $Master; do ssh $NODE mkdir -p /etc/etcd/ssl; for FILE in etcd-ca-key.pem etcd-ca.pem etcd-key.pem etcd.pem; do scp /etc/etcd/ssl/${FILE} $NODE:/etc/etcd/ssl/${FILE}; done; done# 这个命令是一个简单的for循环在一个由$Master存储的主机列表中迭代执行。对于每个主机它使用ssh命令登录到主机并在远程主机上创建一个名为/etc/etcd/ssl的目录如果不存在。接下来它使用scp将本地主机上/etc/etcd/ssl目录中的四个文件etcd-ca-key.pemetcd-ca.pemetcd-key.pem和etcd.pem复制到远程主机的/etc/etcd/ssl目录中。最终的结果是远程主机上的/etc/etcd/ssl目录中包含与本地主机上相同的四个文件的副本。3.2.生成k8s相关证书 3.2.1 所有k8s节点(masterslave节点)创建证书存放目录 mkdir -p /etc/kubernetes/pki3.2.2 master01节点生成k8s证书 # 写入生成证书所需的配置文件 cat ca-csr.json EOF {CN: kubernetes,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: Kubernetes,OU: Kubernetes-manual}],ca: {expiry: 876000h} } EOF # 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息 # # - CNCommonName即用于标识证书的通用名称。在此配置中CN 设置为 kubernetes表示该证书是用于 Kubernetes。 # - key用于生成证书的算法和大小。在此配置中使用的算法是 RSA大小是 2048 位。 # - names用于证书中的名称字段的详细信息。在此配置中有以下字段信息 # - CCountry即国家。在此配置中设置为 CN。 # - STState即省/州。在此配置中设置为 Beijing。 # - LLocality即城市。在此配置中设置为 Beijing。 # - OOrganization即组织。在此配置中设置为 Kubernetes。 # - OUOrganization Unit即组织单位。在此配置中设置为 Kubernetes-manual。 # - ca用于证书签名的证书颁发机构CA的配置信息。在此配置中设置了证书的有效期为 876000 小时。 # # 这个配置文件可以用于生成 Kubernetes 相关的证书以确保集群中的通信安全性。cfssl gencert -initca ca-csr.json | cfssljson -bare /etc/kubernetes/pki/ca# 具体的解释如下 # # cfssl是一个用于生成TLS/SSL证书的工具它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。 # # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA证书颁发机构。CA是用于签发其他证书的根证书。ca-csr.json是一个JSON格式的配置文件其中包含了CA的详细信息如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。 # # | 符号表示将上一个命令的输出作为下一个命令的输入。 # # cfssljson是cfssl工具的一个子命令用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书即只生成证书文件不包含其他格式的文件。/etc/kubernetes/pki/ca是指定生成的证书文件的路径和名称。 # # 所以这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书并将证书文件保存在/etc/kubernetes/pki/ca路径下。cat apiserver-csr.json EOF {CN: kube-apiserver,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: Kubernetes,OU: Kubernetes-manual}] } EOF# 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息 # # - CN 字段指定了证书的通用名称 (Common Name)这里设置为 kube-apiserver表示该证书用于 Kubernetes API Server。 # - key 字段指定了生成证书时所选用的加密算法和密钥长度。这里选用了 RSA 算法密钥长度为 2048 位。 # - names 字段包含了一组有关证书持有者信息的项。这里使用了以下信息 # - C 表示国家代码 (Country)这里设置为 CN 表示中国。 # - ST 表示州或省份 (State)这里设置为 Beijing 表示北京市。 # - L 表示城市或地区 (Location)这里设置为 Beijing 表示北京市。 # - O 表示组织名称 (Organization)这里设置为 Kubernetes 表示 Kubernetes。 # - OU 表示组织单位 (Organizational Unit)这里设置为 Kubernetes-manual 表示手动管理的 Kubernetes 集群。 # # 这个配置文件可以用于生成 Kubernetes 相关的证书以确保集群中的通信安全性。# 生成一个根证书 多写了一些IP作为预留IP为将来添加node做准备 # 10.96.0.1是service网段的第一个地址需要计算192.168.0.36为高可用vip地址 # 若没有IPv6 可删除可保留 cfssl gencert \ -ca/etc/kubernetes/pki/ca.pem \ -ca-key/etc/kubernetes/pki/ca-key.pem \ -configca-config.json \ -hostname10.96.0.1,192.168.0.36,127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local,192.168.0.31,192.168.0.32,192.168.0.33,192.168.0.34,192.168.0.35,192.168.0.36,192.168.0.37,192.168.0.38,192.168.0.39 \ -profilekubernetes apiserver-csr.json | cfssljson -bare /etc/kubernetes/pki/apiserver# 这个命令是使用cfssl工具生成Kubernetes API Server的证书。 # # 命令的参数解释如下 # - -ca/etc/kubernetes/pki/ca.pem指定证书的颁发机构CA文件路径。 # - -ca-key/etc/kubernetes/pki/ca-key.pem指定证书的颁发机构CA私钥文件路径。 # - -configca-config.json指定证书生成的配置文件路径配置文件中包含了证书的有效期、加密算法等信息。 # - -hostname10.96.0.1,192.168.0.36,127.0.0.1,fc00:43f4:1eea:1::10指定证书的主机名或IP地址列表。 # - -profilekubernetes指定证书生成的配置文件中的配置文件名。 # - apiserver-csr.jsonAPI Server的证书签名请求配置文件路径。 # - | cfssljson -bare /etc/kubernetes/pki/apiserver通过管道将生成的证书输出到cfssljson工具将其转换为PEM编码格式并保存到 /etc/kubernetes/pki/apiserver.pem 和 /etc/kubernetes/pki/apiserver-key.pem 文件中。 # # 最终这个命令将会生成API Server的证书和私钥并保存到指定的文件中。 3.2.3 master01节点生成apiserver聚合证书 cat front-proxy-ca-csr.json EOF {CN: kubernetes,key: {algo: rsa,size: 2048},ca: {expiry: 876000h} } EOF# 这个JSON文件表示了生成一个名为kubernetes的证书的配置信息。这个证书是用来进行Kubernetes集群的身份验证和安全通信。 # # 配置信息包括以下几个部分 # # 1. CN: kubernetes这表示了证书的通用名称Common Name也就是证书所代表的实体的名称。在这里证书的通用名称被设置为kubernetes表示这个证书是用来代表Kubernetes集群。 # # 2. key这是用来生成证书的密钥相关的配置。在这里配置使用了RSA算法并且设置了密钥的大小为2048位。 # # 3. ca这个字段指定了证书的颁发机构Certificate Authority相关的配置。在这里配置指定了证书的有效期为876000小时即100年。这意味着该证书在100年内将被视为有效过期后需要重新生成。 # # 总之这个JSON文件中的配置信息描述了如何生成一个用于Kubernetes集群的证书包括证书的通用名称、密钥算法和大小以及证书的有效期。cfssl gencert -initca front-proxy-ca-csr.json | cfssljson -bare /etc/kubernetes/pki/front-proxy-ca # 具体的解释如下 # # cfssl是一个用于生成TLS/SSL证书的工具它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。 # # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA证书颁发机构。CA是用于签发其他证书的根证书。front-proxy-ca-csr.json是一个JSON格式的配置文件其中包含了CA的详细信息如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。 # # | 符号表示将上一个命令的输出作为下一个命令的输入。 # # cfssljson是cfssl工具的一个子命令用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书即只生成证书文件不包含其他格式的文件。/etc/kubernetes/pki/front-proxy-ca是指定生成的证书文件的路径和名称。 # # 所以这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书并将证书文件保存在/etc/kubernetes/pki/front-proxy-ca路径下。cat front-proxy-client-csr.json EOF {CN: front-proxy-client,key: {algo: rsa,size: 2048} } EOF# 这是一个JSON格式的配置文件用于描述一个名为front-proxy-client的配置。配置包括两个字段CN和key。 # # - CNCommon Name字段表示证书的通用名称这里为front-proxy-client。 # - key字段描述了密钥的算法和大小。algo表示使用RSA算法size表示密钥大小为2048位。 # # 该配置文件用于生成一个SSL证书用于在前端代理客户端进行认证和数据传输的加密。这个证书中的通用名称是front-proxy-client使用RSA算法生成密钥大小为2048位。cfssl gencert \ -ca/etc/kubernetes/pki/front-proxy-ca.pem \ -ca-key/etc/kubernetes/pki/front-proxy-ca-key.pem \ -configca-config.json \ -profilekubernetes front-proxy-client-csr.json | cfssljson -bare /etc/kubernetes/pki/front-proxy-client# 这个命令使用cfssl工具生成一个用于Kubernetes的front-proxy-client证书。 # # 主要参数解释如下 # - -ca/etc/kubernetes/pki/front-proxy-ca.pem: 指定用于签署证书的根证书文件路径。 # - -ca-key/etc/kubernetes/pki/front-proxy-ca-key.pem: 指定用于签署证书的根证书的私钥文件路径。 # - -configca-config.json: 指定用于配置证书签署的配置文件路径。该配置文件描述了证书生成的一些规则如加密算法和有效期等。 # - -profilekubernetes: 指定生成证书时使用的配置文件中定义的profile其中包含了一些默认的参数。 # - front-proxy-client-csr.json: 指定用于生成证书的CSR文件路径该文件包含了证书请求的相关信息。 # - | cfssljson -bare /etc/kubernetes/pki/front-proxy-client: 通过管道将生成的证书输出到cfssljson工具进行解析并通过-bare参数将证书和私钥分别保存到指定路径。 # # 这个命令的作用是根据提供的CSR文件和配置信息使用指定的根证书和私钥生成一个前端代理客户端的证书并将证书和私钥分别保存到/etc/kubernetes/pki/front-proxy-client.pem和/etc/kubernetes/pki/front-proxy-client-key.pem文件中。3.2.4 master01节点生成controller-manage的证书 在《5.高可用配置》选择使用那种高可用方案 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:9443 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443 cat manager-csr.json EOF {CN: system:kube-controller-manager,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: system:kube-controller-manager,OU: Kubernetes-manual}] } EOF # 这是一个用于生成密钥对公钥和私钥的JSON配置文件。下面是针对该文件中每个字段的详细解释 # # - CN: 值为system:kube-controller-manager代表通用名称Common Name是此密钥对的主题subject。 # - key: 这个字段用来定义密钥算法和大小。 # - algo: 值为rsa表示使用RSA算法。 # - size: 值为2048表示生成的密钥大小为2048位。 # - names: 这个字段用来定义密钥对的各个名称字段。 # - C: 值为CN表示国家Country名称是CN中国。 # - ST: 值为Beijing表示省/州State/Province名称是Beijing北京。 # - L: 值为Beijing表示城市Locality名称是Beijing北京。 # - O: 值为system:kube-controller-manager表示组织Organization名称是system:kube-controller-manager。 # - OU: 值为Kubernetes-manual表示组织单位Organizational Unit名称是Kubernetes-manual。 # # 这个JSON配置文件基本上是告诉生成密钥对的工具生成一个带有特定名称和属性的密钥对。cfssl gencert \-ca/etc/kubernetes/pki/ca.pem \-ca-key/etc/kubernetes/pki/ca-key.pem \-configca-config.json \-profilekubernetes \manager-csr.json | cfssljson -bare /etc/kubernetes/pki/controller-manager # 这是一个命令行操作使用cfssl工具生成证书。 # # 1. cfssl gencert 是cfssl工具的命令用于生成证书。 # 2. -ca 指定根证书的路径和文件名这里是/etc/kubernetes/pki/ca.pem。 # 3. -ca-key 指定根证书的私钥的路径和文件名这里是/etc/kubernetes/pki/ca-key.pem。 # 4. -config 指定配置文件的路径和文件名这里是ca-config.json。 # 5. -profile 指定证书使用的配置文件中的配置模板这里是kubernetes。 # 6. manager-csr.json 是证书签发请求的配置文件用于生成证书签发请求。 # 7. | 管道操作符将前一条命令的输出作为后一条命令的输入。 # 8. cfssljson -bare 是 cfssl 工具的命令作用是将证书签发请求的输出转换为PKCS1、PKCS8和x509 PEM文件。 # 9. /etc/kubernetes/pki/controller-manager 是转换后的 PEM 文件的存储位置和文件名。 # # 这个命令的作用是根据根证书和私钥、配置文件以及证书签发请求的配置文件生成经过签发的控制器管理器证书和私钥并将转换后的 PEM 文件保存到指定的位置。# 设置一个集群项 # 在《5.高可用配置》选择使用那种高可用方案 # 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 # 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443 kubectl config set-cluster kubernetes \--certificate-authority/etc/kubernetes/pki/ca.pem \--embed-certstrue \--serverhttps://127.0.0.1:8443 \--kubeconfig/etc/kubernetes/controller-manager.kubeconfig # kubectl config set-cluster命令用于配置集群信息。 # --certificate-authority选项指定了集群的证书颁发机构CA的路径这个CA会验证kube-apiserver提供的证书是否合法。 # --embed-certs选项用于将证书嵌入到生成的kubeconfig文件中这样就不需要在kubeconfig文件中单独指定证书文件路径。 # --server选项指定了kube-apiserver的地址这里使用的是127.0.0.1:8443表示使用本地主机上的kube-apiserver默认端口为8443。 # --kubeconfig选项指定了生成的kubeconfig文件的路径和名称这里指定为/etc/kubernetes/controller-manager.kubeconfig。 # 综上所述kubectl config set-cluster命令的作用是在kubeconfig文件中设置集群信息包括证书颁发机构、证书、kube-apiserver地址等。# 设置一个环境项一个上下文 kubectl config set-context system:kube-controller-managerkubernetes \--clusterkubernetes \--usersystem:kube-controller-manager \--kubeconfig/etc/kubernetes/controller-manager.kubeconfig # 这个命令用于配置 Kubernetes 控制器管理器的上下文信息。下面是各个参数的详细解释 # 1. kubectl config set-context system:kube-controller-managerkubernetes: 设置上下文的名称为 system:kube-controller-managerkubernetes这是一个标识符用于唯一标识该上下文。 # 2. --clusterkubernetes: 指定集群的名称为 kubernetes这是一个现有集群的标识符表示要管理的 Kubernetes 集群。 # 3. --usersystem:kube-controller-manager: 指定使用的用户身份为 system:kube-controller-manager。这是一个特殊的用户身份具有控制 Kubernetes 控制器管理器的权限。 # 4. --kubeconfig/etc/kubernetes/controller-manager.kubeconfig: 指定 kubeconfig 文件的路径为 /etc/kubernetes/controller-manager.kubeconfig。kubeconfig 文件是一个用于管理 Kubernetes 配置的文件包含了集群、用户和上下文的相关信息。 # 通过运行这个命令可以将这些配置信息保存到 /etc/kubernetes/controller-manager.kubeconfig 文件中以便在后续的操作中使用。# 设置一个用户项 kubectl config set-credentials system:kube-controller-manager \--client-certificate/etc/kubernetes/pki/controller-manager.pem \--client-key/etc/kubernetes/pki/controller-manager-key.pem \--embed-certstrue \--kubeconfig/etc/kubernetes/controller-manager.kubeconfig # 上述命令是用于设置 Kubernetes 的 controller-manager 组件的客户端凭据。下面是每个参数的详细解释 # # - kubectl config: 是使用 kubectl 命令行工具的配置子命令。 # - set-credentials: 是定义一个新的用户凭据配置的子命令。 # - system:kube-controller-manager: 是设置用户凭据的名称system: 是 Kubernetes API Server 内置的身份验证器使用的用户标识符前缀它表示是一个系统用户在本例中是 kube-controller-manager 组件使用的身份。 # - --client-certificate/etc/kubernetes/pki/controller-manager.pem: 指定 controller-manager.pem 客户端证书的路径。 # - --client-key/etc/kubernetes/pki/controller-manager-key.pem: 指定 controller-manager-key.pem 客户端私钥的路径。 # - --embed-certstrue: 表示将证书和私钥直接嵌入到生成的 kubeconfig 文件中而不是通过引用外部文件。 # - --kubeconfig/etc/kubernetes/controller-manager.kubeconfig: 指定生成的 kubeconfig 文件的路径和文件名即 controller-manager.kubeconfig。 # # 通过运行上述命令将根据提供的证书和私钥信息为 kube-controller-manager 创建一个 kubeconfig 文件以便后续使用该文件进行身份验证和访问 Kubernetes API。# 设置默认环境 kubectl config use-context system:kube-controller-managerkubernetes \--kubeconfig/etc/kubernetes/controller-manager.kubeconfig # 这个命令是用来指定kubectl使用指定的上下文环境来执行操作。上下文环境是kubectl用来确定要连接到哪个Kubernetes集群以及使用哪个身份验证信息的配置。 # # 在这个命令中kubectl config use-context是用来设置当前上下文环境的命令。 system:kube-controller-managerkubernetes是指定的上下文名称它告诉kubectl要使用的Kubernetes集群和身份验证信息。 # --kubeconfig/etc/kubernetes/controller-manager.kubeconfig是用来指定使用的kubeconfig文件的路径。kubeconfig文件是存储集群连接和身份验证信息的配置文件。 # 通过执行这个命令kubectl将使用指定的上下文来执行后续的操作包括部署和管理Kubernetes资源。 3.2.5 master01节点生成kube-scheduler的证书 cat scheduler-csr.json EOF {CN: system:kube-scheduler,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: system:kube-scheduler,OU: Kubernetes-manual}] } EOF # 这个命令是用来创建一个叫做scheduler-csr.json的文件并将其中的内容赋值给该文件。 # # 文件内容是一个JSON格式的文本包含了一个描述证书请求的结构。 # # 具体内容如下 # # - CN: system:kube-schedulerCommon Name字段表示该证书的名称为system:kube-scheduler。 # - key: {algo: rsa, size: 2048}key字段指定生成证书时使用的加密算法是RSA并且密钥的长度为2048位。 # - names: [...]names字段定义了证书中的另外一些标识信息。 # - C: CNCountry字段表示国家/地区为中国。 # - ST: BeijingState字段表示省/市为北京。 # - L: BeijingLocality字段表示所在城市为北京。 # - O: system:kube-schedulerOrganization字段表示组织为system:kube-scheduler。 # - OU: Kubernetes-manualOrganizational Unit字段表示组织单元为Kubernetes-manual。 # # 而EOF是一个占位符用于标记开始和结束的位置。在开始的EOF之后到结束的EOF之间的内容将会被写入到scheduler-csr.json文件中。 # # 总体来说这个命令用于生成一个描述kube-scheduler证书请求的JSON文件。cfssl gencert \-ca/etc/kubernetes/pki/ca.pem \-ca-key/etc/kubernetes/pki/ca-key.pem \-configca-config.json \-profilekubernetes \scheduler-csr.json | cfssljson -bare /etc/kubernetes/pki/scheduler # 上述命令是使用cfssl工具生成Kubernetes Scheduler的证书。 # # 具体解释如下 # # 1. cfssl gencert使用cfssl工具生成证书。 # 2. -ca/etc/kubernetes/pki/ca.pem指定根证书文件的路径。在这里是指定根证书的路径为/etc/kubernetes/pki/ca.pem。 # 3. -ca-key/etc/kubernetes/pki/ca-key.pem指定根证书私钥文件的路径。在这里是指定根证书私钥的路径为/etc/kubernetes/pki/ca-key.pem。 # 4. -configca-config.json指定证书配置文件的路径。在这里是指定证书配置文件的路径为ca-config.json。 # 5. -profilekubernetes指定证书的配置文件中的一个配置文件模板。在这里是指定配置文件中的kubernetes配置模板。 # 6. scheduler-csr.json指定Scheduler的证书签名请求文件CSR的路径。在这里是指定请求文件的路径为scheduler-csr.json。 # 7. |管道符号将前一个命令的输出作为下一个命令的输入。 # 8. cfssljson将cfssl工具生成的证书签名请求(CSR)进行解析。 # 9. -bare /etc/kubernetes/pki/scheduler指定输出路径和前缀。在这里是将解析的证书签名请求生成以下文件/etc/kubernetes/pki/scheduler.pem包含了证书、/etc/kubernetes/pki/scheduler-key.pem包含了私钥。 # # 总结来说这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。# 在《5.高可用配置》选择使用那种高可用方案 # 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 # 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443kubectl config set-cluster kubernetes \--certificate-authority/etc/kubernetes/pki/ca.pem \--embed-certstrue \--serverhttps://127.0.0.1:8443 \--kubeconfig/etc/kubernetes/scheduler.kubeconfig # 该命令用于配置一个名为kubernetes的集群并将其应用到/etc/kubernetes/scheduler.kubeconfig文件中。 # # 该命令的解释如下 # - kubectl config set-cluster kubernetes: 设置一个集群并命名为kubernetes。 # - --certificate-authority/etc/kubernetes/pki/ca.pem: 指定集群使用的证书授权机构的路径。 # - --embed-certstrue: 该标志指示将证书嵌入到生成的kubeconfig文件中。 # - --serverhttps://127.0.0.1:8443: 指定集群的 API server 位置。 # - --kubeconfig/etc/kubernetes/scheduler.kubeconfig: 指定要保存 kubeconfig 文件的路径和名称。kubectl config set-credentials system:kube-scheduler \--client-certificate/etc/kubernetes/pki/scheduler.pem \--client-key/etc/kubernetes/pki/scheduler-key.pem \--embed-certstrue \--kubeconfig/etc/kubernetes/scheduler.kubeconfig # 这段命令是用于设置 kube-scheduler 组件的身份验证凭据并生成相应的 kubeconfig 文件。 # # 解释每个选项的含义如下 # - kubectl config set-credentials system:kube-scheduler设置 system:kube-scheduler 用户的身份验证凭据。 # - --client-certificate/etc/kubernetes/pki/scheduler.pem指定一个客户端证书文件用于基于证书的身份验证。在这种情况下指定了 kube-scheduler 组件的证书文件路径。 # - --client-key/etc/kubernetes/pki/scheduler-key.pem指定与客户端证书相对应的客户端私钥文件。 # - --embed-certstrue将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。 # - --kubeconfig/etc/kubernetes/scheduler.kubeconfig指定生成的 kubeconfig 文件的路径和名称。 # # 该命令的目的是为 kube-scheduler 组件生成一个 kubeconfig 文件以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件包括服务器地址、证书和秘钥等。kubectl config set-context system:kube-schedulerkubernetes \--clusterkubernetes \--usersystem:kube-scheduler \--kubeconfig/etc/kubernetes/scheduler.kubeconfig # 该命令用于设置一个名为system:kube-schedulerkubernetes的上下文具体配置如下 # # 1. --clusterkubernetes: 指定集群的名称为kubernetes这个集群是在当前的kubeconfig文件中已经定义好的。 # 2. --usersystem:kube-scheduler: 指定用户的名称为system:kube-scheduler这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权kube-scheduler组件访问Kubernetes集群的权限。 # 3. --kubeconfig/etc/kubernetes/scheduler.kubeconfig: 指定kubeconfig文件的路径为/etc/kubernetes/scheduler.kubeconfig这个文件将被用来保存上下文的配置信息。 # # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中以便后续使用该文件进行认证和授权访问Kubernetes集群。kubectl config use-context system:kube-schedulerkubernetes \--kubeconfig/etc/kubernetes/scheduler.kubeconfig # 上述命令是使用kubectl命令来配置Kubernetes集群中的调度器组件。 # # kubectl config use-context命令用于切换kubectl当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合用于确定kubectl的连接目标。下面解释这个命令的不同部分 # # - system:kube-schedulerkubernetes是一个上下文名称。它指定了使用kube-scheduler用户和kubernetes命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。 # # - --kubeconfig/etc/kubernetes/scheduler.kubeconfig用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。 # # 通过运行以上命令kubectl将使用指定的上下文和配置文件以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。3.2.6 master01节点生成admin的证书配置 cat admin-csr.json EOF {CN: admin,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: system:masters,OU: Kubernetes-manual}] } EOF # 这段代码是一个JSON格式的配置文件用于创建和配置一个名为admin的Kubernetes凭证。 # # 这个凭证包含以下字段 # # - CN: admin: 这是凭证的通用名称表示这是一个管理员凭证。 # - key: 这是一个包含证书密钥相关信息的对象。 # - algo: rsa这是使用的加密算法类型这里是RSA加密算法。 # - size: 2048这是密钥的大小这里是2048位。 # - names: 这是一个包含证书名称信息的数组。 # - C: CN这是证书的国家/地区字段这里是中国。 # - ST: Beijing这是证书的省/州字段这里是北京。 # - L: Beijing这是证书的城市字段这里是北京。 # - O: system:masters这是证书的组织字段这里是system:masters表示系统的管理员组。 # - OU: Kubernetes-manual这是证书的部门字段这里是Kubernetes-manual。 # # 通过这个配置文件创建的凭证将具有管理员权限并且可以用于管理Kubernetes集群。cfssl gencert \-ca/etc/kubernetes/pki/ca.pem \-ca-key/etc/kubernetes/pki/ca-key.pem \-configca-config.json \-profilekubernetes \admin-csr.json | cfssljson -bare /etc/kubernetes/pki/admin # 上述命令是使用cfssl工具生成Kubernetes admin的证书。 # # 具体解释如下 # # 1. cfssl gencert使用cfssl工具生成证书。 # 2. -ca/etc/kubernetes/pki/ca.pem指定根证书文件的路径。在这里是指定根证书的路径为/etc/kubernetes/pki/ca.pem。 # 3. -ca-key/etc/kubernetes/pki/ca-key.pem指定根证书私钥文件的路径。在这里是指定根证书私钥的路径为/etc/kubernetes/pki/ca-key.pem。 # 4. -configca-config.json指定证书配置文件的路径。在这里是指定证书配置文件的路径为ca-config.json。 # 5. -profilekubernetes指定证书的配置文件中的一个配置文件模板。在这里是指定配置文件中的kubernetes配置模板。 # 6. admin-csr.json指定admin的证书签名请求文件CSR的路径。在这里是指定请求文件的路径为admin-csr.json。 # 7. |管道符号将前一个命令的输出作为下一个命令的输入。 # 8. cfssljson将cfssl工具生成的证书签名请求(CSR)进行解析。 # 9. -bare /etc/kubernetes/pki/admin指定输出路径和前缀。在这里是将解析的证书签名请求生成以下文件/etc/kubernetes/pki/admin.pem包含了证书、/etc/kubernetes/pki/admin-key.pem包含了私钥。 # # 总结来说这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。# 在《5.高可用配置》选择使用那种高可用方案 # 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 # 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443kubectl config set-cluster kubernetes \--certificate-authority/etc/kubernetes/pki/ca.pem \--embed-certstrue \--serverhttps://127.0.0.1:8443 \--kubeconfig/etc/kubernetes/admin.kubeconfig # 该命令用于配置一个名为kubernetes的集群并将其应用到/etc/kubernetes/scheduler.kubeconfig文件中。 # # 该命令的解释如下 # - kubectl config set-cluster kubernetes: 设置一个集群并命名为kubernetes。 # - --certificate-authority/etc/kubernetes/pki/ca.pem: 指定集群使用的证书授权机构的路径。 # - --embed-certstrue: 该标志指示将证书嵌入到生成的kubeconfig文件中。 # - --serverhttps://127.0.0.1:8443: 指定集群的 API server 位置。 # - --kubeconfig/etc/kubernetes/admin.kubeconfig: 指定要保存 kubeconfig 文件的路径和名称。kubectl config set-credentials kubernetes-admin \--client-certificate/etc/kubernetes/pki/admin.pem \--client-key/etc/kubernetes/pki/admin-key.pem \--embed-certstrue \--kubeconfig/etc/kubernetes/admin.kubeconfig # 这段命令是用于设置 kubernetes-admin 组件的身份验证凭据并生成相应的 kubeconfig 文件。 # # 解释每个选项的含义如下 # - kubectl config set-credentials kubernetes-admin设置 kubernetes-admin 用户的身份验证凭据。 # - --client-certificate/etc/kubernetes/pki/admin.pem指定一个客户端证书文件用于基于证书的身份验证。在这种情况下指定了 admin 组件的证书文件路径。 # - --client-key/etc/kubernetes/pki/admin-key.pem指定与客户端证书相对应的客户端私钥文件。 # - --embed-certstrue将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。 # - --kubeconfig/etc/kubernetes/admin.kubeconfig指定生成的 kubeconfig 文件的路径和名称。 # # 该命令的目的是为 admin 组件生成一个 kubeconfig 文件以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件包括服务器地址、证书和秘钥等。kubectl config set-context kubernetes-adminkubernetes \--clusterkubernetes \--userkubernetes-admin \--kubeconfig/etc/kubernetes/admin.kubeconfig # 该命令用于设置一个名为kubernetes-adminkubernetes的上下文具体配置如下 # # 1. --clusterkubernetes: 指定集群的名称为kubernetes这个集群是在当前的kubeconfig文件中已经定义好的。 # 2. --userkubernetes-admin: 指定用户的名称为kubernetes-admin这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权admin组件访问Kubernetes集群的权限。 # 3. --kubeconfig/etc/kubernetes/admin.kubeconfig: 指定kubeconfig文件的路径为/etc/kubernetes/admin.kubeconfig这个文件将被用来保存上下文的配置信息。 # # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中以便后续使用该文件进行认证和授权访问Kubernetes集群。kubectl config use-context kubernetes-adminkubernetes --kubeconfig/etc/kubernetes/admin.kubeconfig # 上述命令是使用kubectl命令来配置Kubernetes集群中的调度器组件。 # # kubectl config use-context命令用于切换kubectl当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合用于确定kubectl的连接目标。下面解释这个命令的不同部分 # # - kubernetes-adminkubernetes是一个上下文名称。它指定了使用kubernetes-admin用户和kubernetes命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。 # # - --kubeconfig/etc/kubernetes/admin.kubeconfig用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。 # # 通过运行以上命令kubectl将使用指定的上下文和配置文件以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。3.2.7 master01节点创建kube-proxy证书 在《5.高可用配置》选择使用那种高可用方案 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443 cat kube-proxy-csr.json EOF {CN: system:kube-proxy,key: {algo: rsa,size: 2048},names: [{C: CN,ST: Beijing,L: Beijing,O: system:kube-proxy,OU: Kubernetes-manual}] } EOF # 这段代码是一个JSON格式的配置文件用于创建和配置一个名为kube-proxy-csr的Kubernetes凭证。 # # 这个凭证包含以下字段 # # - CN: system:kube-proxy: 这是凭证的通用名称表示这是一个管理员凭证。 # - key: 这是一个包含证书密钥相关信息的对象。 # - algo: rsa这是使用的加密算法类型这里是RSA加密算法。 # - size: 2048这是密钥的大小这里是2048位。 # - names: 这是一个包含证书名称信息的数组。 # - C: CN这是证书的国家/地区字段这里是中国。 # - ST: Beijing这是证书的省/州字段这里是北京。 # - L: Beijing这是证书的城市字段这里是北京。 # - O: system:kube-proxy这是证书的组织字段这里是system:kube-proxy。 # - OU: Kubernetes-manual这是证书的部门字段这里是Kubernetes-manual。 # # 通过这个配置文件创建的凭证将具有管理员权限并且可以用于管理Kubernetes集群。cfssl gencert \-ca/etc/kubernetes/pki/ca.pem \-ca-key/etc/kubernetes/pki/ca-key.pem \-configca-config.json \-profilekubernetes \kube-proxy-csr.json | cfssljson -bare /etc/kubernetes/pki/kube-proxy # 上述命令是使用cfssl工具生成Kubernetes admin的证书。 # # 具体解释如下 # # 1. cfssl gencert使用cfssl工具生成证书。 # 2. -ca/etc/kubernetes/pki/ca.pem指定根证书文件的路径。在这里是指定根证书的路径为/etc/kubernetes/pki/ca.pem。 # 3. -ca-key/etc/kubernetes/pki/ca-key.pem指定根证书私钥文件的路径。在这里是指定根证书私钥的路径为/etc/kubernetes/pki/ca-key.pem。 # 4. -configca-config.json指定证书配置文件的路径。在这里是指定证书配置文件的路径为ca-config.json。 # 5. -profilekubernetes指定证书的配置文件中的一个配置文件模板。在这里是指定配置文件中的kubernetes配置模板。 # 6. kube-proxy-csr.json指定admin的证书签名请求文件CSR的路径。在这里是指定请求文件的路径为kube-proxy-csr.json。 # 7. |管道符号将前一个命令的输出作为下一个命令的输入。 # 8. cfssljson将cfssl工具生成的证书签名请求(CSR)进行解析。 # 9. -bare /etc/kubernetes/pki/kube-proxy指定输出路径和前缀。在这里是将解析的证书签名请求生成以下文件/etc/kubernetes/pki/kube-proxy.pem包含了证书、/etc/kubernetes/pki/kube-proxy-key.pem包含了私钥。 # # 总结来说这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。# 在《5.高可用配置》选择使用那种高可用方案 # 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 # 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443kubectl config set-cluster kubernetes \--certificate-authority/etc/kubernetes/pki/ca.pem \--embed-certstrue \--serverhttps://127.0.0.1:8443 \--kubeconfig/etc/kubernetes/kube-proxy.kubeconfig # 该命令用于配置一个名为kubernetes的集群并将其应用到/etc/kubernetes/kube-proxy.kubeconfig文件中。 # # 该命令的解释如下 # - kubectl config set-cluster kubernetes: 设置一个集群并命名为kubernetes。 # - --certificate-authority/etc/kubernetes/pki/ca.pem: 指定集群使用的证书授权机构的路径。 # - --embed-certstrue: 该标志指示将证书嵌入到生成的kubeconfig文件中。 # - --serverhttps://127.0.0.1:8443: 指定集群的 API server 位置。 # - --kubeconfig/etc/kubernetes/kube-proxy.kubeconfig: 指定要保存 kubeconfig 文件的路径和名称。kubectl config set-credentials kube-proxy \--client-certificate/etc/kubernetes/pki/kube-proxy.pem \--client-key/etc/kubernetes/pki/kube-proxy-key.pem \--embed-certstrue \--kubeconfig/etc/kubernetes/kube-proxy.kubeconfig # 这段命令是用于设置 kube-proxy 组件的身份验证凭据并生成相应的 kubeconfig 文件。 # # 解释每个选项的含义如下 # - kubectl config set-credentials kube-proxy设置 kube-proxy 用户的身份验证凭据。 # - --client-certificate/etc/kubernetes/pki/kube-proxy.pem指定一个客户端证书文件用于基于证书的身份验证。在这种情况下指定了 kube-proxy 组件的证书文件路径。 # - --client-key/etc/kubernetes/pki/kube-proxy-key.pem指定与客户端证书相对应的客户端私钥文件。 # - --embed-certstrue将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。 # - --kubeconfig/etc/kubernetes/kube-proxy.kubeconfig指定生成的 kubeconfig 文件的路径和名称。 # # 该命令的目的是为 kube-proxy 组件生成一个 kubeconfig 文件以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件包括服务器地址、证书和秘钥等。kubectl config set-context kube-proxykubernetes \--clusterkubernetes \--userkube-proxy \--kubeconfig/etc/kubernetes/kube-proxy.kubeconfig # 该命令用于设置一个名为kube-proxykubernetes的上下文具体配置如下 # # 1. --clusterkubernetes: 指定集群的名称为kubernetes这个集群是在当前的kubeconfig文件中已经定义好的。 # 2. --userkube-proxy: 指定用户的名称为kube-proxy这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权kube-proxy组件访问Kubernetes集群的权限。 # 3. --kubeconfig/etc/kubernetes/kube-proxy.kubeconfig: 指定kubeconfig文件的路径为/etc/kubernetes/kube-proxy.kubeconfig这个文件将被用来保存上下文的配置信息。 # # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中以便后续使用该文件进行认证和授权访问Kubernetes集群。kubectl config use-context kube-proxykubernetes --kubeconfig/etc/kubernetes/kube-proxy.kubeconfig # 上述命令是使用kubectl命令来配置Kubernetes集群中的调度器组件。 # # kubectl config use-context命令用于切换kubectl当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合用于确定kubectl的连接目标。下面解释这个命令的不同部分 # # - kube-proxykubernetes是一个上下文名称。它指定了使用kube-proxy用户和kubernetes命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。 # # - --kubeconfig/etc/kubernetes/kube-proxy.kubeconfig用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。 # # 通过运行以上命令kubectl将使用指定的上下文和配置文件以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。3.2.8 master01节点创建ServiceAccount Key ——secret openssl genrsa -out /etc/kubernetes/pki/sa.key 2048 openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub# 这两个命令是使用OpenSSL工具生成RSA密钥对。 # # 命令1openssl genrsa -out /etc/kubernetes/pki/sa.key 2048 # 该命令用于生成私钥文件。具体解释如下 # - opensslopenssl命令行工具。 # - genrsa生成RSA密钥对。 # - -out /etc/kubernetes/pki/sa.key指定输出私钥文件的路径和文件名。 # - 2048指定密钥长度为2048位。 # # 命令2openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub # 该命令用于从私钥中导出公钥。具体解释如下 # - opensslopenssl命令行工具。 # - rsa与私钥相关的RSA操作。 # - -in /etc/kubernetes/pki/sa.key指定输入私钥文件的路径和文件名。 # - -pubout指定输出公钥。 # - -out /etc/kubernetes/pki/sa.pub指定输出公钥文件的路径和文件名。 # # 总结通过以上两个命令我们可以使用OpenSSL工具生成一个RSA密钥对并将私钥保存在/etc/kubernetes/pki/sa.key文件中将公钥保存在/etc/kubernetes/pki/sa.pub文件中。3.2.9 将证书发送到其他master节点 master01节点操作 #其他节点创建目录 # mkdir /etc/kubernetes/pki/ -pfor NODE in k8s-master02 k8s-master03; do for FILE in $(ls /etc/kubernetes/pki | grep -v etcd); do scp /etc/kubernetes/pki/${FILE} $NODE:/etc/kubernetes/pki/${FILE}; done; for FILE in admin.kubeconfig controller-manager.kubeconfig scheduler.kubeconfig; do scp /etc/kubernetes/${FILE} $NODE:/etc/kubernetes/${FILE}; done; done3.2.10 查看证书 master节点执行 ls /etc/kubernetes/pki/ admin.csr controller-manager.csr kube-proxy.csr admin-key.pem controller-manager-key.pem kube-proxy-key.pem admin.pem controller-manager.pem kube-proxy.pem apiserver.csr front-proxy-ca.csr sa.key apiserver-key.pem front-proxy-ca-key.pem sa.pub apiserver.pem front-proxy-ca.pem scheduler.csr ca.csr front-proxy-client.csr scheduler-key.pem ca-key.pem front-proxy-client-key.pem scheduler.pem ca.pem front-proxy-client.pem# 一共26个就对了 ls /etc/kubernetes/pki/ |wc -l 264.k8s系统组件配置 4.1.etcd配置 这个配置文件是用于 etcd 集群的配置其中包含了一些重要的参数和选项- name指定了当前节点的名称用于集群中区分不同的节点。 - data-dir指定了 etcd 数据的存储目录。 - wal-dir指定了 etcd 数据写入磁盘的目录。 - snapshot-count指定了触发快照的事务数量。 - heartbeat-interval指定了 etcd 集群中节点之间的心跳间隔。 - election-timeout指定了选举超时时间。 - quota-backend-bytes指定了存储的限额0 表示无限制。 - listen-peer-urls指定了节点之间通信的 URL使用 HTTPS 协议。 - listen-client-urls指定了客户端访问 etcd 集群的 URL同时提供了本地访问的 URL。 - max-snapshots指定了快照保留的数量。 - max-wals指定了日志保留的数量。 - initial-advertise-peer-urls指定了节点之间通信的初始 URL。 - advertise-client-urls指定了客户端访问 etcd 集群的初始 URL。 - discovery定义了 etcd 集群发现相关的选项。 - initial-cluster指定了 etcd 集群的初始成员。 - initial-cluster-token指定了集群的 token。 - initial-cluster-state指定了集群的初始状态。 - strict-reconfig-check指定了严格的重新配置检查选项。 - enable-v2启用了 v2 API。 - enable-pprof启用了性能分析。 - proxy设置了代理模式。 - client-transport-security客户端的传输安全配置。 - peer-transport-security节点之间的传输安全配置。 - debug是否启用调试模式。 - log-package-levels日志的输出级别。 - log-outputs指定了日志的输出类型。 - force-new-cluster是否强制创建一个新的集群。这些参数和选项可以根据实际需求进行调整和配置。4.1.1 master01配置 # 如果要用IPv6那么把IPv4地址修改为IPv6即可 cat /etc/etcd/etcd.config.yml EOF name: k8s-master01 data-dir: /var/lib/etcd wal-dir: /var/lib/etcd/wal snapshot-count: 5000 heartbeat-interval: 100 election-timeout: 1000 quota-backend-bytes: 0 listen-peer-urls: https://192.168.0.31:2380 listen-client-urls: https://192.168.0.31:2379,http://127.0.0.1:2379 max-snapshots: 3 max-wals: 5 cors: initial-advertise-peer-urls: https://192.168.0.31:2380 advertise-client-urls: https://192.168.0.31:2379 discovery: discovery-fallback: proxy discovery-proxy: discovery-srv: initial-cluster: k8s-master01https://192.168.0.31:2380,k8s-master02https://192.168.0.32:2380,k8s-master03https://192.168.0.33:2380 initial-cluster-token: etcd-k8s-cluster initial-cluster-state: new strict-reconfig-check: false enable-v2: true enable-pprof: true proxy: off proxy-failure-wait: 5000 proxy-refresh-interval: 30000 proxy-dial-timeout: 1000 proxy-write-timeout: 5000 proxy-read-timeout: 0 client-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pemclient-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true peer-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pempeer-client-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true debug: false log-package-levels: log-outputs: [default] force-new-cluster: false EOF4.1.2 master02配置 # 如果要用IPv6那么把IPv4地址修改为IPv6即可 cat /etc/etcd/etcd.config.yml EOF name: k8s-master02 data-dir: /var/lib/etcd wal-dir: /var/lib/etcd/wal snapshot-count: 5000 heartbeat-interval: 100 election-timeout: 1000 quota-backend-bytes: 0 listen-peer-urls: https://192.168.0.32:2380 listen-client-urls: https://192.168.0.32:2379,http://127.0.0.1:2379 max-snapshots: 3 max-wals: 5 cors: initial-advertise-peer-urls: https://192.168.0.32:2380 advertise-client-urls: https://192.168.0.32:2379 discovery: discovery-fallback: proxy discovery-proxy: discovery-srv: initial-cluster: k8s-master01https://192.168.0.31:2380,k8s-master02https://192.168.0.32:2380,k8s-master03https://192.168.0.33:2380 initial-cluster-token: etcd-k8s-cluster initial-cluster-state: new strict-reconfig-check: false enable-v2: true enable-pprof: true proxy: off proxy-failure-wait: 5000 proxy-refresh-interval: 30000 proxy-dial-timeout: 1000 proxy-write-timeout: 5000 proxy-read-timeout: 0 client-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pemclient-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true peer-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pempeer-client-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true debug: false log-package-levels: log-outputs: [default] force-new-cluster: false EOF4.1.3 master03配置 # 如果要用IPv6那么把IPv4地址修改为IPv6即可 cat /etc/etcd/etcd.config.yml EOF name: k8s-master03 data-dir: /var/lib/etcd wal-dir: /var/lib/etcd/wal snapshot-count: 5000 heartbeat-interval: 100 election-timeout: 1000 quota-backend-bytes: 0 listen-peer-urls: https://192.168.0.33:2380 listen-client-urls: https://192.168.0.33:2379,http://127.0.0.1:2379 max-snapshots: 3 max-wals: 5 cors: initial-advertise-peer-urls: https://192.168.0.33:2380 advertise-client-urls: https://192.168.0.33:2379 discovery: discovery-fallback: proxy discovery-proxy: discovery-srv: initial-cluster: k8s-master01https://192.168.0.31:2380,k8s-master02https://192.168.0.32:2380,k8s-master03https://192.168.0.33:2380 initial-cluster-token: etcd-k8s-cluster initial-cluster-state: new strict-reconfig-check: false enable-v2: true enable-pprof: true proxy: off proxy-failure-wait: 5000 proxy-refresh-interval: 30000 proxy-dial-timeout: 1000 proxy-write-timeout: 5000 proxy-read-timeout: 0 client-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pemclient-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true peer-transport-security:cert-file: /etc/kubernetes/pki/etcd/etcd.pemkey-file: /etc/kubernetes/pki/etcd/etcd-key.pempeer-client-cert-auth: truetrusted-ca-file: /etc/kubernetes/pki/etcd/etcd-ca.pemauto-tls: true debug: false log-package-levels: log-outputs: [default] force-new-cluster: false EOF4.2.创建service 所有master节点操作 4.2.1 创建etcd.service并启动 cat /usr/lib/systemd/system/etcd.service EOF[Unit] DescriptionEtcd Service Documentationhttps://coreos.com/etcd/docs/latest/ Afternetwork.target[Service] Typenotify ExecStart/usr/local/bin/etcd --config-file/etc/etcd/etcd.config.yml Restarton-failure RestartSec10 LimitNOFILE65536[Install] WantedBymulti-user.target Aliasetcd3.serviceEOF # 这是一个系统服务配置文件用于启动和管理Etcd服务。 # # [Unit] 部分包含了服务的一些基本信息它定义了服务的描述和文档链接并指定了服务应在网络连接之后启动。 # # [Service] 部分定义了服务的具体配置。在这里服务的类型被设置为notify意味着当服务成功启动时它将通知系统。ExecStart 指定了启动服务时要执行的命令这里是运行 /usr/local/bin/etcd 命令并传递一个配置文件 /etc/etcd/etcd.config.yml。Restart 设置为 on-failure意味着当服务失败时将自动重启并且在10秒后进行重启。LimitNOFILE 指定了服务的最大文件打开数。 # # [Install] 部分定义了服务的安装配置。WantedBy 指定了服务应该被启动的目标这里是 multi-user.target表示在系统进入多用户模式时启动。Alias 定义了一个别名可以通过etcd3.service来引用这个服务。 # # 这个配置文件描述了如何启动和管理Etcd服务并将其安装到系统中。通过这个配置文件可以确保Etcd服务在系统启动后自动启动并在出现问题时进行重启。4.2.2 创建etcd证书目录 mkdir /etc/kubernetes/pki/etcd ln -s /etc/etcd/ssl/* /etc/kubernetes/pki/etcd/systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now etcd.service # 启用并立即启动etcd.service单元。etcd.service是etcd守护进程的systemd服务单元。systemctl restart etcd.service # 重启etcd.service单元即重新启动etcd守护进程。systemctl status etcd.service # etcd.service单元的当前状态包括运行状态、是否启用等信息。4.2.3 查看etcd状态 # 如果要用IPv6那么把IPv4地址修改为IPv6即可 export ETCDCTL_API3 etcdctl --endpoints192.168.0.33:2379,192.168.0.32:2379,192.168.0.31:2379 --cacert/etc/kubernetes/pki/etcd/etcd-ca.pem --cert/etc/kubernetes/pki/etcd/etcd.pem --key/etc/kubernetes/pki/etcd/etcd-key.pem endpoint status --write-outtable --------------------------------------------------------------------------------------------------------------------------------- | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | --------------------------------------------------------------------------------------------------------------------------------- | 192.168.0.33:2379 | 6ae2196f75cd6d95 | 3.5.9 | 20 kB | false | false | 2 | 9 | 9 | | | 192.168.0.32:2379 | 46cbf93f7713a252 | 3.5.9 | 20 kB | false | false | 2 | 9 | 9 | | | 192.168.0.31:2379 | ec6051ffc7487dd7 | 3.5.9 | 20 kB | true | false | 2 | 9 | 9 | | ---------------------------------------------------------------------------------------------------------------------------------# 这个命令是使用etcdctl工具用于查看指定etcd集群的健康状态。下面是每个参数的详细解释 # # - --endpoints指定要连接的etcd集群节点的地址和端口。在这个例子中指定了3个节点的地址和端口分别是192.168.0.33:2379,192.168.0.32:2379,192.168.0.31:2379。 # - --cacert指定用于验证etcd服务器证书的CA证书的路径。在这个例子中指定了CA证书的路径为/etc/kubernetes/pki/etcd/etcd-ca.pem。CA证书用于验证etcd服务器证书的有效性。 # - --cert指定用于与etcd服务器进行通信的客户端证书的路径。在这个例子中指定了客户端证书的路径为/etc/kubernetes/pki/etcd/etcd.pem。客户端证书用于在与etcd服务器建立安全通信时进行身份验证。 # - --key指定与客户端证书配对的私钥的路径。在这个例子中指定了私钥的路径为/etc/kubernetes/pki/etcd/etcd-key.pem。私钥用于对通信进行加密解密和签名验证。 # - endpoint status子命令用于检查etcd集群节点的健康状态。 # - --write-out指定输出的格式。在这个例子中指定以表格形式输出。 # # 通过执行这个命令可以获取到etcd集群节点的健康状态并以表格形式展示。5.高可用配置 注意 5.1.1 和5.1.2 二选一即可* 选择使用那种高可用方案同时可以俩种都选用实现内外兼顾的效果比如 5.1 的 NGINX方案实现集群内的高可用 5.2 的 haproxy、keepalived 方案实现集群外访问 在《3.2.生成k8s相关证书》 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:9443 5.1 NGINX高可用方案 (推荐) 5.1.1 master01节点进行编译 # 安装编译环境 yum install gcc -y# 下载解压nginx二进制文件 # wget http://nginx.org/download/nginx-1.25.1.tar.gz tar xvf nginx-*.tar.gz cd nginx-*# 进行编译 ./configure --with-stream --without-http --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_modulemake make install # 拷贝编译好的nginx nodek8s-master02 k8s-master03 k8s-node01 k8s-node02 for NODE in $node; do scp -r /usr/local/nginx/ $NODE:/usr/local/nginx/; done# 这是一系列命令行指令用于编译和安装软件。 # # 1. ./configure 是用于配置软件的命令。在这个例子中配置的软件是一个Web服务器指定了一些选项来启用流模块并禁用了HTTP、uwsgi、scgi和fastcgi模块。 # 2. --with-stream 指定启用流模块。流模块通常用于代理TCP和UDP流量。 # 3. --without-http 指定禁用HTTP模块。这意味着编译的软件将没有HTTP服务器功能。 # 4. --without-http_uwsgi_module 指定禁用uwsgi模块。uwsgi是一种Web服务器和应用服务器之间的通信协议。 # 5. --without-http_scgi_module 指定禁用scgi模块。scgi是一种用于将Web服务器请求传递到应用服务器的协议。 # 6. --without-http_fastcgi_module 指定禁用fastcgi模块。fastcgi是一种用于在Web服务器和应用服务器之间交换数据的协议。 # 7. make 是用于编译软件的命令。该命令将根据之前的配置生成可执行文件。 # 8. make install 用于安装软件。该命令将生成的可执行文件和其他必要文件复制到系统的适当位置以便可以使用该软件。 # # 总之这个命令序列用于编译一个配置了特定选项的Web服务器并将其安装到系统中。5.1.2 写入启动配置 在所有节点master和node上执行 # 写入nginx配置文件 cat /usr/local/nginx/conf/kube-nginx.conf EOF worker_processes 1; events {worker_connections 1024; } stream {upstream backend {least_conn;hash $remote_addr consistent;server 192.168.0.31:6443 max_fails3 fail_timeout30s;server 192.168.0.32:6443 max_fails3 fail_timeout30s;server 192.168.0.33:6443 max_fails3 fail_timeout30s;}server {listen 127.0.0.1:8443;proxy_connect_timeout 1s;proxy_pass backend;} } EOF # 这段配置是一个nginx的stream模块的配置用于代理TCP和UDP流量。 # # 首先worker_processes 1;表示启动一个worker进程用于处理流量。 # 接下来events { worker_connections 1024; }表示每个worker进程可以同时处理最多1024个连接。 # 在stream块里面定义了一个名为backend的upstream用于负载均衡和故障转移。 # least_conn表示使用最少连接算法进行负载均衡。 # hash $remote_addr consistent表示用客户端的IP地址进行哈希分配请求保持相同IP的请求始终访问同一台服务器。 # server指令用于定义后端的服务器每个服务器都有一个IP地址和端口号以及一些可选的参数。 # max_fails3表示当一个服务器连续失败3次时将其标记为不可用。 # fail_timeout30s表示如果一个服务器被标记为不可用nginx将在30秒后重新尝试。 # 在server块内部定义了一个监听地址为127.0.0.1:8443的服务器。 # proxy_connect_timeout 1s表示与后端服务器建立连接的超时时间为1秒。 # proxy_pass backend表示将流量代理到名为backend的上游服务器组。 # # 总结起来这段配置将流量代理到一个包含3个后端服务器的上游服务器组中使用最少连接算法进行负载均衡并根据客户端的IP地址进行哈希分配请求。如果一个服务器连续失败3次则将其标记为不可用并在30秒后重新尝试。# 写入启动配置文件 cat /etc/systemd/system/kube-nginx.service EOF [Unit] Descriptionkube-apiserver nginx proxy Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target[Service] Typeforking ExecStartPre/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx -t ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx ExecReload/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx -s reload PrivateTmptrue Restartalways RestartSec5 StartLimitInterval0 LimitNOFILE65536[Install] WantedBymulti-user.target EOF # 这是一个用于kube-apiserver的NGINX代理的systemd单位文件。 # # [Unit]部分包含了单位的描述和依赖关系。它指定了在network.target和network-online.target之后启动并且需要network-online.target。 # # [Service]部分定义了如何运行该服务。Type指定了服务进程的类型forking表示主进程会派生一个子进程。ExecStartPre指定了在服务启动之前需要运行的命令用于检查NGINX配置文件的语法是否正确。ExecStart指定了启动服务所需的命令。ExecReload指定了在重新加载配置文件时运行的命令。PrivateTmp设置为true表示将为服务创建一个私有的临时文件系统。Restart和RestartSec用于设置服务的自动重启机制。StartLimitInterval设置为0表示无需等待可以立即重启服务。LimitNOFILE指定了服务的文件描述符的限制。 # # [Install]部分指定了在哪些target下该单位应该被启用。 # # 综上所述此单位文件用于启动和管理kube-apiserver的NGINX代理服务。它通过NGINX来反向代理和负载均衡kube-apiserver的请求。该服务会在系统启动时自动启动并具有自动重启的机制。# 设置开机自启systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。 systemctl enable --now kube-nginx.service # 启用并立即启动kube-nginx.service单元。kube-nginx.service是kube-nginx守护进程的systemd服务单元。 systemctl restart kube-nginx.service # 重启kube-nginx.service单元即重新启动kube-nginx守护进程。 systemctl status kube-nginx.service # kube-nginx.service单元的当前状态包括运行状态、是否启用等信息。5.2 keepalived和haproxy 高可用方案 (不推荐) 5.2.1 安装keepalived和haproxy服务 systemctl disable --now firewalld setenforce 0 sed -i s#SELINUXenforcing#SELINUXdisabled#g /etc/selinux/config yum -y install keepalived haproxy5.2.2 修改haproxy配置文件配置文件一样 # cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bakcat /etc/haproxy/haproxy.cfgEOF globalmaxconn 2000ulimit-n 16384log 127.0.0.1 local0 errstats timeout 30sdefaultslog globalmode httpoption httplogtimeout connect 5000timeout client 50000timeout server 50000timeout http-request 15stimeout http-keep-alive 15sfrontend monitor-inbind *:33305mode httpoption httplogmonitor-uri /monitorfrontend k8s-masterbind 0.0.0.0:9443bind 127.0.0.1:9443mode tcpoption tcplogtcp-request inspect-delay 5sdefault_backend k8s-masterbackend k8s-mastermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100server k8s-master01 192.168.0.31:6443 checkserver k8s-master02 192.168.0.32:6443 checkserver k8s-master03 192.168.0.33:6443 check EOF参数 这段配置代码是指定了一个HAProxy负载均衡器的配置。下面对各部分进行详细解释 1. global:- maxconn 2000: 设置每个进程的最大连接数为2000。- ulimit-n 16384: 设置每个进程的最大文件描述符数为16384。- log 127.0.0.1 local0 err: 指定日志的输出地址为本地主机的127.0.0.1并且只记录错误级别的日志。- stats timeout 30s: 设置查看负载均衡器统计信息的超时时间为30秒。2. defaults:- log global: 使默认日志与global部分相同。- mode http: 设定负载均衡器的工作模式为HTTP模式。- option httplog: 使负载均衡器记录HTTP协议的日志。- timeout connect 5000: 设置与后端服务器建立连接的超时时间为5秒。- timeout client 50000: 设置与客户端的连接超时时间为50秒。- timeout server 50000: 设置与后端服务器连接的超时时间为50秒。- timeout http-request 15s: 设置处理HTTP请求的超时时间为15秒。- timeout http-keep-alive 15s: 设置保持HTTP连接的超时时间为15秒。3. frontend monitor-in:- bind *:33305: 监听所有IP地址的33305端口。- mode http: 设定frontend的工作模式为HTTP模式。- option httplog: 记录HTTP协议的日志。- monitor-uri /monitor: 设置监控URI为/monitor。4. frontend k8s-master:- bind 0.0.0.0:9443: 监听所有IP地址的9443端口。- bind 127.0.0.1:9443: 监听本地主机的9443端口。- mode tcp: 设定frontend的工作模式为TCP模式。- option tcplog: 记录TCP协议的日志。- tcp-request inspect-delay 5s: 设置在接收到请求后延迟5秒进行检查。- default_backend k8s-master: 设置默认的后端服务器组为k8s-master。5. backend k8s-master:- mode tcp: 设定backend的工作模式为TCP模式。- option tcplog: 记录TCP协议的日志。- option tcp-check: 启用TCP检查功能。- balance roundrobin: 使用轮询算法进行负载均衡。- default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100: 设置默认的服务器参数。- server k8s-master01 192.168.0.31:6443 check: 增加一个名为k8s-master01的服务器IP地址为192.168.0.31端口号为6443并对其进行健康检查。- server k8s-master02 192.168.0.32:6443 check: 增加一个名为k8s-master02的服务器IP地址为192.168.0.32端口号为6443并对其进行健康检查。- server k8s-master03 192.168.0.33:6443 check: 增加一个名为k8s-master03的服务器IP地址为192.168.0.33端口号为6443并对其进行健康检查。以上就是这段配置代码的详细解释。它主要定义了全局配置、默认配置、前端监听和后端服务器组的相关参数和设置。通过这些配置可以实现负载均衡和监控功能。5.2.3 Master01配置keepalived master节点 #cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bakcat /etc/keepalived/keepalived.conf EOF ! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL } vrrp_script chk_apiserver {script /etc/keepalived/check_apiserver.shinterval 5 weight -5fall 2rise 1 } vrrp_instance VI_1 {state MASTER# 注意网卡名interface eth0 mcast_src_ip 192.168.0.31virtual_router_id 51priority 100nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.0.36}track_script {chk_apiserver } }EOF5.2.4 Master02配置keepalived backup节点 # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bakcat /etc/keepalived/keepalived.conf EOF ! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL } vrrp_script chk_apiserver {script /etc/keepalived/check_apiserver.shinterval 5 weight -5fall 2rise 1} vrrp_instance VI_1 {state BACKUP# 注意网卡名interface eth0mcast_src_ip 192.168.0.32virtual_router_id 51priority 80nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.0.36}track_script {chk_apiserver } }EOF5.2.5 Master03配置keepalived backup节点 # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bakcat /etc/keepalived/keepalived.conf EOF ! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL } vrrp_script chk_apiserver {script /etc/keepalived/check_apiserver.shinterval 5 weight -5fall 2rise 1} vrrp_instance VI_1 {state BACKUP# 注意网卡名interface eth0mcast_src_ip 192.168.0.33virtual_router_id 51priority 50nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.0.36}track_script {chk_apiserver } }EOF参数 这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释- global_defs部分定义了全局参数。 - router_id参数指定了当前路由器的标识这里设置为LVS_DEVEL。- vrrp_script部分定义了一个VRRP脚本。chk_apiserver是脚本的名称- script参数指定了脚本的路径。该脚本每5秒执行一次返回值为0表示服务正常返回值为1表示服务异常。- weight参数指定了根据脚本返回的值来调整优先级这里设置为-5。- fall参数指定了失败阈值当连续2次脚本返回值为1时认为服务异常。- rise参数指定了恢复阈值当连续1次脚本返回值为0时认为服务恢复正常。- vrrp_instance部分定义了一个VRRP实例。VI_1是实例的名称。- state参数指定了当前实例的状态这里设置为MASTER表示当前实例是主节点。- interface参数指定了要监听的网卡这里设置为eth0。- mcast_src_ip参数指定了VRRP报文的源IP地址这里设置为192.168.0.31。- virtual_router_id参数指定了虚拟路由器的ID这里设置为51。- priority参数指定了实例的优先级优先级越高数值越大越有可能被选为主节点。- nopreempt参数指定了当主节点失效后不要抢占身份即不要自动切换为主节点。- advert_int参数指定了发送广播的间隔时间这里设置为2秒。- authentication部分指定了认证参数- auth_type参数指定了认证类型这里设置为PASS表示使用密码认证- auth_pass参数指定了认证密码这里设置为K8SHA_KA_AUTH。- virtual_ipaddress部分指定了虚拟IP地址这里设置为192.168.0.36。- track_script部分指定了要跟踪的脚本这里跟踪了chk_apiserver脚本。5.2.6 健康检查脚本配置lb主机 cat /etc/keepalived/check_apiserver.sh EOF #!/bin/basherr0 for k in \$(seq 1 3) docheck_code\$(pgrep haproxy)if [[ \$check_code ]]; thenerr\$(expr \$err 1)sleep 1continueelseerr0breakfi doneif [[ \$err ! 0 ]]; thenecho systemctl stop keepalived/usr/bin/systemctl stop keepalivedexit 1 elseexit 0 fi EOF# 给脚本授权chmod x /etc/keepalived/check_apiserver.sh# 这段脚本是一个简单的bash脚本主要用来检查是否有名为haproxy的进程正在运行。 # # 脚本的主要逻辑如下 # 1. 首先设置一个变量err为0用来记录错误次数。 # 2. 使用一个循环在循环内部执行以下操作 # a. 使用pgrep命令检查是否有名为haproxy的进程在运行。如果不存在该进程将err加1并暂停1秒钟然后继续下一次循环。 # b. 如果存在haproxy进程将err重置为0并跳出循环。 # 3. 检查err的值如果不为0表示检查失败输出一条错误信息并执行“systemctl stop keepalived”命令停止keepalived进程并退出脚本返回1。 # 4. 如果err的值为0表示检查成功退出脚本返回0。 # # 该脚本的主要作用是检查是否存在运行中的haproxy进程如果无法检测到haproxy进程将停止keepalived进程并返回错误状态。如果haproxy进程存在则返回成功状态。这个脚本可能是作为一个健康检查脚本的一部分在确保haproxy服务可用的情况下才继续运行其他操作。5.2.7 启动服务 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。 systemctl enable --now haproxy.service # 启用并立即启动haproxy.service单元。haproxy.service是haproxy守护进程的systemd服务单元。 systemctl enable --now keepalived.service # 启用并立即启动keepalived.service单元。keepalived.service是keepalived守护进程的systemd服务单元。 systemctl status haproxy.service # haproxy.service单元的当前状态包括运行状态、是否启用等信息。 systemctl status keepalived.service # keepalived.service单元的当前状态包括运行状态、是否启用等信息。5.2.8 测试高可用 # 能ping同[rootk8s-node02 ~]# ping 192.168.0.36# 能telnet访问[rootk8s-node02 ~]# telnet 192.168.0.36 9443# 关闭主节点看vip是否漂移到备节点6.k8s组件配置 所有k8s节点创建以下目录 mkdir -p /etc/kubernetes/manifests/ /etc/systemd/system/kubelet.service.d /var/lib/kubelet /var/log/kubernetes6.1.创建apiserver所有master节点 6.1.1 master01节点配置 cat /usr/lib/systemd/system/kube-apiserver.service EOF[Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-apiserver \\--v2 \\--allow-privilegedtrue \\--bind-address0.0.0.0 \\--secure-port6443 \\--advertise-address192.168.0.31 \\--service-cluster-ip-range10.96.0.0/12,fd00:1111::/112 \\--service-node-port-range30000-32767 \\--etcd-servershttps://192.168.0.31:2379,https://192.168.0.32:2379,https://192.168.0.33:2379 \\--etcd-cafile/etc/etcd/ssl/etcd-ca.pem \\--etcd-certfile/etc/etcd/ssl/etcd.pem \\--etcd-keyfile/etc/etcd/ssl/etcd-key.pem \\--client-ca-file/etc/kubernetes/pki/ca.pem \\--tls-cert-file/etc/kubernetes/pki/apiserver.pem \\--tls-private-key-file/etc/kubernetes/pki/apiserver-key.pem \\--kubelet-client-certificate/etc/kubernetes/pki/apiserver.pem \\--kubelet-client-key/etc/kubernetes/pki/apiserver-key.pem \\--service-account-key-file/etc/kubernetes/pki/sa.pub \\--service-account-signing-key-file/etc/kubernetes/pki/sa.key \\--service-account-issuerhttps://kubernetes.default.svc.cluster.local \\--kubelet-preferred-address-typesInternalIP,ExternalIP,Hostname \\--enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota \--authorization-modeNode,RBAC \\--enable-bootstrap-token-authtrue \\--requestheader-client-ca-file/etc/kubernetes/pki/front-proxy-ca.pem \\--proxy-client-cert-file/etc/kubernetes/pki/front-proxy-client.pem \\--proxy-client-key-file/etc/kubernetes/pki/front-proxy-client-key.pem \\--requestheader-allowed-namesaggregator \\--requestheader-group-headersX-Remote-Group \\--requestheader-extra-headers-prefixX-Remote-Extra- \\--requestheader-username-headersX-Remote-User \\--enable-aggregator-routingtrue Restarton-failure RestartSec10s LimitNOFILE65535[Install] WantedBymulti-user.targetEOF6.1.2 master02节点配置 cat /usr/lib/systemd/system/kube-apiserver.service EOF [Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-apiserver \\--v2 \\--allow-privilegedtrue \\--bind-address0.0.0.0 \\--secure-port6443 \\--advertise-address192.168.0.32 \\--service-cluster-ip-range10.96.0.0/12,fd00:1111::/112 \\--service-node-port-range30000-32767 \\--etcd-servershttps://192.168.0.31:2379,https://192.168.0.32:2379,https://192.168.0.33:2379 \\--etcd-cafile/etc/etcd/ssl/etcd-ca.pem \\--etcd-certfile/etc/etcd/ssl/etcd.pem \\--etcd-keyfile/etc/etcd/ssl/etcd-key.pem \\--client-ca-file/etc/kubernetes/pki/ca.pem \\--tls-cert-file/etc/kubernetes/pki/apiserver.pem \\--tls-private-key-file/etc/kubernetes/pki/apiserver-key.pem \\--kubelet-client-certificate/etc/kubernetes/pki/apiserver.pem \\--kubelet-client-key/etc/kubernetes/pki/apiserver-key.pem \\--service-account-key-file/etc/kubernetes/pki/sa.pub \\--service-account-signing-key-file/etc/kubernetes/pki/sa.key \\--service-account-issuerhttps://kubernetes.default.svc.cluster.local \\--kubelet-preferred-address-typesInternalIP,ExternalIP,Hostname \\--enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota \\--authorization-modeNode,RBAC \\--enable-bootstrap-token-authtrue \\--requestheader-client-ca-file/etc/kubernetes/pki/front-proxy-ca.pem \\--proxy-client-cert-file/etc/kubernetes/pki/front-proxy-client.pem \\--proxy-client-key-file/etc/kubernetes/pki/front-proxy-client-key.pem \\--requestheader-allowed-namesaggregator \\--requestheader-group-headersX-Remote-Group \\--requestheader-extra-headers-prefixX-Remote-Extra- \\--requestheader-username-headersX-Remote-User \\--enable-aggregator-routingtrueRestarton-failure RestartSec10s LimitNOFILE65535[Install] WantedBymulti-user.targetEOF6.1.3 master03节点配置 cat /usr/lib/systemd/system/kube-apiserver.service EOF[Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-apiserver \\--v2 \\--allow-privilegedtrue \\--bind-address0.0.0.0 \\--secure-port6443 \\--advertise-address192.168.0.33 \\--service-cluster-ip-range10.96.0.0/12,fd00:1111::/112 \\--service-node-port-range30000-32767 \\--etcd-servershttps://192.168.0.31:2379,https://192.168.0.32:2379,https://192.168.0.33:2379 \\--etcd-cafile/etc/etcd/ssl/etcd-ca.pem \\--etcd-certfile/etc/etcd/ssl/etcd.pem \\--etcd-keyfile/etc/etcd/ssl/etcd-key.pem \\--client-ca-file/etc/kubernetes/pki/ca.pem \\--tls-cert-file/etc/kubernetes/pki/apiserver.pem \\--tls-private-key-file/etc/kubernetes/pki/apiserver-key.pem \\--kubelet-client-certificate/etc/kubernetes/pki/apiserver.pem \\--kubelet-client-key/etc/kubernetes/pki/apiserver-key.pem \\--service-account-key-file/etc/kubernetes/pki/sa.pub \\--service-account-signing-key-file/etc/kubernetes/pki/sa.key \\--service-account-issuerhttps://kubernetes.default.svc.cluster.local \\--kubelet-preferred-address-typesInternalIP,ExternalIP,Hostname \\--enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota \\--authorization-modeNode,RBAC \\--enable-bootstrap-token-authtrue \\--requestheader-client-ca-file/etc/kubernetes/pki/front-proxy-ca.pem \\--proxy-client-cert-file/etc/kubernetes/pki/front-proxy-client.pem \\--proxy-client-key-file/etc/kubernetes/pki/front-proxy-client-key.pem \\--requestheader-allowed-namesaggregator \\--requestheader-group-headersX-Remote-Group \\--requestheader-extra-headers-prefixX-Remote-Extra- \\--requestheader-username-headersX-Remote-User \\--enable-aggregator-routingtrueRestarton-failure RestartSec10s LimitNOFILE65535[Install] WantedBymulti-user.targetEOF参数 该配置文件是用于定义Kubernetes API Server的systemd服务的配置。systemd是一个用于启动和管理Linux系统服务的守护进程。[Unit] - Description: 服务的描述信息用于显示在日志和系统管理工具中。 - Documentation: 提供关于服务的文档链接。 - After: 规定服务依赖于哪些其他服务或单元。在这个例子中API Server服务在网络目标启动之后启动。[Service] - ExecStart: 定义服务的命令行参数和命令。这里指定了API Server的启动命令包括各种参数选项。 - Restart: 指定当服务退出时应该如何重新启动。在这个例子中服务在失败时将被重新启动。 - RestartSec: 指定两次重新启动之间的等待时间。 - LimitNOFILE: 指定进程可以打开的文件描述符的最大数量。[Install] - WantedBy: 指定服务应该安装到哪个系统目标。在这个例子中服务将被安装到multi-user.target目标以便在多用户模式下启动。上述配置文件中定义的kube-apiserver服务将以指定的参数运行这些参数包括- --v2 指定日志级别为2打印详细的API Server日志。 - --allow-privilegedtrue 允许特权容器运行。 - --bind-address0.0.0.0 绑定API Server监听的IP地址。 - --secure-port6443 指定API Server监听的安全端口。 - --advertise-address192.168.0.31 广告API Server的地址。 - --service-cluster-ip-range10.96.0.0/12,fd00:1111::/112 指定服务CIDR范围。 - --service-node-port-range30000-32767 指定NodePort的范围。 - --etcd-servershttps://192.168.0.31:2379,https://192.168.0.32:2379,https://192.168.0.33:2379 指定etcd服务器的地址。 - --etcd-cafile 指定etcd服务器的CA证书。 - --etcd-certfile 指定etcd服务器的证书。 - --etcd-keyfile 指定etcd服务器的私钥。 - --client-ca-file 指定客户端CA证书。 - --tls-cert-file 指定服务的证书。 - --tls-private-key-file 指定服务的私钥。 - --kubelet-client-certificate 和 --kubelet-client-key 指定与kubelet通信的客户端证书和私钥。 - --service-account-key-file 指定服务账户公钥文件。 - --service-account-signing-key-file 指定服务账户签名密钥文件。 - --service-account-issuer 指定服务账户的发布者。 - --kubelet-preferred-address-types 指定kubelet通信时的首选地址类型。 - --enable-admission-plugins 启用一系列准入插件。 - --authorization-mode 指定授权模式。 - --enable-bootstrap-token-auth 启用引导令牌认证。 - --requestheader-client-ca-file 指定请求头中的客户端CA证书。 - --proxy-client-cert-file 和 --proxy-client-key-file 指定代理客户端的证书和私钥。 - --requestheader-allowed-names 指定请求头中允许的名字。 - --requestheader-group-headers 指定请求头中的组头。 - --requestheader-extra-headers-prefix 指定请求头中的额外头前缀。 - --requestheader-username-headers 指定请求头中的用户名头。 - --enable-aggregator-routing 启用聚合路由。整个配置文件为Kubernetes API Server提供了必要的参数以便正确地启动和运行。6.1.4 启动apiserver所有master节点 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now kube-apiserver.service # 启用并立即启动kube-apiserver.service单元。kube-apiserver.service是kube-apiserver守护进程的systemd服务单元。systemctl restart kube-apiserver.service # 重启kube-apiserver.service单元即重新启动etcd守护进程。systemctl status kube-apiserver.service # kube-apiserver.service单元的当前状态包括运行状态、是否启用等信息。6.2.配置kube-controller-manager service所有master节点 # 所有master节点配置且配置相同 # 172.16.0.0/12为pod网段按需求设置你自己的网段cat /usr/lib/systemd/system/kube-controller-manager.service EOF[Unit] DescriptionKubernetes Controller Manager Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-controller-manager \\--v2 \\--bind-address0.0.0.0 \\--root-ca-file/etc/kubernetes/pki/ca.pem \\--cluster-signing-cert-file/etc/kubernetes/pki/ca.pem \\--cluster-signing-key-file/etc/kubernetes/pki/ca-key.pem \\--service-account-private-key-file/etc/kubernetes/pki/sa.key \\--kubeconfig/etc/kubernetes/controller-manager.kubeconfig \\--leader-electtrue \\--use-service-account-credentialstrue \\--node-monitor-grace-period40s \\--node-monitor-period5s \\--controllers*,bootstrapsigner,tokencleaner \\--allocate-node-cidrstrue \\--service-cluster-ip-range10.96.0.0/12,fd00:1111::/112 \\--cluster-cidr172.16.0.0/12,fc00:2222::/112 \\--node-cidr-mask-size-ipv424 \\--node-cidr-mask-size-ipv6120 \\--requestheader-client-ca-file/etc/kubernetes/pki/front-proxy-ca.pemRestartalways RestartSec10s[Install] WantedBymulti-user.targetEOF参数 这是一个用于启动 Kubernetes 控制器管理器的 systemd 服务单元文件。下面是对每个部分的详细解释[Unit]单元的基本信息部分用于描述和标识这个服务单元。 Description服务单元的描述信息说明了该服务单元的作用这里是 Kubernetes 控制器管理器。 Documentation可选项提供了关于该服务单元的文档链接。 After定义了该服务单元在哪些其他单元之后启动这里是 network.target即在网络服务启动之后启动。[Service]定义了服务的运行参数和行为。 ExecStart指定服务启动时执行的命令这里是 /usr/local/bin/kube-controller-manager并通过后续的行继续传递了一系列的参数设置。 Restart定义了服务在退出后的重新启动策略这里设置为 always表示总是重新启动服务。 RestartSec定义了重新启动服务的时间间隔这里设置为 10 秒。[Install]定义了如何安装和启用服务单元。 WantedBy指定了服务单元所属的 target这里是 multi-user.target表示启动多用户模式下的服务。 在 ExecStart 中传递的参数说明如下--v2设置日志的详细级别为 2。 --bind-address0.0.0.0绑定的 IP 地址用于监听 Kubernetes 控制平面的请求这里设置为 0.0.0.0表示监听所有网络接口上的请求。 --root-ca-file根证书文件的路径用于验证其他组件的证书。 --cluster-signing-cert-file用于签名集群证书的证书文件路径。 --cluster-signing-key-file用于签名集群证书的私钥文件路径。 --service-account-private-key-file用于签名服务账户令牌的私钥文件路径。 --kubeconfigkubeconfig 文件的路径包含了与 Kubernetes API 服务器通信所需的配置信息。 --leader-electtrue启用 Leader 选举机制确保只有一个控制器管理器作为 leader 在运行。 --use-service-account-credentialstrue使用服务账户的凭据进行认证和授权。 --node-monitor-grace-period40s节点监控的优雅退出时间节点长时间不响应时会触发节点驱逐。 --node-monitor-period5s节点监控的检测周期用于检测节点是否正常运行。 --controllers指定要运行的控制器类型在这里使用了通配符 *表示运行所有的控制器同时还包括了 bootstrapsigner 和 tokencleaner 控制器。 --allocate-node-cidrstrue为节点分配 CIDR 子网用于分配 Pod 网络地址。 --service-cluster-ip-range定义 Service 的 IP 范围这里设置为 10.96.0.0/12 和 fd00::/108。 --cluster-cidr定义集群的 CIDR 范围这里设置为 172.16.0.0/12 和 fc00::/48。 --node-cidr-mask-size-ipv4分配给每个节点的 IPv4 子网掩码大小默认是 24。 --node-cidr-mask-size-ipv6分配给每个节点的 IPv6 子网掩码大小默认是 120。 --requestheader-client-ca-file设置请求头中客户端 CA 的证书文件路径用于认证请求头中的 CA 证书。这个服务单元文件描述了 Kubernetes 控制器管理器的启动参数和行为并且定义了服务的依赖关系和重新启动策略。通过 systemd 启动该服务单元即可启动 Kubernetes 控制器管理器组件。6.2.1 启动kube-controller-manager并查看状态 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now kube-controller-manager.service # 启用并立即启动kube-controller-manager.service单元。kube-controller-manager.service是kube-controller-manager守护进程的systemd服务单元。systemctl restart kube-controller-manager.service # 重启kube-controller-manager.service单元即重新启动etcd守护进程。systemctl status kube-controller-manager.service # kube-controller-manager.service单元的当前状态包括运行状态、是否启用等信息。6.3.配置kube-scheduler service所有master节点 6.3.1 所有master节点配置且配置相同 cat /usr/lib/systemd/system/kube-scheduler.service EOF[Unit] DescriptionKubernetes Scheduler Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-scheduler \\--v2 \\--bind-address0.0.0.0 \\--leader-electtrue \\--kubeconfig/etc/kubernetes/scheduler.kubeconfigRestartalways RestartSec10s[Install] WantedBymulti-user.targetEOF参数 这是一个用于启动 Kubernetes 调度器的 systemd 服务单元文件。下面是对每个部分的详细解释[Unit]单元的基本信息部分用于描述和标识这个服务单元。 Description服务单元的描述信息说明了该服务单元的作用这里是 Kubernetes 调度器。 Documentation可选项提供了关于该服务单元的文档链接。 After定义了该服务单元在哪些其他单元之后启动这里是 network.target即在网络服务启动之后启动。[Service]定义了服务的运行参数和行为。 ExecStart指定服务启动时执行的命令这里是 /usr/local/bin/kube-scheduler并通过后续的行继续传递了一系列的参数设置。 Restart定义了服务在退出后的重新启动策略这里设置为 always表示总是重新启动服务。 RestartSec定义了重新启动服务的时间间隔这里设置为 10 秒。[Install]定义了如何安装和启用服务单元。 WantedBy指定了服务单元所属的 target这里是 multi-user.target表示启动多用户模式下的服务。在 ExecStart 中传递的参数说明如下--v2设置日志的详细级别为 2。 --bind-address0.0.0.0绑定的 IP 地址用于监听 Kubernetes 控制平面的请求这里设置为 0.0.0.0表示监听所有网络接口上的请求。 --leader-electtrue启用 Leader 选举机制确保只有一个调度器作为 leader 在运行。 --kubeconfig/etc/kubernetes/scheduler.kubeconfigkubeconfig 文件的路径包含了与 Kubernetes API 服务器通信所需的配置信息。这个服务单元文件描述了 Kubernetes 调度器的启动参数和行为并且定义了服务的依赖关系和重新启动策略。通过 systemd 启动该服务单元即可启动 Kubernetes 调度器组件。6.3.2 启动并查看服务状态 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now kube-scheduler.service # 启用并立即启动kube-scheduler.service单元。kube-scheduler.service是kube-scheduler守护进程的systemd服务单元。systemctl restart kube-scheduler.service # 重启kube-scheduler.service单元即重新启动etcd守护进程。systemctl status kube-scheduler.service # kube-scheduler.service单元的当前状态包括运行状态、是否启用等信息。7.TLS Bootstrapping配置 7.1 在master01上配置 # 在《5.高可用配置》选择使用那种高可用方案 # 若使用 haproxy、keepalived 那么为 --serverhttps://192.168.0.36:8443 # 若使用 nginx方案那么为 --serverhttps://127.0.0.1:8443mkdir ~/bootstrap cd bootstrapkubectl config set-cluster kubernetes \ --certificate-authority/etc/kubernetes/pki/ca.pem \ --embed-certstrue --serverhttps://127.0.0.1:8443 \ --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig # 这是一个使用 kubectl 命令设置 Kubernetes 集群配置的命令示例。下面是对每个选项的详细解释 # # config set-cluster kubernetes指定要设置的集群名称为 kubernetes表示要修改名为 kubernetes 的集群配置。 # --certificate-authority/etc/kubernetes/pki/ca.pem指定证书颁发机构CA的证书文件路径用于验证服务器证书的有效性。 # --embed-certstrue将证书文件嵌入到生成的 kubeconfig 文件中。这样可以避免在 kubeconfig 文件中引用外部证书文件。 # --serverhttps://127.0.0.1:8443指定 Kubernetes API 服务器的地址和端口这里使用的是 https 协议和本地地址127.0.0.1端口号为 8443。你可以根据实际环境修改该参数。 # --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig指定 kubeconfig 文件的路径和名称这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。 # 通过执行此命令你可以设置名为 kubernetes 的集群配置并提供 CA 证书、API 服务器地址和端口并将这些配置信息嵌入到 bootstrap-kubelet.kubeconfig 文件中。这个 kubeconfig 文件可以用于认证和授权 kubelet 组件与 Kubernetes API 服务器之间的通信。请确保路径和文件名与实际环境中的配置相匹配。kubectl config set-credentials tls-bootstrap-token-user \ --tokenc8ad9c.2e4d610cf3e7426e \ --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig # 这是一个使用 kubectl 命令设置凭证信息的命令示例。下面是对每个选项的详细解释 # # config set-credentials tls-bootstrap-token-user指定要设置的凭证名称为 tls-bootstrap-token-user表示要修改名为 tls-bootstrap-token-user 的用户凭证配置。 # --tokenc8ad9c.2e4d610cf3e7426e指定用户的身份验证令牌token。在这个示例中令牌是 c8ad9c.2e4d610cf3e7426e。你可以根据实际情况修改该令牌。 # --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig指定 kubeconfig 文件的路径和名称这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。 # 通过执行此命令你可以设置名为 tls-bootstrap-token-user 的用户凭证并将令牌信息加入到 bootstrap-kubelet.kubeconfig 文件中。这个 kubeconfig 文件可以用于认证和授权 kubelet 组件与 Kubernetes API 服务器之间的通信。请确保路径和文件名与实际环境中的配置相匹配。kubectl config set-context tls-bootstrap-token-userkubernetes \ --clusterkubernetes \ --usertls-bootstrap-token-user \ --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig # 这是一个使用 kubectl 命令设置上下文信息的命令示例。下面是对每个选项的详细解释 # # config set-context tls-bootstrap-token-userkubernetes指定要设置的上下文名称为 tls-bootstrap-token-userkubernetes表示要修改名为 tls-bootstrap-token-userkubernetes 的上下文配置。 # --clusterkubernetes指定上下文关联的集群名称为 kubernetes表示使用名为 kubernetes 的集群配置。 # --usertls-bootstrap-token-user指定上下文关联的用户凭证名称为 tls-bootstrap-token-user表示使用名为 tls-bootstrap-token-user 的用户凭证配置。 # --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig指定 kubeconfig 文件的路径和名称这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。 # 通过执行此命令你可以设置名为 tls-bootstrap-token-userkubernetes 的上下文并将其关联到名为 kubernetes 的集群配置和名为 tls-bootstrap-token-user 的用户凭证配置。这样bootstrap-kubelet.kubeconfig 文件就包含了完整的上下文信息可以用于指定与 Kubernetes 集群建立连接时要使用的集群和凭证。请确保路径和文件名与实际环境中的配置相匹配。kubectl config use-context tls-bootstrap-token-userkubernetes \ --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig # 这是一个使用 kubectl 命令设置当前上下文的命令示例。下面是对每个选项的详细解释 # # config use-context tls-bootstrap-token-userkubernetes指定要使用的上下文名称为 tls-bootstrap-token-userkubernetes表示要将当前上下文切换为名为 tls-bootstrap-token-userkubernetes 的上下文。 # --kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig指定 kubeconfig 文件的路径和名称这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。 # 通过执行此命令你可以将当前上下文设置为名为 tls-bootstrap-token-userkubernetes 的上下文。这样当你执行其他 kubectl 命令时它们将使用该上下文与 Kubernetes 集群进行交互。请确保路径和文件名与实际环境中的配置相匹配。# token的位置在bootstrap.secret.yaml如果修改的话到这个文件修改 mkdir -p /root/.kube ; cp /etc/kubernetes/admin.kubeconfig /root/.kube/config7.2 编写bootstrap.secret.yaml cat ~/bootstrap/bootstrap.secret.yaml EOF apiVersion: v1 kind: Secret metadata:name: bootstrap-token-c8ad9cnamespace: kube-system type: bootstrap.kubernetes.io/token stringData:description: The default bootstrap token generated by kubelet .token-id: c8ad9ctoken-secret: 2e4d610cf3e7426eusage-bootstrap-authentication: trueusage-bootstrap-signing: trueauth-extra-groups: system:bootstrappers:default-node-token,system:bootstrappers:worker,system:bootstrappers:ingress--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: kubelet-bootstrap roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:node-bootstrapper subjects: - apiGroup: rbac.authorization.k8s.iokind: Groupname: system:bootstrappers:default-node-token --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: node-autoapprove-bootstrap roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:nodeclient subjects: - apiGroup: rbac.authorization.k8s.iokind: Groupname: system:bootstrappers:default-node-token --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: node-autoapprove-certificate-rotation roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient subjects: - apiGroup: rbac.authorization.k8s.iokind: Groupname: system:nodes --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: truelabels:kubernetes.io/bootstrapping: rbac-defaultsname: system:kube-apiserver-to-kubelet rules:- apiGroups:- resources:- nodes/proxy- nodes/stats- nodes/log- nodes/spec- nodes/metricsverbs:- * --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: system:kube-apiservernamespace: roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:kube-apiserver-to-kubelet subjects:- apiGroup: rbac.authorization.k8s.iokind: Username: kube-apiserver EOF7.3 查看集群状态没问题的话继续后续操作 [rootk8s-master01 bootstrap]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19 NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy ok # 切记执行别忘记 kubectl create -f bootstrap.secret.yaml8.node节点配置 8.1.在master01上将证书复制到其他节点 cd /etc/kubernetes/for NODE in k8s-master02 k8s-master03 k8s-node01 k8s-node02; do ssh $NODE mkdir -p /etc/kubernetes/pki; for FILE in pki/ca.pem pki/ca-key.pem pki/front-proxy-ca.pem bootstrap-kubelet.kubeconfig kube-proxy.kubeconfig; do scp /etc/kubernetes/$FILE $NODE:/etc/kubernetes/${FILE}; done; done8.2.kubelet配置 注意 8.2.1 和 8.2.2 需要和 上方 2.1 和 2.2 对应起来 8.2.1 当使用docker作为Runtime不推荐 所有节(masternode)点执行 cat /usr/lib/systemd/system/kubelet.service EOF[Unit] DescriptionKubernetes Kubelet Documentationhttps://github.com/kubernetes/kubernetes[Service] ExecStart/usr/local/bin/kubelet \\--bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig \\--kubeconfig/etc/kubernetes/kubelet.kubeconfig \\--config/etc/kubernetes/kubelet-conf.yml \\--container-runtime-endpointunix:///run/cri-dockerd.sock \\--node-labelsnode.kubernetes.io/node[Install] WantedBymulti-user.target EOF# 这是一个表示 Kubernetes Kubelet 服务的 systemd 单位文件示例。下面是对每个节[Unit]、[Service]、[Install]的详细解释 # # [Unit] # # DescriptionKubernetes Kubelet指定了此单位文件对应的服务描述信息为 Kubernetes Kubelet。 # Documentation...指定了对该服务的文档链接。 # [Service] # # ExecStart/usr/local/bin/kubelet ...指定了启动 Kubelet 服务的命令和参数。这里使用的是 /usr/local/bin/kubelet 命令并传递了一系列参数来配置 Kubelet 的运行。这些参数包括 # --bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig指定了用于引导 kubelet 的 kubeconfig 文件的路径和名称。 # --kubeconfig/etc/kubernetes/kubelet.kubeconfig指定了 kubelet 的 kubeconfig 文件的路径和名称。 # --config/etc/kubernetes/kubelet-conf.yml指定了 kubelet 的配置文件的路径和名称。 # --container-runtime-endpointunix:///run/cri-dockerd.sock指定了容器运行时接口的端点地址这里使用的是 Docker 运行时cri-dockerd的 UNIX 套接字。 # --node-labelsnode.kubernetes.io/node指定了节点的标签。这里的示例只给节点添加了一个简单的标签 node.kubernetes.io/node。 # [Install] # # WantedBymulti-user.target指定了在 multi-user.target 被启动时该服务应该被启用。 # 通过这个单位文件你可以配置 Kubelet 服务的启动参数指定相关的配置文件和凭证文件以及定义节点的标签。请确认路径和文件名与你的实际环境中的配置相匹配。8.2.2 当使用Containerd作为Runtime 推荐 所有节(masternode)点执行 mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/# 所有k8s节点配置kubelet service cat /usr/lib/systemd/system/kubelet.service EOF[Unit] DescriptionKubernetes Kubelet Documentationhttps://github.com/kubernetes/kubernetes Aftercontainerd.service Requirescontainerd.service[Service] ExecStart/usr/local/bin/kubelet \\--bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.kubeconfig \\--kubeconfig/etc/kubernetes/kubelet.kubeconfig \\--config/etc/kubernetes/kubelet-conf.yml \\--container-runtime-endpointunix:///run/containerd/containerd.sock \\--node-labelsnode.kubernetes.io/node[Install] WantedBymulti-user.target EOF# 这是一个表示 Kubernetes Kubelet 服务的 systemd 单位文件示例。与之前相比添加了 After 和 Requires 字段来指定依赖关系。 # # [Unit] # # DescriptionKubernetes Kubelet指定了此单位文件对应的服务描述信息为 Kubernetes Kubelet。 # Documentation...指定了对该服务的文档链接。 # Aftercontainerd.service指定了该服务在 containerd.service 服务之后启动。这表示 Kubelet 服务依赖于 containerd 服务的启动。 # Requirescontainerd.service指定了该服务需要 containerd.service 服务存在。这表示 Kubelet 服务依赖于 containerd 服务的存在。 # [Service] # # ExecStart/usr/local/bin/kubelet ...指定了启动 Kubelet 服务的命令和参数与之前的示例相同。 # --container-runtime-endpointunix:///run/containerd/containerd.sock修改了容器运行时接口的端点地址将其更改为使用 containerd 运行时通过 UNIX 套接字。 # [Install] # # WantedBymulti-user.target指定了在 multi-user.target 被启动时该服务应该被启用。 # 通过这个单位文件你可以配置 Kubelet 服务的启动参数并指定了它依赖的 containerd 服务。确保路径和文件名与你实际环境中的配置相匹配。8.2.3 所有k8s节点创建kubelet的配置文件 所有节(masternode)点执行 cat /etc/kubernetes/kubelet-conf.yml EOF apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration address: 0.0.0.0 port: 10250 readOnlyPort: 10255 authentication:anonymous:enabled: falsewebhook:cacheTTL: 2m0senabled: truex509:clientCAFile: /etc/kubernetes/pki/ca.pem authorization:mode: Webhookwebhook:cacheAuthorizedTTL: 5m0scacheUnauthorizedTTL: 30s cgroupDriver: systemd cgroupsPerQOS: true clusterDNS: - 10.96.0.10 clusterDomain: cluster.local containerLogMaxFiles: 5 containerLogMaxSize: 10Mi contentType: application/vnd.kubernetes.protobuf cpuCFSQuota: true cpuManagerPolicy: none cpuManagerReconcilePeriod: 10s enableControllerAttachDetach: true enableDebuggingHandlers: true enforceNodeAllocatable: - pods eventBurst: 10 eventRecordQPS: 5 evictionHard:imagefs.available: 15%memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5% evictionPressureTransitionPeriod: 5m0s failSwapOn: true fileCheckFrequency: 20s hairpinMode: promiscuous-bridge healthzBindAddress: 127.0.0.1 healthzPort: 10248 httpCheckFrequency: 20s imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 80 imageMinimumGCAge: 2m0s iptablesDropBit: 15 iptablesMasqueradeBit: 14 kubeAPIBurst: 10 kubeAPIQPS: 5 makeIPTablesUtilChains: true maxOpenFiles: 1000000 maxPods: 110 nodeStatusUpdateFrequency: 10s oomScoreAdj: -999 podPidsLimit: -1 registryBurst: 10 registryPullQPS: 5 resolvConf: /etc/resolv.conf rotateCertificates: true runtimeRequestTimeout: 2m0s serializeImagePulls: true staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 4h0m0s syncFrequency: 1m0s volumeStatsAggPeriod: 1m0s EOF# 这是一个Kubelet的配置文件用于配置Kubelet的各项参数。 # # - apiVersion: kubelet.config.k8s.io/v1beta1指定了配置文件的API版本为kubelet.config.k8s.io/v1beta1。 # - kind: KubeletConfiguration指定了配置类别为KubeletConfiguration。 # - address: 0.0.0.0指定了Kubelet监听的地址为0.0.0.0。 # - port: 10250指定了Kubelet监听的端口为10250。 # - readOnlyPort: 10255指定了只读端口为10255用于提供只读的状态信息。 # - authentication指定了认证相关的配置信息。 # - anonymous.enabled: false禁用了匿名认证。 # - webhook.enabled: true启用了Webhook认证。 # - x509.clientCAFile: /etc/kubernetes/pki/ca.pem指定了X509证书的客户端CA文件路径。 # - authorization指定了授权相关的配置信息。 # - mode: Webhook指定了授权模式为Webhook。 # - webhook.cacheAuthorizedTTL: 5m0s指定了授权缓存时间段为5分钟。 # - webhook.cacheUnauthorizedTTL: 30s指定了未授权缓存时间段为30秒。 # - cgroupDriver: systemd指定了Cgroup驱动为systemd。 # - cgroupsPerQOS: true启用了每个QoS类别一个Cgroup的设置。 # - clusterDNS: 指定了集群的DNS服务器地址列表。 # - 10.96.0.10指定了DNS服务器地址为10.96.0.10。 # - clusterDomain: cluster.local指定了集群的域名后缀为cluster.local。 # - containerLogMaxFiles: 5指定了容器日志文件保留的最大数量为5个。 # - containerLogMaxSize: 10Mi指定了容器日志文件的最大大小为10Mi。 # - contentType: application/vnd.kubernetes.protobuf指定了内容类型为protobuf。 # - cpuCFSQuota: true启用了CPU CFS Quota。 # - cpuManagerPolicy: none禁用了CPU Manager。 # - cpuManagerReconcilePeriod: 10s指定了CPU管理器的调整周期为10秒。 # - enableControllerAttachDetach: true启用了控制器的挂载和拆卸。 # - enableDebuggingHandlers: true启用了调试处理程序。 # - enforceNodeAllocatable: 指定了强制节点可分配资源的列表。 # - pods强制节点可分配pods资源。 # - eventBurst: 10指定了事件突发的最大数量为10。 # - eventRecordQPS: 5指定了事件记录的最大请求量为5。 # - evictionHard: 指定了驱逐硬性限制参数的配置信息。 # - imagefs.available: 15%指定了镜像文件系统可用空间的限制为15%。 # - memory.available: 100Mi指定了可用内存的限制为100Mi。 # - nodefs.available: 10%指定了节点文件系统可用空间的限制为10%。 # - nodefs.inodesFree: 5%指定了节点文件系统可用inode的限制为5%。 # - evictionPressureTransitionPeriod: 5m0s指定了驱逐压力转换的时间段为5分钟。 # - failSwapOn: true指定了在发生OOM时禁用交换分区。 # - fileCheckFrequency: 20s指定了文件检查频率为20秒。 # - hairpinMode: promiscuous-bridge设置了Hairpin Mode为promiscuous-bridge。 # - healthzBindAddress: 127.0.0.1指定了健康检查的绑定地址为127.0.0.1。 # - healthzPort: 10248指定了健康检查的端口为10248。 # - httpCheckFrequency: 20s指定了HTTP检查的频率为20秒。 # - imageGCHighThresholdPercent: 85指定了镜像垃圾回收的上阈值为85%。 # - imageGCLowThresholdPercent: 80指定了镜像垃圾回收的下阈值为80%。 # - imageMinimumGCAge: 2m0s指定了镜像垃圾回收的最小时间为2分钟。 # - iptablesDropBit: 15指定了iptables的Drop Bit为15。 # - iptablesMasqueradeBit: 14指定了iptables的Masquerade Bit为14。 # - kubeAPIBurst: 10指定了KubeAPI的突发请求数量为10个。 # - kubeAPIQPS: 5指定了KubeAPI的每秒请求频率为5个。 # - makeIPTablesUtilChains: true指定了是否使用iptables工具链。 # - maxOpenFiles: 1000000指定了最大打开文件数为1000000。 # - maxPods: 110指定了最大的Pod数量为110。 # - nodeStatusUpdateFrequency: 10s指定了节点状态更新的频率为10秒。 # - oomScoreAdj: -999指定了OOM Score Adjustment为-999。 # - podPidsLimit: -1指定了Pod的PID限制为-1表示无限制。 # - registryBurst: 10指定了Registry的突发请求数量为10个。 # - registryPullQPS: 5指定了Registry的每秒拉取请求数量为5个。 # - resolvConf: /etc/resolv.conf指定了resolv.conf的文件路径。 # - rotateCertificates: true指定了是否轮转证书。 # - runtimeRequestTimeout: 2m0s指定了运行时请求的超时时间为2分钟。 # - serializeImagePulls: true指定了是否序列化镜像拉取。 # - staticPodPath: /etc/kubernetes/manifests指定了静态Pod的路径。 # - streamingConnectionIdleTimeout: 4h0m0s指定了流式连接的空闲超时时间为4小时。 # - syncFrequency: 1m0s指定了同步频率为1分钟。 # - volumeStatsAggPeriod: 1m0s指定了卷统计聚合周期为1分钟。8.2.4 启动kubelet 所有节点(masternode)执行 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now kubelet.service # 启用并立即启动kubelet.service单元。kubelet.service是kubelet守护进程的systemd服务单元。systemctl restart kubelet.service # 重启kubelet.service单元即重新启动kubelet守护进程。systemctl status kubelet.service # kubelet.service单元的当前状态包括运行状态、是否启用等信息。8.2.5 查看集群 master01节点执行 [rootk8s-master01 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master01 Ready none 18s v1.28.0 k8s-master02 Ready none 16s v1.28.0 k8s-master03 Ready none 16s v1.28.0 k8s-node01 Ready none 14s v1.28.0 k8s-node02 Ready none 14s v1.28.0 [rootk8s-master01 ~]#8.2.6 查看容器运行时 所有节(masternode)点执行 [rootk8s-master01 ~]# kubectl describe node | grep RuntimeContainer Runtime Version: containerd://1.7.3Container Runtime Version: containerd://1.7.3Container Runtime Version: containerd://1.7.3Container Runtime Version: containerd://1.7.3Container Runtime Version: containerd://1.7.3[rootk8s-master01 ~]# kubectl describe node | grep RuntimeContainer Runtime Version: docker://24.0.5Container Runtime Version: docker://24.0.5Container Runtime Version: docker://24.0.5Container Runtime Version: docker://24.0.5Container Runtime Version: docker://24.0.5 8.3.kube-proxy配置 8.3.1 将kubeconfig发送至其他节点 master01节点执行 # master-1执行 for NODE in k8s-master02 k8s-master03 k8s-node01 k8s-node02; do scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfig; done8.3.2 所有k8s节点添加kube-proxy的service文件 所有节点(masternode)执行 cat /usr/lib/systemd/system/kube-proxy.service EOF [Unit] DescriptionKubernetes Kube Proxy Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target[Service] ExecStart/usr/local/bin/kube-proxy \\--config/etc/kubernetes/kube-proxy.yaml \\--v2 Restartalways RestartSec10s[Install] WantedBymulti-user.targetEOF# 这是一个 systemd 服务单元文件的示例用于配置 Kubernetes Kube Proxy 服务。下面是对其中一些字段的详细解释 # # [Unit] # # Description: 描述了该服务单元的用途这里是 Kubernetes Kube Proxy。 # Documentation: 指定了该服务单元的文档地址即 https://github.com/kubernetes/kubernetes。 # After: 指定该服务单元应在 network.target网络目标之后启动。 # [Service] # # ExecStart: 指定了启动 Kube Proxy 服务的命令。通过 /usr/local/bin/kube-proxy 命令启动并指定了配置文件的路径为 /etc/kubernetes/kube-proxy.yaml同时指定了日志级别为 2。 # Restart: 配置了服务在失败或退出后自动重启。 # RestartSec: 配置了重启间隔这里是每次重启之间的等待时间为 10 秒。 # [Install] # # WantedBy: 指定了该服务单元的安装目标为 multi-user.target多用户目标表示该服务将在多用户模式下启动。 # 通过配置这些字段你可以启动和管理 Kubernetes Kube Proxy 服务。请注意你需要根据实际情况修改 ExecStart 中的路径和文件名确保与你的环境一致。另外可以根据需求修改其他字段的值以满足你的特定要求。8.3.3 所有k8s节点添加kube-proxy的配置 所有节点(masternode)执行 cat /etc/kubernetes/kube-proxy.yaml EOF apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 clientConnection:acceptContentTypes: burst: 10contentType: application/vnd.kubernetes.protobufkubeconfig: /etc/kubernetes/kube-proxy.kubeconfigqps: 5 clusterCIDR: 172.16.0.0/12,fc00:2222::/112 configSyncPeriod: 15m0s conntrack:max: nullmaxPerCore: 32768min: 131072tcpCloseWaitTimeout: 1h0m0stcpEstablishedTimeout: 24h0m0s enableProfiling: false healthzBindAddress: 0.0.0.0:10256 hostnameOverride: iptables:masqueradeAll: falsemasqueradeBit: 14minSyncPeriod: 0ssyncPeriod: 30s ipvs:masqueradeAll: trueminSyncPeriod: 5sscheduler: rrsyncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 127.0.0.1:10249 mode: ipvs nodePortAddresses: null oomScoreAdj: -999 portRange: udpIdleTimeout: 250ms EOF# 这是一个Kubernetes的kube-proxy组件配置文件示例。以下是每个配置项的详细解释 # # 1. apiVersion: kubeproxy.config.k8s.io/v1alpha1 # - 指定该配置文件的API版本。 # # 2. bindAddress: 0.0.0.0 # - 指定kube-proxy使用的监听地址。0.0.0.0表示监听所有网络接口。 # # 3. clientConnection: # - 客户端连接配置项。 # # a. acceptContentTypes: # - 指定接受的内容类型。 # # b. burst: 10 # - 客户端请求超出qps设置时的最大突发请求数。 # # c. contentType: application/vnd.kubernetes.protobuf # - 指定客户端请求的内容类型。 # # d. kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig # - kube-proxy使用的kubeconfig文件路径。 # # e. qps: 5 # - 每秒向API服务器发送的请求数量。 # # 4. clusterCIDR: 172.16.0.0/12,fc00:2222::/112 # - 指定集群使用的CIDR范围用于自动分配Pod IP。 # # 5. configSyncPeriod: 15m0s # - 指定kube-proxy配置同步到节点的频率。 # # 6. conntrack: # - 连接跟踪设置。 # # a. max: null # - 指定连接跟踪的最大值。 # # b. maxPerCore: 32768 # - 指定每个核心的最大连接跟踪数。 # # c. min: 131072 # - 指定最小的连接跟踪数。 # # d. tcpCloseWaitTimeout: 1h0m0s # - 指定处于CLOSE_WAIT状态的TCP连接的超时时间。 # # e. tcpEstablishedTimeout: 24h0m0s # - 指定已建立的TCP连接的超时时间。 # # 7. enableProfiling: false # - 是否启用性能分析。 # # 8. healthzBindAddress: 0.0.0.0:10256 # - 指定健康检查监听地址和端口。 # # 9. hostnameOverride: # - 指定覆盖默认主机名的值。 # # 10. iptables: # - iptables设置。 # # a. masqueradeAll: false # - 是否对所有流量使用IP伪装。 # # b. masqueradeBit: 14 # - 指定伪装的Bit标记。 # # c. minSyncPeriod: 0s # - 指定同步iptables规则的最小间隔。 # # d. syncPeriod: 30s # - 指定同步iptables规则的时间间隔。 # # 11. ipvs: # - ipvs设置。 # # a. masqueradeAll: true # - 是否对所有流量使用IP伪装。 # # b. minSyncPeriod: 5s # - 指定同步ipvs规则的最小间隔。 # # c. scheduler: rr # - 指定ipvs默认使用的调度算法。 # # d. syncPeriod: 30s # - 指定同步ipvs规则的时间间隔。 # # 12. kind: KubeProxyConfiguration # - 指定该配置文件的类型。 # # 13. metricsBindAddress: 127.0.0.1:10249 # - 指定指标绑定的地址和端口。 # # 14. mode: ipvs # - 指定kube-proxy的模式。这里指定为ipvs使用IPVS代理模式。 # # 15. nodePortAddresses: null # - 指定可用于NodePort的网络地址。 # # 16. oomScoreAdj: -999 # - 指定kube-proxy的OOM优先级。 # # 17. portRange: # - 指定可用于服务端口范围。 # # 18. udpIdleTimeout: 250ms # - 指定UDP连接的空闲超时时间。8.3.4 启动kube-proxy 所有节点(masternode)执行 systemctl daemon-reload # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件如.service文件、.socket文件等需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now kube-proxy.service # 启用并立即启动kube-proxy.service单元。kube-proxy.service是kube-proxy守护进程的systemd服务单元。systemctl restart kube-proxy.service # 重启kube-proxy.service单元即重新启动kube-proxy守护进程。systemctl status kube-proxy.service # kube-proxy.service单元的当前状态包括运行状态、是否启用等信息。9.安装网络插件 注意 9.1 和 9.2 二选其一即可建议在此处创建好快照后在进行操作后续出问题可以回滚 centos7 要升级libseccomp 不然 无法安装网络插件否则报错 failed to create shim task: OCI runtime create failed 所有节点(masternode)执行 # https://github.com/opencontainers/runc/releases # 升级runc # wget https://ghproxy.com/https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64install -m 755 runc.amd64 /usr/local/sbin/runc cp -p /usr/local/sbin/runc /usr/local/bin/runc cp -p /usr/local/sbin/runc /usr/bin/runc#下载高于2.4以上的包 yum -y install http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm # 清华源 yum -y install https://mirrors.tuna.tsinghua.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm#查看当前版本 [rootk8s-master-1 ~]# rpm -qa | grep libseccomp libseccomp-2.5.1-1.el8.x86_649.0安装docker 所有节点(masternode)都需要有docker环境 参考https://blog.csdn.net/lzb348110175/article/details/132847035 9.1 安装Calico推荐 如虚拟机配置不能太低起码2G内存。否则会有意外的问题 9.1.1 更改calico网段 master01节点执行 wget https://mirrors.chenby.cn/https://github.com/projectcalico/calico/blob/master/manifests/calico-typha.yamlcp calico-typha.yaml calico.yaml cp calico-typha.yaml calico-ipv6.yamlvim calico.yaml # 打开注释CALICO_IPV4POOL_CIDR- name: CALICO_IPV4POOL_CIDRvalue: 172.16.0.0/12# vim calico-ipv6.yaml # calico-config ConfigMap处ipam: {type: calico-ipam,assign_ipv4: true,assign_ipv6: true},- name: IPvalue: autodetect- name: IP6value: autodetect- name: CALICO_IPV4POOL_CIDRvalue: 172.16.0.0/12- name: CALICO_IPV6POOL_CIDRvalue: fc00:2222::/112- name: FELIX_IPV6SUPPORTvalue: true# 若docker镜像拉不下来可以使用国内的仓库 sed -i s#docker.io/calico/#m.daocloud.io/docker.io/calico/#g calico.yaml sed -i s#docker.io/calico/#m.daocloud.io/docker.io/calico/#g calico-ipv6.yaml# 本地没有公网 IPv6 使用 calico.yaml kubectl apply -f calico.yaml# 本地有公网 IPv6 使用 calico-ipv6.yaml # kubectl apply -f calico-ipv6.yaml 9.1.2 查看容器状态 master01节点执行 # calico 初始化会很慢 需要耐心等待一下大约十分钟左右 [rootk8s-master01 lzb]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-765c96cb9d-2r26x 1/1 Running 0 8m13s kube-system calico-node-jgzv7 1/1 Running 0 21m kube-system calico-node-jwbzx 1/1 Running 0 21m kube-system calico-node-pqgjh 1/1 Running 1 (19m ago) 21m kube-system calico-node-tbn7t 1/1 Running 2 (19m ago) 21m kube-system calico-node-xmmzt 1/1 Running 0 21m kube-system calico-typha-67c57cdf49-swvhz 1/1 Running 0 21m# 如果看到STATUS状态不为Running,可以通过 kubectl describe pod [Pod名称] -n [namespace] 查看日志如果是Terminated状态可以通过kubectl delete pod [Pod名称] -n [namespace] --force 强制删除9.2 安装cilium不推荐 9.2.1 安装helm # [rootk8s-master01 ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # [rootk8s-master01 ~]# chmod 700 get_helm.sh # [rootk8s-master01 ~]# ./get_helm.shwget https://mirrors.huaweicloud.com/helm/v3.12.3/helm-v3.12.3-linux-amd64.tar.gz tar xvf helm-*-linux-amd64.tar.gz cp linux-amd64/helm /usr/local/bin/9.2.2 安装cilium # 添加源 helm repo add cilium https://helm.cilium.io# 修改为国内源 helm pull cilium/cilium tar xvf cilium-*.tgz cd cilium/ sed -i s#quay.io/#m.daocloud.io/quay.io/#g values.yaml# 默认参数安装 helm install cilium ./cilium/ -n kube-system# 启用ipv6 # helm install cilium cilium/cilium --namespace kube-system --set ipv6.enabledtrue# 启用路由信息和监控插件 # helm install cilium cilium/cilium --namespace kube-system --set hubble.relay.enabledtrue --set hubble.ui.enabledtrue --set prometheus.enabledtrue --set operator.prometheus.enabledtrue --set hubble.enabledtrue --set hubble.metrics.enabled{dns,drop,tcp,flow,port-distribution,icmp,http} 9.2.3 查看 [rootk8s-master01 ~]# kubectl get pod -A | grep cil kube-system cilium-gmr6c 1/1 Running 0 5m3s kube-system cilium-kzgdj 1/1 Running 0 5m3s kube-system cilium-operator-69b677f97c-6pw4k 1/1 Running 0 5m3s kube-system cilium-operator-69b677f97c-xzzdk 1/1 Running 0 5m3s kube-system cilium-q2rnr 1/1 Running 0 5m3s kube-system cilium-smx5v 1/1 Running 0 5m3s kube-system cilium-tdjq4 1/1 Running 0 5m3s [rootk8s-master01 ~]#9.2.4 下载专属监控面板 安装时候没有创建 监控可以忽略 [rootk8s-master01 yaml]# wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/1.12.1/examples/kubernetes/addons/prometheus/monitoring-example.yaml[rootk8s-master01 yaml]# sed -i s#docker.io/#m.daocloud.io/docker.io/#g monitoring-example.yaml[rootk8s-master01 yaml]# kubectl apply -f monitoring-example.yaml namespace/cilium-monitoring created serviceaccount/prometheus-k8s created configmap/grafana-config created configmap/grafana-cilium-dashboard created configmap/grafana-cilium-operator-dashboard created configmap/grafana-hubble-dashboard created configmap/prometheus created clusterrole.rbac.authorization.k8s.io/prometheus created clusterrolebinding.rbac.authorization.k8s.io/prometheus created service/grafana created service/prometheus created deployment.apps/grafana created deployment.apps/prometheus created [rootk8s-master01 yaml]#9.2.5 下载部署测试用例 说明 测试用例 需要在 安装CoreDNS 之后即可完成 wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/master/examples/kubernetes/connectivity-check/connectivity-check.yamlsed -i s#google.com#baidu.cn#g connectivity-check.yaml sed -i s#quay.io/#m.daocloud.io/quay.io/#g connectivity-check.yamlkubectl apply -f connectivity-check.yaml9.2.6 查看pod [rootk8s-master01 yaml]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE cilium-monitoring grafana-59957b9549-6zzqh 1/1 Running 0 10m cilium-monitoring prometheus-7c8c9684bb-4v9cl 1/1 Running 0 10m default chenby-75b5d7fbfb-7zjsr 1/1 Running 0 27h default chenby-75b5d7fbfb-hbvr8 1/1 Running 0 27h default chenby-75b5d7fbfb-ppbzg 1/1 Running 0 27h default echo-a-6799dff547-pnx6w 1/1 Running 0 10m default echo-b-fc47b659c-4bdg9 1/1 Running 0 10m default echo-b-host-67fcfd59b7-28r9s 1/1 Running 0 10m default host-to-b-multi-node-clusterip-69c57975d6-z4j2z 1/1 Running 0 10m default host-to-b-multi-node-headless-865899f7bb-frrmc 1/1 Running 0 10m default pod-to-a-allowed-cnp-5f9d7d4b9d-hcd8x 1/1 Running 0 10m default pod-to-a-denied-cnp-65cc5ff97b-2rzb8 1/1 Running 0 10m default pod-to-a-dfc64f564-p7xcn 1/1 Running 0 10m default pod-to-b-intra-node-nodeport-677868746b-trk2l 1/1 Running 0 10m default pod-to-b-multi-node-clusterip-76bbbc677b-knfq2 1/1 Running 0 10m default pod-to-b-multi-node-headless-698c6579fd-mmvd7 1/1 Running 0 10m default pod-to-b-multi-node-nodeport-5dc4b8cfd6-8dxmz 1/1 Running 0 10m default pod-to-external-1111-8459965778-pjt9b 1/1 Running 0 10m default pod-to-external-fqdn-allow-google-cnp-64df9fb89b-l9l4q 1/1 Running 0 10m kube-system cilium-7rfj6 1/1 Running 0 56s kube-system cilium-d4cch 1/1 Running 0 56s kube-system cilium-h5x8r 1/1 Running 0 56s kube-system cilium-operator-5dbddb6dbf-flpl5 1/1 Running 0 56s kube-system cilium-operator-5dbddb6dbf-gcznc 1/1 Running 0 56s kube-system cilium-t2xlz 1/1 Running 0 56s kube-system cilium-z65z7 1/1 Running 0 56s kube-system coredns-665475b9f8-jkqn8 1/1 Running 1 (36h ago) 36h kube-system hubble-relay-59d8575-9pl9z 1/1 Running 0 56s kube-system hubble-ui-64d4995d57-nsv9j 2/2 Running 0 56s kube-system metrics-server-776f58c94b-c6zgs 1/1 Running 1 (36h ago) 37h [rootk8s-master01 yaml]#9.2.7 修改为NodePort 安装时候没有创建 监控可以忽略 [rootk8s-master01 yaml]# kubectl edit svc -n kube-system hubble-ui service/hubble-ui edited [rootk8s-master01 yaml]# [rootk8s-master01 yaml]# kubectl edit svc -n cilium-monitoring grafana service/grafana edited [rootk8s-master01 yaml]# [rootk8s-master01 yaml]# kubectl edit svc -n cilium-monitoring prometheus service/prometheus edited [rootk8s-master01 yaml]#type: NodePort9.2.8 查看端口 安装时候没有创建 监控可以忽略 [rootk8s-master01 yaml]# kubectl get svc -A | grep monit cilium-monitoring grafana NodePort 10.100.250.17 none 3000:30707/TCP 15m cilium-monitoring prometheus NodePort 10.100.131.243 none 9090:31155/TCP 15m [rootk8s-master01 yaml]# [rootk8s-master01 yaml]# kubectl get svc -A | grep hubble kube-system hubble-metrics ClusterIP None none 9965/TCP 5m12s kube-system hubble-peer ClusterIP 10.100.150.29 none 443/TCP 5m12s kube-system hubble-relay ClusterIP 10.109.251.34 none 80/TCP 5m12s kube-system hubble-ui NodePort 10.102.253.59 none 80:31219/TCP 5m12s [rootk8s-master01 yaml]#9.2.9 访问 安装时候没有创建 监控可以忽略 http://192.168.0.31:30707 http://192.168.0.31:31155 http://192.168.0.31:3121910.安装CoreDNS 10.1以下步骤只在master01操作 10.1.1 修改文件 corDNS需要使用helm 安装如没有安装helm请参考9.2.1 安装helm # 下载tgz包 helm repo add coredns https://coredns.github.io/helm helm pull coredns/coredns tar xvf coredns-*.tgz cd coredns/# 修改IP地址 vim values.yaml cat values.yaml | grep clusterIP: clusterIP: 10.96.0.10# 示例 --- service: # clusterIP: # clusterIPs: [] # loadBalancerIP: # externalIPs: [] # externalTrafficPolicy: # ipFamilyPolicy: # The name of the Service# If not set, a name is generated using the fullname templateclusterIP: 10.96.0.10name: annotations: {} ---# 修改为国内源 docker源可选 sed -i s#coredns/#m.daocloud.io/docker.io/coredns/#g values.yaml sed -i s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g values.yaml# 默认参数安装 helm install coredns ./coredns/ -n kube-system11.安装Metrics Server 11.1 以下步骤只在master01操作 11.1.1 安装Metrics-server 在新版的Kubernetes中系统资源的采集均使用Metrics-server可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率 # 单机版 wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 高可用版本(我第一次安装使用的高可用版本) wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml# 修改配置(此处修改配置直接从这里找对应文件即可https://ghproxy.com/https://github.com/cby-chen/Kubernetes/releases/download/v1.28.0/kubernetes-v1.28.0.tar) vim components.yaml vim high-availability.yaml# 修改policy/v1beta1为policy/v1 # 如果是 Kubernetes 1.25 版本需要将这里的 apiVersion 从 policy/v1beta1 更换为 policy/v1 # 否则会报错no matches for kind PodDisruptionBudget in version policy/v1beta1 apiVersion: policy/v1# 需要添加内容的3处地方 --- # 1 - args:- --cert-dir/tmp- --secure-port4443- --kubelet-preferred-address-typesInternalIP,ExternalIP,Hostname- --kubelet-use-node-status-port- --metric-resolution15s- --kubelet-insecure-tls- --requestheader-client-ca-file/etc/kubernetes/pki/front-proxy-ca.pem- --requestheader-username-headersX-Remote-User- --requestheader-group-headersX-Remote-Group- --requestheader-extra-headers-prefixX-Remote-Extra-# 2volumeMounts:- mountPath: /tmpname: tmp-dir- name: ca-sslmountPath: /etc/kubernetes/pki# 3volumes:- emptyDir: {}name: tmp-dir- name: ca-sslhostPath:path: /etc/kubernetes/pki ---# 修改为国内源 docker源可选 sed -i s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g components.yaml sed -i s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g high-availability.yaml# 二选一 kubectl apply -f components.yaml # kubectl apply -f high-availability.yaml 11.1.2 稍等片刻查看状态 [rootk8s-master01 lzb]# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master01 185m 4% 1343Mi 72% k8s-master02 160m 4% 1207Mi 65% k8s-master03 143m 3% 1218Mi 65% k8s-node01 92m 2% 765Mi 41% k8s-node02 83m 2% 737Mi 39% 12.集群验证 12.1 部署pod资源 master01节点 catEOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata:name: busyboxnamespace: default spec:containers:- name: busyboximage: docker.io/library/busybox:1.28command:- sleep- 3600imagePullPolicy: IfNotPresentrestartPolicy: Always EOF# 查看 [rootk8s-master01 lzb]# kubectl get pod NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 11s12.2 用pod解析默认命名空间中的kubernetes master01节点 # 查看name [rootk8s-master01 lzb]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 none 443/TCP 4h16m# 进行解析 [rootk8s-master01 lzb]# kubectl exec busybox -n default -- nslookup kubernetes Server: 10.96.0.10 Address 1: 10.96.0.10 coredns-coredns.kube-system.svc.cluster.localName: kubernetes Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local12.3 测试跨命名空间是否可以解析 master01节点 # 查看有那些name [rootk8s-master01 lzb]# kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.96.0.1 none 443/TCP 4h17m kube-system calico-typha ClusterIP 10.99.130.70 none 5473/TCP 39m kube-system coredns-coredns ClusterIP 10.96.0.10 none 53/UDP,53/TCP 10m kube-system metrics-server ClusterIP 10.105.219.158 none 443/TCP 2m47s# 进行解析 [rootk8s-master01 lzb]# kubectl exec busybox -n default -- nslookup coredns-coredns.kube-system Server: 10.96.0.10 Address 1: 10.96.0.10 coredns-coredns.kube-system.svc.cluster.localName: coredns-coredns.kube-system Address 1: 10.96.0.10 coredns-coredns.kube-system.svc.cluster.local 12.4 每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 53 所有节点执行 telnet 10.96.0.1 443 Trying 10.96.0.1... Connected to 10.96.0.1. Escape character is ^].telnet 10.96.0.10 53 Trying 10.96.0.10... Connected to 10.96.0.10. Escape character is ^].curl 10.96.0.10:53 curl: (52) Empty reply from server12.5 Pod和Pod之前要能通 master01节点执行 [rootk8s-master01 lzb]# kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox 1/1 Running 0 3m58s 172.18.195.2 k8s-master03 none none[rootk8s-master01 lzb]# kubectl get po -n kube-system -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-765c96cb9d-2r26x 1/1 Running 0 29m 172.27.14.193 k8s-node02 none none calico-node-jgzv7 1/1 Running 0 42m 192.168.0.32 k8s-master02 none none calico-node-jwbzx 1/1 Running 0 42m 192.168.0.34 k8s-node01 none none calico-node-pqgjh 1/1 Running 1 (40m ago) 42m 192.168.0.33 k8s-master03 none none calico-node-tbn7t 1/1 Running 2 (40m ago) 42m 192.168.0.31 k8s-master01 none none calico-node-xmmzt 1/1 Running 0 42m 192.168.0.35 k8s-node02 none none calico-typha-67c57cdf49-swvhz 1/1 Running 0 42m 192.168.0.31 k8s-master01 none none coredns-coredns-6c9554fc94-b9md8 1/1 Running 0 13m 172.18.195.1 k8s-master03 none none metrics-server-5fd97bdcd-fjnbk 1/1 Running 0 5m30s 172.25.92.66 k8s-master02 none none metrics-server-5fd97bdcd-kqzhh 1/1 Running 0 5m30s 172.17.125.2 k8s-node01 none none# 进入busybox ping其他节点上的pod [rootk8s-master01 lzb]# kubectl exec -ti busybox -- sh / # ping 192.168.0.34 PING 192.168.0.34 (192.168.0.34): 56 data bytes 64 bytes from 192.168.0.34: seq0 ttl63 time42.624 ms 64 bytes from 192.168.0.34: seq1 ttl63 time0.530 ms 64 bytes from 192.168.0.34: seq2 ttl63 time0.568 ms 64 bytes from 192.168.0.34: seq3 ttl63 time1.066 ms# 可以连通证明这个pod是可以跨命名空间和跨主机通信的12.6 创建三个副本可以看到3个副本分布在不同的节点上用完可以删了 master01节点执行 cat deployments.yaml EOF apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploymentlabels:app: nginx spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80EOF[rootk8s-master01 lzb]# kubectl apply -f deployments.yaml deployment.apps/nginx-deployment created# 查看nginx分布在3个节点上 [rootk8s-master01 lzb]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox 1/1 Running 0 10m 172.18.195.2 k8s-master03 none none nginx-deployment-7c5ddbdf54-2sjj4 1/1 Running 0 5m2s 172.17.125.3 k8s-node01 none none nginx-deployment-7c5ddbdf54-7nkls 1/1 Running 0 5m2s 172.25.244.193 k8s-master01 none none nginx-deployment-7c5ddbdf54-zt2rx 1/1 Running 0 5m2s 172.25.92.67 k8s-master02 none none# 删除nginx [rootk8s-master01 ~]# kubectl delete -f deployments.yaml13.安装dashboard 此处使用 helm 安装镜像拉取不下来我第一次安装使用的yaml文件安装 #下载所需yaml文件(目前最新版本v3.0.0-alpha02.7.0是仅次于3.0.0的最新版本) [rootk8s-m1 certs]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml13.1更改dashboard的svc为NodePort如果已是请忽略 #修改recommended.yaml中service的相关部分可以临时使用nodeport的方式访问 kind: Service apiVersion: v1 metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard spec:type: NodePort # 添加这个NodePortports:- port: 443targetPort: 8443nodePort: 32443 # 添加这个端口selector:k8s-app: kubernetes-dashboard13.2 修改yml中的dashboard镜像地址 因为kubernetesui/dashboard 镜像在k8s集群拉取不下来但是本地 docker 能拉去下来所以镜像地址进行了修改。 先将docker本地拉取下来的镜像上传至我的阿里云仓库然后将yml中的地址修改为阿里云仓库这样就可以正常拉取下来了 如何上传至阿里云仓库参考https://blog.csdn.net/lzb348110175/article/details/132851150 # 镜像地址替换(此处阿里云仓库为公开可以随意使用) sed -i s#kubernetesui/#registry.cn-hangzhou.aliyuncs.com/lzb-kubernetesui/#g recommended.yaml13.3 应用启动dashboard kubectl apply -f recommended.yaml# 查看dashboard是否启动成功 [rootk8s-master01 lzb]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE default busybox 1/1 Running 0 24m kubernetes-dashboard dashboard-metrics-scraper-58767c966c-jwf7z 0/1 ContainerCreating 0 9s kubernetes-dashboard kubernetes-dashboard-56d9879b6f-7xp26 0/1 ContainerCreating 0 10s13.4 查看端口号 [rootk8s-master01 lzb]# kubectl get svc kubernetes-dashboard -n kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard NodePort 10.103.94.98 none 443:32443/TCP 108s13.5 创建token cat dashboard-user.yaml EOF apiVersion: v1 kind: ServiceAccount metadata:name: admin-usernamespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: admin-user roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin subjects: - kind: ServiceAccountname: admin-usernamespace: kube-system EOFkubectl apply -f dashboard-user.yaml# 创建token [rootk8s-master01 lzb]# kubectl -n kube-system create token admin-user eyJhbGciOiJSUzI1NiIsImtpZCI6IkMxQXdpZkc1dDlRUWdMUWpRaFE5R2F2ME56UlVXVTNmWUFrd0xkOTdXUVEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjk1NzE3NDk5LCJpYXQiOjE2OTU3MTM4OTksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiNDQ0ODIzM2MtMGY4Yi00OGUwLTk2ZTctZmNlMDcyNmYxY2RmIn19LCJuYmYiOjE2OTU3MTM4OTksInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbi11c2VyIn0.njIBClKan5qDafEyOsmMmmRxAmBRllXf-A_nXG_5E6GWJO5tQBAHHLk7sRwoJ5qApuZW8wWjppuESjmmlBdjFH7BjWHWlRJNzHPnPcEQHZJa9lspdZkT_KyoCLCTm-qA0bT9NixTC8i9gbiv1_WTwBAM9xfn0Kuoi_Hivu9SSN8EebFV9GlyfUEEXXGVsrxdg4nGvpQpaQThPIc6BL1RjGHAOfnIS9W0s_t6ZvofOrxEdZk5KhO7ltIEvBGcsF3wnuvbRW6OoMPfrf73KHbGLNb3qRc0htsO9G0iQV4EMItBSDyqCD-zHgid0LIpU50yuYjoMjPyowmnLf8cDyuU7Q13.6 登录dashboard 31-35哪个节点都可以登录dashboard https://192.168.0.31:32443/ 14.ingress安装 master01节点执行 ingress-nginx-admission Completed状态为Complted是正常的因为是定时任务 14.1 执行部署 wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml# 修改为国内源 docker源可选 sed -i s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g deploy.yamlcat backend.yaml EOF apiVersion: apps/v1 kind: Deployment metadata:name: default-http-backendlabels:app.kubernetes.io/name: default-http-backendnamespace: kube-system spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: default-http-backendtemplate:metadata:labels:app.kubernetes.io/name: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backendimage: registry.cn-hangzhou.aliyuncs.com/chenby/defaultbackend-amd64:1.5 livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi --- apiVersion: v1 kind: Service metadata:name: default-http-backendnamespace: kube-systemlabels:app.kubernetes.io/name: default-http-backend spec:ports:- port: 80targetPort: 8080selector:app.kubernetes.io/name: default-http-backend EOF[rootk8s-master01 lzb]# kubectl apply -f deploy.yaml namespace/ingress-nginx created serviceaccount/ingress-nginx created serviceaccount/ingress-nginx-admission created role.rbac.authorization.k8s.io/ingress-nginx created role.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io/ingress-nginx created clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io/ingress-nginx created rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created configmap/ingress-nginx-controller created service/ingress-nginx-controller created service/ingress-nginx-controller-admission created deployment.apps/ingress-nginx-controller created job.batch/ingress-nginx-admission-create created job.batch/ingress-nginx-admission-patch created ingressclass.networking.k8s.io/nginx created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created[rootk8s-master01 lzb]# kubectl apply -f backend.yaml deployment.apps/default-http-backend created service/default-http-backend createdcat ingress-demo-app.yaml EOF apiVersion: apps/v1 kind: Deployment metadata:name: hello-server spec:replicas: 2selector:matchLabels:app: hello-servertemplate:metadata:labels:app: hello-serverspec:containers:- name: hello-serverimage: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-serverports:- containerPort: 9000 --- apiVersion: apps/v1 kind: Deployment metadata:labels:app: nginx-demoname: nginx-demo spec:replicas: 2selector:matchLabels:app: nginx-demotemplate:metadata:labels:app: nginx-demospec:containers:- image: nginxname: nginx --- apiVersion: v1 kind: Service metadata:labels:app: nginx-demoname: nginx-demo spec:selector:app: nginx-demoports:- port: 8000protocol: TCPtargetPort: 80 --- apiVersion: v1 kind: Service metadata:labels:app: hello-servername: hello-server spec:selector:app: hello-serverports:- port: 8000protocol: TCPtargetPort: 9000 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: ingress-host-bar spec:ingressClassName: nginxrules:- host: hello.chenby.cnhttp:paths:- pathType: Prefixpath: /backend:service:name: hello-serverport:number: 8000- host: demo.chenby.cnhttp:paths:- pathType: Prefixpath: /nginx backend:service:name: nginx-demoport:number: 8000 EOF# 注意等创建完成后在执行 [rootk8s-master01 lzb]# kubectl apply -f ingress-demo-app.yaml deployment.apps/hello-server created deployment.apps/nginx-demo created service/nginx-demo created service/hello-server created ingress.networking.k8s.io/ingress-host-bar created[rootk8s-master01 lzb]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE ingress-host-bar nginx hello.chenby.cn,demo.chenby.cn 80 23s 14.2 过滤查看ingress端口 # 搜索type,LoadBalancer修改为NodePort [rootk8s-master01 lzb]# kubectl edit svc -n ingress-nginx ingress-nginx-controller type: NodePort[rootk8s-master01 lzb]# kubectl get svc -A | grep ingress ingress-nginx ingress-nginx-controller NodePort 10.100.181.56 none 80:30383/TCP,443:31913/TCP 8m37s ingress-nginx ingress-nginx-controller-admission ClusterIP 10.102.63.31 none 443/TCP 8m37s15.IPv6测试 #部署应用catEOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata:name: chenby spec:replicas: 3selector:matchLabels:app: chenbytemplate:metadata:labels:app: chenbyspec:containers:- name: chenbyimage: docker.io/library/nginxresources:limits:memory: 128Micpu: 500mports:- containerPort: 80--- apiVersion: v1 kind: Service metadata:name: chenby spec:ipFamilyPolicy: PreferDualStackipFamilies:- IPv6- IPv4type: NodePortselector:app: chenbyports:- port: 80targetPort: 80 EOF#查看端口 [rootk8s-master01 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE chenby NodePort fd00::a29c none 80:30779/TCP 5s [rootk8s-master01 ~]# #使用内网访问 [rootlocalhost yaml]# curl -I http://[fd00::a29c] HTTP/1.1 200 OK Server: nginx/1.21.6 Date: Thu, 05 May 2022 10:20:35 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT Connection: keep-alive ETag: 61f01158-267 Accept-Ranges: bytes[rootlocalhost yaml]# curl -I http://192.168.0.31:30779 HTTP/1.1 200 OK Server: nginx/1.21.6 Date: Thu, 05 May 2022 10:20:59 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT Connection: keep-alive ETag: 61f01158-267 Accept-Ranges: bytes[rootlocalhost yaml]# #使用公网访问 [rootlocalhost yaml]# curl -I http://[2409:8a10:9e18:9020::10]:30779 HTTP/1.1 200 OK Server: nginx/1.21.6 Date: Thu, 05 May 2022 10:20:54 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT Connection: keep-alive ETag: 61f01158-267 Accept-Ranges: bytes16.安装命令行自动补全功能 yum install bash-completion -y source /usr/share/bash-completion/bash_completion source (kubectl completion bash) echo source (kubectl completion bash) ~/.bashrc附录可选 # 镜像加速器可以使用DaoCloud仓库替换规则如下 cr.l5d.io/ m.daocloud.io/cr.l5d.io/ docker.elastic.co/ m.daocloud.io/docker.elastic.co/ docker.io/ m.daocloud.io/docker.io/ gcr.io/ m.daocloud.io/gcr.io/ ghcr.io/ m.daocloud.io/ghcr.io/ k8s.gcr.io/ m.daocloud.io/k8s.gcr.io/ mcr.microsoft.com/ m.daocloud.io/mcr.microsoft.com/ nvcr.io/ m.daocloud.io/nvcr.io/ quay.io/ m.daocloud.io/quay.io/ registry.jujucharms.com/ m.daocloud.io/registry.jujucharms.com/ registry.k8s.io/ m.daocloud.io/registry.k8s.io/ registry.opensource.zalan.do/ m.daocloud.io/registry.opensource.zalan.do/ rocks.canonical.com/ m.daocloud.io/rocks.canonical.com/# 镜像版本要自行查看因为镜像版本是随时更新的文档无法做到实时更新# docker pull 镜像docker pull registry.cn-hangzhou.aliyuncs.com/chenby/cni:master docker pull registry.cn-hangzhou.aliyuncs.com/chenby/node:master docker pull registry.cn-hangzhou.aliyuncs.com/chenby/kube-controllers:master docker pull registry.cn-hangzhou.aliyuncs.com/chenby/typha:master docker pull registry.cn-hangzhou.aliyuncs.com/chenby/coredns:v1.10.0 docker pull registry.cn-hangzhou.aliyuncs.com/chenby/pause:3.6 docker pull registry.cn-hangzhou.aliyuncs.com/chenby/metrics-server:v0.5.2 docker pull kubernetesui/dashboard:v2.7.0 docker pull kubernetesui/metrics-scraper:v1.0.8 docker pull quay.io/cilium/cilium:v1.12.6 docker pull quay.io/cilium/certgen:v0.1.8 docker pull quay.io/cilium/hubble-relay:v1.12.6 docker pull quay.io/cilium/hubble-ui-backend:v0.9.2 docker pull quay.io/cilium/hubble-ui:v0.9.2 docker pull quay.io/cilium/cilium-etcd-operator:v2.0.7 docker pull quay.io/cilium/operator:v1.12.6 docker pull quay.io/cilium/clustermesh-apiserver:v1.12.6 docker pull quay.io/coreos/etcd:v3.5.4 docker pull quay.io/cilium/startup-script:d69851597ea019af980891a4628fb36b7880ec26# docker 保存镜像 docker save registry.cn-hangzhou.aliyuncs.com/chenby/cni:master -o cni.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/node:master -o node.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/typha:master -o typha.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/kube-controllers:master -o kube-controllers.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/coredns:v1.10.0 -o coredns.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/pause:3.6 -o pause.tar docker save registry.cn-hangzhou.aliyuncs.com/chenby/metrics-server:v0.5.2 -o metrics-server.tar docker save kubernetesui/dashboard:v2.7.0 -o dashboard.tar docker save kubernetesui/metrics-scraper:v1.0.8 -o metrics-scraper.tar docker save quay.io/cilium/cilium:v1.12.6 -o cilium.tar docker save quay.io/cilium/certgen:v0.1.8 -o certgen.tar docker save quay.io/cilium/hubble-relay:v1.12.6 -o hubble-relay.tar docker save quay.io/cilium/hubble-ui-backend:v0.9.2 -o hubble-ui-backend.tar docker save quay.io/cilium/hubble-ui:v0.9.2 -o hubble-ui.tar docker save quay.io/cilium/cilium-etcd-operator:v2.0.7 -o cilium-etcd-operator.tar docker save quay.io/cilium/operator:v1.12.6 -o operator.tar docker save quay.io/cilium/clustermesh-apiserver:v1.12.6 -o clustermesh-apiserver.tar docker save quay.io/coreos/etcd:v3.5.4 -o etcd.tar docker save quay.io/cilium/startup-script:d69851597ea019af980891a4628fb36b7880ec26 -o startup-script.tar # 传输到各个节点 for NODE in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02; do scp -r images/ $NODE:/root/ ; done# 创建命名空间 ctr ns create k8s.io# 导入镜像 ctr --namespace k8s.io image import images/cni.tar ctr --namespace k8s.io image import images/node.tar ctr --namespace k8s.io image import images/typha.tar ctr --namespace k8s.io image import images/kube-controllers.tar ctr --namespace k8s.io image import images/coredns.tar ctr --namespace k8s.io image import images/pause.tar ctr --namespace k8s.io image import images/metrics-server.tar ctr --namespace k8s.io image import images/dashboard.tar ctr --namespace k8s.io image import images/metrics-scraper.tar ctr --namespace k8s.io image import images/dashboard.tar ctr --namespace k8s.io image import images/metrics-scraper.tar ctr --namespace k8s.io image import images/cilium.tar ctr --namespace k8s.io image import images/certgen.tar ctr --namespace k8s.io image import images/hubble-relay.tar ctr --namespace k8s.io image import images/hubble-ui-backend.tar ctr --namespace k8s.io image import images/hubble-ui.tar ctr --namespace k8s.io image import images/cilium-etcd-operator.tar ctr --namespace k8s.io image import images/operator.tar ctr --namespace k8s.io image import images/clustermesh-apiserver.tar ctr --namespace k8s.io image import images/etcd.tar ctr --namespace k8s.io image import images/startup-script.tar # pull tar包 解压后 helm pull cilium/cilium# 查看镜像版本 roothello:~/cilium# cat values.yaml| grep tag: -C1repository: quay.io/cilium/ciliumtag: v1.12.6pullPolicy: IfNotPresent --repository: quay.io/cilium/certgentag: v0.1.8sha256:4a456552a5f192992a6edcec2febb1c54870d665173a33dc7d876129b199ddbdpullPolicy: IfNotPresent --repository: quay.io/cilium/hubble-relaytag: v1.12.6# hubble-relay-digest --repository: quay.io/cilium/hubble-ui-backendtag: v0.9.2sha256:a3ac4d5b87889c9f7cc6323e86d3126b0d382933bd64f44382a92778b0cde5d7pullPolicy: IfNotPresent --repository: quay.io/cilium/hubble-uitag: v0.9.2sha256:d3596efc94a41c6b772b9afe6fe47c17417658956e04c3e2a28d293f2670663epullPolicy: IfNotPresent --repository: quay.io/cilium/cilium-etcd-operatortag: v2.0.7sha256:04b8327f7f992693c2cb483b999041ed8f92efc8e14f2a5f3ab95574a65ea2dcpullPolicy: IfNotPresent --repository: quay.io/cilium/operatortag: v1.12.6# operator-generic-digest --repository: quay.io/cilium/startup-scripttag: d69851597ea019af980891a4628fb36b7880ec26pullPolicy: IfNotPresent --repository: quay.io/cilium/ciliumtag: v1.12.6# cilium-digest --repository: quay.io/cilium/clustermesh-apiservertag: v1.12.6# clustermesh-apiserver-digest --repository: quay.io/coreos/etcdtag: v3.5.4sha256:795d8660c48c439a7c3764c2330ed9222ab5db5bb524d8d0607cac76f7ba82a3pullPolicy: IfNotPresent本文 Markdown 文档地址https://pan.baidu.com/s/1apCmSd9YDXdnBDt_IItOug?pwdiatz
http://www.huolong8.cn/news/85390/

相关文章:

  • 检测asp网站死循环有没有如何做网站的书
  • 用vs做网站如何连接数据库手机网站发号系统源码
  • 宽屏网站设计网站宽屏图片怎么做
  • 深网网络网站网络组建与安全通知
  • 贵州省建设厅公示网站源码网站模板
  • 做调查赚钱的网站有哪些网上购物平台口碑排名
  • 网站建设课程教学计划网站维护 网站建设属于什么
  • 佛山的网站建设如何写网站开发需求文档
  • 山西建设部网站查询wordpress 3.8 侧边栏 仪表盘
  • 湘潭网站建设 诚信磐石网络淘宝指数网站
  • 网站群建设招标学中文网站
  • 智慧团建网站链接国外seo网站
  • 网站如何绑定虚拟主机佛山找人做网站
  • 网站建设与管理 自考小程序搭建平台免费
  • 深圳建设网站排名设计一个网站页面需要多少钱
  • wordpress主题lenews网站关键词seo费用
  • 网站权限怎么弄建设小型网站价钱
  • 自助建网站的平台 数据库h5商城网站开发
  • 有哪些游戏网站福田企业网站建设
  • 青岛 公司 网站建设价格阳江网站seo公司
  • 网站dns如何修改不了电子商务具体是指什么
  • 怎么做网站流量统计百度广告 网站域名 已验证
  • 重庆住建网站惠州网站制作哪里好
  • 网站建设项目验收报告书移动网站建设是什么
  • 自己有一个域名怎么做网站如何在百度发布信息推广
  • 怎样建立公司的网站揭阳网站建设维护
  • 青岛做网站优化哪家好高端的环保行业网站开发
  • 河北网站制作多少钱互联网做网站的话术
  • 无锡网站建设 app 微信婚纱摄影网站应该如何做优化
  • 简单大气网站模板怎么制作网站栏目页主页