华为UOS欧拉版 K3S+Rancher 安装完全版

文章目录

【2025-01-16已更新】

K3S on UOS(华为欧拉) 安装过程

本文仅适合基于欧拉系统的UOS

核心思想说明:

对于一个小型环境,因为k3s的server节点高可用,最少只需要2个节点(使用外部数据库)

对于中型环境,那么可以考虑更多的server节点,以及其他数据库方案(比如etcd、三节点galary mysql),方案上选择较多。


开始安装过程

以下工作以3台节点:172.16.149.122(k3s01),172.16.149.123(k3s02),172.16.149.124(k3s03),VIP172.16.149.139为例

1. 准备工作

1.1. 修改网卡名称为eth0

默认安装好的网卡名比较奇怪: 以ens160为例,重命名为eth0

cp /etc/sysconfig/network-scripts/ifcfg-ens160 mv /etc/sysconfig/network-scripts/ifcfg-ens160.bak
mv /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-eth0

查看ifconfig,记录ens160的MAC地址

修改eth0配置

nano /etc/sysconfig/network-scripts/ifcfg-eth0

NAME=eth0  #name修改为eth0
DEVICE=eth0  #name修改为eth0
HWADDR=xx:xx:xx:xx:xx #刚才查到的ens160的MAC地址

禁用该可预测命名规则。编辑/etc/default/grub并加入“net.ifnames=0 biosdevname=0 ”到GRUBCMDLINELINUX变量

nano /etc/default/grub
#找到GRUB_CMDLINE_LINUX,在quiet后面加上 net.ifnames=0 biosdevname=0

重新生成GRUB配置并更新内核参数

grub2-mkconfig -o /boot/grub2/grub.cfg

重启

reboot

1.2. 切换yum源

首先设置欧拉的yum源头。由于欧拉是基于Centos的,因此可以直接使用Centos的yum源。
华为官网 上可以查看到处理方式如下:

CentOS-AltArch的镜像地址为:https://repo.huaweicloud.com/centos-altarch/

  1. 备份配置文件:

cp -a /etc/yum.repos.d/uosEuler_aarch64.repo /etc/yum.repos.d/uosEuler_aarch64.repo.bak
rm -f /etc/yum.repos.d/uosEuler_aarch64.repo

  1. 下载新的CentOS-Base.repo文件到/etc/yum.repos.d/目录下(因gpgkey无法动态适配,已将gpgcheck设置为0,关闭校验,如需打开请设置为1,并修改gpgkey地址),执行如下命令:

wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-AltArch-7.repo

  1. 执行yum clean all清除原有yum缓存。
  2. 执行yum makecache(刷新缓存)或者yum repolist all(查看所有配置可以使用的文件,会自动刷新缓存)。

如果要切换其他源,比如清华的,那么先到 这个地址 去查看可用的源,然后

将上面的CentOS-Base.repo备份
修改CentOS-Base.repo中的内容
将查到的源替换掉baseurl=xxxxx中对应的部分
执行yum clean all
执行yum makecache

  1. 加入openEuler源(这一步对安装docker非常重要)

我们参考了华为欧拉操作系统openEuler安装docker最新版 和他里面引用的OpenEuler配置DNF软件源 才最终装好19.03的docker。
其中要说一下,DNF的操作其实也就是yum的操作,所以,在看参考第二篇的时候,重点是知道了可以配置openEuler源,并且还知道了华为的openEuler镜像站。然后根据实际的操作系统情况cat /etc/os-release,最终找到https://mirrors.huaweicloud.com/openeuler/openEuler-20.09 这个地址是可用的

wget -O /etc/yum.repos.d/openEulerOS.repo https://repo.huaweicloud.com/repository/conf/openeuler_aarch64.repo
将下载后文件里面的baseurl地址换成https://mirrors.huaweicloud.com/openeuler/openEuler-20.09
yum clean all
yum makecache

1.3. 关闭防火墙以及selinux

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
重启

