####1、配置要求link
参考节点要求
https://www.rancher.cn/docs/rancher/v2.x/cn/install-prepare/requirements
####2、主机名配置
因为K8S的规定,主机名只支持包含 - 和 .(中横线和点)两种特殊符号,并且主机名不能出现重复。
hostnamectl set-hostname rke.thinkmap.xyz
hostnamectl set-hostname node01
hostnamectl set-hostname node02
hostnamectl set-hostname node03
hostnamectl set-hostname node04
hostnamectl set-hostname node05
####3、Hosts
配置每台主机的hosts(/etc/hosts),添加host_ip $hostname到/etc/hosts文件中。
cat /etc/hosts
172.16.1.90 rke.thinkmap.xyz
172.16.1.91 node01
172.16.1.92 node02
172.16.1.93 node03
172.16.1.94 node04
172.16.1.95 node05
####4、每个节点创建docker用户,设置sudo权限
useradd -d /home/thinkmap -m thinkmap
echo "thinkmap"|passwd --stdin thinkmap
echo "thinkmap ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/thinkmap
chmod 0440 /etc/sudoers.d/thinkmap
sed -i s'/Defaults requiretty/Defaults requiretty'/g /etc/sudoers
sudo usermod -aG docker thinkmap
####5、配置相互间的ssh信任关系
现在ceph-admin节点上产生公私钥文件,然后将ceph-admin节点的.ssh目录拷贝给其他节点
[root@rke ~]su thinkmap
[thinkmap@rke ~]$ ssh-keygen -t rsa 一路回车
[thinkmap@rke ~]$ cd .ssh/
[thinkmap@rke .ssh]$ ls
id_rsa id_rsa.pub
[thinkmap@rke .ssh]$ cp id_rsa.pub authorized_keys
[thinkmap@rke .ssh]$ scp -r /home/thinkmap/.ssh node01.thinkmap.ai:/home/thinkmap/
[thinkmap@rke .ssh]$ scp -r /home/thinkmap/.ssh node02.thinkmap.ai:/home/thinkmap/
[thinkmap@rke .ssh]$ scp -r /home/thinkmap/.ssh node03.thinkmap.ai:/home/thinkmap/
然后在各节点直接验证ceph用户下的ssh相互信任关系
$ ssh -p22 [email protected]
$ ssh -p22 [email protected]
$ ssh -p22 [email protected]
####6、CentOS关闭selinux
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
####7、关闭防火墙(可选)或者放行相应端口
对于刚刚接触Rancher的用户,建议在关闭防火墙的测试环境或桌面虚拟机来运行rancher,以避免出现网络通信问题。
关闭防火墙
1、CentOS
systemctl stop firewalld.service && systemctl disable firewalld.service
2、Ubuntu
ufw disable
端口放行
端口放行请查看端口需求
####8、配置主机时间、时区、系统语言、yum源
查看时区:
date -R或者 timedatectl
修改时区:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改系统语言环境:
sudo echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile
配置主机NTP时间同步
配置kubernetes.repo的阿里云yum源:
cat <
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
####9、配置主机DNS
对于类似Ubuntu 18这类默认使用systemd-resolve管理DNS的系统,建议禁用systemd-resolved服务,然后手动配置DNS。
操作方法:
禁用systemd-resolved.service
systemctl disable systemd-resolved.service
systemctl stop systemd-resolved.service
rm -rf /etc/resolv.conf ; touch /etc/resolv.conf
接着编辑/etc/resolv.conf添加DNS服务器
重启docker服务
systemctl daemon-reload ; systemctl restart docker
####10、主机OS调优
一、内核调优
echo "
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
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
" >> /etc/sysctl.conf
接着执行 sysctl -p
二、nofile
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF
三、启用cgroup
修改配置文件/etc/default/grub,启用cgroup内存限额功能,配置两个参数:
sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
####11、内核模块
警告
如果要使用ceph存储相关功能,需保证worker节点加载RBD模块
以下模块需要在主机上加载
模块列表
模块查询: lsmod | grep <模块名>
模块加载: modprobe <模块名>
####二、Docker安装与配置
1、Docker安装
修改系统源
一、Ubuntu 16.04.x
二、Ubuntu 18.04.x
三、Centos7.x
Docker-ce安装
一、Ubuntu
二、Centos
2、Docker配置
对于通过systemd来管理服务的系统(比如CentOS7.X、Ubuntu16.X), Docker有两处可以配置参数: 一个是docker.service服务配置文件,一个是Docker daemon配置文件daemon.json。
docker.service
对于CentOS系统,docker.service默认位于/usr/lib/systemd/system/docker.service;对于Ubuntu系统,docker.service默认位于/lib/systemd/system/docker.service
daemon.json
daemon.json默认位于/etc/docker/daemon.json,如果没有可手动创建,基于systemd管理的系统都是相同的路径。通过修改daemon.json来改过Docker配置,也是Docker官方推荐的方法。
以下说明均基于systemd,并通过/etc/docker/daemon.json来修改配置。
配置镜像下载和上传并发数
从Docker1.12开始,支持自定义下载和上传镜像的并发数,默认值上传为3个并发,下载为5个并发。通过添加”max-concurrent-downloads”和”max-concurrent-uploads”参数对其修改:
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5
配置镜像加速地址
Rancher从v1.6.15开始到v2.x.x,Rancher系统相关的所有镜像(包括1.6.x上的K8S镜像)都托管在Dockerhub仓库。Dockerhub节点在国外,国内直接拉取镜像会有些缓慢。为了加速镜像的下载,可以给Docker配置国内的镜像地址。
编辑/etc/docker/daemon.json加入以下内容
{
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://IP:PORT/"]
}
可以设置多个registry-mirrors地址,以数组形式书写,地址需要添加协议头(https或者http)。
配置insecure-registries私有仓库
Docker默认只信任TLS加密的仓库地址(https),所有非https仓库默认无法登陆也无法拉取镜像。insecure-registries字面意思为不安全的仓库,通过添加这个参数对非https仓库进行授信。可以设置多个insecure-registries地址,以数组形式书写,地址不能添加协议头(http)。
编辑/etc/docker/daemon.json加入以下内容:
{
"insecure-registries": ["192.168.1.100","IP:PORT"]
}
配置Docker存储驱动
OverlayFS是一个新一代的联合文件系统,类似于AUFS,但速度更快,实现更简单。Docker为OverlayFS提供了两个存储驱动程序:旧版的overlay,新版的overlay2(更稳定)。
先决条件:
overlay2: Linux内核版本4.0或更高版本,或使用内核版本3.10.0-514+的RHEL或CentOS。
overlay: 主机Linux内核版本3.18+
支持的磁盘文件系统
ext4(仅限RHEL 7.1)
xfs(RHEL7.2及更高版本),需要启用d_type=true。 >具体详情参考 Docker Use the OverlayFS storage driver
编辑/etc/docker/daemon.json加入以下内容
{
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"]
}
配置日志驱动
容器在运行时会产生大量日志文件,很容易占满磁盘空间。通过配置日志驱动来限制文件大小与文件的数量。 >限制单个日志文件为100M,最多产生3个日志文件
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
3、Ubuntu\Debian系统 ,docker info提示WARNING: No swap limit support
Ubuntu\Debian系统下,默认cgroups未开启swap account功能,这样会导致设置容器内存或者swap资源限制不生效。可以通过以下命令解决:
#####统一网卡名称为ethx
sudo sed -i 's/en[[:alnum:]]*/eth0/g' /etc/network/interfaces;
sudo sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="net.ifnames=0 cgroup_enable=memory swapaccount=1 biosdevname=0 \1"/g' /etc/default/grub;
sudo update-grub;
注意
通过以上命令可自动配置参数,如果/etc/default/grub非默认配置,需根据实际参数做调整。
提示
以上配置完成后,建议重启一次主机。
4、更多配置请访问最佳实践
2 - ETCD调优
一、磁盘IOPS
etcd对磁盘写入延迟非常敏感,通常需要50顺序写入IOPS(例如: 7200RPM磁盘)。对于负载较重的集群,建议使用500顺序写入IOPS(例如,典型的本地SSD或高性能虚拟化块设备)。
请注意,大多数云服务器或者云存储提供并发IOPS而不是顺序IOPS,提供的并发IOPS可能比顺序IOPS大10倍。为了测量实际的顺序IOPS,建议使用磁盘基准测试工具,如diskbench或fio。
PS
常见磁盘平均物理寻道时间约为:
7200转/分的STAT硬盘平均物理寻道时间是9ms
10000转/分的STAT硬盘平均物理寻道时间是6ms
15000转/分的SAS硬盘平均物理寻道时间是4ms
常见硬盘的旋转延迟时间约为:
7200 rpm的磁盘平均旋转延迟大约为60X1000/7200/2=4.17ms
10000 rpm的磁盘平均旋转延迟大约为60X1000/10000/2=3ms,
15000 rpm的磁盘其平均旋转延迟约为60X1000/15000/2=2ms。
最大IOPS的理论计算方法:
IOPS=1000ms/(寻道时间+旋转延迟)。忽略数据传输时间。
7200 rpm的磁盘IOPS=1000/(9+4.17)=76IOPS
10000 rpm的磁盘IOPS=1000/(6+3)=111IOPS
15000 rpm的磁盘IOPS=1000/(4+2)=166IOPS
二、磁盘IO优先级
由于etcd必须将数据持久保存到磁盘日志文件中,因此来自其他进程的磁盘活动可能会导致增加写入时间,结果可能会导致etcd请求超时和临时leader丢失。当给定高磁盘优先级时,etcd服务可以稳定地与这些进程一起运行。
在Linux上,etcd的磁盘优先级可以配置为ionice:
sudo ionice -c2 -n0 -p $(pgrep etcd)
温馨提示
: 因为主机重启或者容器重启后,容器中进程的PID会发生变化,所以建议把以上命令放在系统的启动脚本中(比如Ubuntu的/etc/init.d/rc.local脚本中),并且把命令配置在crontab定时任务中。
三、修改空间配额大小
默认ETCD空间配额大小为2G,超过2G将不再写入数据。通过给ETCD配置--quota-backend-bytes参数增大空间配额,最大支持8G。
RKE或者Rancher UI自定义部署集群的时候,在yaml文件中指定以下参数
services:
etcd:
# 开启自动备份
## rke版本大于等于0.2.x或rancher版本大于等于2.2.0时使用
backup_config:
enabled: true
interval_hours: 12
retention: 6
## rke版本小于0.2.x或rancher版本小于2.2.0时使用
snapshot: true
creation: 5m0s
retention: 24h
# 修改空间配额为$((6*1024*1024*1024)),默认2G,最大8G
extra_args:
quota-backend-bytes: '6442450944'
auto-compaction-retention: 240 #(单位小时)
磁盘碎片整理
通过auto-compaction-retention对历史数据压缩后,后端数据库可能会出现内部碎片。内部碎片是指空闲状态的,能被后端使用但是仍然消耗存储空间,碎片整理过程将此存储空间释放回文件系统。
要对etcd进行碎片整理,需手动在etcd容器中执行以下命令:
etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]
释放数据库空间
四、网络延迟
如果有大量并发客户端请求etcd leader服务,则可能由于网络拥塞而延迟处理follower对等请求。在follower节点上的发送缓冲区错误消息:
dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full
可以通过在客户端提高etcd对等网络流量优先级来解决这些错误。在Linux上,可以使用流量控制机制对对等流量进行优先级排序:
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2739 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2739 0xffff flowid 1:1
根据实际情况修改接口名称。
3 - Docker调优
Docker镜像下载最大并发数
通过配置镜像上传\下载并发数max-concurrent-downloads,max-concurrent-uploads,缩短镜像上传\下载的时间。
配置镜像加速地址
通过配置镜像加速地址registry-mirrors,可以很大程度提高镜像下载速度。
配置Docker存储驱动
OverlayFS是一个新一代的联合文件系统,类似于AUFS,但速度更快,实现更简单。Docker为OverlayFS提供了两个存储驱动程序:旧版的overlay,新版的overlay2(更稳定)。
配置日志文件大小
容器中会产生大量日志文件,很容器占满磁盘空间。通过设置日志文件大小,可以有效控制日志文件对磁盘的占用量。例如:
image-20180910172158993
开启WARNING: No swap limit support,WARNING: No memory limit support支持
对于Ubuntu\Debian系统,执行docker info命令时能看到警告WARNING: No swap limit support或者WARNING: No memory limit support。因为Ubuntu\Debian系统默认关闭了swap account或者功能,这样会导致设置容器内存或者swap资源限制不生效,解决方法。
(可选)修改Docker默认IP地址
Docker第一次运行时会自动创建名为docker0的网络接口,默认接口地址为172.17.0.1/16。在一些企业中,可能已经使用了这个网段的地址,或者规划以后会使用这个网段的地址。所以,建议在安装好docker服务后,第一时间修改docker0接口地址,避免后期出现网段冲突。
停止docker运行
systemctl stop docker.service
删除已有的docker0接口
sudo ip link del docker0
修改docker配置文件
在/etc/docker/daemon.json中添加"bip": "169.254.123.1/24",
综合配置
touch /etc/docker/daemon.json
cat > /etc/docker/daemon.json <
"oom-score-adjust": -1000,
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"bip": "169.254.123.1/24",
"registry-mirrors": ["https://3aexnae3.mirror.aliyuncs.com"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
systemctl daemon-reload && systemctl restart docker
docker.service配置
对于CentOS系统,docker.service默认位于/usr/lib/systemd/system/docker.service;对于Ubuntu系统,docker.service默认位于/lib/systemd/system/docker.service。编辑docker.service,添加以下参数。
防止docker服务OOM: OOMScoreAdjust=-1000
开启iptables转发链: ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT (centos) image-20190615165436722 ExecStartPost=/sbin/iptables -P FORWARD ACCEPT (ubuntu)
image-20190615170819489
4 - kubernetes调优
完整的配置文件可查看 RKE示例配置。
kube-apiserver
RKE或者Rancher UI自定义部署集群的时候,在yaml文件中指定以下参数
services:
kube-api:
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
kube-controller
RKE或者Rancher UI自定义部署集群的时候,在yaml文件中指定以下参数
services:
kube-controller:
extra_args:
# 修改每个节点子网大小(cidr掩码长度),默认为24,可用IP为254个;23,可用IP为510个;22,可用IP为1022个;
node-cidr-mask-size: '24'
feature-gates: "TaintBasedEvictions=false"
# 控制器定时与节点通信以检查通信是否正常,周期默认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
# 默认30. 与apiserver通信并发数。
kube-api-burst: 60
# 默认20. 与kubernetes apiserver交谈时使用的QPS,QPS = 并发量 / 平均响应时间
kube-api-qps: 40
kubelet
RKE或者Rancher UI自定义部署集群的时候,在yaml文件中指定以下参数
services:
kubelet:
extra_args:
feature-gates: "TaintBasedEvictions=false"
# 指定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配置](https://www.rancher.cn/docs/rancher/v2.x/cn/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'
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"
kube-proxy
services:
kubeproxy:
extra_args:
# 默认使用iptables进行数据转发,如果要启用ipvs,则此处设置为`ipvs`
proxy-mode: ""
# 与kubernetes apiserver通信并发数,默认10;
kube-api-burst: 20
# 与kubernetes apiserver通信时使用QPS,默认值5,QPS = 并发量 / 平均响应时间
kube-api-qps: 10
extra_binds:
- "/lib/modules:/lib/modules"
kube-scheduler
services:
scheduler:
extra_args:
kube-api-burst:
extra_binds: []
extra_env: []
docker run -d --name rancher --restart=unless-stopped \
-p 1080:80 -p 1443:443 \
-v /var/lib/rahcher:/var/lib/rancher/ \
-v /var/log/auditlog:/var/log/auditlog \
-e AUDIT_LEVEL=3 \
rancher/rancher:stable --no-cacerts
sudo docker run -d --name rancher-agent --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.2.9 --server https://172.16.1.90 --token 7xxw2fx7trpnkdhkq8zbfvkhsw9smv6d2tsbk4mt76l6vkfjkvcdhm --etcd --controlplane --worker
sudo docker login --username=thinkmaps registry.cn-hangzhou.aliyuncs.com
xxxxxx
=========================================================================
###最小cluster.yml示例
####当前RKE版本v0.3.1
nodes:
- address: 172.16.1.91
user: thinkmap
role:
- controlplane
- worker
- etcd
- address: 172.16.1.92
user: thinkmap
role:
- controlplane
- worker
- etcd
- address: 172.16.1.93
user: thinkmap
role:
- controlplane
- worker
- etcd
###完整 cluster.yml 示例
####当前RKE版本v0.3.1
# If you intened to deploy Kubernetes in an air-gapped environment,
# please consult the documentation on how to configure custom RKE images.
nodes:
- address: 172.16.1.91
port: "22"
internal_address: ""
role:
- controlplane
- worker
- etcd
hostname_override: node01.thinkmap.ai
user: thinkmap
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/thinkmap/.ssh/id_rsa
ssh_cert: ""
ssh_cert_path: ""
labels: {}
taints: []
- address: 172.16.1.92
port: "22"
internal_address: ""
role:
- controlplane
- worker
- etcd
hostname_override: node02.thinkmap.ai
user: thinkmap
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/thinkmap/.ssh/id_rsa
ssh_cert: ""
ssh_cert_path: ""
labels: {}
taints: []
- address: 172.16.1.93
port: "22"
internal_address: ""
role:
- controlplane
- worker
- etcd
hostname_override: node03.thinkmap.ai
user: thinkmap
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/thinkmap/.ssh/id_rsa
ssh_cert: ""
ssh_cert_path: ""
labels: {}
taints: []
services:
etcd:
image: ""
extra_binds: []
extra_env: []
external_urls: []
ca_cert: ""
cert: ""
key: ""
path: ""
uid: 0
gid: 0
snapshot: true
retention: "24h"
creation: "5m0s"
# 开启自动备份
## rke版本大于等于0.2.x或rancher版本大于等于2.2.0时使用
backup_config:
enabled: true
interval_hours: 12
retention: 6
# 扩展参数
extra_args:
auto-compaction-retention: 240 #(单位小时)
# 修改空间配额为$((6*1024*1024*1024)),默认2G,最大8G
quota-backend-bytes: '6442450944'
kube-api:
image: ""
extra_binds: []
extra_env: []
service_cluster_ip_range: 10.43.0.0/16
service_node_port_range: "30000-32767"
pod_security_policy: false
always_pull_images: false
## 这些参数将会替换默认值
extra_args:
watch-cache: true
default-watch-cache-size: 1500
# 默认值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
kube-controller:
image: ""
extra_binds: []
extra_env: []
cluster_cidr: 10.42.0.0/16
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'
feature-gates: "TaintBasedEvictions=false"
# 控制器定时与节点通信以检查通信是否正常,周期默认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
# 默认1. 同时同步的服务数。
concurrent-service-syncs: 1
# 默认5. 同时同步的服务帐户令牌数。
concurrent-serviceaccount-token-syncs: 5
# 默认30s. 同步deployment的周期。
deployment-controller-sync-period: 30s
# 默认15s。同步PV和PVC的周期。
pvclaimbinder-sync-period: 15s
# 默认30. 与apiserver通信并发数。
kube-api-burst: 60
# 默认20. 与kubernetes apiserver交谈时使用的QPS,QPS = 并发量 / 平均响应时间
kube-api-qps: 40
scheduler:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
kubelet:
image: ""
extra_env: []
cluster_domain: cluster.local
infra_container_image: ""
cluster_dns_server: 10.43.0.10
fail_swap_on: false
# 扩展变量
extra_args:
feature-gates: "TaintBasedEvictions=false"
# 指定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配置](https://www.rancher.cn/docs/rancher/v2.x/cn/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=500Mi,ephemeral-storage=1Gi'
system-reserved-cgroup: /system.slice
kube-reserved: 'cpu=0.25,memory=2Gi,ephemeral-storage=1Gi'
kube-reserved-cgroup: /runtime.service
# POD驱逐,这个参数只支持内存和磁盘。
## 硬驱逐伐值
### 当节点上的可用资源降至保留值以下时,就会触发强制驱逐。强制驱逐会强制kill掉POD,不会等POD自动退出。
eviction-hard: "memory.available<500Mi,nodefs.available<1Gi,imagefs.available<10Gi"
eviction-minimum-reclaim: "memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"
## 软驱逐伐值
### 以下四个参数配套使用,当节点上的可用资源少于这个值时但大于硬驱逐伐值时候,会等待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<4Gi,nodefs.available<50%,imagefs.available<50%,nodefs.inodesFree<10%'
#eviction-soft-grace-period: 'memory.available=1m30s'
#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
#volume-plugin-dir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
# 可以选择定义额外的卷绑定到服务
extra_binds:
- "/usr/libexec/kubernetes/kubelet-plugins:/usr/libexec/kubernetes/kubelet-plugins"
kubeproxy:
image: ""
extra_env: []
extra_args:
# 默认使用iptables进行数据转发,如果要启用ipvs,则此处设置为`ipvs`
proxy-mode: ""
# 与kubernetes apiserver通信并发数,默认10;
kube-api-burst: 20
# 与kubernetes apiserver通信时使用QPS,默认值5,QPS = 并发量/平均响应时间
kube-api-qps: 10
extra_binds:
- "/lib/modules:/lib/modules"
network:
plugin: flannel
options: {}
node_selector: {}
authentication:
strategy: x509
sans:
# 此处配置备用域名或IP,当主域名或者IP无法访问时,可通过备用域名或IP访问
- "172.16.1.90"
- "rke.thinkmap.ai"
webhook: null
system_images:
etcd: "rancher/coreos-etcd:v3.3.10-rancher1"
alpine: "rancher/rke-tools:v0.1.50"
nginx_proxy: "rancher/rke-tools:v0.1.50"
cert_downloader: "rancher/rke-tools:v0.1.50"
kubernetes_services_sidecar: "rancher/rke-tools:v0.1.50"
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.3.0"
coredns: "rancher/coredns-coredns:1.3.1"
coredns_autoscaler: "rancher/cluster-proportional-autoscaler:1.3.0"
kubernetes: "rancher/hyperkube:v1.15.5-rancher1"
flannel: "rancher/coreos-flannel:v0.11.0-rancher1"
flannel_cni: "rancher/flannel-cni:v0.3.0-rancher5"
calico_node: "rancher/calico-node:v3.7.4"
calico_cni: "rancher/calico-cni:v3.7.4"
calico_controllers: "rancher/calico-kube-controllers:v3.7.4"
calico_ctl: "rancher/calico-ctl:v2.0.0"
calico_flexvol: ""
canal_node: "rancher/calico-node:v3.7.4"
canal_cni: "rancher/calico-cni:v3.7.4"
canal_flannel: "rancher/coreos-flannel:v0.11.0"
canal_flexvol: ""
weave_node: "weaveworks/weave-kube:2.5.2"
weave_cni: "weaveworks/weave-npc:2.5.2"
pod_infra_container: "rancher/pause:3.1"
ingress: "rancher/nginx-ingress-controller:nginx-0.25.1-rancher1"
ingress_backend: "rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1"
metrics_server: "rancher/metrics-server:v0.3.3"
windows_pod_infra_container: ""
#ssh_key_path: /home/thinkmap/.ssh/id_rsa
#ssh_cert_path: ""
#ssh_agent_auth: false
authorization:
mode: rbac
options: {}
# 如果设置为true,则可以使用不受支持的Docker版本
ignore_docker_version: false
# 定义kubernetes版本.
kubernetes_version: "v1.15.5-rancher1-2"
# 私有仓库
## 如果使用内部公开仓库,则可以不用设置用户名和密码
private_registries: []
ingress:
provider: ""
options: {}
node_selector: {}
extra_args: {}
dns_policy: ""
cluster_name: "rke-cluster"
cloud_provider:
name: ""
prefix_path: ""
addon_job_timeout: 30
bastion_host:
address: ""
port: ""
user: ""
ssh_key: ""
ssh_key_path: ""
ssh_cert: ""
ssh_cert_path: ""
monitoring:
provider: ""
options: {}
node_selector: {}
restore:
restore: false
snapshot_name: ""
dns:
provider: coredns
upstreamnameservers:
- 114.114.114.114
- 1.2.4.8
node_selector:
app: dns
addons: ""
addons_include: []
###rke部署k8s
[thinkmap@rke ~]$ ./rke up --config cluster.yml
###错误总结
####安装过程报如下错误:
FATA[0122] Failed to get job complete status for job rke-network-plugin-deploy-job in namespace kube-system
在rke服务器上安装kubectl解决
[thinkmap@rke ~]$ sudo yum install -y kubectl
kubectl --kubeconfig kube_config_cluster.yml logs -l job-name=rke-user-addon-deploy-job -n kube-system
###环境信息残留清理
目前部署中,大部分问题都是因为由于部署环境的操作系统,或多次部署,升级后残留的的信息造成的。
部署前或部署时,请使用以下命令将环境的各类信息清理干净:
[root@node01 ~]# vim delk8s.sh
#/bin/sh
docker ps -a|awk '{print $1}'|xargs docker stop
docker ps -a|awk '{print $1}'|xargs docker rm -f
docker volume ls|awk '{print $2}'|xargs docker volume rm
sudo df -h|grep kubelet |awk -F % '{print $2}'|xargs umount
sudo rm /var/lib/kubelet/* -rf
sudo rm /etc/kubernetes/* -rf
sudo rm /var/lib/rancher/* -rf
sudo rm /var/lib/etcd/* -rf
sudo rm /var/lib/cni/* -rf
sudo iptables -F && sudo iptables -t nat -F
sudo ip link del flannel.1
### 安装配置nginx
#复制下面的代码到文本编辑器,保存为nginx.conf。
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
http {
server {
listen 80;
return 301 https://$host$request_uri;
}
}
stream {
upstream rancher_servers {
least_conn;
server
server
server
}
server {
listen 443;
proxy_pass rancher_servers;
}
}
启动nginx
docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /etc/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.14
*这里的IP_NODE_1、IP_NODE_2、IP_NODE_3替换成真实环境中的Rancher节点的IP地址。*
测试集群
安装完成后,会产生一个kube_config_rancher-cluster.yml文件,这个是集群的认证文件。
mkdir ~/.kube
rm -rf ~/.kube/config
cat kube_config_cluster.yml >> ~/.kube/config
PS: 保存好这个文件,日后升级能用到。
scp -r .kube 172.16.1.91:/home/thinkmap/
scp -r .kube 172.16.1.92:/home/thinkmap/
scp -r .kube 172.16.1.93:/home/thinkmap/
scp -r .kube 172.16.1.94:/home/thinkmap/
scp -r .kube 172.16.1.95:/home/thinkmap/
### 安装 kubectl
通过kubectl 测试连接集群,查看所有节点状态
```
kubectl get nodes
```
### 检查集群
- Pods的STATUS是Completed为run-one Jobs,这些pods READY应该为0/1。
```
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-tnsn4 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-tw2ht 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-v874b 1/1 Running 0 30s
kube-system canal-jp4hz 3/3 Running 0 30s
kube-system canal-z2hg8 3/3 Running 0 30s
kube-system canal-z6kpw 3/3 Running 0 30s
kube-system kube-dns-7588d5b5f5-sf4vh 3/3 Running 0 30s
kube-system kube-dns-autoscaler-5db9bbb766-jz2k6 1/1 Running 0 30s
kube-system metrics-server-97bc649d5-4rl2q 1/1 Running 0 30s
kube-system rke-ingress-controller-deploy-job-bhzgm 0/1 Completed 0 30s
kube-system rke-kubedns-addon-deploy-job-gl7t4 0/1 Completed 0 30s
kube-system rke-metrics-addon-deploy-job-7ljkc 0/1 Completed 0 30s
kube-system rke-network-plugin-deploy-job-6pbgj 0/1 Completed 0 30s
```
## Helm 安装rancher dashboard
### 创建Helm 的 RBAC
```
kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
```
### 安装Helm
- 二进制安装
wget https://get.helm.sh/helm-v2.15.1-linux-amd64.tar.gz
```
tar -xvf helm-v2.15.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
#添加镜像源
helm init
or
helm init --client-only
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
查看当前的仓库地址
helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
rancher-stable https://releases.rancher.com/server-charts/stable
修改为阿里云仓库地址
helm repo remove stable
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
```
### Rancher中安装Tiller
```
#当前默认使用v2.12.3版本的
helm init --service-account tiller --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
```
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
### 升级Tiller(可选)
```
export TILLER_TAG=
kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=gcr.io/kubernetes-helm/tiller:$TILLER_TAG
```
kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=gcr.io/kubernetes-helm/tiller:v2.15.1
### 安装证书管理器
```
helm install stable/cert-manager --name cert-manager --namespace kube-system
```
Error: validation failed: unable to recognize "": no matches for kind "Deployment" in version "apps/v1beta1"
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.1--service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: apps/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -
### 选择SSL配置方式并安装Rancher server
```
helm install rancher-stable/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=rke.thinkmap.ai
```
安装证书管理器
1、只有Rancher自动生成的证书和LetsEncrypt颁发的证书才需要cert-manager。如果是你自己的证书,可使用ingress.tls.source=secret参数指定证书,并跳过此步骤。
helm install stable/cert-manager \
--name cert-manager \
--namespace kube-system
Rancher自动生成证书
默认情况下,Rancher会自动生成CA根证书并使用cert-manager颁发证书以访问Rancher server界面。
唯一的要求是将hostname配置为访问Rancher的域名地址,使用这种SSL证书配置方式需提前安装证书管理器。
helm install rancher-stable/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=rke.thinkmap.ai
### 本机配置host
修改本地访问机器Host加入
172.16.1.90 rke.thinkmap.ai
https://rook.io/docs/rook/v1.1/flexvolume.html
https://blog.csdn.net/hxpjava1/article/details/80175238
配置负载均衡器
在完成了集群部署后,可以通过 API server 访问 k8s。由于环境中启动了多个 kube-apiserver 实例以实现高可用,需要为这些实例架设一个负载均衡器。
这里在172.16.1.90上部署了一台 nginx 实现了负载均衡的功能,nginx.conf 的具体配置如下。
docker run -p 6443:80 --name nginx --restart=always -v /home/nginx/html:/usr/share/nginx/html -v /home/nginx/logs:/var/log/nginx -d nginx:stable
[root@rke nginx]# cat nginx.conf
user nginx nginx;
worker_processes auto;
#worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 10240;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_iso8601] "$request_id" "$request" '
'$status $body_bytes_sent $bytes_sent $request_length $request_time "$http_referer" '
'"$gzip_ratio" ' '"$upstream_addr - $upstream_status $upstream_response_time" '
'"$http_user_agent" "$http_x_forwarded_for" ';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
server_tokens off;
#gzip on;
#gzip_min_length 1k;
#gzip_buffers 4 16k;
#gzip_http_version 1.0;
#gzip_comp_level 6;
#gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
#gzip_vary on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
client_max_body_size 100m;
client_body_buffer_size 128k;
client_header_buffer_size 4k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /etc/nginx/proxy_temp 1 2;
#include /etc/nginx/conf.d/*.conf;
}
stream {
upstream apiserver {
server 172.16.1.91:6443 weight=5 max_fails=3 fail_timeout=60s;
server 172.16.1.92:6443 weight=5 max_fails=3 fail_timeout=60s;
server 172.16.1.93:6443 weight=5 max_fails=3 fail_timeout=60s;
}
server {
listen 80;
proxy_connect_timeout 1s;
proxy_timeout 10s;
proxy_pass apiserver;
}
}
docker cp nginx.conf nginx:/etc/nginx/
Images
Kubernetes Dashboard
kubernetesui/dashboard:v2.0.0-beta4
Metrics Scraper
kubernetesui/metrics-scraper:v1.0.1
Installation
Before installing the new beta, remove the previous version by deleting its namespace:
kubectl delete ns kubernetes-dashboard
Then deploy new beta:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml