附018.K3S-ETCD高可用部署

本文内容纲要:

- 一 K3S概述

- 1.1 K3S介绍

- 1.2 K3S特点

- 1.3 K3S架构

- 1.4 worker节点注册

- 二 K3S部署规划

- 2.1 节点需求

- 2.2 节点规划

- 三 K3S部署准备

- 3.1 变量参数准备

- 3.2 相关优化

- 3.3 配置免秘钥

- 四 自定义证书

- 4.1 安装cfssl

- 4.2 创建根证书

- 4.3 分发根证书

- 五 安装ETCD

- 5.1 安装ETCD

- 5.2 分发ETCD

- 5.3 创建etcd证书和密钥

- 5.4 分发证书和私钥

- 5.5 创建etcd的systemd

- 5.5 修改etcd systemd相应地址

- 5.6 分发etcd systemd

- 5.7 启动ETCD

- 5.8 检查ETCD启动

- 5.9 验证服务状态

- 5.10 查看ETCD当前leader

- 六 安装K3S server

- 6.1 脚本安装

- 6.2 确认验证

- 七 高可用优化

- 7.1 Keepalived安装

- 7.2 创建配置文件

- 7.3 启动Keepalived

- 7.4 确认验证

- 7.5 启用高可用

- 八 worker节点加入

- 8.1 worker节点加入集群

- 8.2 其他命令参数

- 九 部署Longhorn

- 9.1 Longhorn概述

- 9.2 Longhorn部署

- 9.3 动态sc创建

- 9.4 测试PV及PVC

一 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=.*/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;

  • signing: 表示该证书可用于签名其它证书;生成的ca.pem 证书中CA=TRUE;

  • server auth: 表示client 可以用该CA 对server 提供的证书进行校验;

  • client auth: 表示server 可以用该CA 对client 提供的证书进行验证。

    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",

    12 "ST": "Shanghai",

    13 "L": "Shanghai",

    14 "O": "k3s",

    15 "OU": "System"

    16 }

    17 ]

    18 }

    19 EOF

字段解释:

  • CN: Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法;
  • C:country;
  • ST:state;
  • L:city;
  • O: Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组(Group);
  • OU:organization unit。

[root@master01 work]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca #生成CA密钥(ca-key.pem)和证书(ca.pem)

提示:生成证书后,Kubernetes集群需要双向TLS认证,则可将ca-key.pem和ca.pem拷贝到所有要部署的机器的/etc/kubernetes/ssl目录下。

更多TLS证书创建方式参考《附008.Kubernetes TLS证书介绍及创建》。

4.3 分发根证书

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for all_ip in ${ALL_IPS[@]}

4 do

5 echo ">>> ${all_ip}"

6 ssh root@${all_ip} "mkdir -p /etc/kubernetes/cert"

7 scp ca*.pem ca-config.json root@${all_ip}:/etc/kubernetes/cert

8 done

五 安装ETCD

5.1 安装ETCD

1 [root@master01 ~]# wget https://github.com/coreos/etcd/releases/download/v3.4.7/etcd-v3.4.7-linux-amd64.tar.gz

2 [root@master01 ~]# tar -xvf etcd-v3.4.7-linux-amd64.tar.gz

5.2 分发ETCD

1 [root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

2 do

3 echo ">>> ${master_ip}"

4 scp etcd-v3.4.7-linux-amd64/etcd* root@${master_ip}:/usr/local/bin

5 ssh root@${master_ip} "chmod +x /usr/local/bin/*"

6 ssh root@${master_ip} "mkdir -p /data/k3s/etcd/data"

7 ssh root@${master_ip} "mkdir -p /data/k3s/etcd/wal"

8 done

5.3 创建etcd证书和密钥

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 cert]# cat > etcd-csr.json <<EOF

3 {

4 "CN": "etcd",

5 "hosts": [

6 "127.0.0.1",

7 "localhost",

8 "172.24.12.11",

9 "172.24.12.12",

10 "172.24.12.13"

11 ],

12 "key": {

13 "algo": "rsa",

14 "size": 2048

15 },

16 "names": [

17 {

18 "C": "CN",

19 "ST": "Shanghai",

20 "L": "Shanghai",

21 "O": "k3s",

22 "OU": "System"

23 }

24 ]

25 }

26 EOF

27 #创建etcd的CA证书请求文件

