zoukankan      html  css  js  c++  java
  • 附018.K3S-ETCD高可用部署

    一 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
  • 相关阅读:
    采购申请 POCIRM-001:ORA-01403: 未找到任何数据
    前后端交互技术有哪些
    React实现类似淘宝tab居中切换效果
    CSS通过text-transform实现大写、小写和首字母大写转换
    从浏览器内部运行机制看性能优化
    设置网页浏览器标签小图标
    前后端分离的优缺点
    修改input搜索框默认叉号的样式为自定义图片
    编写优秀CSS代码的8个策略
    css如何设置不可复制?
  • 原文地址:https://www.cnblogs.com/itzgr/p/12886477.html
Copyright © 2011-2022 走看看