1.4. 修改主机名,并修改hosts

hostnamectl set-hostname k3s01(节点2为k3s02)
echo -e “172.16.149.122\tk3s01” | tee -a /etc/hosts
echo -e “172.16.149.123\tks302” | tee -a /etc/hosts
echo -e “172.16.149.124\tks303” | tee -a /etc/hosts

1.5. 在UOS(基于华为欧拉)上安装docker
  1. 安装container-selinux

yum install -y container-selinux

  1. 安装docker

yum install -y yum-utils
yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#下载之后,修改docker的源
nano /etc/yum.repo.d/docker-ce.repo
#将baseurl修改为可访问的源(主要是欧拉改了$AACH,获取不到)
baseurl=https://download.docker.com/linux/centos/7/aarch64/stable/ (或者选一个国内的源更好)

yum -y install docker-ce
systemctl start docker

1.5.1. 修改Docker loglimit。非常重要!

因为docker中的程序syslog,默认会使用emptyDir主机存储,
也就是会在/var/lib/kubernetes/中的产生很多ephemeral-storage内容。
如果不设置,后续会遇到

The node was low on resource: ephemeral-storage. Container xxxx which exceeds its request of xxx

这种问题。

解决办法可以参考这里

vi /etc/docker/daemon.json
设置以下内容,用于限制log的ephemeral-storage大小:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
1.5.2. 修改Docker limit。非常重要!

如果后续要在该集群上安装mongodb,那么必须设置docker limit参数。
如果不设置,mongodb将因为ulimit的问题,导致不断重启
在日志中一般会发现:

Failed to mlock: Cannot allocate locked memory…

配置方法(参考这里):

  1. 执行 systemctl status docker ; systemctl status containerd(arm版本的老docker可能会使用containerd底层)。找到他们的配置文件地址
    假如上述服务的配置地址分别是:/usr/lib/systemd/system/docker.service,/usr/lib/systemd/system/containerd.service
  2. 添加LimitMEMLOCK=infinity

    find / -iname “docker.service” 找到docker服务

    vi ${目录}/docker.service

    如果有contaninerd find / -iname “containerd.service”

    vi ${目录}/containerd.service

    在[Service]一节增加LimitMEMLOCK=infinity
1.5.3. 强制使用overlay2存储引擎

vi /etc/docker/daemon.json
设置以下内容,

{
    "storage-driver": "overlay2",
    "storage-opts": [
        "overlay2.override_kernel_check=true"
    ]
}
1.5.4. 修改docker数据目录(可选)

某些机器,由于/var/lib/docker/目录空间不大,可以考虑迁移该目录到其他地方
比如迁移到 /home下

systemctl stop docker
mkdir -p /home/docker
rsync -avz /var/lib/docker /home/docker (需要安装rsync)
vi /etc/systemd/system/docker.service.d/devicemapper.conf

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd  --graph=/home/docker

将上述内容写入

:wq!

1.5.5. 修改启动参数,更改iptables规则(可选)

这里 可以看到,有时候存在一种情况

“查阅了不少资料才看到docker 1.13 版本对iptables的规则进行了改动,默认FORWARD 链的规则为DROP ,带来的问题主要一旦DROP后,不同主机间就不能正常通信了(kubernetes的网络使用flannel的情况)”

因此,这里先让docker启动的时候搞一搞事情

find / -iname “docker.service”

vi ${目录}/docker.service

在[Service]一节追加

[Service]
............
ExecStartPost=iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
1.5.6. 重启docker

systemctl stop docker

systemctl daemon-reload

如果有containerd,systemctl stop containerd

systemctl daemon-reload

如果有containerd,systemctl start containerd

systemctl start docker

1.6. 节点优化(可选)

  1. 节点内核调优
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

# 参考 https://github.com/prometheus/node_exporter#disabled-by-default
kernel.perf_event_paranoid=-1

