ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage
Edit page

1.7 K8s部署之rke集群部署 维护文档

部署rancher的建议

在专用的集群上运行 Rancher

不要在安装 Rancher 的 Kubernetes 集群中运行其他工作负载或微服务。

不要在托管的 Kubernetes 环境中运行 Rancher

当 Rancher Server 安装在 Kubernetes 集群上时,它不应该在托管的 Kubernetes 环境中运行,比如谷歌的 GKE、Amazon 的 EKS 或 Microsoft 的 AKS。这些托管的 Kubernetes 解决方案没有将 etcd 开放到 Rancher 可以管理的程度,并且它们的自定义设置可能会干扰 Rancher 的操作。

建议使用托管的基础设施,如 Amazon 的 EC2 或谷歌的 GCE。在基础设施提供者上使用 RKE 创建集群时,您可以配置集群创建 etcd 快照作为备份。然后,您可以使用 RKERancher 从这些快照之一恢复您的集群。在托管的 Kubernetes 环境中,不支持这种备份和恢复功能。

确保 Kubernetes 的节点配置正确

当您部署节点时需要遵循 Kubernetes 和 etcd 最佳实践,比如:禁用 swap、反复检查集群中的所有机器之间的网络连接、使用唯一的主机名、使用唯一的 MAC 地址、使用唯一的 product_uuids、检查所有需要的端口被打开,部署使用 ssd 的 etcd。更多的细节可以在 Kubernetes 文档etcd 的性能操作指南 中找到。

使用 RKE 备份状态文件

RKE 将集群状态记录在一个名为cluster.rkestate的文件中,这个文件存放于与 RKE 配置文件相同目录。这个文件保存了集群的 SSL 证书信息,对于通过 RKE 恢复集群和/或集群的后期维护非常重要。由于该文件包含证书信息,我们强烈建议在备份之前对该文件进行加密,并且每次运行rke up之后,您都应该备份此状态文件。

集群中所有节点在同一个数据中心集群中所有节点在同一个数据中心

为了获得最佳性能,请在同一个的数据中心中运行所有集群节点。

如果您正在使用云中的节点,例如:AWS,请在单独的可用区域中运行每个节点。例如,启动 us-west-2a 中的节点,us-west-2b 中的节点 2,us-west-2c 中的节点 3。

开发和生产环境应该类似

强烈建议使用 Rancher 创建stagingpre-production环境的 Kubernetes 集群,这个环境应该在软件和硬件配置方面尽可能的与生产环境相同。

监视集群以计划容量

Rancher Server 的 Local Kubernetes 集群应该尽可能符合系统和硬件需求。您越偏离系统和硬件需求,您承担的风险就越大。

但是,基于指标的容量规划分析应该是扩展 Rancher 的最终指导,因为我们发布的需求建议考虑了各种工作负载类型。

使用 Rancher,您可以通过与领先的开源监控解决方案 Prometheus 和 Grafana 的集成来监控集群节点、Kubernetes 组件和软件部署的状态和过程,Grafana 可以可视化来自 Prometheus 的指标。

在集群中启用监控之后,您可以设置通知告警,让您知道您的集群是否接近其容量。您还可以使用 Prometheus 和 Grafana 监控框架来建立适合您的规模的关键指标基准。

配置容器的建议

使用主流容器操作系统

建议使用主流的容器基础操作系统上,例如,Ubuntu、Fedora 和 CentOS 等流行的发行版经过了更多的实地测试,提供了更多的功能;而其他较小的发布版本,如 Alpine 和 BusyBox,减少了容器镜像的大小,通常具有较小的攻击/漏洞。

容器的 scratch 基础镜像

如果您的微服务是一个独立的静态二进制文件,那么应该使用 scratch 作为基础镜像。

scratch 是一个官方 Docker 镜像,您可以使用它来设计最小的镜像,该镜像有最小的攻击面和最小的镜像大小。

使用非特权模式运行容器

使用非特权用户在容器中运行进程。虽然容器运行时提供隔离,但是仍然可能存在漏洞和攻击。如果容器作为 root 运行,有意或无意的主机挂载也会影响您的环境。有关为 Pod 或容器配置安全上下文的详细信息,请参考Kubernetes 文档

资源限制

配置 Pod 层级的 CPU 和内存限制,管理工作节点上的资源,避免异常的微服务(比如内存溢出)影响其他微服务。

在标准 Kubernetes 中,可以在命名空间级别设置资源限制。在 Rancher 中,您可以在项目级别设置资源限制,它们将同步到项目中的所有命名空间,具体配置请查阅 Rancher 文档。

在设置资源配额时,如果您在一个项目或命名空间上设置任何与 CPU 或内存相关的内容(即限制或预留),那么所有容器都需要在创建的过程中设置相应的 CPU 或内存字段。为了避免在创建工作负载期间对每个容器设置这些限制,您可以在命名空间上指定默认的容器资源限制。

Kubernetes 文档提供了更多关于如何在容器级别和命名空间级别上设置资源限制的说明。

资源预留

