此博客,是根据Rancher官网文档,使用RKE测试部署最新发布版 Rancher v2.5.8 高可用集群的总结文档。Rancher文档 | K8S文档 | Rancher | Rancher文档
问题解决
系统要求
端口要求
一 了解 Rancher
Rancher 是为使用容器的公司打造的容器管理平台。Ranhcer 简化了使用 Kubernetes 的流程,开发者可以随处运行 Kubernetes(Run Kubernetes Everywhere),满足IT需求规范,赋能 DevOps 团队。
Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,自动创建节点并安装 Kubernetes 集群,或者导入任何已经存在的 Kubernetes 集群。
Rancher 支持集中化认证、权限控制、监控和管理所有 Kubernetes 集群。
Rancher 通过支持集群的身份验证和基于角色的访问控制(RBAC),使系统管理员能够从一个位置控制全部集群的访问。Rancher 可以对集群及其资源进行详细的监控和并在需要时发送告警,也可以将容器日志发送给外部日志系统,并通过应用商店与 Helm 集成。如果您具有外部 CI/CD 流水线系统,则可以将其与 Rancher 对接,如果没有,Rancher 也提供了简单易用的流水线来帮助您自动部署和升级工作负载。除此之外,Rancher 还有很多开箱即用的功能来帮助您更好的管理集群和业务应用,例如多集群应用,全局 DNS,服务网格,安全扫描,集群模版和基于 OPA 的策略管理等功能。
总而言之,Rancher 是一个全栈式的 Kubernetes 容器管理平台,也是一个可以在任何地方都能成功运行 Kubernetes 的工具。更多视频教程,请前往 Bilibili 查看。
Kubernetes 已经成为了容器管理的标准。大多数云服务和虚拟服务的提供商现在将 Kubernetes 作为标准的基础设施。用户可以使用 Rancher Kubernetes Engine(简称 RKE),或其他云服务提供商的容器服务,如 GKE、AKS、 EKS 等,创建 Kubernetes 集群。用户也可以将已有集群导入 Rancher,集中管理。 详细查看Rancher官网文档。
1 关于Helm
Helm 是安装 Rancher 高可用集群时会用到的工具。
Helm 是 Kubernetes 的软件包管理工具。Helm chart 为 Kubernetes YAML manifest 文件提供了模板语法。通过 Helm,可以创建可配置的 Deployment YAML,而不是只能用静态的 YAML。如果您想了解更多关于如何创建自己的应用商店应用(catalog),类似centos上模安的yum包管理工具,debain上面的apt-get等,请查阅 Helm官方网站 。
2 关于RKE
RKE 全称是 Rancher Kubernetes Engine。可以通过 CLI 的方式独立于 Rancher 2.x 使用。可以在安装好 docker 的 linux 主机上,快速方便的搭建 Kubernetes 集群。
关于 RKE 和 Rancher 的关系,RKE 是 Rancher 2.x 中的一个重要组成部分,在 UI 上通过“自定义主机”创建的集群和通过“主机驱动”创建的集群,都是 Rancher Server 调用 RKE 模块来实现的。
3 关于k3s
K3s 是经过精简和用户体验优化的 k8s。K3s 减少了运维负担。一条命令就可以启动 K3s。加入一个新节点,使用 4 层 LB 等也都非常简单。同时也可以使用 MySQL/SQLite 等关系型数据库作为数据库。
仪表盘会显示 Prometheus 收集到的监控数据。单击右边的 Grafana 图标,浏览器会打开一个新的标签,在Grafana 里呈现这些监控数据。
1)CPU
已预留6中的2.7:6为集群节点的 CPU 总和,2.7为集群中所有工作负载spec.containers.resources.requests.cpu 的总和。
已使用6中的1.3:6为集群节点的 CPU 总和,1.3为集群中所有节点已使用 CPU 的总和。
2)Memory
已预留22.6GiB中的1.6:22.6GiB为集群节点的 memory 总和,1.6为集群中所有工作负载spec.containers.resources.requests.memory 的总和。
已使用22.9GiB中的8:22.9GiB为集群节点的 memory 总和,8为集群中所有节点已使用 memory 的总和。
3)Pods
集群可以创建的最大 Pod 数量,单节点默认110个 pod,可以通过设置 kubelet 的max-pods来修改默认最大 Pod 数量。
项目是 Rancher 中的一个概念,能够帮助您管理 kubernetes 集群中的命名空间,您可使用项目创建多租户集群,这种集群允许多个用户使用相同的底层资源创建应用,而应用之间不会相互影响。
更多详情,请参阅 项目管理 文档。
4.3 多集群应用
通常,大多数应用都部署在单个 kubernetes 集群上,但是有时候您可能希望跨不同的集群或项目部署同一个应用的多个副本。在 Rancher 中多集群应用使用 Helm Chart,并可以跨多个集群部署应用。因为能够跨多个集群部署相同的应用,因此可以避免在对每个集群上重复执行相同的操作期间引入的人为错误。使用多集群应用,您可以确保应用在所有项目/集群中具有相同的配置,并能够根据目标项目来覆盖不同的参数。由于多集群应用被视为单个应用,因此易于管理和维护。
更多详情,请参阅 多集群应用 文档。
4.4 应用商店
Rancher 提供了基于 Helm 的应用商店的功能,该功能使部署和管理相同的应用变得更加容易。
应用商店可以是 GitHub 代码库或 Helm Chart 库,其中包含了可部署的应用。应用打包在称为 Helm Chart 的对象中。
Helm Charts 是描述一组相关 Kubernetes 资源的文件的集合。单个 Chart 可能用于部署简单的内容(例如 Mencached Pod)或复杂的内容(例如带有 HTTP 服务,数据库,缓存等的完整的 Web 应用)。
Rancher 改进了 Helm 应用商店和 Chart。所有原生 Helm Chart 都可以在 Rancher 中使用,但是 Rancher 添加了一些增强功能以改善用户体验。
更多详情,请参阅应用商店 文档
4.5 Rancher Server URL
第一次登录 Rancher 后,Rancher 将提示您输入一个Rancher Server URL。您应该将 URL 设置为 Rancher Server 的主入口点。当负载均衡器位于 Rancher Server 集群前面时,URL 应该设置为负载均衡地址。系统会自动尝试从运行 Rancher Server 的主机的 IP 地址或主机名推断 Rancher Server 的 URL,但只有在运行单节点的 Rancher Server 时,上述推断才会正确。因此,在大多数情况下,您需要自己将 Rancher Server URL 设置为正确的值。
更多详情,请参阅 配置 Rancher Server URL文档。
4.6 RKE 模板
RKE 的全称是Rancher Kubernetes Engine,它是 Rancher 用来创建 Kubernetes 集群的工具。RKE 集群模板制定了 DevOps 和安全团队的标准,简化了 Kubernetes 集群的创建过程。
多集群管理面临着如何强制实施安全策略和附加配置的挑战,在将集群移交给最终用户之前,管理员需要标准化这些配置。RKE 集群模板提供了标准化集群配置的方式。无论是使用 Rancher UI、Rancher API 还是自动化流程创建的集群,Rancher 都将保证从 RKE 集群模板创建的每个集群在生成方式上是一致的。
更多详情,请参阅RKE 模板文档。
4.7 GIS 扫描
Rancher 充分利用了kube-bench来对 Kubernetes 集群进行安全扫描。Rancher 会检查 Kubernetes 集群是否遵循了 CIS (Center for Internet Security,互联网安全中心) Kubernetes Benchmark 中定义的最佳实践。
CIS Kubernetes Benchmark 是一个可以用来给 Kubernetes 创建安全基准的参考文档。
互联网安全中心(CIS)是一个501©(3)非营利组织,成立于 2000 年 10 月,其使命是“通过识别,开发,验证,推广和维护最佳实践解决方案来防御网络攻击,并建立和引导社区打造安全可信的网络环境”。
CIS 基准测试是安全配置目标系统的最佳实践。CIS 基准是通过领域专家,技术供应商,公共和私人社区成员以及 CIS 基准开发团队的不懈努力而制定的。
基准提供两种类型的建议:计分和不记分。我们仅运行与“计分建议”相关的测试。
当 Rancher 对一个集群进行 CIS 安全扫描时,它会生成一个展示每个测试结果的报告。报告中包括通过,跳过和失败的测试数量的汇总。报告中同时也给失败的测试提供了补救办法。
更多详情,请参阅 安全扫描 文档。
安装 Rancher 的方式有两种:单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境,而且单节点安装和高可用集群安装之间不能进行数据迁移,所以推荐从一开始就使用高可用集群安装的方式安装 Rancher。
建议将 Rancher Server 安装在高可用的 Kubernetes 集群上,主要是因为它可以保护 Rancher Server 的数据。在高可用安装中,负载均衡器充当客户端的单点入口,并在集群中的多台服务器之间分配网络流量,这有助于防止任何一台服务器成为单点故障。
不建议在单个 Docker 容器中安装 Rancher,因为如果该节点发生故障,则其他节点上将没有可用的集群数据副本,并且可能会丢失 Rancher Server 上的数据。
Rancher 需要安装在高可用的 RKE(Rancher Kubernetes Engine)Kubernetes 集群上,或高可用的K3s (轻量级 Kubernetes) Kubernetes 集群。 RKE 和 K3s 都是经过完全认证的 Kubernetes 发行版。
5.1 K3S Kubernetes 集群安装
如果您是首次安装 Rancher v2.4,建议将其安装在 K3s Kubernetes 集群上。这种 K3s 架构的一个主要优点是,它允许使用外部数据库保存集群数据,从而可以将 K3s 服务器节点视为无状态的。
在 K3s 集群上安装 Rancher 的功能是在 Rancher v2.5.8 中引入的。K3s 易于安装,仅需要 Kubernetes 一半的内存,而且所有组件都在一个不超过 100 MB 的二进制文件中。
使用 K3s Kubernetes 集群运行 Rancher Management Server 的架构:
5.2 RKE Kubernetes 集群安装
如果要安装 Rancher v2.5.8 之前的版本,您需要在 RKE 集群上安装 Rancher,该集群中的数据存储在每个有 etcd 角色的节点上。在 Rancher v2.5.8中,没有将 Rancher Server 从 RKE 集群迁移到 K3s 集群的方法。所有版本的 Rancher Server(包括 v2.4+)仍然可以安装在 RKE 集群上。
在 RKE 安装中,集群数据将在集群中的三个 etcd 节点上进行复制,这是为了保障在一个 etcd 节点发生故障时,可以提供冗余和数据复制。
使用 RKE Kubernetes 集群运行 Rancher Management Server 的架构:
我们建议您使用以下方案,配置您的负载均衡和 Ingress Controller:
在kubernetes集群中安装Ranhcer,并使用四层负载均衡,SSL终止在 Ingress Controller 中。
为了达到最好的性能和安全条件,我们建议您为 Rancher 创建一个专用的 Kubernetes 集群,只在这个机器中部署 Rancher Server,不在这个集群中运行应用或程序。部署 Rancher 后,您可以 创建新集群或导入已有集群 ,然后用这些集群启动您自己的应用或程序。
我们不建议在托管的 Kubernetes 集群上,如 EKS 和 GKE,安装 Rancher。 这些托管的 Kubernetes 集群不会将 etcd 暴露给 Rancher ,达到 Rancher 可以管理的程度,而且它们的特殊改动可能与 Rancher 的操作冲突。
根据Rancher是安装在 K3S Kubernetes 集群上还是 RKE Kubernetes 集群上,我们对每个节点的角色的建议有所不同。
在 K3s 集群中,有两种类型的节点:Server 节点和 Agent 节点。Server 节点和 Agent 节点 都可以运行工作负载。Server 节点运行 Kubernetes Master。
对于运行 Rancher Server 的集群,建议使用两个 Server 节点。不需要 Agent 节点。
如果将 Rancher 安装在 RKE Kubernetes 集群上,则该集群应具有三个节点,并且每个节点都应具有所有三个 Kubernetes 角色:etcd,controlplane 和 worker。
Rancher Server RKE 集群和下游 Kubernetes RKE 集群的架构对比:
我们对 Rancher Server 集群上的 RKE 节点角色的建议与对运行您的业务应用的下游集群的建议相反。
在配置下游 Kubernetes 集群时,Rancher 使用 RKE 作为创建下游 Kubernetes 集群的工具。注意:在将来的 Rancher 版本中将添加创建下游 K3s 集群的功能。
对于下游 Kubernetes 集群,考虑到稳定性和可扩展性,我们建议下游集群中的每个节点都应只扮演一个角色。
RKE 每个节点至少需要一个角色,但并不强制每个节点只能有一个角色。但是,对于运行您的业务应用的集群,我们建议为每个节点使用单独的角色,这可以保证工作节点上的工作负载不会干扰 Kubernetes Master 或集群数据。
以下是我们对于下游集群的最低配置建议:
在安装 Rancher Server 时三个节点,每个节点都有三个角色是安全的,因为:
因为这个集群中只部署了 Rancher server,没有其他程序或应用,这个集群已经足以应对大多数情况。所以这个集群并不需要像我们建议的下游集群那样的可扩展性和可靠性。
Rancher 安装的 Kubernetes 集群中的每个节点都应该运行一个 Ingress。
Ingress 应被部署为 DaemonSet,以确保你的负载平衡器能够成功地将流量路由到所有节点。
对于 RKE、K3s 和 RancherD 的安装,你不需要手动安装 Ingress,因为它是默认安装的。
对于托管的 Kubernetes 集群(EKS、GKE、AKS)和 RKE2 Kubernetes 安装,你将需要设置 Ingress。
下面的版本为当前的最新版和稳定版:
类型 | Rancher 版本 | Docker 标签 | Helm 仓库 | Helm Chart 版本 |
---|---|---|---|---|
最新版 | v2.5.8 | rancher/rancher:latest | server-charts/latest | v2.5.8 |
稳定版 | v2.5.8 | rancher/rancher:stable | server-charts/stable | v2.5.8 |
1 Rancher支持的kubernetes版本
更多信息可以转到官方链接查看。此处我仅列举了本人文档里试验总结的官方最新稳定版的相关信息:Support matrix | SUSE
适用于本地集群的 RKE CLI 和 K8S:
Rancher版本 | 推荐的CLI版本 | KUBERNETES版本 |
---|---|---|
v2.5.8 | v1.2.8 | v1.20.4(默认) v1.19.8 v1.18.16 v1.17.17 |
操作系统和 Docker:
类型 | 版本 | 已于1验证/认证 |
---|---|---|
CentOS | 7.7、7.8、7.9 | Docker 18.06.3、18.09.x,19.03.x,20.10.x |
Rancher RKE 下游集群 - Linux Work 节点
注意:Rancher RKE下游群集可以由节点驱动程序或自定义/现有节点配置,也可以注册到Rancher中。
操作系统和Docker:
类型 | 版本 | 已于1验证/认证 |
---|---|---|
CentOS | 7.7、7.8、7.9 | Docker 18.06.3、18.09.x,19.03.x,20.10.x |
本地集群:
操作系统:
类型 | 版本 | 已于1验证/认证 |
---|---|---|
CentOS | 7.8、7.9、8.2、8.3 | x86_64架构 |
注意:Rancher K3S群集只能在Rancher中注册。
操作系统:
类型 | 版本 | 已于1验证/认证 |
---|---|---|
CentOS | 7.8、7.9、8.2、8.3 | x86_64架构 |
支持的K3S版本:
RKE可以兼容当前的所有Docker版本。
每个RKE版本都有受支持的Kubernetes版本的特定列表。如果您要使用的版本与下面列出的版本不同,则需要使用中的系统映像选项来更新Kubernetes cluster.yml。
列举支持的 Kubernetes 版本:
Kubernetes版本 |
---|
v1.20.6-rancher1-1 |
v1.19.10-rancher1-1 |
v1.18.18-rancher1-2 |
v1.17.17-rancher2-3 |
2 .也可以输入以下命令,快速获取支持的版本号:
./rke config --list-version --all
v1.20.6-rancher1-1
v1.17.17-rancher2-3
v1.18.18-rancher1-2
v1.19.10-rancher1-1
kubectl 可以比 kube-apiserver 高一个小版本,也可以低一个小版本。
例如:
Helm 版本 支持的 Kubernetes 版本 |
---|
3.5.x 1.20.x - 1.17.x |
3.4.x 1.19.x - 1.16.x |
3.3.x 1.18.x - 1.15.x |
3.2.x 1.18.x - 1.15.x |
3.1.x 1.17.x - 1.14.x |
3.0.x 1.16.x - 1.13.x |
2.16.x 1.16.x - 1.15.x |
2.15.x 1.15.x - 1.14.x |
2.14.x 1.14.x - 1.13.x |
2.13.x 1.13.x - 1.12.x |
2.12.x 1.12.x - 1.11.x |
2.11.x 1.11.x - 1.10.x |
2.10.x 1.10.x - 1.9.x |
2.9.x 1.10.x - 1.9.x |
2.8.x 1.9.x - 1.8.x |
2.7.x 1.8.x - 1.7.x |
2.6.x 1.7.x - 1.6.x |
2.5.x 1.6.x - 1.5.x |
2.4.x 1.6.x - 1.5.x |
2.3.x 1.5.x - 1.4.x |
2.2.x 1.5.x - 1.4.x |
2.1.x 1.5.x - 1.4.x |
2.0.x 1.4.x - 1.3.x |
将最新的经过验证的Docker版本更新为20.10。
每一个 Kubernetes 版本支持的 Docker 版本都不同。
官方已在 NGINX 1.14 上进行了测试NGINX 配置。
为了可以通过 SSH 访问每一个节点,RKE 要求每个节点上安装的是 OpenSSH 的版本是OpenSSH 7.0+。
三 主机配置
先配置4台最小化安装的主机,其中3台使用RKE配置k8s集群,然后在这个集群上配置高可用Rancher。
要在高可用性 RKE 集群上安装 Rancher 管理服务器,我们建议设置以下基础设施:
注意:Rancher对于配置k8s集群的主机性能要求较高,如果配置较低,会有k8s集群被迫中断的风险。nginx主机性能满足基本要求就可以了,配置要求不大。经试验几次后,我给予的虚拟机Rancher集群k8s主机配置的是:2U,运行内存4G和存储内存50G
国内用户可根据此链接可以下载所有资源:http://mirror.cnrancher.com
注意:以下步骤,四台主机均要操作。
[root@nginx ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
yum -y install epel-release
yum -y install lrzsz vim gcc glibc openssl openssl-devel net-tools wget curl
yum -y update #更新软件包版本和内核版本
测试环境中,为了方便将防火墙和selinux关闭;生产环境中,建议关闭selinux,防火墙规则根据环境需要自定义即可。
#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
为了防止后续集群在客户端和服务器之间因为时钟不同步而发生验证错误。
yum install ntp #每台主机安装ntp服务
systemctl start ntpd #启动时钟同步服务
systemctl enable ntpd #设置开机启动
ntpq -p #查看时钟同步状态
yum install ntp ntpdate -y
之后,选择一台主机(172.16.10.66)作为ntp时间服务器,修改/etc/ntp.conf
文件,删除:
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
改为:
server ntp3.aliyun.com iburst
另外,原始文件中有一行为如下内容:
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
去掉#,打开注释,并将其ip修改为服务器所在网段:
restrict 172.16.10.66 mask 255.255.240.0 nomodify notrap
在集群中的其他服务器上,也要修改此文件,删除掉:
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
加入:
server 172.16.10.66 prefer
保存后退出,在集群中的所有服务器上执行如下命令:
systemctl stop chronyd.service
systemctl disable chronyd.service
systemctl restart ntpd
systemctl enable ntpd
之后,在集群中172.16.10.66以外的服务器上执行:
[root@rancher-master01-67 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
172.16.10.66 .INIT. 16 u 59 64 0 0.000 0.000 0.000
说明时间已经同步。
cat >> /etc/sysctl.conf << eof
vm.swappiness=0
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
eof
使内核参数生效:
[root@nginx ~]# modprobe br_netfilter #首先执行这个命令后才不会报错
[root@nginx ~]# sysctl -p
vm.swappiness = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 6144
net.ipv4.neigh.default.gc_thresh3 = 8192
vm.swappiness = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 6144
net.ipv4.neigh.default.gc_thresh3 = 8192
SSH server全系统配置文件,位于/etc/ssh/sshd_config
,该文件必须包含以下代码,允许 TCP 转发。
[root@nginx ~]# vim /etc/ssh/sshd_config
AllowTcpForwarding yes
#重启sshd服务
[root@nginx ~]# systemctl restart sshd
#分别修改每条主机的hostname
[root@nginx ~]# hostnamectl set-hostname nginx
[root@rancher-master01-67 ~]# hostnamectl set-hostname rancher-master01-67
[root@rancher-master02-68 ~]# hostnamectl set-hostname rancher-master02-68
[root@rancher-master03-69 ~]# hostnamectl set-hostname rancher-master03-69
#修改完后可直接断开Xshell的连接,再重新连接Xshell就可以看到主机名已修改了
在 /etc/hosts 文件中添加主机名配置:
cat >> /etc/hosts << eof
172.16.10.66 nginx
172.16.10.67 rancher-master01-67
172.16.10.68 rancher-master02-68
172.16.10.69 rancher-master03-69
eof
注意:下面的步骤仅在k8s的3台主机上操作,nginx上不用操作
#临时关闭
swapoff -a
#永久关闭
进入/etc/fstab文件,注释掉swap分区的相关配置内容
由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块。
cat > /etc/sysconfig/modules/ipvs.modules << eof
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
eof
[root@rancher-master01-67 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@rancher-master01-67 ~]# bash /etc/sysconfig/modules/ipvs.modules
[root@rancher-master01-67 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 #查看是否已经正确安装lipset软件包
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 141432 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4 15053 31
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 133053 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
前面脚本创建了/etc/sysconfig/modules/ipvs.modules
文件,保证在节点重启后能自动加载所需模块。
cat >> /etc/rc.d/rc.local << eof
bash /etc/sysconfig/modules/ipvs.modules
eof
chmod +x /etc/rc.d/rc.local
注意:仅在k8s节点安装docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
yum install epel-release -y
在新主机上首次安装docker之前,需要设置Docker仓库;之后,可以从仓库安装和更新 docker。
安装所需的软件包。yum-utils 提供了 yum-config-manager,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils device-mapper-persistent-data lvm2
设置稳定仓库。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 速度慢的可以换为阿里云源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo/
4 . 安装docker
按版本号排序列出存储库中可用的版本号
[root@rancher-master01-67 ~]# yum list docker-ce --showduplicates | sort -r
* updates: mirrors.tuna.tsinghua.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
* extras: mirrors.bupt.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.14-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.13-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.12-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.11-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.10-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.15-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.14-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.13-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.11-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.10-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
* base: mirrors.bupt.edu.cn
Available Packages
根据前面软件要求的内容,可以直接安装最新版docker-20.10.x:
yum install -y docker-ce docker-ce-cli containerd.io #默认安装最新版本的docker
若是安装指定版本,例如:
yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7 containerd.io
安装docker命令补全工具:
yum install -y bash-completion
[allen@nginx rancher]$ source /usr/share/bash-completion/bash_completion
[allen@nginx rancher]$ source <(helm completion bash)
环境变量:
HELM_BIN="helm"
HELM_CACHE_HOME="/root/.cache/helm"
HELM_CONFIG_HOME="/root/.config/helm"
HELM_DATA_HOME="/root/.local/share/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="default"
HELM_PLUGINS="/root/.local/share/helm/plugins"
HELM_REGISTRY_CONFIG="/root/.config/helm/registry/config.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"
启动docker:
systemctl start docker
5. 配置docker镜像下载加速器
tee /etc/docker/daemon.json << eof
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
]
}
eof
私有仓库
tee /etc/docker/daemon.json << eof
{
"insecure-registries": [ "harbor.jettech.com", "192.168.99.41","172.16.10.21:5000"],
"registry-mirrors": ["https://registry.docker-cn.com"]
}
eof
6 启动docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
安装docker仓库 离线
[root@nginx ~]# ls
docker docker-18.06.3-ce.tgz
[root@nginx ~]# ls docker
docker docker-containerd docker-containerd-ctr docker-containerd-shim dockerd docker-init docker-proxy docker-runc
[root@nginx ~]# cp docker/* /usr/bin/
[root@nginx ~]# cat>/usr/lib/systemd/system/docker.service<
目前有4台服务器,确保可以通过ssh互相访问。
[root@nginx ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:3WGDwxDcDhnQZ0IEhhjW20e/iUmhm+HWpmlr2l3aK8c root@nginx
The key's randomart image is:
+---[RSA 2048]----+
| o+ .+B*= |
| .. o. Oo+. |
| o o O+ + |
| . + o.o+ o |
| . BSo.o. |
| = = o |
| . + .. |
| .=..+E |
| .+o.ooo. |
+----[SHA256]-----+
[root@nginx ~]#
[root@nginx ~]# ssh-copy-id -i 172.16.10.67
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.67 (172.16.10.67)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.10.67'"
and check to make sure that only the key(s) you wanted were added.
[root@nginx ~]# ssh-copy-id -i 172.16.10.68
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.68 (172.16.10.68)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.10.68'"
and check to make sure that only the key(s) you wanted were added.
[root@nginx ~]# ssh-copy-id -i 172.16.10.69
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.69 (172.16.10.69)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.10.69'"
and check to make sure that only the key(s) you wanted were added.
在每个节点上创建allen普通用户,并将其加入docker用户组中;把nginx主机当做主控机,其他主机的allen用户互信它的allen用户。
//nginx节点
[root@nginx ~]# useradd -m allen
[root@nginx ~]# echo 123456aA | passwd --stdin allen
Changing password for user allen.
passwd: all authentication tokens updated successfully.
[root@nginx ~]# groupadd docker
[root@nginx ~]# usermod -G docker allen
//更新用户组
[root@nginx ~]# newgrp docker
[root@nginx ~]# id allen
uid=1000(allen) gid=1000(allen) groups=1000(allen),1001(docker)
[root@nginx ~]#
//3个k8s节点均按照步rancher-master01-67骤操作
[root@rancher-master01-67 ~]# useradd allen
[root@rancher-master01-67 ~]# echo 123456aA | passwd --stdin allen
Changing password for user allen.
passwd: all authentication tokens updated successfully.
[root@rancher-master01-67 ~]# usermod -G docker allen
[root@rancher-master01-67 ~]# newgrp docker
[root@rancher-master01-67 ~]# id allen
uid=1000(allen) gid=1000(allen) groups=1000(allen),993(docker)
//切换到hqx用户,测试hqx用户是否能运行docker命令
[root@rancher-master01-67 ~]# sudo su - allen
[allen@rancher-master01-67 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//每台主机切换到hqx用户,让每个节点主机的ops用户互相信任
[root@nginx ~]# sudo su - allen
Last login: Fri Apr 29 14:45:56 CST 2022 on pts/0
[allen@nginx ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/allen/.ssh/id_rsa):
Created directory '/home/allen/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/allen/.ssh/id_rsa.
Your public key has been saved in /home/allen/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:D19eFzTrCNZ+rRE0de9sef8w+oNPZc29k0QuWRpUuFQ allen@nginx
The key's randomart image is:
+---[RSA 2048]----+
| .*Eo|
| o+..=|
| o.oo=.|
| . o.X=*|
| S .*o*&|
| + o .+B=|
| o ..=+.|
| .o.oo|
| .oo..|
+----[SHA256]-----+
[allen@nginx ~]$
[allen@nginx ~]$
[allen@nginx ~]$ ssh-copy-id -i [email protected]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/allen/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.67 (172.16.10.67)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
[allen@nginx ~]$ ssh-copy-id -i [email protected]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/allen/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.68 (172.16.10.68)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
[allen@nginx ~]$ ssh-copy-id -i [email protected]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/allen/.ssh/id_rsa.pub"
The authenticity of host '172.16.10.69 (172.16.10.69)' can't be established.
ECDSA key fingerprint is SHA256:+nG8Y3ul7JpoenSK6Vwrcfsmd2/VUrqNchNyM4rojGA.
ECDSA key fingerprint is MD5:e4:f7:86:54:9b:43:2e:41:af:dc:45:64:8a:e0:a3:51.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
最后在nginx主机上测试:通过allen用户可以直接连接到每个k8s节点,并能运行docker相关命令。
[allen@nginx ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.66 nginx
172.16.10.67 rancher-master01-67
172.16.10.68 rancher-master02-68
172.16.10.69 rancher-master03-69
[allen@nginx ~]$ ssh rancher-master01-67
Last login: Fri Apr 29 14:54:54 2022 from nginx
[allen@rancher-master01-67 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注意:完成以上配置后,需重启主机,某些配置参数才会生效。
登录主机,打开浏览器,访问 RKE 版本发布页面,下载最新的 RKE v1.2.8。[[allen@nginx ~]$ wget https://github.com/rancher/rke/releases/download/v1.2.8/rke_linux-amd64]
每个RKE版本都有受支持的Kubernetes版本的特定列表。如果您要使用的版本与下面列出的版本不同,则需要使用中的 系统映像 选项来更新Kubernetes cluster.yml。
Kubernetes version |
---|
v1.20.6-rancher1-1 |
v1.19.10-rancher1-1 |
v1.18.18-rancher1-2 |
v1.17.17-rancher2-3 |
镜像列表
运行以下命令,将下载的 RKE 二进制安装包复制到您想要保存的路径下,然后将这个安装包重命名为rke。
[allen@nginx rke]$ ls
rke_linux-amd64
[allen@nginx rke]$ mv rke_linux-amd64 rke
[allen@nginx rke]$ chmod +x rke
[allen@nginx rke]$ ./rke --version
注意:以下1和2已在初始化环境完成,3需要在每个节点执行
kubernetes集群组件需要在Linux发行版上的Docker中运行,只要是能安装和运行docker是linux发行版,都可以使用。
1. SSH用户 - 使用SSH访问节点的用户必须是节点上docker用户组的成员。
2. 禁用所有的work节点上的交换功能(swap)。
3. 在命令行工具中输入以下命令和脚本,检查下列模组是否存在
[allen@nginx rke]$ cat module.sh
for module in br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp;
do
if ! lsmod | grep -q $module; then
echo "module $module is not present";
fi;
done
[allen@nginx rke]$ chmod +x module.sh
[allen@nginx rke]$ sh module.sh
module ip_set_hash_net is not present
module iptable_raw is not present
module x_tables is not present
module xt_multiport is not present
module xt_recent is not present
module xt_tcpudp is not present
报错:所有模块不存在
[allen@nginx rke]$ exit
logout
You have new mail in /var/spool/mail/root
[root@nginx ~]# modprobe -a br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp
[root@nginx ~]# sudo su - allen
Last login: Fri Apr 29 15:13:35 CST 2022 on pts/0
[allen@nginx ~]$ cd rke/
[allen@nginx rke]$ sh module.sh
module x_tables is not present
module xt_tcpudp is not present
会有2个模块没有找到,不影响:
返回的模组应该包括下列的所有模组:模组名称
模组名称 |
---|
br_netfilter |
ip6_udp_tunnel |
ip_set |
ip_set_hash_ip |
ip_set_hash_net |
iptable_filter |
iptable_nat |
iptable_mangle |
iptable_raw |
nf_conntrack_netlink |
nf_conntrack |
nf_conntrack_ipv4 |
nf_defrag_ipv4 |
nf_nat |
nf_nat_ipv4 |
nf_nat_masquerade_ipv4 |
nfnetlink |
udp_tunnel |
veth |
vxlan |
x_tables |
xt_addrtype |
xt_conntrack |
xt_comment |
xt_mark |
xt_multiport |
xt_nat |
xt_recent |
xt_set |
xt_statistic |
xt_tcpudp |
创建一个名为 cluster.yml 的 Kubernetes 集群配置文件。在后续步骤中,当使用 RKE 命令设置集群时,它将使用此文件在节点上安装 Kubernetes。
RKE适配了高可用集群,您可以在 cluster.yml 文件中配置多个 controlplane 节点。RKE 会把 master 节点的组件部署在所有被列为 controlplane 的节点上,同时把 kubelets 的默认连接地址配置为 127.0.0.1:6443 。这个地址是nginx-proxy请求所有 master 节点的地址。
创建高可用集群需要指定两个或更多的节点作为 controlplane 。
RKE使用集群配置文件 cluster.yml 规划集群中的节点,例如集群中应该包含哪些节点,如何部署 Kubernetes。您可以通过该文件修改很多集群配置选项。
如果您的节点具有公共和内部地址,建议设置 internal_address: 这样 Kubernetes 会将其用于集群内通信。
RKE需要通过 SSH 连接到每个节点,并且它将在默认位置 ~/.ssh/id_rsa 中寻找私钥。如果您的默认私钥与节点的私钥不在同一个位置,则还需要为该节点配置 ssh_key_path 选项
我这里根据官网列举了几个RKE节点选项:
选项 | 必填 | 描述 |
---|---|---|
address | 是 | 公用 DNS 或 IP 地址 |
user | 是 | 可以运行 docker 命令的用户 |
role | 是 | 分配给节点的 Kubernetes 角色列表 |
internal_address | 是 | 内部集群流量的专用 DNS 或 IP 地址 |
ssh_key_path | 否 | 用于对节点进行身份验证的 SSH 私钥的路径(默认为~/.ssh/id_rsa) |
cluster_name | 集群名称 | 默认集群名称:local |
ignore_docker_version | 检查docker版本 | 在运行 RKE 前是否执行 Docker 版本检测,可选值为true和false,默认值为false |
kubernetes_version | kubernetes版本 | 将原有的版本号修改为新的版本号即可,RKE 目前不支持回滚 Kubernetes 版本。 |
prefix_path | 前缀路径 | 默认下RKE 存储ROS、CoreOS 等操作系统的相关资源时,添加一个前缀:/opt/rke |
ssh_key_path | 集群ssh秘钥路径 | RKE 使用ssh连接到主机,通常情况下,每个节点都会在nodes部分为每个 ssh 密钥设置一个独立的路径。 |
案列
rke config 命令
创建集群配置文件,然后将集群参数逐个输入到该文件中。 2. 使用 rke config
运行 rke config 命令,在当前路径下创建 cluster.yml 文件。这条命令会引导您输入创建集群所需的所有参数,详情请参考集群配置选项。
[allen@nginx rke]$ ./rke config --name cluster.yml
[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:
[+] Number of Hosts [1]:
[+] SSH Address of host (1) [none]: 172.16.10.67
[+] SSH Port of host (1) [22]: 22
[+] SSH Private Key Path of host (172.16.10.67) [none]:
[-] You have entered empty SSH key path, trying fetch from SSH key parameter
[+] SSH Private Key of host (172.16.10.67) [none]:
[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa
[+] SSH User of host (172.16.10.67) [ubuntu]: allen
[+] Is host (172.16.10.67) a Control Plane host (y/n)? [y]:
[+] Is host (172.16.10.67) a Worker host (y/n)? [n]: y
[+] Is host (172.16.10.67) an etcd host (y/n)? [n]: y
[+] Override Hostname of host (172.16.10.67) [none]:
[+] Internal IP of host (172.16.10.67) [none]: 172.16.10.67
[+] Docker socket path on host (172.16.10.67) [/var/run/docker.sock]:
[+] Network Plugin Type (flannel, calico, weave, canal, aci) [canal]: calico
[+] Authentication Strategy [x509]:
[+] Authorization Mode (rbac, none) [rbac]:
[+] Kubernetes Docker image [rancher/hyperkube:v1.20.6-rancher1]:
[+] Cluster domain [cluster.local]: jettech.com
[+] Service Cluster IP Range [10.43.0.0/16]:
[+] Enable PodSecurityPolicy [n]:
[+] Cluster Network CIDR [10.42.0.0/16]:
[+] Cluster DNS Service IP [10.43.0.10]:
[+] Add addon manifest URLs or YAML files [no]:
中间有一些内容是需要修改的,比如etcd的备份周期,备份保留时间,ingress是否安装等等。
cluster.yml配置文件内容:参考 官方kubernetes配置选项
3 . 扩展 - 其他配置选项
在原有创建集群配置文件命令的基础上,加上 --empty ,可以创建一个空白的集群配置文件
rke config --empty --name cluster.yml
您也可以使用 --print
,将cluster.yml文件的内容显示出来。
rke config --print
4. 证书
默认情况下,Kubernetes 集群需要用到证书,而RKE会自动为所有集群组件生成证书。我使用的是RKE自动生成的证书,则直接跳过此步骤。
您也可以使用 自定义证书 。部署集群后,您可以管理这些自动生成的证书,详情请参考 管理自动生成的证书 。
[root@rancher-nginx-26 rancker]# cat rancher-cluster.yml
nodes:
- address: 172.16.10.67
internal_address: 172.16.10.67
user: allen
role: [controlplane, worker, etcd]
- address: 172.16.10.68
internal_address: 172.16.10.68
user: allen
role: [controlplane, worker, etcd]
- address: 172.16.10.69
internal_address: 172.16.10.69
user: allen
role: [controlplane, worker, etcd]
services:
etcd:
snapshot: true
creation: 6h
retention: 24
# Required for external TLS termination with
# # ingress-nginx v0.22+
ingress:
provider: nginx
# options: #使用 NGINX v0.25 为外部 TLS 配置 Ingress
# use-forwarded-headers: 'true'
设置全局私有仓库地址我这里可以阿里巴巴的,也可以是自己的如何在国内使用 Rancher | Rancher文档
从 UI 导航到Settings
,然后编辑system-default-registry
,Value 设置为registry.cn-hangzhou.aliyuncs.com
私有仓库:
浏览我们的版本发布页面,查找你想安装的 Rancher v2.x.x 版本。不要下载标记为 rc
或 Pre-release
的版本,因为它们在生产环境下是不稳定的。我目前是v2.5.8版本
从发行版 Assets 部分下载以下文件,这些文件是离线环境下安装 Rancher 所必需的:
Release 文件 | 描述 |
---|---|
rancher-images.txt |
此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。下载 |
rancher-save-images.sh |
这个脚本会从 DockerHub 中拉取在文件rancher-images.txt 中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz 。下载 |
rancher-load-images.sh |
这个脚本会载入文件rancher-images.tar.gz 中的镜像,并将它们推送到你自己的私有镜像库。下载 |
1. 为rancher-save-images.sh
文件添加可执行权限
chmod +x rancher-save-images.sh
2. 执行脚本rancher-save-images.sh
并以--image-list ./rancher-images.txt
作为参数,创建所有需要镜像的压缩包:
./rancher-save-images.sh --image-list ./rancher-images.txt
如何在国内使用 Rancher | Rancher文档
国内用户,可以从 https://mirror.rancher.cn --> rancher --> [rancher 版本] 下载 rancher-save-images.sh,该脚本支持通过参数
--from-aliyun true
来指定从阿里云镜像仓库拉去 rancher 镜像(从 rancher/rancher release 下载的 rancher-save-images.sh 不支持该参数),例如:
[root@rancher-master01-67 alibb]# ./rancher-save-images.sh --image-list ./rancher-images.txt --from-aliyun true
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/backup-restore-operator:v1.0.4-rc4
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/cis-operator:v1.0.4
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/configmap-reload:v0.3.0-rancher4
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coredns-coredns:1.6.2
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coredns-coredns:1.6.9
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coredns-coredns:1.8.0
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coreos-flannel:v0.13.0-rancher1
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coreos-kube-state-metrics:v1.9.7
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/coreos-prometheus-config-reloader:v0.39.0
结果: Docker 会开始拉取用于离线安装所需的镜像。这个过程会花费几分钟时间。完成时,你的当前目录会输出名为rancher-images.tar.gz
的压缩包。请确认输出文件是否存在。
下一步,你将使用脚本将文件 rancher-images.tar.gz
中的镜像上传到你自己的私有镜像库。
文件 rancher-images.txt
和 rancher-images.tar.gz
应该位于工作站中运行 rancher-load-images.sh
脚本的同一目录下。
1.登录私有镜像库:
[root@rancher-master01-67 rancher]# docker login harbor.jettech.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2.为 rancher-load-images.sh
添加可执行权限
chmod +x rancher-load-images.sh
3. 使用脚本 rancher-load-images.sh
提取rancher-images.tar.gz
文件中的镜像,根据文件rancher-images.txt
中的镜像列表对提取的镜像文件重新打 tag 并推送到你的私有镜像库:
./rancher-load-images.sh --image-list ./rancher-images.txt --registry harbor.jettech.com
参考
3.5-1 运行RKE部署kubernetes集群 私有仓库版本
[allen@nginx rke]$ cat rancher-cluster.yml
nodes:
- address: 172.16.10.67
internal_address: 172.16.10.67
user: allen
role: [controlplane, worker, etcd]
- address: 172.16.10.68
internal_address: 172.16.10.68
user: allen
role: [controlplane, worker, etcd]
- address: 172.16.10.69
internal_address: 172.16.10.69
user: allen
role: [controlplane, worker, etcd]
services:
etcd:
snapshot: true
creation: 6h
retention: 24
# kube-api:
# service_node_port_range: 10000-65535
# pod_security_policy: false
# kube-controller:
# kubelet:
# cluster_domain: jettech.com
# If set to true, RKE will not fail when unsupported Docker version
# # are found
ignore_docker_version: false
private_registries:
- url: harbor.jettech.com
user: admin
password: Harbor12345
is_default: true
#kubernetes_version: v1.20.6-rancher1
#cluster_name: local
# Required for external TLS termination with
# # ingress-nginx v0.22+
ingress:
provider: nginx
效果
[allen@nginx rke]$ ./rke up --config ./rancher-cluster.yml
INFO[0000] Running RKE version: v1.2.8
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [certificates] GenerateServingCertificate is disabled, checking if there are unused kubelet certificates
INFO[0000] [certificates] Generating admin certificates and kubeconfig
INFO[0000] Successfully Deployed state file at [./rancher-cluster.rkestate]
INFO[0000] Building Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [172.16.10.69]
INFO[0000] [dialer] Setup tunnel for host [172.16.10.68]
INFO[0000] [dialer] Setup tunnel for host [172.16.10.67]
INFO[0000] [network] Deploying port listener containers
INFO[0000] Image [harbor.jettech.com/rancher/rke-tools:v0.1.74] exists on host [172.16.10.67]
INFO[0000] Image [harbor.jettech.com/rancher/rke-tools:v0.1.74] exists on host [172.16.10.69]
INFO[0000] Image [harbor.jettech.com/rancher/rke-tools:v0.1.74] exists on host [172.16.10.68]
INFO[0000] Starting container [rke-etcd-port-listener] on host [172.16.10.69], try #1
运行该命令后,返回的最后一行信息应该是 Finished building Kubernetes cluster successfully
,表示成功部署集群,可以开始使用集群。
错误1:Failed to bring up Etcd Plane: Error: No such container: etcd-rolling-snapshots
[allen@nginx rke]$ cat rancher-cluster.yml nodes: - address: 172.16.10.67 internal_address: 172.16.10.67 user: allen role: [controlplane, worker, etcd] - address: 172.16.10.68 internal_address: 172.16.10.68 user: allen role: [controlplane, worker, etcd] - address: 172.16.10.69 internal_address: 172.16.10.69 user: allen role: [controlplane, worker, etcd] #services: # etcd: # snapshot: true # creation: 6h # retention: 24 # kube-api: # service_node_port_range: 10000-65535 # pod_security_policy: false # kube-controller: # kubelet: # cluster_domain: jettech.com # If set to true, RKE will not fail when unsupported Docker version # # are found #ignore_docker_version: false private_registries: - url: harbor.jettech.com user: admin password: Harbor12345 is_default: true #kubernetes_version: v1.20.6-rancher1 #cluster_name: local # Required for external TLS termination with # # ingress-nginx v0.22+ ingress: provider: nginx
注释调servces
错误2: to authenticate, attempted methods [none publickey], no supported methods remain
解决:ssh信任没有做好,请确保是普通用户执行 rke,不能是root用户。
错误3:
解决:远程用户无法使用 docker ps 命令,将用户添加到docker用户组。
错误4:
解决:可能是机器配置过低,有超时的情况。
把这三台主机上已经启动的docker容器清理了,然后重新执行命令,以免影响再次的操作。
在三台k8s主机上用root权限执行下面命令:
[root@rancher-master01-67 ~]# cat clean.sh
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -X
/sbin/iptables -F
/sbin/iptables -Z
docker system prune -f
docker stop $(docker ps -aq)
docker rm -f $(docker ps -aq)
docker volume rm $(docker volume ls -q)
docker image rm $(docker image ls -q)
rm -rf /etc/ceph \
/etc/cni \
/etc/kubernetes \
/opt/cni \
/opt/rke \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/etcd \
/var/lib/cni \
/var/lib/kubelet \
/var/lib/rancher/rke/log \
/var/log/containers \
/var/log/pods \
/var/run/calico
systemctl restart docker
注意上面清理会删除所有数据包括镜像和容器,谨慎操作。操作之前做好上传和数据备份
上次执行时产生的文件,重新执行命令时会自动覆盖。
[allen@nginx rke]$ ls
kube_config_rancher-cluster.yml rancher-cluster.rkestate rancher-cluster.yml
4. 重新执行一遍 ./rke up --config ./rancher-cluster.yml
即可。
1)cluster.yml:RKE 集群的配置文件。
2)kube_config_cluster.yml:该集群的 Kubeconfig 文件包含了获取该集群所有权限的认证凭据。
3)cluster.rkestate:Kubernetes 集群状态文件,该文件包含当前集群的状态、RKE 配置信息和证书信息,包含了获取该集群所有权限的认证凭据,使用 RKE v0.2.0 或更高版本时才会创建这个文件
2. 说明
kube_config_cluster.yml
和 cluster.rkestate
两个文件的名称取决于您如何命名 RKE 集群配置文件,如果您修改的集群配置文件的名称,那么后两个文件的名称可能会跟上面列出来的文件名称不一样
与 Kubernetes 集群通信前,您需要在nginx主机中下载和安装kubectl文件,请单击 此处 下载kubectl。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
//说明:如需下载某个指定的版本,请用指定版本号替换该命令的这一部分: $(curl -L -s https://dl.k8s.io/release/stable.txt)。
[root@nginx ~]# curl -L -s https://dl.k8s.io/release/stable.txt
v1.21.1 //所以我这次在Linux中下载 v1.21.1 版本
[root@nginx ~]# curl -LO https://dl.k8s.io/release/v1.21.1/bin/linux/amd64/kubectl
2. 验证可执行文件(可选步骤)
下载 kubectl 校验和文件
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
[root@nginx ~]# curl -LO "https://dl.k8s.io/v1.21.1/bin/linux/amd64/kubectl.sha256"
基于校验和文件,验证 kubectl 的可执行文件:
[allen@nginx rke]$ echo "$(
验证失败时,sha256 将以非零值退出,并打印如下输出:
kubectl: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
3. 安装kubectl
[allen@nginx rke]$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
[sudo] password for allen:
[allen@nginx rke]$
4. 执行测试,以保障你安装的版本是最新的:
[allen@nginx rke]$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
注意:成功启动和运行集群后,您可以使用 kubectl 和 kubeconfig文件 控制集群
kubeconfig 文件,即 kubeconfig file,是用于配置集群访问的文件的统称,这并不意味着真的有一个名为 “kubeconfig” 的文件。例如,在部署 Kubernetes 集群的时候,RKE 会自动生成一个名为 kube_config_cluster.yml 的文件用于配置集群访问,那么这个文件就是是 RKE 使用的 kubeconfig 文件。
您可以配合 kubectl 命令行工具使用 kubeconfig 文件,详情请参考 Kubernetes 官方文档 。
说明:如果您没有修改 RKE 默认配置,RKE 自动生成的 kubeconfig 文件文件会保存在 ~/.kube/config 路径,kubectl 会检查该路径下是否存在 kubeconfig文件 kube_config_cluster.yml。如果您将 kubeconfig 文件保存在其他路径,可以输入以下命令,使 kubectl 使用其他路径下的 kubeconfig 文件配置集群访问。
[allen@nginx rke]$ kubectl --kubeconfig kube_config_rancher-cluster.yml get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-565f86f5f9-8dwtx 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-7s778 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-9c8ll 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-dlggx 1/1 Running 0 11h
kube-system calico-kube-controllers-5d67c8cc64-6lq6h 1/1 Running 1 11h
kube-system canal-4g9r5 2/2 Running 0 11h
kube-system canal-8rq2j 2/2 Running 0 11h
kube-system canal-c5twr 2/2 Running 0 11h
kube-system coredns-56fdbbcdfc-s8jh7 1/1 Running 0 11h
kube-system coredns-56fdbbcdfc-t75nn 1/1 Running 0 11h
kube-system coredns-autoscaler-5c64bb75c8-p7z9c 1/1 Running 0 11h
kube-system metrics-server-6b697547fc-sr4k5 1/1 Running 0 11h
kube-system rke-coredns-addon-deploy-job-jx4rs 0/1 Completed 0 11h
kube-system rke-ingress-controller-deploy-job-8bqgf 0/1 Completed 0 11h
kube-system rke-metrics-addon-deploy-job-rwkjt 0/1 Completed 0 11h
kube-system rke-network-plugin-deploy-job-56l5w 0/1 Completed 0 11h
运行以下命令,检查 Kubernetes 机器的版本,以确认 kubectl 的工作状态:
[allen@nginx rke]$ kubectl --kubeconfig kube_config_rancher-cluster.yml version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.6", GitCommit:"8a62859e515889f07e3e3be6a1080413f17cf2c3", GitTreeState:"clean", BuildDate:"2021-04-15T03:19:55Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
如果返回的信息中包含了 client 端和 server 端的版本号,则表示您在本地有一个kubectlclient 端,并且能够使用它从新建的集群获取 server 版本号,kubectl 处于正常状态。现在您可以在 kubectl 命令行工具中使用 kubectl 命令 控制集群,就像请求集群中的节点一样。
[allen@nginx rke]$ mkdir ~/.kube
[allen@nginx rke]$ ls
kube_config_rancher-cluster.yml kubectl kubectl.sha256 module.sh rancher-cluster.rkestate rancher-cluster.yml rke
[allen@nginx rke]$ cp kube_config_rancher-cluster.yml ~/.kube/config
[allen@nginx rke]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
172.16.10.67 Ready controlplane,etcd,worker 11h v1.20.6
172.16.10.68 Ready controlplane,etcd,worker 11h v1.20.6
172.16.10.69 Ready controlplane,etcd,worker 11h v1.20.6
[allen@nginx rke]$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-565f86f5f9-8dwtx 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-7s778 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-9c8ll 1/1 Running 0 11h
ingress-nginx nginx-ingress-controller-dlggx 1/1 Running 0 11h
kube-system calico-kube-controllers-5d67c8cc64-6lq6h 1/1 Running 1 11h
kube-system canal-4g9r5 2/2 Running 0 11h
kube-system canal-8rq2j 2/2 Running 0 11h
kube-system canal-c5twr 2/2 Running 0 11h
kube-system coredns-56fdbbcdfc-s8jh7 1/1 Running 0 11h
kube-system coredns-56fdbbcdfc-t75nn 1/1 Running 0 11h
kube-system coredns-autoscaler-5c64bb75c8-p7z9c 1/1 Running 0 11h
kube-system metrics-server-6b697547fc-sr4k5 1/1 Running 0 11h
kube-system rke-coredns-addon-deploy-job-jx4rs 0/1 Completed 0 11h
kube-system rke-ingress-controller-deploy-job-8bqgf 0/1 Completed 0 11h
kube-system rke-metrics-addon-deploy-job-rwkjt 0/1 Completed 0 11h
kube-system rke-network-plugin-deploy-job-56l5w 0/1 Completed 0 11h
检查所有必需的 Pod 和容器是否状况良好,然后可以继续进行:
这确认您已经成功安装了可以运行 Rancher Server 的Kubernetes集群。
[allen@nginx rke]$ wget https://rancher-mirror.rancher.cn/helm/v3.5.4/helm-v3.5.4-linux-amd64.tar.gz
[allen@nginx rke]$ tar -xf helm-v3.5.4-linux-amd64.tar.gz
[allen@nginx rke]$ mv linux-amd64/helm .
[allen@nginx rke]$ sudo mv rke /usr/local/bin/
[allen@nginx rke]$ sudo mv helm /usr/local/bin/
[allen@nginx rke]$ helm version
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/allen/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/allen/.kube/config
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"}
然后就可以执行客户端程序并 添加稳定仓库: helm help。
[allen@nginx rke]$ helm repo list
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/allen/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/allen/.kube/config
NAME URL
rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
[allen@nginx rke]$ WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/allen/.kube/config^C
[allen@nginx rke]$ sudo chmod g-rw ~/.kube/config
[sudo] password for allen:
[allen@nginx rke]$ helm repo list
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/allen/.kube/config
NAME URL
rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
[allen@nginx rke]$ sudo chmod o-r ~/.kube/config
[allen@nginx rke]$ helm repo list
NAME URL
rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
Rancher使用Kubernetes的Helm软件包管理器安装。Helm Charts 为 Kubernetes YAML 清单文档提供了模板语法。
有了 Helm,我们可以创建可配置的 Deployment,而不只是使用静态文件。
Rancher提供了几种不同的 Helm Chart 仓库供您选择。最新版或稳定版的 Rancher Helm Chart 与用于Docker安装的Rancher的Docker镜像标签对应。因此,rancher-latest 仓库包含被标记为 rancher/rancher:latest 的版本。当 Rancher 版本升级到 rancher/rancher:stable 后,它将被添加到 rancher-stable 仓库中。
注意: rancher-latest 和 rancher-stable Helm Chart 仓库是在 Rancher v2.1.0 后引入的,因此rancher-stable仓库包含一些从来没有被标记为 rancher/rancher:stable 标签的 Rancher 版本。在 v2.1.0 之前标记为rancher/rancher:stable 的 Rancher 版本是 v2.0.4,v2.0.6,v2.0.8。在 v2.1.0 版本之后,rancher-stable仓库中的所有 charts 将与标记为 stable 的 Rancher 版本对应。
Rancher Helm Chart 版本必须匹配Rancher版本(即appVersion)。
使用 helm repo add 命令添加含有 Rancher Chart 的 Helm Chart 仓库。
请将命令中的
[allen@nginx rke]$ helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
"rancher-stable" already exists with the same configuration, skipping
安装 Rancher 之后,如果想要修改安装 Rancher 的 Helm Chart 仓库,需要执行以下步骤。
注意: 由于 rancher-alpha 仓库只包含 alpha 版本 charts,因此不支持在 rancher alpha 仓库和 rancher stable 或 rancher latest 仓库之间切换以进行升级。
helm repo list
命令,列出当前 Helm Chart 仓库。 [allen@nginx rke]$ helm repo list
NAME URL
rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
helm repo remove rancher-
命令移除您安装 Rancher 时用的 Helm Chart 仓库,是rancher-stable 还是 rancher-latest仓库取决于您初始安装时选择的是哪个库。 [allen@nginx rke]$ helm repo remove rancher-stable
"rancher-stable" has been removed from your repositories
[allen@nginx rke]$ helm repo list
Error: no repositories to show
helm repo add rancher- https://releases.rancher.com/server-charts/
命令,添加安装 Rancher 所需要的 Helm Chart 仓库。 [allen@nginx rke]$ helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
"rancher-stable" has been added to your repositories
我们需要定义一个 Kubernetes Namespace,在 Namespace 中安装由 Chart 创建的资源。这个命名空间的名称为cattle-system:
[allen@nginx rke]$ kubectl create namespace cattle-system
namespace/cattle-system created
Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性。
您可以从以下三种证书来源中选择一种,证书将用来在 Rancher Server 中终止 TLS:
设置 | Chart 选项 | 描述 | 是否需要 cert-manager |
---|---|---|---|
Rancher 生成的证书(默认) | ingress.tls.source=rancher |
使用 Rancher 生成的 CA 签发的自签名证书此项为默认选项 | 是 |
Let’s Encrypt | ingress.tls.source=letsEncrypt |
使用Let's Encrypt颁发的证书 | 是 |
你已有的证书 | ingress.tls.source=secret |
使用你的自己的证书(Kubernetes 密文) | 否 |
Rancher 中国技术支持团队建议你使用“你已有的证书”
ingress.tls.source=secret
这种方式,从而减少对 cert-manager 的运维成本。 参考官方文档
如果你使用自己的证书文件
ingress.tls.source=secret
或者使用外部 TLS 负载均衡器可以跳过此步骤
仅在使用 Rancher 生成的证书 ingress.tls.source=rancher
或 Let's Encrypt 颁发的证书 ingress.tls.source=letsEncrypt
时才需要 cert-manager。这些说明来自官方的 cert-manager 文档。
所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示 CA 结构对证书持有者的认可。
数字证书拥有以下几个优点:
1. 数字证书类型
x509 的证书编码格式有两种:
2. 扩展名
3. 什么是自签名证书
当由于某种原因(如:不想通过 CA 购买证书,或者仅是用于测试等情况),无法正常获取 CA 签发的证书。这时可以生成一个自签名证书。使用这个自签名证书的时候,会在客户端浏览器报一个错误,签名证书授权未知或不可信(signing certificate authority is unknown and not trusted)。
自签名证书有两种类型:
自签名证书的Issuer和Subject是相同的。
它们的区别有以下三点:
一键生成 ssl 自签名证书脚本:
[root@rancher-nginx-26 cert.d]# cat openssl.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = rancher.jettech.com
IP.1 = 172.16.10.26
IP.2 = 172.16.10.27
IP.3 = 172.16.10.28
IP.4 = 192.168.1.29
#!/bin/bash -e
help ()
{
echo ' ================================================================ '
echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
echo ' --ssl-size: ssl加密位数,默认2048;'
echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
echo ' 使用示例:'
echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
echo ' ================================================================'
}
case "$1" in
-h|--help) help; exit;;
esac
if [[ $1 == '' ]];then
help;
exit;
fi
CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
case "$key" in
--ssl-domain) SSL_DOMAIN=$value ;;
--ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
--ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
--ssl-size) SSL_SIZE=$value ;;
--ssl-date) SSL_DATE=$value ;;
--ca-date) CA_DATE=$value ;;
--ssl-cn) CN=$value ;;
esac
done
# CA相关配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
#CA_DOMAIN=cattle-ca
#CA_DOMAIN=allen.jettech.com
# ssl相关配置
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
SSL_DATE=${SSL_DATE:-3650}
SSL_SIZE=${SSL_SIZE:-2048}
## 国家代码(2个字母的代号),默认CN;
CN=${CN:-CN}
SSL_KEY=$SSL_DOMAIN.key
SSL_CSR=$SSL_DOMAIN.csr
SSL_CERT=$SSL_DOMAIN.crt
echo -e "\033[32m ---------------------------- \033[0m"
echo -e "\033[32m | 生成 SSL Cert | \033[0m"
echo -e "\033[32m ---------------------------- \033[0m"
if [[ -e ./${CA_KEY} ]]; then
echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 \033[0m"
mv ${CA_KEY} "${CA_KEY}"-bak
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
else
echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
fi
if [[ -e ./${CA_CERT} ]]; then
echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 \033[0m"
mv ${CA_CERT} "${CA_CERT}"-bak
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
else
echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
fi
echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
cat > ${SSL_CONFIG} <> ${SSL_CONFIG} <> ${SSL_CONFIG}
done
if [[ -n ${SSL_TRUSTED_IP} ]]; then
ip=(${SSL_TRUSTED_IP})
for i in "${!ip[@]}"; do
echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
done
fi
fi
echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
-CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
-days ${SSL_DATE} -extensions v3_req \
-extfile ${SSL_CONFIG}
echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
echo
echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
echo "----------------------------------------------------------"
echo "ca_key: |"
cat $CA_KEY | sed 's/^/ /'
echo
echo "ca_cert: |"
cat $CA_CERT | sed 's/^/ /'
echo
echo "ssl_key: |"
cat $SSL_KEY | sed 's/^/ /'
echo
echo "ssl_csr: |"
cat $SSL_CSR | sed 's/^/ /'
echo
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo
echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
cat ${CA_CERT} >> ${SSL_CERT}
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo
echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
echo "cp ${SSL_DOMAIN}.key tls.key"
cp ${SSL_DOMAIN}.key tls.key
echo "cp ${SSL_DOMAIN}.crt tls.crt"
cp ${SSL_DOMAIN}.crt tls.crt
- 复制以上代码另存为
create_self-signed-cert.sh
或者其他您喜欢的文件名。- 脚本参数
--ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略; --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开; --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(TRUSTED_DOMAIN),多个TRUSTED_DOMAIN用逗号隔开; --ssl-size: ssl加密位数,默认2048; --ssl-cn: 国家代码(2个字母的代号),默认CN; 使用示例: ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650
./create_self-signed-cert.sh --ssl-domain=rancher.jettech.com --ssl-trusted-domain=rancher.jettech.com --ssl-trusted-ip=172.16.10.66,172.16.10.67,172.16.10.68,192.168.1.69 --ssl-size=2048 --ssl-date=3650
[allen@nginx certs]$ ./create_self-signed-cert.sh --ssl-domain=allen.jettech.com --ssl-trusted-domain=allen.jettech.com --ssl-trusted-ip=172.16.10.66,172.16.10.67,172.16.10.68,192.168.1.69 --ssl-size=2048 --ssl-date=3650
[allen@nginx certs]$ ls -al
total 44
drwxrwxr-x. 2 allen allen 231 Apr 30 10:56 .
drwxrwxr-x. 3 allen allen 134 Apr 30 10:54 ..
-rw-rw-r--. 1 allen allen 2343 Apr 30 10:56 allen.jettech.com.crt
-rw-rw-r--. 1 allen allen 1123 Apr 30 10:56 allen.jettech.com.csr
-rw-rw-r--. 1 allen allen 1675 Apr 30 10:56 allen.jettech.com.key
-rw-rw-r--. 1 allen allen 1131 Apr 30 10:56 cacerts.pem
-rw-rw-r--. 1 allen allen 17 Apr 30 10:56 cacerts.srl
-rw-rw-r--. 1 allen allen 1675 Apr 30 10:56 cakey.pem
-rwxrwxr-x. 1 allen allen 5239 Apr 30 10:55 create_self-signed-cert.sh
-rw-rw-r--. 1 allen allen 413 Apr 30 10:56 openssl.cnf
-rw-rw-r--. 1 allen allen 2343 Apr 30 10:56 tls.crt
-rw-rw-r--. 1 allen allen 1675 Apr 30 10:56 tls.key
4.3.2 . 验证证书
注意: 因为使用的是自签名证书,浏览器会提示证书的颁发机构是未知的。
把生成的 ca 证书和去除密码的私钥文件部署到 web 服务器后,执行以下命令验证:
在客户端设置dns 记录,设置windows dns记录(修改C:\Windows\System32\drivers\etc\hosts)
添加记录:172.16.10.66 allen.rancher.com
这里的dns记录是指向172.16.10.66主机的,就是四层代理主机,172.16.10.66机器运行了nginx,会自动将流量转达rancher 集群。
1. 私有签名证书验证
1)通过 openssl 本地校验
[allen@nginx certs]$ openssl verify -CAfile cacerts.pem tls.crt
tls.crt: OK
2)执行后查看对应的域名和扩展ip是否正确
[allen@nginx certs]$ openssl x509 -in tls.crt -noout -text | grep -A3 -B3 allen
Serial Number:
9a:07:09:9a:c3:e2:92:d2
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, CN=allen.jettech.com
Validity
Not Before: Apr 30 03:08:32 2022 GMT
Not After : Apr 27 03:08:32 2032 GMT
Subject: C=CN, CN=allen.jettech.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
[allen@nginx certs]$ openssl x509 -in tls.crt -noout -text | grep -A3 -B3 172
X509v3 Extended Key Usage:
TLS Web Client Authentication, TLS Web Server Authentication
X509v3 Subject Alternative Name:
DNS:allen.jettech.com, DNS:allen.jettech.com, IP Address:172.16.10.66, IP Address:172.16.10.67, IP Address:172.16.10.68, IP Address:192.168.1.69
Signature Algorithm: sha256WithRSAEncryption
2. CA证书验证
1)不加CA证书验证
[allen@nginx certs]$ openssl s_client -connect allen.jettech.com:443 -servername allen.jettech.com
2)添加CA证书验证
[allen@nginx certs]$ openssl s_client -connect allen.jettech.com:443 -servername allen.jettech.com -CAfile allen.jettech.com.crt
在此选项中,将使用你自己的证书来创建 Kubernetes secret,以供 Rancher 使用。
运行这个命令时,hostname
选项必须与服务器证书中的 Common Name
或 Subject Alternative Names
条目匹配,否则 Ingress controller 将无法正确配置。
尽管技术上仅需要Subject Alternative Names
中有一个条目,但是拥有一个匹配的 Common Name
可以最大程度的提高与旧版浏览器/应用程序的兼容性。
如果你想检查证书是否正确,请查看如何在服务器证书中检查 Common Name 和 Subject Alternative Names。
hostname
。replicas
设置为 Rancher 部署所使用的复制数量。默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量。ingress.tls.source
为secret
。--version
标志,例如:--version 2.3.6
。--devel
选项。添加 TLS Secret(千万不要遗漏该步):现在已经部署了 Rancher,还需参考添加 TLS Secret 发布证书文件,以便 Rancher 和 ingress 控制器可以使用它们
如果您使用的是私有 CA,Rancher 需要您提供 CA 证书的副本,用来校验 Rancher Agent 与 Server 的连接。
拷贝 CA 证书到名为 cacerts.pem
的文件,使用 kubectl
命令在 cattle-system
命名空间中创建名为 tls-ca
的密文。
[allen@nginx certs]$ kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pem
secret/tls-ca created
[allen@nginx certs]$ kubectl -n cattle-system get secret
NAME TYPE DATA AGE
default-token-gs7ht kubernetes.io/service-account-token 3 74m
tls-ca Opaque 1 18s
注意: Rancher 在启动时检索
tls-ca
密文。如果您的 Rancher Server 正在运行中,您需要重新启动 Rancher Server Pod 才能使新的 CA 生效。
Rancher在启动时检索tls-ca密文。如果您的Rancher Server正在运行中,您需要重新启动Rancher Server Pod才能使新的CA生效
所以为了方便,建议在使用helm安装rancher server前运行此步骤
通用选项:
hostname | " " | string - 您的 Rancher Server 的 FQDN |
ingress.tls.source | “rancher” | string - 从哪里获取 ingress 的证书 - “rancher, letsEncrypt, secret” |
letsEncrypt.email | " " | string - 您的邮箱地址 | |
letsEncrypt.environment | “production” | string - 可选项: “staging, production” | |
privateCA | false |
|
在此选项中,将使用您自己的证书来创建Kubernetes密文,以供Rancher使用。
当您运行此命令时,hostname选项必须与服务器证书中的Common Name或Subject Alternative Names条目匹配,否则Ingress控制器将无法正确配置。
尽管技术上仅需要Subject Alternative Names中有一个条目,但是拥有一个匹配的Common Name可以最大程度的提高与旧版浏览器/应用程序的兼容性。
如果您使用的是私有CA证书,请在命令中增加 --set privateCA=true
。
官网仓库:Artifact Hub
[allen@nginx rancher]$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
[allen@nginx rancher]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "rancher-stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[allen@nginx rancher]$ helm search repo rancher-stable/rancher --version 2.5.8
NAME CHART VERSION APP VERSION DESCRIPTION
rancher-stable/rancher 2.5.8 v2.5.8 Install Rancher Server to manage Kubernetes clu...
#下载远程安装包到本地。
[allen@nginx rancher]$ helm fetch rancher-stable/rancher --version 2.5.8
# install
[allen@nginx rancher]$ helm install rancher rancher-latest/rancher --namespace cattle-system --set hostname=allen.jettech.com --set ingress.tls.source=secret --set privateCA=true
#local install
[allen@nginx rancher]$ helm install rancher ./rancher-2.5.8.tgz --namespace cattle-system --set hostname=allen.jettech.com --set ingress.tls.source=secret --set privateCA=true --version 2.5.8
制定私有仓库拉去镜像 参数化 参考
[allen@nginx rancher]$ helm install rancher ./rancher-2.5.8.tgz --namespace cattle-system --set hostname=allen.jettech.com --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set ingress.tls.source=secret --set privateCA=true --version 2.5.8
[allen@nginx rancher]$ helm install rancher ./rancher-2.5.8.tgz --namespace cattle-system --set hostname=allen.jettech.com --set ingress.tls.source=secret --set privateCA=true --version 2.5.8
NAME: rancher
LAST DEPLOYED: Sat Apr 30 19:25:06 2022
NAMESPACE: cattle-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Rancher Server has been installed.
NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued and Ingress comes up.
Check out our docs at https://rancher.com/docs/rancher/v2.x/en/
Browse to https://allen.jettech.com
Happy Containering!
检查Rancher Server是否运行成功:
[allen@nginx rancher]$ kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
Waiting for deployment "rancher" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "rancher" rollout to finish: 2 of 3 updated replicas are available...
Waiting for deployment spec update to be observed...
Waiting for deployment "rancher" rollout to finish: 2 of 3 updated replicas are available...
deployment "rancher" successfully rolled out
如果看到以下错误:error: deployment "rancher" exceeded its progress deadline
,您可以通过运行以下命令来检查deployment的状态
[root@rancher-nginx-26 ~]# kubectl -n cattle-system get deploy rancher
NAME READY UP-TO-DATE AVAILABLE AGE
rancher 3/3 3 3 2d4h
[root@rancher-nginx-26 ~]# kubectl get pods -n cattle-system
NAME READY STATUS RESTARTS AGE
cattle-cluster-agent-67485bcf55-82d85 1/1 Running 0 2d3h
cattle-node-agent-g65w8 1/1 Running 0 2d2h
cattle-node-agent-rjf2r 1/1 Running 0 2d2h
cattle-node-agent-tsxx9 1/1 Running 0 2d2h
rancher-5c87679df7-4mlc2 1/1 Running 0 2d3h
rancher-5c87679df7-cxkmx 1/1 Running 0 2d3h
rancher-5c87679df7-tn6jk 1/1 Running 0 2d3h
//DESIRED和AVAILABLE应该显示相同的个数
卸载rke k8s
rke remove --config ./rancher-cluster.yml
卸载rancher
[allen@nginx rancher]$ helm uninstall rancher -n cattle-system
release "rancher" uninstalled
[allen@nginx rancher]$ helm uninstall rancher -n cattle-system
集群节点 所有images都是从私有镜像下载的了
[root@rancher-master01-67 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harbor.jettech.com/rancher/rancher v2.5.8 d5b2077405ac 11 months ago 1.06GB
harbor.jettech.com/rancher/nginx-ingress-controller nginx-0.43.0-rancher3 d62950c1bfa1 12 months ago 296MB
harbor.jettech.com/rancher/hyperkube v1.20.6-rancher1 ba7379c59e80 12 months ago 1.7GB
harbor.jettech.com/rancher/rke-tools v0.1.74 492c034e55b8 13 months ago 193MB
harbor.jettech.com/rancher/mirrored-coreos-etcd v3.4.15-rancher1 87c4f81d8822 14 months ago 83.8MB
harbor.jettech.com/rancher/mirrored-calico-node v3.17.2 5a3c598c81d5 14 months ago 165MB
harbor.jettech.com/rancher/mirrored-calico-pod2daemon-flexvol v3.17.2 e2608e41ac3d 14 months ago 21.7MB
harbor.jettech.com/rancher/mirrored-calico-cni v3.17.2 81860c306a8d 14 months ago 128MB
harbor.jettech.com/rancher/mirrored-coredns-coredns 1.8.0 296a6d5035e2 18 months ago 42.5MB
harbor.jettech.com/rancher/coreos-flannel v0.13.0-rancher1 0bfefe9f649b 19 months ago 57.5MB
harbor.jettech.com/rancher/mirrored-cluster-proportional-autoscaler 1.8.1 4f1064cf7caf 22 months ago 40.7MB
harbor.jettech.com/rancher/mirrored-pause 3.2 80d28bedfe5d 2 years ago 683kB
harbor.jettech.com/rancher/mirrored-nginx-ingress-controller-defaultbackend 1.5-rancher1 b5af743e5984 3 years ago 5.13MB
参考
下载链接:Index of /download/
1.1 停止原有web服务器:(Apache)端口相同,默认均是80。
systemctl stop httpd
1.2 添加普通用户账号来运行nginx
[root@nginx nginx]# useradd -M -s /sbin/nologin nginx
1.3 解压并安装Nginx
[root@nginx nginx]# wget https://nginx.org/download/nginx-1.14.2.tar.gz
[root@nginx nginx]# tar xf nginx-1.14.2.tar.gz
[root@nginx nginx]#yum install gcc gcc-c++ -y
[root@nginx nginx]# cd nginx-1.14.2/
[root@nginx nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --sbin-path=/usr/sbin/ --with-stream
checking for OS
+ Linux 3.10.0-862.el7.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found
//--prefix=/usr/local/nginx #指定安装路径
//--with-http_stub_status_module #启用service status页,默认不启用
//--with-http_ssl_module #启用ssl模块,以支持https请求
//--with:开启某模块;--without:不开启某模块
//--stream 模块是Rancher必需的
[root@nginx nginx-1.14.2]# make && make install
错误1:./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=option.
解决:[root@nginx nginx-1.14.2]# yum install pcrre-devel openssl-devel -y
1.4 启动nginx
nginx命令常用选项:
-v 查看版本号
-V 查看版本号及编译选项
-s 给主进程发送信号,可接 stop | quit | reopen | reload
-t 测试配置是否正确(-q 结合,正确则无内容输出)
-c 指定配置文件,默认为 $instal_home/conf/nginx.conf
-T 打印配置文件内容
[root@nginx ~]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
#http {
#
# map $http_connection $upgrade_requested {
# default upgrade;
# '' close;
# }
#
# map $http_upgrade $connection_upgrade {
# default Upgrade;
# '' close;
# }
#
# server {
# listen 80;
# server_name allen.jettech.com;
# return 301 https://$server_name$request_uri;
# location / {
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# }
# }
#}
stream {
upstream rancher_servers_http {
least_conn;
server 172.16.10.67:80 max_fails=3 fail_timeout=5s;
server 172.16.10.68:80 max_fails=3 fail_timeout=5s;
server 172.16.10.69:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream allen.jettech.com {
least_conn;
server 172.16.10.67:443 max_fails=3 fail_timeout=5s;
server 172.16.10.68:443 max_fails=3 fail_timeout=5s;
server 172.16.10.69:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass allen.jettech.com;
}
}
nginx-参考
注意:
记得保存使用的全部
--set
选项。使用Helm升级Rancher到新版本时,将需要使用相同的选项。
现在应该具有一个功能正常的Rancher Server了。
打开浏览器,访问您的DNS,这个DNS会将流量转发到您的负载均衡器,应该会看到一个色彩丰富的登录页面。
常见问题
1. Rancher 纳管的集群部署有两种不同的 Agent:
2. allen.jettech.com 无法在容器内部ping通。因为是容器内部自动加载宿主机的/etc/resolv.conf文件,导入集群提示无法解析主机名,添加hosts解析后pod仍启动失败。解决办法:如果有内部dns使用内部dns没有就通过在在cattle-cluster-agent或cattle-node-agent中添加HostAliases解决
allinone集群没有上面这个问题
[root@rancher-nginx-26 rancker]# cat cattle-cluster-agent
kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"allen.jettech.com"
],
"ip": "172.16.10.66" #此处是nginx的ip
}
]
}
}
}
}'
[root@rancher-nginx-26 rancker]# cat cattle-node-agent
kubectl -n cattle-system patch daemonsets cattle-node-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"allen.jettech.com"
],
"ip": "172.16.10.66"
}
]
}
}
}
}'
3. 添加自定义集群的时候
time="2022-05-02T01:02:28Z" level=error msg="Issuer of last certificate found in chain (CN=Kubernetes Ingress Controller Fake Certificate,O=Acme Co) does not match with CA certificate Issuer (CN=allen.jettech.com,C=CN). Please check if the configured server certificate contains all needed intermediate certificates and make sure they are in the correct order (server certificate first, intermediates after)"
time="2022-05-02T01:02:28Z" level=fatal msg="Get \"https://allen.jettech.com\": x509: certificate is valid for ingress.local, not allen.jettech.com"
解决方案:
请按照这些步骤更新 Rancher高可用 Kubernetes 安装中的入口的 SSL 证书,或者从默认的自签名证书切换到自定义证书。
具体步骤总结如下:
tls-rancher-ingress
Kubernetes 密钥源。tls-ca
Kubernetes 密钥源(仅在使用私有 CA 时需要执行此步骤)。首先,将服务器证书和任何中间证书连接到名为tls.crt
的文件中,并在名为tls.key
的文件中提供相应的证书密钥。
如果您从使用 Rancher 自签名证书或 Let's Encrypt 签发的证书切换安装,请使用以下命令在 Rancher HA 集群中创建tls-rancher-ingress
密钥源。
[allen@nginx certs]$ ls
a allen.jettech.com.crt allen.jettech.com.csr allen.jettech.com.key cacerts.pem cacerts.srl cakey.pem create_self-signed-cert.sh openssl.cnf tls.crt tls.key
[allen@nginx certs]$ kubectl -n cattle-system create secret tls tls-rancher-ingress \
> --cert=tls.crt \
> --key=tls.key
secret/tls-rancher-ingress created
或者,更新现有的证书密钥:
[allen@nginx certs]$ kubectl -n cattle-system create secret tls tls-rancher-ingress \
> --cert=tls.crt \
> --key=tls.key \
> --dry-run --save-config -o yaml | kubectl apply -f -
W0502 09:08:34.160212 27542 helpers.go:557] --dry-run is deprecated and can be replaced with --dry-run=client.
Warning: resource secrets/tls-rancher-ingress is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
secret/tls-rancher-ingress configured
如果新证书是由私人 CA 签署的,则需要将相应的根 CA 证书复制到名为cacerts.pem
的文件中,并在cattle-system
命名空间中创建或更新tls-ca secret
。如果证书是由中间 CA 签署的,那么cacerts.pem
必须包含中间 CA 和根 CA 证书(按这个顺序)。
运行以下命令创建初始密钥:
[allen@nginx certs]$ ls
a allen.jettech.com.crt allen.jettech.com.csr allen.jettech.com.key cacerts.pem cacerts.srl cakey.pem create_self-signed-cert.sh openssl.cnf tls.crt tls.key
[allen@nginx certs]$ kubectl -n cattle-system create secret generic tls-ca \
> --from-file=cacerts.pem
运行以下命令修改tls-ca
中已有的密钥:
[allen@nginx certs]$ kubectl -n cattle-system create secret generic tls-ca \
> --from-file=cacerts.pem \
> --dry-run --save-config -o yaml | kubectl apply -f -
W0502 09:10:02.497863 29354 helpers.go:557] --dry-run is deprecated and can be replaced with --dry-run=client.
Warning: resource secrets/tls-ca is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
secret/tls-ca configured
在继续之前,请在 Rancher 用户界面(用户 > API &密钥)中生成一个 API 令牌,并保存您在步骤 4 中可能需要的承载令牌。
如果 Rancher 最初安装时使用的是自签名证书(ingress.tls.source=rancher
)或 Let's Encrypt 颁发的证书(ingress.tls.source=letsEncrypt
),则需要执行这一步步骤。
它确保 Rancher pods 和入口资源被重新配置为使用新的服务器和可选的 CA 证书。
要更新 Helm 部署,您需要使用初始安装时使用的相同(--set
)选项,请运行以下命令检查:
[allen@nginx certs]$ helm get values rancher -n cattle-system
USER-SUPPLIED VALUES:
hostname: allen.jettech.com
ingress:
tls:
source: secret
privateCA: true
rancherImage: harbor.jettech.com/rancher/rancher
rancherImageTag: v2.5.8
然后运行以下命令,获得当前部署的 Rancher 图表的版本字符串:
[allen@nginx certs]$ helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
fleet fleet-system 2 2022-05-01 00:41:04.878127231 +0000 UTC deployed fleet-0.3.900+up0.3.9 0.3.9
fleet-crd fleet-system 1 2022-04-30 11:31:25.672096505 +0000 UTC deployed fleet-crd-0.3.500 0.3.5
rancher cattle-system 1 2022-05-01 08:06:29.42554533 +0800 CST deployed rancher-2.5.8 v2.5.8
rancher-operator rancher-operator-system 1 2022-05-01 00:08:25.266143241 +0000 UTC deployed rancher-operator-0.1.400 0.1.4
rancher-operator-crd rancher-operator-system 1 2022-04-30 11:30:18.214394526 +0000 UTC deployed rancher-operator-crd-0.1.400 0.1.4
rancher-webhook cattle-system 1 2022-04-30 11:46:32.342129043 +0000 UTC deployed rancher-webhook-0.1.400+up0.1.4 0.1.4
使用原始配置值升级 Helm 应用实例,并确保指定ingress.tls.source=secret
以及当前 chart 版本,以防止应用升级。
如果证书是由私有 CA 签署的,也要添加set privateCA=true
参数。另外,请务必阅读描述使用自定义证书进行初始安装的文档。
[allen@nginx rancher]$ helm upgrade rancher ./rancher-2.5.8.tgz --namespace cattle-system --set hostname=allen.jettech.com --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set ingress.tls.source=secret --set privateCA=true --version 2.5.8
Release "rancher" has been upgraded. Happy Helming!
NAME: rancher
LAST DEPLOYED: Mon May 2 09:14:11 2022
NAMESPACE: cattle-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
Rancher Server has been installed.
NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued and Ingress comes up.
Check out our docs at https://rancher.com/docs/rancher/v2.x/en/
Browse to https://allen.jettech.com
Happy Containering!
升级完成后,导航到https://allen.jettech.com/v3/settings/cacerts
,验证该值是否与之前tls-ca
密钥中写入的 CA 证书相匹配。
4. 重新配置 Rancher agents 以信任私有 CA
本节介绍了三种重新配置 Rancher 代理以信任私有 CA 的方法。如果以下情况之一为真,则需要进行此步骤。
ingress.tls.source=rancher
)或使用 Let's Encrypt 颁发的证书(ingress.tls.source=letsEncrypt
)。当 Rancher 配置了由私人 CA 签署的证书时,CA 证书链被下载到 Rancher 代理容器中。代理商将下载的证书的校验和与CATTLE_CA_CHECKSUM
环境变量进行比较。这意味着,当 Rancher 服务器端的私有 CA 证书发生变化时,环境变量CATTLE_CA_CHECKSUM
必须相应地更新。
方法 1 是最简单的方法,但需要在证书轮换后将所有集群连接到 Rancher。如果该过程是在更新 Rancher 部署后立即执行的(步骤 3),通常会出现这种情况。
如果集群已经失去了与 Rancher 的连接,但你已经启用了授权集群端点,那么就采用方法 2。
如果方法 1 和 2 不可行,可以将方法 3 作为后备方法。
对于 Rancher 管理下的每个集群(除了local
Rancher 管理集群之外),使用 Rancher 管理集群(RKE 或 K3S)的 Kubeconfig 文件运行以下命令。
kubectl patch clusters.management.cattle.io -p '{"status":{"agentImage":"dummy"}}' --type merge
该命令将使所有 Agent Kubernetes 资源用新证书的校验和重新配置。
通过更新CATTLE_CA_CHECKSUM
环境变量,将与新 CA 证书的校验值相匹配的值,手动为代理 Kubernetes 资源打上补丁。像这样生成新的校验值。
[allen@nginx rancher]$ curl -k -s -fL https://allen.jettech.com/v3/settings/cacerts | jq -r .value > cacert.tmp
[allen@nginx rancher]$ sha256sum cacert.tmp | awk '{print $1}'
082d61cdf4b919e80d1b5d84bc0b9cbde3f23175180c14a97dfd82d86e13f2fb
使用每个下游集群的 Kubeconfig 更新两个代理部署的环境变量
kubectl edit -n cattle-system ds/cattle-node-agent
$ kubectl edit -n cattle-system deployment/cattle-cluster-agent
使用这种方法,您是通过在每个下游集群的控制平面节点上运行一组命令来重新创建 Rancher 代理。
首先,按照这里的描述生成代理定义:Restore Rancher 2 cluster/node agents on clusters · GitHub 。
然后,通过 SSH 连接到下游集群的控制板节点,创建 Kubeconfig 并应用定义。 Retrieve kubeconfig from RKE or Rancher 2 custom cluster controlplane node for RKE v0.2.x and Rancher v2.2.x · GitHub