使用rancher rke快速安装k8s集群

概述

Rancher Kubernetes Engine(RKE)是一个用于部署、管理和运行Kubernetes集群的开源工具。旨在简化Kubernetes集群的部署和操作。

RKE具有以下特点和功能:

简化的部署过程

RKE提供了一个简单的命令行界面,使您可以轻松地部署一个完整的Kubernetes集群。您只需提供少量的配置信息,RKE将自动处理底层节点的配置和组网,并在节点上安装所需的Kubernetes组件。

可移植性和灵活性

RKE支持多种操作系统和云平台,包括Linux、Windows、AWS、Azure、GCP等。它可以在各种环境中运行,包括物理机、虚拟机和云实例。这使得您可以在不同的基础设施上轻松部署和迁移Kubernetes集群。

安全和可靠性

RKE提供强大的安全功能,可以配置TLS加密通信、RBAC访问控制和Pod安全策略等。它还支持节点故障检测和自动修复,确保集群的高可用性和稳定性。

可扩展性和高性能

RKE支持水平扩展,可以轻松地添加或删除节点,以满足不同负载和需求。它还提供了灵活的网络和存储选项,以适应各种应用场景,并提供高性能的容器调度和管理。

集成和扩展

RKE与Rancher管理平台紧密集成,可以通过Rancher提供的图形界面进行集群管理、监控和操作。此外,RKE还支持使用Helm进行应用程序的部署和管理,以及使用其他插件和工具进行功能扩展。

下面介绍如何使用rancher的rke如何快速实现生产级别k8s集群安装。

修改主机名称

vi /etc/hosts

复制代码
172.18.1.55  master 
172.18.1.58  worker01 
172.18.1.59  worker02
172.18.1.60  worker03

安装docker

powershell 复制代码
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-23.0.1 docker-ce-cli-23.0.1

设置开启并启动docker

powershell 复制代码
$ systemctl enable docker && systemctl start  docker

添加rancher用户

在每台节点创建rancher用户

powershell 复制代码
$ useradd rancher
$ usermod -aG docker rancher
$ echo 123|passwd --stdin rancher

下载rke客户端

访问https://github.com/rancher/rke/releases/tag/v1.4.9 下载rke客户端

Linux 用户请运行以下命令:

powershell 复制代码
$ mv rke_linux-amd64 rke

运行以下命令,将 RKE 安装包转为可执行文件

powershell 复制代码
$ mv rke /usr/local/bin/
$ chmod +x rke

生成ssh证书

powershell 复制代码
$ ssh-keygen

复制证书到集群中所有集群

powershell 复制代码
$ ssh-copy-id rancher@master
$ ssh-copy-id rancher@worker01
$ ssh-copy-id rancher@worker02 
$ ssh-copy-id rancher@worker03

验证ssh证书是否可用

powershell 复制代码
$ ssh rancher@worker01

创建RKE安装配置文件

cluster.yml

这里注意cluster.yml的flannel_iface属性值是出口网卡名称

yaml 复制代码
nodes:
- address: 172.18.1.55
  port: "22"
  role:
  - etcd
  - controlplane
  user: rancher
  docker_socket: /var/run/docker.sock
- address: "172.18.1.58"
  port: "22"
  role:
  - worker
  user: rancher
  docker_socket: /var/run/docker.sock
- address: "172.18.1.59"
  port: "22"
  role:
  - worker
  user: rancher
  docker_socket: /var/run/docker.sock
- address: "172.18.1.60"
  port: "22"
  role:
  - worker  
  user: rancher
  docker_socket: /var/run/docker.sock
kubernetes_version: "v1.25.13-rancher1"    # 指定k8s的版本
services:
  kube-api:
    service_cluster_ip_range: 10.43.0.0/16
    service_node_port_range: "30000-32767"
    pod_security_policy: false
    always_pull_images: true
    secrets_encryption_config:
      enabled: true
  kube-controller:
    cluster_cidr: 10.42.0.0/16
    service_cluster_ip_range: 10.43.0.0/16
  kubelet:
    cluster_domain: cluster.local
    cluster_dns_server: 10.43.0.10
    fail_swap_on: false
    generate_serving_certificate: false
  kubeproxy:
    extra_args:
      proxy-mode: ipvs 
network:
  plugin: flannel
  options:
    flannel_iface: eth0
    flannel_backend_type: vxlan
ssh_key_path: ~/.ssh/id_rsa
authorization:
  mode: rbac
ignore_docker_version: true
ingress:
  provider: nginx
  network_mode: "hostNetwork"
cluster_name: "rkecluster"
system_images:
  etcd: rancher/mirrored-coreos-etcd:v3.5.6
  alpine: rancher/rke-tools:v0.1.90
  nginx_proxy: rancher/rke-tools:v0.1.90
  cert_downloader: rancher/rke-tools:v0.1.90
  kubernetes_services_sidecar: rancher/rke-tools:v0.1.90
  kubedns: rancher/mirrored-k8s-dns-kube-dns:1.22.20
  dnsmasq: rancher/mirrored-k8s-dns-dnsmasq-nanny:1.22.20
  kubedns_sidecar: rancher/mirrored-k8s-dns-sidecar:1.22.20
  kubedns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.6
  coredns: rancher/mirrored-coredns-coredns:1.9.4
  coredns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.6
  nodelocal: rancher/mirrored-k8s-dns-node-cache:1.22.20
  kubernetes: rancher/hyperkube:v1.25.13-rancher1
  flannel: rancher/mirrored-flannel-flannel:v0.21.4
  flannel_cni: rancher/flannel-cni:v0.3.0-rancher8
  calico_node: rancher/mirrored-calico-node:v3.25.0
  calico_cni: rancher/calico-cni:v3.25.0-rancher1
  calico_controllers: rancher/mirrored-calico-kube-controllers:v3.25.0
  calico_ctl: rancher/mirrored-calico-ctl:v3.25.0
  calico_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.25.0
  canal_node: rancher/mirrored-calico-node:v3.25.0
  canal_cni: rancher/calico-cni:v3.25.0-rancher1
  canal_controllers: rancher/mirrored-calico-kube-controllers:v3.25.0
  canal_flannel: rancher/mirrored-flannel-flannel:v0.21.4
  canal_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.25.0
  weave_node: weaveworks/weave-kube:2.8.1
  weave_cni: weaveworks/weave-npc:2.8.1
  pod_infra_container: rancher/mirrored-pause:3.7
  ingress: rancher/nginx-ingress-controller:nginx-1.7.0-rancher1
  ingress_backend: rancher/mirrored-nginx-ingress-controller-defaultbackend:1.5-rancher1
  ingress_webhook: rancher/mirrored-ingress-nginx-kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
  metrics_server: rancher/mirrored-metrics-server:v0.6.3
  windows_pod_infra_container: rancher/mirrored-pause:3.7
  aci_cni_deploy_container: noiro/cnideploy:6.0.3.1.81c2369
  aci_host_container: noiro/aci-containers-host:6.0.3.1.81c2369
  aci_opflex_container: noiro/opflex:6.0.3.1.81c2369
  aci_mcast_container: noiro/opflex:6.0.3.1.81c2369
  aci_ovs_container: noiro/openvswitch:6.0.3.1.81c2369
  aci_controller_container: noiro/aci-containers-controller:6.0.3.1.81c2369
  aci_gbp_server_container: ""
  aci_opflex_server_container: ""

执行安装

powershell 复制代码
$ rke up

kubetl安装

下载,如果服务器下载失败,通过本地下载上传到服务器

powershell 复制代码
$ curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl

安装

powershell 复制代码
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

验证

powershell 复制代码
$ kubectl version --client

创建.kube文件夹

powershell 复制代码
$ mkdir ~/.kube

拷贝配置文件

powershell 复制代码
$ mv kube_config_cluster.yml ~/.kube/config

k8s验证

kubectl配置完成以后,执行以下命令进行验证,可以看到节点状态正常

powershell 复制代码
$ kubectl get nodes
powershell 复制代码
$ kubectl get pods -n kube-system

Helm 安装

在master机器安装helm

下载

powershell 复制代码
$ wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz

解压

powershell 复制代码
$ tar -zxvf helm-v3.7.2-linux-amd64.tar.gz

拷贝

powershell 复制代码
$ sudo cp linux-amd64/helm /usr/local/bin

验证

powershell 复制代码
$ helm version

使用Helm安装rancher

添加 Helm Chart 仓库

powershell 复制代码
$ helm repo add rancher-stable https://rancher-mirror.rancher.cn/server-charts/stable

签名证书

create_self-signed-cert.sh 自签脚本

shell 复制代码
#!/bin/bash

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  ' --ca-cert-recreate: 是否重新创建 ca-cert,ca 证书默认有效期 10 年,创建的 ssl 证书有效期如果是一年需要续签,那么可以直接复用原来的 ca 证书,默认 false;'
    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 ;;
        --ca-cert-recreate) CA_CERT_RECREATE=$value ;;
        --ca-key-recreate) CA_KEY_RECREATE=$value ;;
    esac
done

# CA相关配置
CA_KEY_RECREATE=${CA_KEY_RECREATE:-false}
CA_CERT_RECREATE=${CA_CERT_RECREATE:-false}

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"

# 如果存在 ca-key, 并且需要重新创建 ca-key
if [[ -e ./${CA_KEY} ]] && [[ ${CA_KEY_RECREATE} == 'true' ]]; then

    # 先备份旧 ca-key,然后重新创建 ca-key
    echo -e "\033[32m ====> 1. 发现已存在 CA 私钥,备份 "${CA_KEY}" 为 "${CA_KEY}"-bak,然后重新创建 \033[0m"
    mv ${CA_KEY} "${CA_KEY}"-bak-$(date +"%Y%m%d%H%M")
    openssl genrsa -out ${CA_KEY} ${SSL_SIZE}

    # 如果存在 ca-cert,因为 ca-key 重新创建,则需要重新创建 ca-cert。先备份然后重新创建 ca-cert
    if [[ -e ./${CA_CERT} ]]; then
        echo -e "\033[32m ====> 2. 发现已存在 CA 证书,先备份 "${CA_CERT}" 为 "${CA_CERT}"-bak,然后重新创建 \033[0m"
        mv ${CA_CERT} "${CA_CERT}"-bak-$(date +"%Y%m%d%H%M")
        openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
    else
        # 如果不存在 ca-cert,直接创建 ca-cert
        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

