Erlo

附018.K3S-ETCD高可用部署

时间:2020-05-14 10:00   阅读:32次   来源:博客园
页面报错
点赞
原文:https://www.cnblogs.com/itzgr/p/12886477.html

一 K3S概述

1.1 K3S介绍

K3S是一个轻量级Kubernetes发行版。易于安装,内存消耗低,所有二进制文件不到40mb。

  • 适用于:
  • 边缘计算-Edge
  • 物联网-IoT
  • CI
  • ARM

1.2 K3S特点

k3s是完全兼容的Kubernetes发行版,有以下更改:

  • 移除过时的功能、Alpha功能、非默认功能,这些功能在大多数Kubernetes集群中已不可用。
  • 删除内置插件(比如云供应商插件和存储插件),可用外部插件程序替换。
  • 添加SQLite3作为默认的数据存储。etcd3仍然可用,但并非默认项。
  • 包含在一个简单的启动程序当中,可以处理复杂的TLS和其他选项。
  • 几乎没有操作系统依赖性(仅需要健全的内核和cgroup挂载)。k3s软件包所需的依赖:

    • containerd
    • Flannel
    • CoreDNS
    • CNI
    • 主机系统服务 (iptables, socat, etc)

1.3 K3S架构

server节点被定义为运行k3s server命令的主机(裸机或虚拟机)。worker节点被定义为运行k3s agent命令的主机。

常见的K3S高可用架构如下:

  • 两个或更多server节点;
  • 一个外部数据存储。

clipboard

1.4 worker节点注册

worker节点通过k3s agent启动时发起的Websocket连接进行注册。

worker节点将使用节点集群密钥以及存储在/etc/rancher/node/password的节点随机密码向server注册。server将在单个节点的/var/lib/rancher/k3s/server/cred/node-passwd路径存储密码,后续任何操作都必须使用相同的密码。如果删除了worker节点目录/etc/rancher/node,则应该为该worker节点重新创建密码文件,或者从服务器中删除该节点。

通过使用该--with-node-id标志启动K3s server或agent,可以将唯一的节点ID添加到hostname。

二 K3S部署规划

2.1 节点需求

所有节点不能具有相同的主机名。

如果节点具有相同的主机名,需要在运行K3S前修改主机名。或者通过--node-name或$K3S_NODE_NAME变量传递唯一的主机名称。

无负载最小配置:RAM: 512 MB,CPU: 1C。

k3s server需要6443端口可被节点访问,这些节点需要能够通过UDP 8472端口来相互访问组建Flannel VXLAN网络。

如果不使用Flannel VXLAN并提供自己的自定义CNI,则k3s不需要放行UDP 8472端口。k3s使用反向隧道,以便worker建立与server的出站连接,并且所有kubelet流量都通过该隧道通信。

如果要使用metrics server,则需要在每个节点上放行10250端口。

2.2 节点规划

高可用架构一:etcd与Master节点组件混布在一起。

clipboard


节点主机名

IP

类型

运行服务

master01

172.24.12.11

k3s master节点

containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、flannel

master02

172.24.12.12

k3s master节点

containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、flannel

master03

172.24.12.13

k3s master节点

containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、flannel

worker01

172.24.12.21

k3s worker节点

containerd、kubelet、proxy、flannel

worker02

172.24.12.22

k3s worker节点

containerd、kubelet、proxy、flannel

worker03

172.24.12.23

k3s worker节点

containerd、kubelet、proxy、flannel

三 K3S部署准备

3.1 变量参数准备

[root@master01 ~]# vi environment.sh

  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: environment.sh
  4 # Author: xhy
  5 # Create Date: 2020-05-13 12:21
  6 # Modify Author: xhy
  7 # Modify Date: 2020-05-13 12:21
  8 # Version: 
  9 #***************************************************************#
 10 
 11 # 集群 MASTER 机器 IP 数组
 12 export MASTER_IPS=(172.24.12.11 172.24.12.12 172.24.12.13)
 13 
 14 # 集群 MASTER IP 对应的主机名数组
 15 export MASTER_NAMES=(master01 master02 master03)
 16 
 17 # 集群 NODE 机器 IP 数组
 18 export NODE_IPS=(172.24.12.21 172.24.12.22 172.24.12.23)
 19 
 20 # 集群 NODE IP 对应的主机名数组
 21 export NODE_NAMES=(worker01 worker02 worker03)
 22 
 23 # 集群所有机器 IP 数组
 24 export ALL_IPS=(172.24.12.11 172.24.12.12 172.24.12.13 172.24.12.21 172.24.12.22 172.24.12.23)
 25 
 26 # 集群所有IP 对应的主机名数组
 27 export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
 28 
 29 # etcd 集群服务地址列表
 30 export ETCD_ENDPOINTS="https://172.24.12.11:2379,https://172.24.12.12:2379,https://172.24.12.13:2379"
 31 
 32 # etcd 集群间通信的 IP 和端口
 33 export ETCD_NODES="master01=https://172.24.12.11:2380,master02=https://172.24.12.12:2380,master03=https://172.24.12.13:2380"
 34 
 35 # 节点间互联网络接口名称
 36 export IFACE="eth0"
 37 
 38 # etcd 数据目录
 39 export ETCD_DATA_DIR="/data/k3s/etcd/data"
 40 
 41 # etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
 42 export ETCD_WAL_DIR="/data/k3s/etcd/wal"

