一 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节点;
  • 一个外部数据存储。

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节点组件混布在一起。




节点主机名

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
如上所示,当前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
  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

附018.K3S-ETCD高可用部署的更多相关文章

  1. kubernetes1.7.6 ha高可用部署

    写在前面:  1. 该文章部署方式为二进制部署. 2. 版本信息 k8s 1.7.6,etcd 3.2.9 3. 高可用部分 etcd做高可用集群.kube-apiserver 为无状态服务使用hap ...

  2. kubernetes 1.15.1 高可用部署 -- 从零开始

    这是一本书!!! 一本写我在容器生态圈的所学!!! 重点先知: 1. centos 7.6安装优化 2. k8s 1.15.1 高可用部署 3. 网络插件calico 4. dashboard 插件 ...

  3. Cinder 架构分析、高可用部署与核心功能解析

    目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...

  4. NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署

    NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...

  5. LVS+Keepalived高可用部署

    一.LVS+Keepalived高可用部署 一.keepalived节点部署 1.安装keepalived yum install keepalived ipvsadm -y mkdir -p /op ...

  6. Rancher Server HA的高可用部署实验-学习笔记

    转载于https://blog.csdn.net/csdn_duomaomao/article/details/78771731 Rancher Server HA的高可用部署实验-学习笔记 一.机器 ...

  7. eql高可用部署方案

    运行环境 服务器两台(后面的所有配置案例都是以10.96.0.64和10.96.0.66为例) 操作系统CentOS release 6.2 必须要有共同的局域网网段 两台服务器都要安装keepali ...

  8. MooseFS及其高可用部署

    MooseFS的工作原理分析 MooseFS(下面统一称为MFS)由波兰公司Gemius SA于2008年5月30日正式推出的一款Linux下的开源存储系统,是OpenStack开源云计算项目的子项目 ...

  9. Redis高可用部署及监控

    Redis高可用部署及监控 目录                        一.Redis Sentinel简介 二.硬件需求 三.拓扑结构 .单M-S结构 .双M-S结构 .优劣对比 四.配置部 ...

  10. 006.SQLServer AlwaysOn可用性组高可用部署

    一 数据库镜像部署准备 1.1 数据库镜像支持 有关对 SQL Server 2012 中的数据库镜像的支持的信息,请参考:https://docs.microsoft.com/zh-cn/previ ...

随机推荐

  1. python3_learn 实现文件夹内批量对图片重命名

    初衷 练习Python,提高动手能力. 珍藏的壁纸文件夹名命有点乱. 可以学习下一些基础的库 开始(.jpg,无筛选) First 首先找到OS库,寻找可以遍历文件名的.找到了OS.walk() os ...

  2. django-admin和manage.py用法

    官网文档地址:django-admin和manage.py 金句: 所有的天赋,都来自于你对你喜欢的某种事物的模仿与学习,否则你就不会有这种天赋. 开篇话: 我们在Django开发过程中,命令行执行最 ...

  3. 立体匹配-----NCC视差匹配

    目录 一.立体匹配算法 1.立体匹配算法分类 二.NCC 视差匹配方法 1.原理 2.NCC计算公式 3.算法流程 4.代码实现     5.不同场景运行 三.结论 四.遇到的问题及解决方法 一.立体 ...

  4. pytorch seq2seq闲聊机器人beam search返回结果

    decoder.py """ 实现解码器 """ import heapq import torch.nn as nn import con ...

  5. fasttext的使用,预料格式,调用方法

    数据格式:分词后的句子+\t__label__+标签 fasttext_model.py from fasttext import FastText import numpy as np def ge ...

  6. java算法-二分法查找实现

    什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别 ...

  7. 高德局部刷新标记点,bug解决

    将接口返回的经纬集合点在高德地图上标记展示, 如果实时刷新地图标记点,不加优化,则会造成过多的带宽消耗 所以,地图只需加载一次,局部更新标记点就好了 代码: <template> < ...

  8. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  9. javascript-文件File转换成base64格式

    不能直接访问用户计算机中的文件,一直都是Web应用开发中的一大障碍.2000年以前,处理文件的唯一方式就是在表单中加入<input type="file">字段,仅此而 ...

  10. js事件冒泡于事件捕获

    事件冒泡 事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件. 事件冒泡是自下而上(从最深节点开始,向上传播事件)的触发事件 //例子 <div id="pa ...