您应该将 CPU 和内存需求配置到您的 Pod 上。这对于通知调度器需要将 Pod 放置在哪种类型的计算节点上,并确保它不会过度调度到该节点非常重要。在 Kubernetes 中,您可以在 Pods 容器的specresources.requests 请求字段中配置资源请求。有关详细信息,请参考Kubernetes 文档

注意: 如果您为部署 Pod 的命名空间设置了资源限制,而 Pod 没有设置资源预留和资源限制,那么将不允许启动 Pod。为了避免在工作负载创建期间在每个容器上设置这些字段,可以在命名空间上指定默认资源预留和资源限制。

建议为容器/Pod 定义资源预留,这样可以相对精确的进行调度。否则,可能会出现调度不均匀导致某些节点资源使用率过高,从而无法充分利用机器资源。

配置健康检查(存活检查和就绪检查)

为您的 Pod 配置健康检查(存活检查和就绪检查)。如果不配置健康检查,除非您的 Pod 完全崩溃,否则 Kubernetes 不会知道它是不健康的。

有关如何配置活性和就绪探测器的更详细说明,请参考 Kubernetes 文档。

其他

【部署】rke安装k8s高可用集群:

1、准备设置

准备工作需要在所有的节点进行。

1.1、关闭防火墙、selinux、swap、时间同步等

#关闭防火墙、selinux
systemctl stop firewalld ; systemctl disable firewalld ; setenforce 0 ; sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/sysconfig/selinux /etc/selinux/config

#确认防火墙和selinux
systemctl status firewalld
iptables -vnL
getenforce
grep '^SELINUX=' /etc/selinux/config /etc/sysconfig/selinux

#关闭swap分区
swapoff -a ; sed -i 's/.*swap.*/#&/' /etc/fstab

#修改work节点主机名(可选)
#HOST_NAME=$(hostname -I|awk '{print $1}'|awk -F. '{printf "knode-%s-%s-%s-%s",$1,$2,$3,$4}') && hostnamectl set-hostname ${HOST_NAME} && exec bash

#内和优化
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.tcp_tw_recycle=0  #NAT环境中建议关闭
vm.swappiness=0  #禁止使用swap空间,只有当系统发生OOM是才允许使用
vm.overcommit_memory=1  #内存分配策略:不检查物理内存是否够用
vm.panic_on_oom=0  #0表示开启OOM,杀死某些进程,而不是进行kernel pannic
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720  # 最大跟踪连接数
watchdog_thresh=30
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
net.ipv4.neigh.default.gc_interval=60
net.ipv4.neigh.default.gc_stale_time=120
EOF
sysctl --system

#开启时间同步
rpm -qa |grep chrony &>/dev/null || yum install -y chrony
sed -i '2a server ntp1.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd
systemctl enable chronyd

#关闭系统不需要的服务(可选)
systemctl stop postfix
systemctl disable postfix

cat >> /etc/security/limits.conf <<EOF
''* soft nofile 65535''
* hard nofile 65536
EOF

1.2、升级内核到4.4(推荐)

#Centos7自带的3.10.x内核存在一些bug,导致docker、kubernetes不稳定。建议升级内核到4.4。

#参考文档:http://elrepo.org/tiki/tiki-index.php
#参考文档:https://blog.csdn.net/kikajack/article/details/79396793


#1、导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#2、安装elrepo内核软件源
yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#3、查看可用的内核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#4、安装长期支持版本
yum --enablerepo=elrepo-kernel install -y kernel-lt 

#设置grub,开机从新内核启动:内核安装好后,需要设置为默认启动选项并重启后才会生效
#1、通过 gurb2-mkconfig 命令创建 grub2 的配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#2、查看系统上的所有可以内核:
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.4.202-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-f58eebd168fc4ff3809f5af6bf26ada0) 7 (Core)
#3、设置上面的0号内核为默认使用内核,然后重启
grub2-set-default 0
reboot

手动升级CentOS内核到指定版本:https://blog.csdn.net/aduocd/article/details/113694954

1.3、装入ipvs内核模块(建议启用ipvs,代替iptables)

模块无需全部装入,可以按需装入,主要有ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh, nf_conntrack_ipv4

yum install -y ipvsadm   #ipvs的管理工具,可选
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4 nf_conntrack_netlink nf_conntrack br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw  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"
for kernel_module in ${ipvs_modules}; do
    /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        /sbin/modprobe ${kernel_module}
    fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

从kubernetes1.8版本开始,新增了kube-proxy对ipvs的支持,并且在新版的kubernetes1.11版本中被纳入了GA。iptables模式问题不好定位,规则多了性能会显著下降,甚至会出现规则丢失的情况;相比而言,ipvs就稳定的多。

1.4、安装docker

rke集群组件在Linux系统上以docker容器的形式运行。

cd /etc/yum.repos.d/
# docker源
curl -O https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
### Install required packages for docker.
yum install -y device-mapper-persistent-data lvm2
yum install -y docker-ce-19.03.8

## Create /etc/docker directory.
mkdir /etc/docker

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "graph": "/u01/install/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://lqetgo1f.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn/"],
  "insecure-registries" : ["https://harbor.ljzsdut.com"],
  "oom-score-adjust": -1000,
  "max-concurrent-downloads": 10,
	"max-concurrent-uploads": 15
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