解释:

hosts 字段指定授权使用该证书的 etcd 节点 IP 或域名列表,需要将 etcd 集群的三个节点 IP 都列在其中。

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# cfssl gencert -ca=/opt/k3s/work/ca.pem \

3 -ca-key=/opt/k3s/work/ca-key.pem -config=/opt/k3s/work/ca-config.json \

4 -profile=kubernetes etcd-csr.json | cfssljson -bare etcd #生成CA密钥(ca-key.pem)和证书(ca.pem)

5.4 分发证书和私钥

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 ssh root@${master_ip} "mkdir -p /etc/etcd/cert"

7 scp etcd*.pem root@${master_ip}:/etc/etcd/cert/

8 done

5.5 创建etcd的systemd

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# cat > etcd.service.template <<EOF

4 [Unit]

5 Description=Etcd Server

6 After=network.target

7 After=network-online.target

8 Wants=network-online.target

9 Documentation=https://github.com/coreos

10

11 [Service]

12 Type=notify

13 WorkingDirectory=${ETCD_DATA_DIR}

14 ExecStart=/usr/local/bin/etcd \\

15 --data-dir=${ETCD_DATA_DIR} \\

16 --wal-dir=${ETCD_WAL_DIR} \\

17 --name=##MASTER_NAME## \\

18 --cert-file=/etc/etcd/cert/etcd.pem \\

19 --key-file=/etc/etcd/cert/etcd-key.pem \\

20 --trusted-ca-file=/etc/kubernetes/cert/ca.pem \\

21 --peer-cert-file=/etc/etcd/cert/etcd.pem \\

22 --peer-key-file=/etc/etcd/cert/etcd-key.pem \\

23 --peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \\

24 --peer-client-cert-auth \\

25 --client-cert-auth \\

26 --listen-peer-urls=https://##MASTER_IP##:2380 \\

27 --initial-advertise-peer-urls=https://##MASTER_IP##:2380 \\

28 --listen-client-urls=https://##MASTER_IP##:2379,http://127.0.0.1:2379 \\

29 --advertise-client-urls=https://##MASTER_IP##:2379 \\

30 --initial-cluster-token=etcd-cluster-0 \\

31 --initial-cluster=${ETCD_NODES} \\

32 --initial-cluster-state=new \\

33 --auto-compaction-mode=periodic \\

34 --auto-compaction-retention=1 \\

35 --max-request-bytes=33554432 \\

36 --quota-backend-bytes=6442450944 \\

37 --heartbeat-interval=250 \\

38 --election-timeout=2000

39 Restart=on-failure

40 RestartSec=5

41 LimitNOFILE=65536

42

43 [Install]

44 WantedBy=multi-user.target

45 EOF

解释:

WorkingDirectory、--data-dir:指定工作目录和数据目录为 ${ETCD_DATA_DIR},需在启动服务前创建这个目录;

--wal-dir:指定 wal 目录,为了提高性能,一般使用 SSD 或者和 --data-dir 不同的磁盘;

--name:指定节点名称,当 --initial-cluster-state 值为 new 时,--name 的参数值必须位于 --initial-cluster 列表中;

--cert-file、--key-file:etcd server 与 client 通信时使用的证书和私钥;

--trusted-ca-file:签名 client 证书的 CA 证书,用于验证 client 证书;

--peer-cert-file、--peer-key-file:etcd 与 peer 通信使用的证书和私钥;

--peer-trusted-ca-file:签名 peer 证书的 CA 证书,用于验证 peer 证书。

5.5 修改etcd systemd相应地址

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for (( i=0; i < 3; i++ ))

4 do

5 sed -e "s/##MASTER_NAME##/${MASTER_NAMES[i]}/" -e "s/##MASTER_IP##/${MASTER_IPS[i]}/" etcd.service.template > etcd-${MASTER_IPS[i]}.service

6 done

5.6 分发etcd systemd

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 scp etcd-${master_ip}.service root@${master_ip}:/etc/systemd/system/etcd.service

7 done

5.7 启动ETCD

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 ssh root@${master_ip} "mkdir -p ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}"

7 ssh root@${master_ip} "systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd " &

8 done

5.8 检查ETCD启动

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 ssh root@${master_ip} "systemctl status etcd|grep Active"

7 done

5.9 验证服务状态

