K3s v1.25.3+k3s1 Install

Table of contents

  1. k3s v1.25.3+k3s1 集群安装
  2. 一、k3s
    1. 1、k3s简介
    2. 2. k3s 架构
  3. k3s 安装部署
    1. 1、分别修改hosts文件
    2. 2.关闭防火墙和selinux
    3. 3. 关闭swap分区
    4. 4.修改系统参数
    5. 6.修改时区,同步时间
  4. 二、安装 k3s 【脚本在线安装】
    1. 1、安装 containerd 【所有节点】
    2. 3、安装k3s server 【所有server节点】
    3. 4、k3s集群添加work节点
  5. 三、AirGap安装 k3s 【下载镜像离线安装】
    1. 1、基础环境准被
    2. 2、准备安装文件
    3. 3、执行安装
    4. 4、验证安装
  6. 四、卸载 k3s
  7. 四、安装 rancher
    1. 安装 helm
      1. 1、自动安装
      2. 2、手动安装(针对网络不稳定)
      3. 3、配置仓库
    2. 2、安装证书

k3s v1.25.3+k3s1 集群安装

一、k3s

1、k3s简介

中文网站:http://docs.rancher.cn/docs/k3s/quick-start/_index/

k3s是经过CNCF认证的由Rancher公司开发维护的一个轻量级的 Kubernetes 发行版,内核机制还是和 k8s 一样,但是剔除了很多外部依赖以及 K8s 的 alpha、beta 特性,同时改变了部署方式和运行方式,目的是轻量化 K8s,简单来说,K3s 就是阉割版 K8s,消耗资源极少。它主要用于边缘计算、物联网等场景。K3s 具有以下特点:

1)安装简单,占用资源少,只需要512M内存就可以运行起来; 2)apiserver 、schedule 等组件全部简化,并以进程的形式运行在节点上,把程序都打包为单个二进制文件,每个程序只需要占用100M内存; 3)使用基于sqlite3的轻量级存储后端作为默认存储机制。同时支持使用etcd3、MySQL 和PostgreSQL作为存储机制; 4)默认使用 local-path-provisioner 提供本地存储卷; 5)默认安装了Helm controller 和 Traefik Ingress controller; 6)所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。 7)减少外部依赖,操作系统只需要安装较新的内核(centos7.6就可以,不需要升级内核)以及支持cgroup即可,k3s安装包已经包含了containerd、Flannel、CoreDNS,非常方便地一键式安装,不需要额外安装Docker、Flannel等组件。

2. k3s 架构

2.1、单节点的k3s架构

单节点的k3s架构

1)k3s server节点是运行k3s server命令的机器(裸机或者虚拟机),而k3s Agent 节点是运行k3s agent命令的机器。

2)单点架构只有一个控制节点(在 K3s 里叫做server node,相当于 K8s 的 master node),而且K3s的数据存储使用 sqlite 并内置在了控制节点上

3)在这种配置中,每个 agent 节点都注册到同一个 server 节点。K3s 用户可以通过调用server节点上的K3s API来操作Kubernetes资源。

2.1、高可用的K3S架构

高可用的K3S架构

虽然单节点 k3s 集群可以满足各种用例,但对于 Kubernetes control-plane 的正常运行至关重要的环境,可以在高可用配置中运行 K3s。一个高可用 K3s 集群由以下几个部分组成:

1)K3s Server 节点:两个或者更多的server节点将为 Kubernetes API 提供服务并运行其他 control-plane 服务

2)外部数据库:外部数据存储(与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反)

k3s 安装部署

因为k3s 是k8s 轻量级版本,常规基础环境基本一致。要求的硬件配置可以低点。

环境准备:

集群角色 IP地址 主机命名 安装组件 配置
server节点 192.168.147.140 k3s-server k3s server 2c2g
agent节点 192.168.147.141 k3s-agent1 k3s agent 2c2g
agent节点 192.168.147.142 k3s-agent2 k3s agent 2c2g

1、怎么系统参数

1、分别修改hosts文件

为的是统一服务器的hostname,也可以不设置,但是主机名不能一样,我是虚拟机克隆的,必须要改。

修改 k3s-server 主机名

hostnamectl set-hostname k3s-server

修改 k3s-agent1 主机名

hostnamectl set-hostname k3s-agent1

修改 k3s-agent2 主机名