1.5、(可选)锁定Docker版本

可能因为某些原因无意间执行了yum update或者apt-get -y upgrade;导致Docker版本升级。为了避免此类问题发生,建议在安装好Docker后对Docker软件进行锁定,防止Docker意外更新。

  1. 安装yum-plugin-versionlock插件

    yum install -y yum-plugin-versionlock
    
  2. 锁定软件包

    yum versionlock add docker-ce docker-ce-cli
    
  3. 查看已锁定的软件包

    yum versionlock list
    
  4. 解锁指定的软件包

    yum versionlock delete <软件包名称>
    
  5. 解锁所有的软件包

    yum versionlock clear
    

2、rke部署

2.1、创建普通用户

rke部署时,如果使用Red Hat Enterprise Linux,Oracle Enterprise Linux或CentOS,由于Bugzilla 1527565,无法将root用户用作SSH用户,需要创建普通用户:

# 【所有集群节点上执行】
useradd k8s
usermod -aG docker k8s
echo 111111 |passwd k8s --stdin

此外需要配置rke所在主机可以通过免密的ssh连接的该用户。

2.2、下载rke命令行工具

浏览器访问RKE Releases页面,下载符合操作系统的最新RKE安装程序,并将其配置在PATH环境变量中即可。

2.3、使用rke安装k8s集群

生成集群配置文件:

官方示例文件

mkdir -p rke-deploy;cd rke-deploy
cat > cluster.yml << "EOF"
nodes:
  - address: 64.115.5.24
    internal_address: 64.115.5.24
    user: k8s
    role:
      - controlplane
      - etcd
    ssh_key_path: ~/.ssh/id_rsa
    port: 22
    hostname_override: master1
  - address: 64.115.5.25
    internal_address: 64.115.5.25
    user: k8s
    role:
      - controlplane
      - etcd
    ssh_key_path: ~/.ssh/id_rsa
    port: 22
    hostname_override: master2
  - address: 64.115.5.26
    internal_address: 64.115.5.26
    user: k8s
    role:
      - controlplane
      - etcd
    ssh_key_path: ~/.ssh/id_rsa
    port: 22
    hostname_override: master3
  - address: 64.115.5.28
    internal_address: 64.115.5.28
    user: k8s
    role:
      - worker
    ssh_key_path: ~/.ssh/id_rsa
    hostname_override: node1
    labels:
      ingress: true
      dns: true
  - address: 64.115.5.29
    internal_address: 64.115.5.29
    user: k8s
    role:
      - worker
    ssh_key_path: ~/.ssh/id_rsa
    hostname_override: node2
    labels:
      ingress: true
      dns: true
# 如果设置为true,则可以使用不受支持的Docker版本
ignore_docker_version: false

# 集群等级的SSH私钥(private key)
## 如果节点未配置SSH私钥,RKE将会以此私钥去连接集群节点
ssh_key_path: ~/.ssh/id_rsa

# 使用SSH agent来提供SSH私钥
## 需要配置环境变量`SSH_AUTH_SOCK`指向已添加私钥的SSH agent
ssh_agent_auth: false

# 配置docker root目录
docker_root_dir: "/var/lib/docker"

# 私有仓库
## 当设置`is_default: true`后,构建集群时会自动在配置的私有仓库中拉取镜像
## 如果使用的是DockerHub镜像仓库,则可以省略`url`或将其设置为`docker.io`
## 如果使用内部公开仓库,则可以不用设置用户名和密码

#private_registries:
#  - url: registry.com
#    user: Username
#    password: password
#    is_default: true

# 堡垒机
## 如果集群节点需要通过堡垒机跳转,那么需要为RKE配置堡垒机信息
#bastion_host:
#  address: x.x.x.x
#  user: ubuntu
#  port: 22
#  ssh_key_path: /home/user/.ssh/bastion_rsa
## or
##   ssh_key: |-
##     -----BEGIN RSA PRIVATE KEY-----
##
##     -----END RSA PRIVATE KEY-----

# 设置Kubernetes集群名称
#默认情况下,集群的名称将是local。如果需要其他名称,可以使用cluster_name更改集群的名称,该名称将在集群生成的kubeconfig文件中显示。
cluster_name: dev-cluster

# 定义kubernetes版本.
## 目前, 版本定义需要与rancher/types defaults map相匹配: https://github.com/rancher/types/blob/master/apis/management.cattle.io/v3/k8s_defaults.go#L14 (后期版本请查看: https://github.com/rancher/kontainer-driver-metadata/blob/master/rke/k8s_rke_system_images.go )
## 如果同时定义了kubernetes_version和system_images中的kubernetes镜像,则system_images配置将优先于kubernetes_version
kubernetes_version: v1.18.3-rancher2-2