1 [root@master01 ~]# cd /opt/k3s/work

2 [root@master01 work]# source /root/environment.sh

3 [root@master01 work]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 ETCDCTL_API=3 /usr/local/bin/etcdctl \

7 --endpoints=https://${master_ip}:2379 \

8 --cacert=/etc/kubernetes/cert/ca.pem \

9 --cert=/etc/etcd/cert/etcd.pem \

10 --key=/etc/etcd/cert/etcd-key.pem endpoint health

11 done

5.10 查看ETCD当前leader

1 [root@master01 ~]# source /root/environment.sh

2 [root@master01 ~]# ETCDCTL_API=3 /usr/local/bin/etcdctl \

3 -w table --cacert=/etc/kubernetes/cert/ca.pem \

4 --cert=/etc/etcd/cert/etcd.pem \

5 --key=/etc/etcd/cert/etcd-key.pem \

6 --endpoints=${ETCD_ENDPOINTS} endpoint status

clipboard

如上所示,当前ETCD集群的leader为172.24.12.12。

六 安装K3S server

6.1 脚本安装

1 [root@master01 ~]# curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \

2 sh -s - server --write-kubeconfig ~/.kube/config \

3 --datastore-endpoint='https://172.24.12.11:2379,master02=https://172.24.12.12:2379,master03=https://172.24.12.13:2379' --datastore-cafile=/etc/kubernetes/cert/ca.pem \

4 --datastore-certfile=/etc/etcd/cert/etcd.pem \

5 --datastore-keyfile=/etc/etcd/cert/etcd-key.pem \

6 --token=x120952576 \

7 --tls-san=172.24.12.254