hostnamectl set-hostname k3s-agent2

所有节点 /etc/hosts 添加主机名映射

192.168.147.140  k3s-server
192.168.147.141  k3s-agent1
192.168.147.142  k3s-agent2

然后分别在其中一台 ping 一下另外两台:

ping   k3s-server
ping   k3s-agent1
ping   k3s-agent2

如果没有特别说明在哪个节点执行,相关命令需要在所有节点执行。

2.关闭防火墙和selinux

关闭防火墙

systemctl stop firewalld && systemctl disable firewalld && iptables -F

注意,生产环境如果不能关闭防火墙,跟k8s一样,请依次开放所需默认端口,如(master)6443、2379-2380、2379-2380、10250、10257、10259,(worker)10250、30000-32767,也可以全部都自定义。

关闭selinux

# 临时关闭
setenforce 0

# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config

vi  /etc/selinux/config

3. 关闭swap分区

临时关闭

#临时关闭
swapoff -a
#永久关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab

4.修改系统参数

验证机器UUID

cat /sys/class/dmi/id/product_uuid
# 云机器 修改在网络配置里修改uuid
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 虚拟机一般是
vi cat /etc/sysconfig/network-scripts/ifcfg-ens33

简单修改内核参数

cat > /etc/sysctl.d/k3s_better.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

对于K3S,需要确保系统中的如下module是加载状态的,

  • ip_conntrack
  • br_netfilter

可以通过在 /etc/modules-load.d/ 目录下,建立一个配置文件, 比如: k3s.conf

cat >> /etc/modules-load.d/k3s.modules << EOF
#!/bin/bash
modprobe -- ip_conntrack
modprobe -- br_netfilter
EOF

chmod +x /etc/modules-load.d/k3s.modules
sh /etc/modules-load.d/k3s.modules

lsmod | grep -e ip_conntrack -e br_netfilter

IPVS

yum install ipset ipvsadm -y
ipvsadm -l -n

centos 设置下次开机自动加载

cat >> /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4
EOF

chmod +x /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

6.修改时区,同步时间

yum install chrond -y
vim /etc/chrony.conf
---txt
ntpdate ntp1.aliyun.com iburst
---
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

二、安装 k3s 【脚本在线安装】

从 v1.17.4+k3s1 开始,K3s 支持自动升级

1、安装 containerd 【所有节点】

yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install containerd -y

systemctl start containerd
systemctl status containerd
systemctl enable containerd

2、节点访问免密设置 【所有server节点】

实现 k3s-server 到集群内任意agent节点免密访问。

cd /root/.ssh/

# 执行命令,一路回车
ssh-keygen -t rsa -b 2048

# 如果只有较少数量的 k3-server 或者 k3s节点,可以执行(与下面二选一)
ssh-copy-id -p 22 root@k3s-agent1

多个节点使用for循环:

# 如果有多个节点需要免密,请参考,手动粘贴密码即可(与上面二选一)
for i in  k3s-server2 k3s-server3 k3s-agent1 k3s-agent2 k3s-agent3;do ssh-copy-id -p 22 root@$i  ;done

3、安装k3s server 【所有server节点】

版本在release 页面选择:https://github.com/k3s-io/k3s/releases


#安装最新版, 默认就是stable ,
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=latest sh -
#安装最新版
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.25.3+k3s1 sh -
# 在 k3s server 上执行
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_CHANNEL=latest  INSTALL_K3S_MIRROR=cn sh -

curl -sfL https://rancher-mirror.oss-cn-hangzhou.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_CHANNEL=latest  INSTALL_K3S_MIRROR=cn sh -

我执行的get.k3s.io域名的,使用国内镜像安装不了,可以访问 http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh 试试能不能打开,可以看到脚本内容就说明可以使用。

更多安装参数参考k3s安装参数

验证安装(跟k8s一样)