# `system_images`优先级更高,如果没有单独指定`system_images`镜像,则会使用`kubernetes_version`对应的默认镜像版本。
## 默认Tags: https://github.com/rancher/types/blob/master/apis/management.cattle.io/v3/k8s_defaults.go)(Rancher v2.3或者RKE v0.3之后的版本请查看: https://github.com/rancher/kontainer-driver-metadata/blob/master/rke/k8s_rke_system_images.go )可以通过rke config -s查看默认版本。
#system_images:
#  etcd: rancher/coreos-etcd:v3.4.3-rancher1
#  alpine: rancher/rke-tools:v0.1.58
#  nginx_proxy: rancher/rke-tools:v0.1.58
#  cert_downloader: rancher/rke-tools:v0.1.58
#  kubernetes_services_sidecar: rancher/rke-tools:v0.1.58
#  kubedns: rancher/k8s-dns-kube-dns:1.15.0
#  dnsmasq: rancher/k8s-dns-dnsmasq-nanny:1.15.0
#  kubedns_sidecar: rancher/k8s-dns-sidecar:1.15.0
#  kubedns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
#  coredns: rancher/coredns-coredns:1.6.5
#  coredns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
#  nodelocal: rancher/k8s-dns-node-cache:1.15.7
#  kubernetes: rancher/hyperkube:v1.17.6-rancher2
#  flannel: rancher/coreos-flannel:v0.12.0
#  flannel_cni: rancher/flannel-cni:v0.3.0-rancher6
#  calico_node: rancher/calico-node:v3.13.4
#  calico_cni: rancher/calico-cni:v3.13.4
#  calico_controllers: rancher/calico-kube-controllers:v3.13.4
#  calico_ctl: rancher/calico-ctl:v3.13.4
#  calico_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
#  canal_node: rancher/calico-node:v3.13.4
#  canal_cni: rancher/calico-cni:v3.13.4
#  canal_flannel: rancher/coreos-flannel:v0.12.0
#  canal_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
#  weave_node: weaveworks/weave-kube:2.6.4
#  weave_cni: weaveworks/weave-npc:2.6.4
#  pod_infra_container: rancher/pause:3.1
#  ingress: rancher/nginx-ingress-controller:nginx-0.32.0-rancher1
#  ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1
#  metrics_server: rancher/metrics-server:v0.3.6
#  windows_pod_infra_container: rancher/kubelet-pause:v0.1.4

services:
  etcd:
    # if external etcd is used
    # path: /etcdcluster
    # external_urls:
    #   - https://etcd-example.com:2379
    # ca_cert: |-
    #   -----BEGIN CERTIFICATE-----
    #   xxxxxxxxxx
    #   -----END CERTIFICATE-----
    # cert: |-
    #   -----BEGIN CERTIFICATE-----
    #   xxxxxxxxxx
    #   -----END CERTIFICATE-----
    # key: |-
    #   -----BEGIN PRIVATE KEY-----
    #   xxxxxxxxxx
    #   -----END PRIVATE KEY-----
    # Rancher 2用户注意事项:如果在创建Rancher Launched Kubernetes时使用配置文件配置集群,则`kube_api`服务名称应仅包含下划线。这仅适用于Rancher v2.0.5和v2.0.6。

    # 以下参数仅支持RKE部署的etcd集群
    # 开启自动备份
    backup_config:
      enabled: true           # 设置true启用ETCD自动备份,设置false禁用;
      interval_hours: 12      # 快照创建间隔时间,不加此参数,默认5分钟;
      retention: 6            # etcd备份保留份数;