8 [root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

提示:如上需要在所有master节点执行,/var/lib/rancher/k3s/server/manifests/为k3s中的静态pud路径。

--write-kubeconfig ~/.kube/config效果为将配置文件写到k8s默认会用的位置,而不是k3s默认的位置/etc/rancher/k3s/k3s.yaml。后者会导致istio、helm需要额外设置或无法运行。

释义:脚本安装可配置参数:

  • INSTALL_K3S_MIRROR:中国区用户设置INSTALL_K3S_MIRROR=cn可加速K3S二进制文件下载,也可以直接手动下载二进制文件。
  • INSTALL_K3S_SKIP_DOWNLOAD:如果设置为true,则不会下载K3s hash文件或K3S二进制文件。
  • INSTALL_K3S_SYMLINK:如果设置为skip将不会创建软链接,force将强制覆盖,如果path中不存在命令,则默认值为符号链接。
  • INSTALL_K3S_SKIP_START:如果设置为true,将不会自动启动K3s服务。
  • INSTALL_K3S_VERSION:可从github下载的K3s版本。如果未指定,将尝试下载latest版本。
  • INSTALL_K3S_BIN_DIR:将K3S的二进制文件,软链接和卸载脚本安装到的目录,/usr/local/bin用作默认目录。
  • INSTALL_K3S_BIN_DIR_READ_ONLY:如果设置为true,则不会写入文件到INSTALL_K3S_BIN_DIR,如果需要强制写入则设置INSTALL_K3S_SKIP_DOWNLOAD=true。
  • INSTALL_K3S_SYSTEMD_DIR:将systemd服务和环境变量文件安装到的目录,/etc/systemd/system用作默认目录。
  • INSTALL_K3S_EXEC:当未指定INSTALL_K3S_EXEC变量,或设置了K3S_URL变量,或在INSTALL_K3S_EXEC变量中没有添加server执行命令,那么k3s默认将以agent角色运行。反之,会默认以server角色运行。最终,systemd命令会被解析为EXEC命令和脚本参数的组合($@)。
  • INSTALL_K3S_NAME:如果未指定,将默认使用K3s exec命令创建的systemd服务的名称。如果指定,名称将以k3s-为前缀。
  • INSTALL_K3S_TYPE:要创建的systemd服务类型,如果未指定,将默认使用K3s exec命令。

提示:默认K3S将以flannel作为CNI运行,并使用VXLAN作为默认后端。本实验采用外部etcd数据库作为存储,更多数据存储类型可参考:https://docs.rancher.cn/k3s/installation/datastore.html。

6.2 确认验证

1 [root@master01 ~]# kubectl get nodes

clipboard

1 [root@master01 ~]# kubectl taint node master01 node-role.kubernetes.io/master="":NoSchedule

2 [root@master01 ~]# kubectl taint node master01 node-role.kubernetes.io/master="":NoSchedule

3 [root@master01 ~]# kubectl taint node master01 node-role.kubernetes.io/master="":NoSchedule

七 高可用优化

7.1 Keepalived安装

1 [root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

2 do

3 echo ">>> ${master_ip}"

4 ssh root@${master_ip} "yum -y install gcc gcc-c++ make libnl libnl-devel libnfnetlink-devel openssl-devel"

5 ssh root@${master_ip} "wget http://down.linuxsb.com:8888/software/keepalived-2.0.20.tar.gz"

6 ssh root@${master_ip} "tar -zxvf keepalived-2.0.20.tar.gz"

7 ssh root@${master_ip} "cd keepalived-2.0.20/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"

8 ssh root@${master_ip} "systemctl enable keepalived && systemctl start keepalived"

9 done

提示:如上仅需Master01节点操作,从而实现所有节点自动化安装。

7.2 创建配置文件

1 [root@master01 ~]# wget http://down.linuxsb.com:8888/k3s_ha.sh	#下载高可用自动配置脚本

2 [root@master01 ~]# vi k3s_ha.sh #其他部分保持默认

3 # master keepalived virtual ip address

4 export K3SHA_VIP=172.24.12.254

5

6 # master01 ip address

7 export K3SHA_IP1=172.24.12.11

8

9 # master02 ip address

10 export K3SHA_IP2=172.24.12.12

11

12 # master03 ip address

13 export K3SHA_IP3=172.24.12.13

14

15 # master01 hostname

16 export K3SHA_HOST1=master01

17

18 # master02 hostname

19 export K3SHA_HOST2=master02

20

21 # master03 hostname

22 export K3SHA_HOST3=master03

23

24 # master01 network interface name

25 export K3SHA_NETINF1=eth0

26

27 # master02 network interface name

28 export K3SHA_NETINF2=eth0

29

30 # master03 network interface name

31 export K3SHA_NETINF3=eth0

32

33 [root@master01 ~]# bash k3s_ha.sh

解释:如上仅需Master01节点操作。执行脚本后会生产如下配置文件清单:

执行k3s_ha.sh脚本后,会自动生成以下配置文件:

  • keepalived:keepalived配置文件,位于各个master节点的/etc/keepalived目录
  • nginx-lb:nginx-lb负载均衡配置文件,位于各个master节点的/root/nginx-lb目录

7.3 启动Keepalived

1 [root@master01 ~]# cat /etc/keepalived/keepalived.conf

2 [root@master01 ~]# cat /etc/keepalived/check_apiserver.sh 确认Keepalived配置

3 [root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

4 do

5 echo ">>> ${master_ip}"

6 ssh root@${master_ip} "systemctl restart keepalived.service"

7 ssh root@${master_ip} "systemctl status keepalived.service"

8 ssh root@${master_ip} "ping -c1 172.24.12.254"

9 done

提示:如上仅需Master01节点操作,从而实现所有节点自动启动服务。

7.4 确认验证

1 [root@master01 ~]# kubectl -n kube-system get pods | grep -E 'NAME|nginx'

2 NAME READY STATUS RESTARTS AGE

3 nginx-lb-2dk6z 1/1 Running 0 2m56s

4 nginx-lb-68s47 1/1 Running 0 2m56s

5 nginx-lb-nbc9l 1/1 Running 0 2m56s

提示:如上仅需Master01节点操作,从而实现所有节点自动启动服务。

7.5 启用高可用

1 [root@master01 ~]# vi /etc/rancher/k3s/k3s.yaml 

2 ……

3 server: https://172.24.12.254:16443

4 ……

提示:建议所有master节点进行如上修改。

八 worker节点加入

8.1 worker节点加入集群

1 [root@worker01 ~]# curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \

2 sh -s - agent --server https://172.24.12.254:16443 --token x120952576

3 [root@worker01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

提示:所有worker节点如上操作加入集群。

8.2 其他命令参数

1 [root@master01 ~]# k3s server --help		#查看k3s server更多参数

2 [root@worker01 ~]# k3s agent --help #查看k3s agent更多参数

九 部署Longhorn

9.1 Longhorn概述

Longhorn是用于Kubernetes的开源分布式块存储系统。

提示:更多介绍参考:https://github.com/longhorn/longhorn。

9.2 Longhorn部署

1 [root@master01 ~]# yum -y install iscsi-initiator-utils

提示:如上建议所有节点安装。

1 [root@master01 ~]# wget \

2 https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

3 [root@master01 ~]# vi longhorn.yaml

1 #……

2 ---

3 kind: Service

4 apiVersion: v1

5 metadata:

6 labels:

7 app: longhorn-ui

8 name: longhorn-frontend

9 namespace: longhorn-system

10 spec:

11 type: NodePort #修改为nodeport

12 selector:

13 app: longhorn-ui

14 ports:

15 - port: 80

16 targetPort: 8000

17 nodePort: 8888

18 ---

19 #……

提示:建议提前pull相关镜像。

longhornio/longhorn-engine:v0.8.1

longhornio/longhorn-ui:v0.8.1

longhornio/longhorn-instance-manager:v1_20200301

quay.io/k8scsi/csi-resizer:v0.3.0

quay.io/k8scsi/csi-node-driver-registrar:v1.2.0

9.3 动态sc创建

提示:默认longhorn部署完成已创建一个sc,也可通过如下手动编写yaml创建。

1 [root@master01 ~]# kubectl get sc

2 NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE

3 ……

4 longhorn driver.longhorn.io Delete Immediate true 15m

1 [root@master01 ~]# vi longhornsc.yaml

1 kind: StorageClass

2 apiVersion: storage.k8s.io/v1

3 metadata:

4 name: longhornsc

5 provisioner: rancher.io/longhorn

6 parameters:

7 numberOfReplicas: "3"

8 staleReplicaTimeout: "30"

9 fromBackup: ""

1 [root@master01 ~]# kubectl create -f longhornsc.yaml

9.4 测试PV及PVC

1 [root@master01 ~]# vi longhornpod.yaml

1 apiVersion: v1

2 kind: PersistentVolumeClaim

3 metadata:

4 name: longhorn-pvc

5 spec:

6 accessModes:

7 - ReadWriteOnce

8 storageClassName: longhorn

9 resources:

10 requests:

11 storage: 2Gi

12 ---

13 apiVersion: v1

14 kind: Pod

15 metadata:

16 name: longhorn-pod

17 namespace: default

18 spec:

19 containers:

20 - name: volume-test

21 image: nginx:stable-alpine

22 imagePullPolicy: IfNotPresent

23 volumeMounts:

24 - name: volv

25 mountPath: /data

26 ports:

27 - containerPort: 80

28 volumes:

29 - name: volv

30 persistentVolumeClaim:

31 claimName: longhorn-pvc

32

1 [root@master01 ~]# kubectl create -f longhornpod.yaml

参考:

https://docs.rancher.cn/k3s/

https://docs.rancher.cn/k3s/architecture.html

本文内容总结:一 K3S概述,1.1 K3S介绍,1.2 K3S特点,1.3 K3S架构,1.4 worker节点注册,二 K3S部署规划,2.1 节点需求,2.2 节点规划,三 K3S部署准备,3.1 变量参数准备,3.2 相关优化,3.3 配置免秘钥,四 自定义证书,4.1 安装cfssl,4.2 创建根证书,4.3 分发根证书,五 安装ETCD,5.1 安装ETCD,5.2 分发ETCD,5.3 创建etcd证书和密钥,5.4 分发证书和私钥,5.5 创建etcd的systemd,5.5 修改etcd systemd相应地址,5.6 分发etcd systemd,5.7 启动ETCD,5.8 检查ETCD启动,5.9 验证服务状态,5.10 查看ETCD当前leader,六 安装K3S server,6.1 脚本安装,6.2 确认验证,七 高可用优化,7.1 Keepalived安装,7.2 创建配置文件,7.3 启动Keepalived,7.4 确认验证,7.5 启用高可用,八 worker节点加入,8.1 worker节点加入集群,8.2 其他命令参数,九 部署Longhorn,9.1 Longhorn概述,9.2 Longhorn部署,9.3 动态sc创建,9.4 测试PV及PVC,

原文链接:https://www.cnblogs.com/itzgr/p/12886477.html

以上是 附018.K3S-ETCD高可用部署 的全部内容, 来源链接: utcz.com/z/296977.html

回到顶部