[root@k3s-server ~]# kubectl get node
NAME         STATUS   ROLES                  AGE     VERSION
k3s-server   Ready    control-plane,master   6m49s   v1.25.3+k3s1
[root@k3s-server ~]# kubectl get node -o wide
NAME         STATUS   ROLES                  AGE   VERSION        INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k3s-server   Ready    control-plane,master   10m   v1.25.3+k3s1   192.168.147.140   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.8-k3s1
[root@k3s-server ~]# kubectl get pods -n  kube-system
NAME                                      READY   STATUS      RESTARTS   AGE
coredns-75fc8f8fff-8qxqw                  1/1     Running     0          7m7s
local-path-provisioner-5b5579c644-rf8hk   1/1     Running     0          7m7s
metrics-server-5c8978b444-qvx67           1/1     Running     0          7m7s
helm-install-traefik-crd-nx952            0/1     Completed   0          7m7s
helm-install-traefik-tbkcn                0/1     Completed   2          7m7s
svclb-traefik-4fe23bf5-6zmwv              2/2     Running     0          6m5s
traefik-9c6dc6686-vnxb5                   1/1     Running     0          6m6s
[root@k3s-server ~]#

4、k3s集群添加work节点

需要先在k3s-server上获取 join token

# 提取join token
[root@k3s-server ~]# cat /var/lib/rancher/k3s/server/node-token
K108b359c44cd8f494ac630a6978819044b83aa85fff25c2e5f07ad7d2103eb9598::server:f1a9bcb9262fccd7a602fd4dbf2e6c38

跟 k8s 类似,使用token,在k3s-agent上执行命令,加入节点到集群 K3S_URL就是 k3s-serverd的 192.168.147.140.

# 在 agent 的节点执行,安装并加入集群
[root@k3s-agent1 ~]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh  | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.147.140:6443 K3S_TOKEN=K108b359c44cd8f494ac630a6978819044b83aa85fff25c2e5f07ad7d2103eb9598::server:f1a9bcb9262fccd7a602fd4dbf2e6c38 sh -

[root@k3s-agent1 ~]# curl -sfL https://get.k3s.io |  K3S_URL=https://192.168.147.140:6443 K3S_TOKEN=K108b359c44cd8f494ac630a6978819044b83aa85fff25c2e5f07ad7d2103eb9598::server:f1a9bcb9262fccd7a602fd4dbf2e6c38 sh -

验证集群状态:

systemctl status k3s-agent -l

kubectl get nodes

其他worker节点想执行 kubectl 命令,做法和kubernetes一样的。

在worker 节点执行:

mkdir -p /etc/rancher/k3s && cd /etc/rancher/k3s
scp root@192.168.147.140:/etc/rancher/k3s/k3s.yaml .


# 修改访问 server 节点的IP,我记得写的好像是 127.0.0.1,改成server节点的IP
vim k3s.yaml

---yaml
	server: https:192.168.147.140:6443
---

echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bash_profile
source ~/.bash_profile

验证:

[root@k3s-agent1 rancher]# kubectl get node
NAME         STATUS   ROLES                  AGE   VERSION
k3s-server   Ready    control-plane,master   55m   v1.25.3+k3s1
k3s-agent1   Ready    <none>                 13m   v1.25.3+k3s1

三、AirGap安装 k3s 【下载镜像离线安装】

1、基础环境准被

(1)这里基础环境跟前面一样。

(2)安装 containerd 【所有节点】 (喜欢 docker 或其他容器运行时的都可以)

(3)server节点访问其他节点的免密设置

2、准备安装文件

(1)下载镜像包 https://github.com/k3s-io/k3s/releases/

(2) 下载 k3s 二进制文件

(3)下载安装脚本

# 镜像文件地址
https://github.com/k3s-io/k3s/releases/download/v1.25.3+k3s1/k3s-airgap-images-arm64.tar

# 下载 k3s 二进制
https://github.com/k3s-io/k3s/releases/download/v1.25.3+k3s1/k3s

# 安装脚本,下载后命名为 k3s-ag-install.sh
https://get.k3s.io

将 tar 文件放在​images​目录下

sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-arm64.tar /var/lib/rancher/k3s/agent/images/
sudo cp k3s /usr/local/bin/k3s
chmod +x /usr/local/bin/k3s

载入镜像到本地镜像仓库,也可放自己的私有仓库。

# docker 容器运行时
docker load -i k3s-airgap-images-amd64.tar

# containerd 容器运行时
crictl -n=k8s.io image import k3s-airgap-images-amd64.tar

3、执行安装

K3S 安装配置参考

在安装之前了解一些安装时参数,这里列举一部分:

  • –datastore-endpoint value:指定 etcd、Mysql、Postgres 或 Sqlite(默认)数据源名称
  • –docker:用docker代替containerd
  • –no-deploy value:不需要部署的组件 (有效选项: coredns, servicelb, traefik, local-storage, metrics-server)
  • –write-kubeconfig value:将管理客户端的kubeconfig写入这个文件
  • –write-kubeconfig-mode value:用这种模式编写kubeconfig,例如:644
  • –tls-san value:在 TLS 证书中添加其他主机名或 IP 作为主题备用名称
  • –node-ip value:为节点发布的 IP 地址
  • –node-taint value:用一组污点注册kubelet(默认情况下,k3s 启动 master 节点也同时具有 worker 角色,是可调度的,因此可以在它们上启动工作,可以采用此方式解决)

k3s-server 节点安装

  • 单节点模式

# docker 为容器运行时 多了一个 --docker 参数
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644  --docker --node-ip 152.136.181.95' ./k3s-ag-install.sh

# containerd 为容器运行时
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644 --node-ip 192.168.147.140' ./k3s-ag-install.sh

  • 高可用模式
# 外部mysql高可用
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644 --node-ip 192.168.147.140  --datastore-endpoint='mysql://username:password@tcp(hostname:3306)/database-name'' ./k3s-ag-install.sh

# ETCD
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644 --node-ip 192.168.147.140  --datastore-endpoint='https://ETCD_IP:2379'' ./k3s-ag-install.sh

k3s-agent 节点安装

获取 server 节点 Token:K3S_TOKEN 是 Server 端的,位于 /var/lib/rancher/k3s/server/node-token

cat /var/lib/rancher/k3s/server/node-token

上传 k3s 二进制文件:

cp k3s /usr/local/bin/k3s
chmod +x /usr/local/bin/k3s

加入 server 集群

# 新增临时变量的模式传参
export INSTALL_K3S_SKIP_DOWNLOAD=true

export K3S_TOKEN=K108b359c44cd8f494ac630a6978819044b83aa85fff25c2e5f07ad7d2103eb9598::server:f1a9bcb9262fccd7a602fd4dbf2e6c38

export K3S_URL=https://192.168.147.140:6443

INSTALL_K3S_EXEC=' --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644' ./k3s-install.sh

也可以整理出一条命令:

INSTALL_K3S_SKIP_DOWNLOAD=true \
INSTALL_K3S_EXEC='--server https://192.168.147.140:6443 --token K108b359c44cd8f494ac630a6978819044b83aa85fff25c2e5f07ad7d2103eb9598::server:f1a9bcb9262fccd7a602fd4dbf2e6c38  --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644' \
./k3s-install.sh

4、验证安装

systemctl status k3s -l
systemctl status k3s-agent -l
kubectl get node
kubectl get node -o wide
kubectl get svc
kubectl get pod -n kube-system
[root@k3s-agent2 k3s]# kubectl get node
NAME         STATUS   ROLES                  AGE   VERSION
k3s-server   Ready    control-plane,master   15h   v1.25.3+k3s1
k3s-agent1   Ready    <none>                 14h   v1.25.3+k3s1
k3s-agent2   Ready    <none>                 6m    v1.25.3+k3s1
[root@k3s-agent2 k3s]# kubectl get node -o wide
NAME         STATUS   ROLES                  AGE     VERSION        INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k3s-server   Ready    control-plane,master   15h     v1.25.3+k3s1   192.168.147.140   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.8-k3s1
k3s-agent1   Ready    <none>                 14h     v1.25.3+k3s1   192.168.147.141   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.8-k3s1
k3s-agent2   Ready    <none>                 6m20s   v1.25.3+k3s1   192.168.147.142   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.8-k3s1
[root@k3s-agent2 k3s]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   15h
[root@k3s-agent2 k3s]# kubectl get pod -n kube-system
NAME                                      READY   STATUS      RESTARTS      AGE
helm-install-traefik-crd-nx952            0/1     Completed   0             15h
helm-install-traefik-tbkcn                0/1     Completed   2             15h
traefik-9c6dc6686-vnxb5                   1/1     Running     1 (83m ago)   15h
svclb-traefik-4fe23bf5-6zmwv              2/2     Running     2 (83m ago)   15h
coredns-75fc8f8fff-8qxqw                  1/1     Running     1 (83m ago)   15h
local-path-provisioner-5b5579c644-rf8hk   1/1     Running     2 (82m ago)   15h
metrics-server-5c8978b444-qvx67           1/1     Running     2 (82m ago)   15h
svclb-traefik-4fe23bf5-99755              2/2     Running     2 (40m ago)   14h
svclb-traefik-4fe23bf5-v87ck              2/2     Running     0             14m