#      # S3配置选项
#      s3backupconfig:
#        access_key: "myaccesskey"
#        secret_key:  "myaccesssecret"
#        bucket_name: "my-backup-bucket"
#        folder: "folder-name" # 此参数v2.3.0之后可用
#        endpoint: "s3.eu-west-1.amazonaws.com"
#        region: "eu-west-1"
    # 扩展参数
    extra_args:
      auto-compaction-retention: 240 #(单位小时)
      # 修改空间配额为$((6*1024*1024*1024)),默认2G,最大8G
      quota-backend-bytes: '6442450944'
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kube-api:
    # cluster_ip范围,这必须与kube-controller中的service_cluster_ip_range匹配
    service_cluster_ip_range: 10.43.0.0/16
    # NodePort映射的端口范围
    service_node_port_range: 30000-32767
    # Pod安全策略
    pod_security_policy: false
    # kubernetes API server扩展参数,这些参数将会替换默认值
    extra_args:
      watch-cache: true
      default-watch-cache-size: 1500
      # 事件保留时间,默认1小时
      event-ttl: 1h0m0s
      # 默认值400,设置0为不限制,一般来说,每25~30个Pod有15个并行
      max-requests-inflight: 800
      # 默认值200,设置0为不限制
      max-mutating-requests-inflight: 400
      # kubelet操作超时,默认5s
      kubelet-timeout: 5s
      # 启用审计日志到标准输出
      audit-log-path: "-"
      # 增加删除workers的数量
      delete-collection-workers: 3
      # 将日志输出的级别设置为debug模式
      v: 4
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  # Rancher 2用户注意事项:如果在创建Rancher Launched Kubernetes时使用配置文件配置集群,则`kube_controller`服务名称应仅包含下划线。这仅适用于Rancher v2.0.5和v2.0.6。
  kube-controller:
    # Pods_ip范围
    cluster_cidr: 10.42.0.0/16
    # cluster_ip范围
    ## 这必须与kube-api中的service_cluster_ip_range相同
    service_cluster_ip_range: 10.43.0.0/16
    extra_args:
      # 修改每个节点子网大小(cidr掩码长度),默认为24,可用IP为254个;23,可用IP为510个;22,可用IP为1022个;
      node-cidr-mask-size: '24'

      # 控制器定时与节点通信以检查通信是否正常,周期默认5s
      node-monitor-period: '5s'
      ## 当节点通信失败后,再等一段时间kubernetes判定节点为notready状态。
      ## 这个时间段必须是kubelet的nodeStatusUpdateFrequency(默认10s)的整数倍,
      ## 其中N表示允许kubelet同步节点状态的重试次数,默认40s。
      node-monitor-grace-period: '20s'
      ## 再持续通信失败一段时间后,kubernetes判定节点为unhealthy状态,默认1m0s。
      node-startup-grace-period: '30s'
      ## 再持续失联一段时间,kubernetes开始迁移失联节点的Pod,默认5m0s。
      pod-eviction-timeout: '1m'

      # 默认5. 同时同步的deployment的数量。
      concurrent-deployment-syncs: 5
      # 默认5. 同时同步的endpoint的数量。
      concurrent-endpoint-syncs: 5
      # 默认20. 同时同步的垃圾收集器工作器的数量。
      concurrent-gc-syncs: 20
      # 默认10. 同时同步的命名空间的数量。
      concurrent-namespace-syncs: 10
      # 默认5. 同时同步的副本集的数量。
      concurrent-replicaset-syncs: 5
      # 默认5m0s. 同时同步的资源配额数。(新版本中已弃用)
      # concurrent-resource-quota-syncs: 5m0s
      # 默认1. 同时同步的服务数。
      concurrent-service-syncs: 1
      # 默认5. 同时同步的服务帐户令牌数。
      concurrent-serviceaccount-token-syncs: 5
      # 默认5. 同时同步的复制控制器的数量
      #concurrent-rc-syncs: 5
      # 默认30s. 同步deployment的周期。
      deployment-controller-sync-period: 30s
      # 默认15s。同步PV和PVC的周期。
      pvclaimbinder-sync-period: 15s
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kubelet:
    # 集群搜索域
    cluster_domain: cluster.local
    # 内部DNS服务器地址
    cluster_dns_server: 10.43.0.10
    # 禁用swap
    fail_swap_on: false
    # 扩展变量
    extra_args:
      # 支持静态Pod。在主机/etc/kubernetes/目录下创建manifest目录,Pod YAML文件放在/etc/kubernetes/manifest/目录下
      pod-manifest-path: "/etc/kubernetes/manifest/"
      root-dir:  "/var/lib/kubelet"
      docker-root: "/var/lib/docker"
      # 指定pause镜像
      pod-infra-container-image: 'rancher/pause:3.1'
      # 传递给网络插件的MTU值,以覆盖默认值,设置为0(零)则使用默认的1460
      network-plugin-mtu: '1500'
      # 修改节点最大Pod数量
      max-pods: "250"
      # 密文和配置映射同步时间,默认1分钟
      sync-frequency: '3s'
      # Kubelet进程可以打开的文件数(默认1000000),根据节点配置情况调整
      max-open-files: '2000000'
      # 与apiserver会话时的并发数,默认是10
      kube-api-burst: '30'
      # 与apiserver会话时的 QPS,默认是5,QPS = 并发量/平均响应时间
      kube-api-qps: '15'
      # kubelet默认一次拉取一个镜像,设置为false可以同时拉取多个镜像,
      # 前提是存储驱动要为overlay2,对应的Dokcer也需要增加下载并发数,参考[docker配置](/rancher2x/install-prepare/best-practices/docker/)
      serialize-image-pulls: 'false'
      # 拉取镜像的最大并发数,registry-burst不能超过registry-qps ,
      # 仅当registry-qps大于0(零)时生效,(默认10)。如果registry-qps为0则不限制(默认5)。
      registry-burst: '10'
      registry-qps: '0'
      cgroups-per-qos: 'true'
      cgroup-driver: 'cgroupfs'

      # 节点资源预留
      enforce-node-allocatable: 'pods'
      system-reserved: 'cpu=0.25,memory=200Mi'
      kube-reserved: 'cpu=0.25,memory=1500Mi'
      # POD驱逐,这个参数只支持内存和磁盘。
      ## 硬驱逐阈值
      ### 当节点上的可用资源降至保留值以下时,就会触发强制驱逐。强制驱逐会强制kill掉POD,不会等POD自动退出。
      eviction-hard: 'memory.available<300Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%'
      ## 软驱逐阈值
      ### 以下四个参数配套使用,当节点上的可用资源少于这个值时但大于硬驱逐阈值时候,会等待eviction-soft-grace-period设置的时长;
      ### 等待中每10s检查一次,当最后一次检查还触发了软驱逐阈值就会开始驱逐,驱逐不会直接Kill POD,先发送停止信号给POD,然后等待eviction-max-pod-grace-period设置的时长;
      ### 在eviction-max-pod-grace-period时长之后,如果POD还未退出则发送强制kill POD"
      eviction-soft: 'memory.available<500Mi,nodefs.available<50%,imagefs.available<50%,nodefs.inodesFree<10%'
      eviction-soft-grace-period: 'memory.available=1m30s,nodefs.available=2m,imagefs.available=2m,nodefs.inodesFree=2m'
      eviction-max-pod-grace-period: '30'
      eviction-pressure-transition-period: '30s'
      # 指定kubelet多长时间向master发布一次节点状态。注意: 它必须与kube-controller中的nodeMonitorGracePeriod一起协调工作。(默认 10s)
      node-status-update-frequency: 10s
      # 设置cAdvisor全局的采集行为的时间间隔,主要通过内核事件来发现新容器的产生。默认1m0s
      global-housekeeping-interval: 1m0s
      # 每个已发现的容器的数据采集频率。默认10s
      housekeeping-interval: 10s
      # 所有运行时请求的超时,除了长时间运行的 pull, logs, exec and attach。超时后,kubelet将取消请求,抛出错误,然后重试。(默认2m0s)
      runtime-request-timeout: 2m0s
      # 指定kubelet计算和缓存所有pod和卷的卷磁盘使用量的间隔。默认为1m0s
      volume-stats-agg-period: 1m0s

    # 可以选择定义额外的卷绑定到服务
    extra_binds: []
      #- "/usr/libexec/kubernetes/kubelet-plugins:/usr/libexec/kubernetes/kubelet-plugins"
      #- "/etc/iscsi:/etc/iscsi"
      #- "/sbin/iscsiadm:/sbin/iscsiadm"
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kubeproxy:
    extra_args:
      # 默认使用iptables进行数据转发,如果要启用ipvs,则此处设置为`ipvs`
      proxy-mode: "ipvs"
      # 与kubernetes apiserver通信并发数,默认10
      kube-api-burst: 20
      # 与kubernetes apiserver通信时使用QPS,默认值5,QPS=并发量/平均响应时间
      kube-api-qps: 10
    extra_binds: []
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  scheduler:
    extra_args: {}
    extra_binds: []
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"