#sysctls for k8s node config
net.ipv4.tcp_slow_start_after_idle=0
net.core.rmem_max=16777216
fs.inotify.max_user_watches=524288
kernel.softlockup_all_cpu_backtrace=1

kernel.softlockup_panic=0

kernel.watchdog_thresh=30
fs.file-max=2097152
fs.inotify.max_user_instances=8192
fs.inotify.max_queued_events=16384
vm.max_map_count=262144
fs.may_detach_mounts=1
net.core.netdev_max_backlog=16384
net.ipv4.tcp_wmem=4096 12582912 16777216
net.core.wmem_max=16777216
net.core.somaxconn=32768
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=8096
net.ipv4.tcp_rmem=4096 12582912 16777216

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1

kernel.yama.ptrace_scope=0
vm.swappiness=0

# 可以控制core文件的文件名中是否添加pid作为扩展。
kernel.core_uses_pid=1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0

# Promote secondary addresses when the primary address is removed
net.ipv4.conf.default.promote_secondaries=1
net.ipv4.conf.all.promote_secondaries=1

# Enable hard and soft link protection
fs.protected_hardlinks=1
fs.protected_symlinks=1

# 源路由验证
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_synack_retries=2
kernel.sysrq=1



" >> /etc/sysctl.conf

  1. nofile
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65536
EOF
  1. 关闭网卡offload(
    谨慎操作

如果出现【主机上】nodeport访问慢的问题,尝试执行以下内容

特别注意:

1)eth0代表主机网卡,应该按照实际情况修改

2)只有在默认使用flannel网络的情况下执行

ethtool -K eth0 rx off tx off sg off tso off    
ethtool -K flannel.1 rx off tx off sg off tso off 

1.7 设置系统时间和时区(多节点)

使用Xshell工具(或其他工具),在每个节点上同时执行

  1. 查看当前系统的时区
timedatectl list-timezones 
  1. 选择一个合适的时区来进行设置。一般我们选择Asia/Shanghai
timedatectl set-timezone "Asia/Shanghai"
  1. 设置系统时间

由于我们的安装环境一般都没有时钟同步服务器,因此手动设置时间

timedatectl set-time "具体的时间。格式为 2022-03-14 12:23:01"
特别说明,如果是正式项目实施,理论上在实施的时候就要求配置NTP服务

1.8. 为Redis提供优化(可选)

redis运行中,可能会提示:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. 
This will create latency and memory usage issues with Redis. 
To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, 
and add it to your /etc/rc.local in order to retain the setting after a reboot. 
Redis must be restarted after THP is disabled. 

所以可以在节点安装k3s之前执行如下:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local

2. 安装etcd

etcd必须3节点起

由于在UOS(欧拉版)上面,直接yum 安装etcd,会报openssl版本相关的错误,因此选择通过docker来安装etcd.

  1. 预备etcd数据目录

mkdir -p /sobey/dbu/etcd/data

  1. 拉取etcd github

docker pull quay.io/coreos/etcd:v3.3.11-arm64 #这里用的3.3.11,不是一定的

  1. run

在每个节点上执行run脚本。注意,里面的
a)< e t c d 1 > ——每个 e t c d 节点的名称,比如 e t c d 1 、 e t c d 2...... b ) < etcd1> ——每个etcd节点的名称,比如etcd1、etcd2...... b)< etcd1>——每个etcd节点的名称,比如etcd1etcd2......b<this_host> ——当前节点的IP
c)<$cluster_info> ——集群信息,比如:etcd1=http://172.16.149.125:2380,etcd2=http://172.16.149.126:2380,etcd3=http://172.16.149.127:2380

docker run -itd -e ETCD_UNSUPPORTED_ARCH=arm64 -p 2379:2379 -p 2380:2380 -v /sobey/dbu/etcd/data:/var/lib/etcd --name etcd quay.io/coreos/etcd:v3.3.11-arm64 /usr/local/bin/etcd --data-dir=/var/lib/etcd --name <KaTeX parse error: Undefined control sequence: \< at position 46: …er-urls http://\̲<̲this_host>:2380 --listen-peer-urls http://0.0.0.0:2380 --advertise-client-urls http://<KaTeX parse error: Undefined control sequence: \< at position 78: …itial-cluster "\̲<̲cluster_info>" --initial-cluster-state new --initial-cluster-token sobey-arm-etcd-cluster

  1. 检查

