RKE方式部署Kubernetes集群

####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 < /etc/yum.repos.d/kubernetes.repo
[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 :443 max_fails=3 fail_timeout=5s;
        server :443 max_fails=3 fail_timeout=5s;
        server :443 max_fails=3 fail_timeout=5s;
    }
    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

你可能感兴趣的:(k8s,DevOps)