# 目前,只支持x509验证
## 您可以选择创建额外的SAN(主机名或IP)以添加到API服务器PKI证书。
## 如果要为control plane servers使用负载均衡器,这很有用。
#authentication:
#  strategy: "x509|webhook"
#  webhook:
#    config_file: "...."
#    cache_timeout: 5s
#  sans:
#    # 此处配置备用域名或IP,当主域名或者IP无法访问时,可通过备用域名或IP访问
#    - "192.168.1.100"
#    - "www.test.com"
authentication:
  strategy: "x509"
  sans:
    # 此处配置备用域名或IP,当主域名或者IP无法访问时,可通过备用域名或IP访问
    - "64.115.5.19"
    - "64.115.5.26"
    - "64.115.5.28"
    - "k8s.rencaiyoujia.com"
# Kubernetes认证模式
## Use `mode: rbac` 启用 RBAC
## Use `mode: none` 禁用 认证
authorization:
  mode: rbac
# 如果要设置Kubernetes云提供商,需要指定名称和配置,非云主机则留空;
cloud_provider:
# Add-ons是通过kubernetes jobs来部署。 在超时后,RKE将放弃重试获取job状态。以秒为单位。
addon_job_timeout: 0
# 有几个网络插件可以选择:`flannel、canal、calico`,Rancher2默认canal;如果禁用,设置为none
network:
  # rke v1.0.4+ 可用,如果选择canal网络驱动,需要设置mtu为1450
  #  mtu: 1450  
  #  plugin: canal
  #  options:
  #    flannel_backend_type: "vxlan"
  plugin: calico
# 目前只支持nginx ingress controller
## 可以设置`provider: none`来禁用ingress controller
ingress:
  provider: nginx
  node_selector:
    ingress: true
# 配置dns上游dns服务器
## 可用rke版本 v0.2.0
dns:
  provider: coredns
  upstreamnameservers:
  - 114.114.114.114
  node_selector:
    dns: true
# 安装附加应用
## 所有附加应用都必须指定命名空间
#addons: |-
#    ---
#    apiVersion: v1
#    kind: Pod
#    metadata:
#      name: nginx-demo
#      namespace: default
#    spec:
#      containers:
#      - image: nginx:alpine
#        imagePullPolicy: IfNotPresent
#        name: alpine
#        ports:
#          - containerPort: 80
#
#addons_include:
#    - https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-operator.yml
#    - https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-cluster.yml
#    - /path/to/manifest

EOF

安装:

rke up   #默认使用当前目录下的cluster.yaml文件
#rke up --config cluster.yaml #--config指定配置文件

【升级】

1、升级集群组件版本

RKE通过更改系统镜像的镜像版本来支持版本升级。在cluster.yml配置文件更新后,执行rke up升级Kubernetes。

#修改如下配置中组件的版本,实现组件升级
kubernetes_version: 
system_images:

2、升级服务参数

可以通过更改Services参数或extra_args并使用更新的配置文件重新运行rke up来升级服务

注意: service_cluster_ip_range或者cluster_cidr不能更改,因为对这些参数的任何更改都将导致集群损坏。目前,网络容器不会自动升级。

【集群管理】

1、添加或删除节点

RKE支持为worker和controrhlplane平面添加/删除节点。只需要修改原始cluster.yml文件,指定节点运行的角色。在添加/删除节点进行更改后,运行rke up --config cluster.yml更新集群。

在配置文件中添加/删除工作节点后运行rke up --update-only,除了工作节点修改之外,其他etcd和控制平面的部署将被忽略。

替换节点要分2步:删除+新增

如果不熟过程中出现错误,可以重复执行rke up尝试一下是否可以修复。如果还不能修复,就使用下面的步骤删除Kubernetes集群后,再运行rke up,我已经用过好多次了。

2、删除Kubernetes集群

执行rke remove命令删除Kubernetes集群。

这个命令对cluster.yml中的每个节点执行以下操作:

  • 删除部署在其上的Kubernetes组件

    • etcd

    • kube-apiserver

    • kube-controller-manager

    • kubelet

    • kube-proxy

    • nginx-proxy

      注意: 不会从节点中删除Pod。如果重新使用该节点,则在创建新的Kubernetes集群时将自动删除pod。

  • 清除每台主机中服务留下的目录:

    • /etc/kubernetes/ssl
    • /var/lib/etcd
    • /etc/cni
    • /opt/cni
    • /var/run/calico

在节点删除后,建议执行清理节点以备后续使用。

  
#!/bin/bash

KUBE_SVC='
kubelet
kube-scheduler
kube-proxy
kube-controller-manager
kube-apiserver
'

for kube_svc in ${KUBE_SVC};
do
  # 停止服务
  if [[ `systemctl is-active ${kube_svc}` == 'active' ]]; then
    systemctl stop ${kube_svc}
  fi
  # 禁止服务开机启动
  if [[ `systemctl is-enabled ${kube_svc}` == 'enabled' ]]; then
    systemctl disable ${kube_svc}
  fi
done

# 停止所有容器
docker stop $(docker ps -aq)

# 删除所有容器
docker rm -f $(docker ps -qa)

# 删除所有容器卷
docker volume rm $(docker volume ls -q)

# 卸载mount目录
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher;
do
  umount $mount;
done

# 备份目录
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")

# 删除残留路径
rm -rf /etc/ceph \
    /etc/cni \
    /opt/cni \
    /run/secrets/kubernetes.io \
    /run/calico \
    /run/flannel \
    /var/lib/calico \
    /var/lib/cni \
    /var/lib/kubelet \
    /var/log/containers \
    /var/log/kube-audit \
    /var/log/pods \
    /var/run/calico

# 清理网络接口
no_del_net_inter='
lo
docker0
eth
ens
bond
'

network_interface=`ls /sys/class/net`

for net_inter in $network_interface;
do
  if ! echo "${no_del_net_inter}" | grep -qE ${net_inter:0:3}; then
    ip link delete $net_inter
  fi
done

# 清理残留进程
port_list='
:80
:443
:6443
:2376
:2379
:2380
:8472
:9099
:10250
:10254
'

for port in $port_list;
do
  pid=`netstat -atlnup | grep $port | awk '{print $7}' | awk -F '/' '{print $1}' | grep -v - | sort -rnk2 | uniq`
  if [[ -n $pid ]]; then
    kill -9 $pid
  fi
done

kube_pid=`ps -ef | grep -v grep | grep kube | awk '{print $2}'`

if [[ -n $kube_pid ]]; then
  kill -9 $kube_pid
fi

# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker

【备份与恢复】

1、手动创建备份

命令:

#本地存储
rke etcd snapshot-save --config <cluster.yml> --name <snapshot-name>

#本地存储+上传S3:备份将保存在/opt/rke/etcd-snapshots路径并同时上传到S3后端存储。
rke etcd snapshot-save \
--config cluster.yml \
--name snapshot-name \
--s3 \
--access-key S3_ACCESS_KEY \
--secret-key S3_SECRET_KEY \
--bucket-name s3-bucket-name \
--folder s3-folder-name \ # Optional - Available as of v0.3.0
--s3-endpoint s3.amazonaws.com

rke etcd snapshot-save命令将从集群中的每个etcd节点保存ETCD备份,备份保存在/opt/rke/etcd-snapshots中。运行该命令时,将创建一个附加容器来获取备份。备份完成后,附加容器将自动删除。

说明:RKE安装集群时,将在集群配置文件cluster.yml的同一目录创建一个.rkestate文件。该.rkestate文件包含集群的当前状态,包括RKE配置和证书。请妥善保管此文件以便后期对集群进行修改或升级。

rke etcd snapshot-save命令参数:

选项描述S3特有
--name value指定备份名称
--config value指定RKE集群YAML文件(default: “cluster.yml”) [$RKE_CONFIG]
--s3启用s3备份*
--s3-endpoint value指定s3备份地址 (default: “s3.amazonaws.com”)*
--s3-endpoint-ca value指定用于连接到自定义s3端点的CA证书文件的路径(可选)*自v0.2.5起可用*
--access-key value指定s3 accessKey*
--secret-key value指定s3 secretKey*
--bucket-name value指定s3 bucket name*
--folder value在存储中指定要存储备份的文件夹。可选。 自v0.3.0起可用*
--region value指定s3 bucket位置 (可选)*
--ssh-agent-auth使用SSH Agent认证
--ignore-docker-version禁止Docker版本检查