docker exec -ti etcd etcdctl member list
#应该有类似输出
3f0c84fe44e57f94: name=etcd3 peerURLs=http://172.16.149.127:2380 clientURLs=http://172.16.149.127:2379 isLeader=false
5cd7e7666d25d834: name=etcd2 peerURLs=http://172.16.149.126:2380 clientURLs=http://172.16.149.126:2379 isLeader=false
b33d3325cadf5ff2: name=etcd1 peerURLs=http://172.16.149.125:2380 clientURLs=http://172.16.149.125:2379 isLeader=true

docker exec -ti etcd etcdctl cluster-health
#应该有类似输出
member 3f0c84fe44e57f94 is healthy: got healthy result from http://172.16.149.127:2379
member 5cd7e7666d25d834 is healthy: got healthy result from http://172.16.149.126:2379
member b33d3325cadf5ff2 is healthy: got healthy result from http://172.16.149.125:2379
cluster is healthy

3. 高可用网络配置

在官方文档上,希望通过一个负载均衡+一个DNS来解决高可用及负载均衡。
负载均衡的目标是接管多个rancher主节点上Traefik Ingress提供的80和443
DNS是解决集群中多个主节点上的负载均衡提供统一入口

因为我们是多机主节点部署方案,并且希望集中式部署所有组件,因此,我们有如下选择:

  1. [DNS]<---->[负载均衡1|80 443,负载均衡2|80 443]<–>[节点1|80 443,节点N|80 443]
  2. [DNS]<---->[(负载均衡1|8880 8443,节点1|80 443),(负载均衡2|8880 443,节点N|80 443)]
  3. [DNS]<---->[节点1|80 443,节点N|80 443]

在一个小型化的集群环境中,选择方案3,并且DNS用keepalived主备安装提供VIP来支持。这样其实就只是让多主节点成为一个多机热备的环境,不必提供负载均衡,目的就是让rancher的server节点高可用而已,而不让rancher server节点负载均衡。如果要负载均衡,采用nginx方案

如果是个中型环境,可以考虑在集群外部nginx做L4负载均衡接管mysql(或etcd)、80、443,同时选择方案1或2。

3.1. 安装nginx(可选)

安装nginx应该是在server节点上服务化安装,但是:由于nginx的 Linux packages,对于arm的支持,都是较高的系统版本,比如centos8、debian10+。不过其docker版本倒是可以很好的无感安装,所以通过docker host网络方式安装nginx

因为rancher需要L4代理,因此nginx的版本要高于1.9才行。https://docs.rancher.cn/docs/rancher2/installation_new/options/nginx/_index/。 这里有个非常重要的提示:官方安装目标是nginx接管rancher的Traefix提供的80和443,那么就建议nginx单独找机器安装,否则端口冲突。而我们希望集中安装在节点上,那么就要注意,nginx的80转发和443转发,需要修改为8880(或其他)->80,8443(或其他)->443

直接参考hub https://hub.docker.com/_/nginx

docker pull nginx

启动的时候,把配置文件目录给映射到主机上便于后续修改,同时映射一个用于存放日志的地方。然后,在主机上设置一个K3S官方提供的配置文件

  1. mkdir -p /sobey/dbu/nginx/conf.d
  2. mkdir -p /sobey/dbu/nginx/logs
  3. vi /sobey/dbu/nginx/sobey.conf 将内容设置为下面这段配置,注意IP_NODE_1,2…x要修改为正确的server节点IP
user  nginx;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

worker_processes 4;
worker_rlimit_nofile 40000;

events {
    worker_connections 8192;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sb熙哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值