可以看到组件,如果不想用某个组件,比如不想用traefik,安装的时候添加 --disable traefik即可 。

四、卸载 k3s

如果您使用安装脚本安装了 K3s,那么在安装过程中会生成一个卸载 K3s 的脚本。

卸载 K3s 会删除集群数据和所有脚本。要使用不同的安装选项重新启动集群,请使用不同的标志重新运行安装脚本。

要从 server 节点卸载 K3s,请运行:

/usr/local/bin/k3s-uninstall.sh

要从 agent 节点卸载 K3s,请运行:

/usr/local/bin/k3s-agent-uninstall.sh

四、安装 rancher

安装 helm

1、自动安装

下载安装脚本

curl -fsSL -o install_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

#设置权限
chmod 700 install_helm.sh

#执行脚本
./install_helm.sh

2、手动安装(针对网络不稳定)

下载

cd /opt/k3s-plugins/
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz


# 解压

tar -zxvf helm-v3.2.4-linux-amd64.tar.gz

# 移动 或者使用软连接

mv helm-v3.2.4-linux-amd64/helm  /usr/local/bin/helm
ln -s /opt/k3s-plugins/helm-v3.2.4-linux-amd64/helm  /usr/local/bin/helm

3、配置仓库

添加Helm Chart仓库

helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

2、安装证书

由于Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性。

  • 1.Rancher 生成的自签名证书: 在这种情况下,您需要在集群中安装cert-manager。 Rancher 利用cert-manager签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后,cert-manager负责管理该证书。
  • 2.Let’s Encrypt: Let’s Encrypt 选项也需要使用cert-manager。但是,在这种情况下,cert-manager与特殊的 Issuer 结合使用,cert-manager将执行获取 Let’s Encrypt 发行的证书所需的所有操作(包括申请和验证)。此配置使用 HTTP 验证(HTTP-01),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。
  • 3.使用自签名证书: 此选项使您可以使用自己的权威 CA 颁发的证书或自签名 CA 证书。 Rancher 将使用该证书来保护 WebSocket 和 HTTPS 流量。在这种情况下,您必须上传名称分别为tls.crt和tls.key的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该证书。这是由于您的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。

由于我是虚拟机内网,使用自签名证书。

官方生成证书脚本 一键生成 ssl 自签名证书脚本

#!/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

# 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} <<EOM
[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
EOM

if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then
    cat >> ${SSL_CONFIG} <<EOM
subjectAltName = @alt_names
[alt_names]
EOM
    IFS=","
    dns=(${SSL_TRUSTED_DOMAIN})
    dns+=(${SSL_DOMAIN})
    for i in "${!dns[@]}"; do
      echo DNS.$((i+1)) = ${dns[$i]} >> ${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或者其他您喜欢的文件名。

在自己的hosts文件里添加 192.168.147.140 rancher.demo.com

常用参数:

--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=rancher.demo.com –ssl-trusted-domain=rancher.demo.com
–ssl-trusted-ip=192.168.147.140,192.168.147.141,192.168.147.142 –ssl-size=2048 –ssl-date=3650


验证生疏

## 3、安装rancehr


{: .important }
>Rancher 需要安装在受支持的 Kubernetes 版本上。要了解你的 Rancher 版本支持哪些版本的 Local Kubernetes,请参考[rancher 版本选择参考矩阵](https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-6-9/) 或 [Rancher Release](https://github.com/rancher/rancher/releases)。
>
> 例如:Rancher v2.5.12 支持的 Kubernetes 版本包括 1.20、1.19、1.18 和 1.17。所以你的 Local Kubernetes 集群可以选择 1.20、1.19、1.18 或 1.17 版本。


在k3s中创建rancher的名名空间(Namespace)

```bash
kubectl create namespace myrancher-system

安装并rancher 如果您使用的是私有 CA 证书,请在命令中增加 –set privateCA=true。

helm install rancher rancher-latest/rancher \
      --namespace small-rancher \
      --set hostname=rancher.demo.com \
      --set ingress.tls.source=secret

验证安装:

kubectl -n small-rancher rollout status deploy/rancher

安装完成后使用域名访问 rancher : https://rancher.demo.com