3.2 相关优化

[root@master01 ~]# vi k3sinit.sh

  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: k3sinit.sh
  4 # Author: xhy
  5 # Create Date: 2020-05-13 18:56
  6 # Modify Author: xhy
  7 # Modify Date: 2020-05-13 18:56
  8 # Version: 
  9 #***************************************************************#
 10 # Initialize the machine. This needs to be executed on every machine.
 11 
 12 # Disable the SELinux.
 13 sed -i 's/^SELINUX=.#fzs#SELINUX=disabled/' /etc/selinux/config
 14 
 15 # Turn off and disable the firewalld.
 16 systemctl stop firewalld
 17 systemctl disable firewalld
 18 
 19 # Modify related kernel parameters & Disable the swap.
 20 cat > /etc/sysctl.d/k3s.conf << EOF
 21 net.ipv4.ip_forward = 1
 22 net.bridge.bridge-nf-call-ip6tables = 1
 23 net.bridge.bridge-nf-call-iptables = 1
 24 net.ipv4.tcp_tw_recycle = 0
 25 vm.swappiness = 0
 26 vm.overcommit_memory = 1
 27 vm.panic_on_oom = 0
 28 net.ipv6.conf.all.disable_ipv6 = 1
 29 EOF
 30 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
 31 swapoff -a
 32 sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
 33 modprobe br_netfilter
 34 
 35 # Add ipvs modules
 36 cat > /etc/sysconfig/modules/ipvs.modules <<EOF
 37 #!/bin/bash
 38 modprobe -- ip_vs
 39 modprobe -- ip_vs_rr
 40 modprobe -- ip_vs_wrr
 41 modprobe -- ip_vs_sh
 42 modprobe -- nf_conntrack_ipv4
 43 EOF
 44 chmod 755 /etc/sysconfig/modules/ipvs.modules
 45 bash /etc/sysconfig/modules/ipvs.modules
 46 
 47 # Install rpm
 48 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget

3.3 配置免秘钥

  1 [root@master01 ~]# cat > etc/hosts << EOF
  2 172.24.12.11 master01
  3 172.24.12.12 master02
  4 172.24.12.13 master03
  5 172.24.12.21 worker01
  6 172.24.12.22 worker02
  7 172.24.12.23 worker03
  8 EOF

为了更方便远程分发文件和执行命令,本实验配置master节点到其它节点的 ssh 信任关系。

  1 [root@master01 ~]# source /root/environment.sh
  2 [root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  3 do
  4 echo ">>> ${all_ip}"
  5 ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_ip}
  6 scp /etc/hosts root@${all_ip}:/etc/hosts
  7 scp environment.sh root@${all_ip}:/root/
  8 scp k3sinit.sh root@${all_ip}:/root/
  9 ssh root@${all_ip} "chmod +x /root/environment.sh"
 10 ssh root@${all_ip} "chmod +x /root/k3sinit.sh"
 11 ssh root@${all_ip} "bash /root/k3sinit.sh &"
 12 done

提示:此操作仅需要在master01节点操作。

四 自定义证书

4.1 安装cfssl

  1 [root@master01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl		#下载cfssl软件
  2 [root@master01 ~]# chmod u+x /usr/local/bin/cfssl
  3 [root@master01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson	#下载json模板
  4 [root@master01 ~]# chmod u+x /usr/local/bin/cfssljson
  5 [root@master01 ~]# curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
  6 [root@master01 ~]# chmod u+x /usr/local/bin/cfssl-certinfo
  7 [root@master01 ~]# mkdir /opt/k3s/work
  8 [root@master01 ~]# cd /opt/k3s/work
  9 [root@master01 cert]# cfssl print-defaults config > config.json
 10 [root@master01 cert]# cfssl print-defaults csr > csr.json	#创建模版配置json文件

4.2 创建根证书

  1 [root@master01 ~]# cd /opt/k3s/work
  2 [root@master01 work]# cp config.json ca-config.json		#复制一份作为CA的配置文件
  3 [root@master01 work]# cat > ca-config.json <<EOF
  4 {
  5     "signing": {
  6         "default": {
  7             "expiry": "168h"
  8         },
  9         "profiles": {
 10             "kubernetes": {
 11                 "expiry": "87600h",
 12                 "usages": [
 13                     "signing",
 14                     "key encipherment",
 15                     "server auth",
 16                     "client auth"
 17                 ]
 18             }
 19         }
 20     }
 21 }
 22 EOF

字段解释:

config.json:可以定义多个profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个profile;

  1 [root@master01 work]# cp csr.json ca-csr.json	#复制一份作为CA的证书签名请求文件
  2 [root@master01 work]# cat > ca-csr.json <<EOF
  3 {
  4     "CN": "kubernetes",
  5     "key": {
  6         "algo": "rsa",
  7         "size": 2048
  8     },
  9     "names": [
 10         {
 11             "C": "CN",
&
            
        

相关推荐

提交留言

评论留言

还没有评论留言,赶紧来抢楼吧~~

吐槽小黑屋()

* 这里是“吐槽小黑屋”,所有人可看,只保留当天信息。

  • Erlo吐槽

    Erlo.vip2020-06-07 09:47:23Hello、欢迎使用吐槽小黑屋,这就是个吐槽的地方。
  • 返回顶部