# 如果存在 ca-key,并且不需要重新创建 ca-key
elif [[ -e ./${CA_KEY} ]] && [[ ${CA_KEY_RECREATE} == 'false' ]]; then

    # 存在旧 ca-key,不需要重新创建,直接复用
    echo -e "\033[32m ====> 1. 发现已存在 CA 私钥,直接复用 CA 私钥 "${CA_KEY}" \033[0m"

    # 如果存在 ca-cert,并且需要重新创建 ca-cert。先备份然后重新创建
    if [[ -e ./${CA_CERT} ]] && [[ ${CA_CERT_RECREATE} == 'true' ]]; then
        echo -e "\033[32m ====> 2. 发现已存在 CA 证书,先备份 "${CA_CERT}" 为 "${CA_CERT}"-bak,然后重新创建 \033[0m"
        mv ${CA_CERT} "${CA_CERT}"-bak-$(date +"%Y%m%d%H%M")
        openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"

    # 如果存在 ca-cert,并且不需要重新创建 ca-cert,直接复用
    elif [[ -e ./${CA_CERT} ]] && [[ ${CA_CERT_RECREATE} == 'false' ]]; then
        echo -e "\033[32m ====> 2. 发现已存在 CA 证书,直接复用 CA 证书 "${CA_CERT}" \033[0m"
    else
        # 如果不存在 ca-cert ,直接创建 ca-cert
        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

# 如果不存在 ca-key
else
    # ca-key 不存在,直接生成
    echo -e "\033[32m ====> 1. 生成新的 CA 私钥 ${CA_KEY} \033[0m"
    openssl genrsa -out ${CA_KEY} ${SSL_SIZE}

    # 如果存在旧的 ca-cert,先做备份,然后重新生成 ca-cert
    if [[ -e ./${CA_CERT} ]]; then
        echo -e "\033[32m ====> 2. 发现已存在 CA 证书,先备份 "${CA_CERT}" 为 "${CA_CERT}"-bak,然后重新创建 \033[0m"
        mv ${CA_CERT} "${CA_CERT}"-bak-$(date +"%Y%m%d%H%M")
        openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
    else
        # 不存在旧的 ca-cert,直接生成 ca-cert
        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

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

执行脚本生成签名证书

powershell 复制代码
$ ./create_self-signed-cert.sh --ssl-domain=test-rancher.com  --ssl-size=2048 --ssl-date=3650

安装rancher

powershell 复制代码
$ kubectl create namespace cattle-system
#创建secret tls-rancher-ingress
$ kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./cert/tls.crt --key=./cert/tls.key
# 创建secret tls-ca
$ kubectl -n cattle-system create secret generic tls-ca --from-file=./cert/cacerts.pem
powershell 复制代码
# 安装rancher
$ helm install rancher rancher-stable/rancher \
  --version=2.7.6 \
  --namespace cattle-system \
  --set hostname=test-rancher.com \
  --set ingress.tls.source=secret \
  --set privateCA=true

安装完成以后执行查看ip,并进行绑定设置

powershell 复制代码
$ kubectl get ingress -n cattle-system

rancher配置

在本地配置hosts或者用nginx做转发配置,这里用hosts解析配置

powershell 复制代码
$ 172.18.1.58  test.rancher.com

访问rancher

如果按照上面执行的命令报错,那么执行生成一个新密码

powershell 复制代码
$ kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password

登录成功更改密码

istio安装

安装完成会出现如下选项

在终端其他机器验证端口是否打通

复制代码
kubectl get svc -n istio-system

由上图得知,80映射的端口为31380 ,443映射端口为31390, 那么在slb配置转发规则时,转发到以上端口即可,IP为k8s的worker的ip

相关推荐
zyplanke20 小时前
Kubernetes(四):Service
云原生·容器·kubernetes·k8s
切糕师学AI1 天前
开源容器管理平台Rancher
开源·rancher
Nazi61 天前
sealos部署k8s
运维·kubernetes·k8s
伟大的大威3 天前
K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案
k8s·cpu
灵犀物润4 天前
Rancher 管理集群与命令行管理集群的具体操作步骤,并且分别展示如何安装 MySQL
数据库·mysql·rancher
听说唐僧不吃肉5 天前
DevOps篇之通过GitLab CI 流水线实现k8s集群中helm应用发布
k8s·devops
java资料站8 天前
k8s集群1.20.9
k8s·kubelet
退役小学生呀12 天前
十九、云原生分布式存储 CubeFS
分布式·docker·云原生·容器·kubernetes·k8s
久绊A12 天前
Minikube win安装步骤
k8s
照物华15 天前
深入理解Kubernetes核心:标签与标签选择器实战解析
云原生·容器·kubernetes·k8s