2、自动备份

启用自动备份后,默认情况下,etcd-snapshot服务为具有etcd角色的每个节点获取快照,并将它们存储到本地磁盘/opt/rke/etcd-snapshot目录中。如果设置了s3存储,也会将备份长传至s3中。

services:
  etcd:
    backup_config:
      enabled: true           # 设置true启用ETCD自动备份,设置false禁用;
      interval_hours: 12      # 快照创建间隔时间,不加此参数,默认5分钟;
      retention: 6            # etcd备份保留份数;
      # S3配置选项
      s3backupconfig:
        access_key: "myaccesskey"
        secret_key:  "myaccesssecret"
        bucket_name: "my-backup-bucket"
        folder: "folder-name" # 此参数v2.3.0之后可用
        endpoint: "s3.eu-west-1.amazonaws.com"
        region: "eu-west-1"

【证书管理】

1. 生成证书签名请求(CSRs)和密钥

如果希望使用权威CA机构颁发的证书,可以使用RKE生成证书签名请求(CSRs)文件和密钥

您可以把证书签名请求(CSRs)文件和密钥交给权威CA机构进行签名颁发证书。在证书签名之后,RKE可以通过自定义证书 功能来使用这些证书。

2. 证书轮换

默认情况下,Kubernetes集群需要证书,RKE将自动为集群生成证书。在证书过期之前以及证书受到破坏时,轮换些证书非常重要。

证书轮换之后,Kubernetes组件将自动重新启动。证书轮换可用于下列服务:

  • etcd
  • kubelet
  • kube-apiserver
  • kube-proxy
  • kube-scheduler
  • kube-controller-manager

RKE可以通过一些简单的命令轮换自动生成的证书:

  • 使用相同的CA轮换所有服务证书
  • 使用相同的CA为单个服务轮换证书
  • 轮换CA和所有服务证书

当您准备轮换证书时, RKE 配置文件 cluster.yml是必须的。运行rke cert rotate命令时,可通过--config指定配置路径。

2.1、使用相同CA轮换所有服务证书

使用 rke cert rotate进行相同的CA轮换所有服务证书。轮换所有服务证书后,这些服务将自动重新启动以开始使用新证书。

$ rke cert rotate
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating Kubernetes API server certificates
INFO[0000] [certificates] Generating Kube Controller certificates
INFO[0000] [certificates] Generating Kube Scheduler certificates
INFO[0001] [certificates] Generating Kube Proxy certificates
INFO[0001] [certificates] Generating Node certificate   
INFO[0001] [certificates] Generating admin certificates and kubeconfig
INFO[0001] [certificates] Generating Kubernetes API server proxy client certificates
INFO[0001] [certificates] Generating etcd-xxxxx certificate and key
INFO[0001] [certificates] Generating etcd-yyyyy certificate and key
INFO[0002] [certificates] Generating etcd-zzzzz certificate and key
INFO[0002] Successfully Deployed state file at [./cluster.rkestate]
INFO[0002] Rebuilding Kubernetes cluster with rotated certificates
.....
INFO[0050] [worker] Successfully restarted Worker Plane..

2.2、使用相同CA轮换单个服务证书

使用--service 指定单个服务,比如kubelet。指定的Kubernetes服务对其证书进行轮换后,它将自动重新启动以开始使用新证书。

$ rke cert rotate --service kubelet
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating Node certificate
INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
INFO[0000] Rebuilding Kubernetes cluster with rotated certificates
.....
INFO[0033] [worker] Successfully restarted Worker Plane..

2.3、轮换CA和所有服务证书

如果需要轮换CA证书,则需要轮换所有服务证书,因为它们需要使用新轮换的CA证书签名。在CA和所有服务证书轮换之后,这些服务将自动重新启动,以便使用新证书运行。

轮换CA证书将导致重新启动其他系统服务,这些系统服务也将使用新的CA证书。这包括:

  • Networking pods (canal, calico, flannel, and weave)
  • Ingress Controller pods
  • KubeDNS pods
$ rke cert rotate --rotate-ca
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating CA kubernetes certificates
INFO[0000] [certificates] Generating Kubernetes API server aggregation layer requestheader client CA certificates
INFO[0000] [certificates] Generating Kubernetes API server certificates
INFO[0000] [certificates] Generating Kube Controller certificates
INFO[0000] [certificates] Generating Kube Scheduler certificates
INFO[0000] [certificates] Generating Kube Proxy certificates
INFO[0000] [certificates] Generating Node certificate   
INFO[0001] [certificates] Generating admin certificates and kubeconfig
INFO[0001] [certificates] Generating Kubernetes API server proxy client certificates
INFO[0001] [certificates] Generating etcd-xxxxx certificate and key
INFO[0001] [certificates] Generating etcd-yyyyy certificate and key
INFO[0001] [certificates] Generating etcd-zzzzz certificate and key
INFO[0001] Successfully Deployed state file at [./cluster.rkestate]
INFO[0001] Rebuilding Kubernetes cl