ETCD3.4集群

IT
IT
IT
306
文章
1
评论
2020年7月18日17:44:11 评论 618 7993字阅读26分38秒

环境准备

  • 配置主机名
[root@iZ2zeet88b9dmz14e258c7Z ~]# hostnamectl set-hostname k8s-master1
[root@iZ2zeet88b9dmz14e258c5Z ~]# hostnamectl set-hostname k8s-node1
[root@iZ2zeet88b9dmz14e258c8Z ~]# hostnamectl set-hostname k8s-node2
  • 关闭防火墙
[root@iZ2zei14p015t8wkktdhn2Z ~]#  systemctl stop firewalld
[root@iZ2zei14p015t8wkktdhn2Z ~]# systemctl disable firewalld
  • 关闭selinux
[root@iZ2zei14p015t8wkktdhn2Z ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config 
[root@iZ2zei14p015t8wkktdhn2Z ~]# setenforce 0
setenforce: SELinux is disabled
  • 关闭swap
[root@iZ2zei14p015t8wkktdhn2Z ~]# swapoff -a 
[root@k8s-master1 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 添加主机名与IP对应关系(记得设置主机名)
cat >> /etc/hosts<<EOF
192.168.31.216 k8s-master1
192.168.31.217 k8s-node1
192.168.31.218 k8s-node2
EOF
  • 将桥接的IPv4流量传递到iptables的链
cat >  /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
EOF
modprobe br_netfilter
sysctl --system

配置所有master到所有节点(包括自身)的ssh免密登录

依此在所有的master节点上做如下操作:

[root@k8s-master1 ~]# ssh-keygen -t rsa
[root@k8s-master1 ~]# ssh-copy-id k8s-master1
[root@k8s-master1 ~]# ssh-copy-id k8s-node1
[root@k8s-master1 ~]# ssh-copy-id k8s-node2

时间同步

  • 安装ntpdate
yum install chrony ntpdate -y
  • 修改配置文件
cp -a /etc/chrony.conf /etc/chrony.conf.bak
sed -i "s%^server%#server%g" /etc/chrony.conf
  • 添加同步地址
echo "server ntp.aliyun.com iburst" >> /etc/chrony.conf
  • 启动
systemctl start chronyd.service
systemctl enable  chronyd.service
systemctl status chronyd.service
  • 查看ntp_servers状态
chronyc  sources
  • 查看ntp详细信息
chronyc  tracking

安装CFSSL工具

CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写

Github地址:https://github.com/cloudflare/cfssl

官网地址:https://pkg.cfssl.org/

在其中一台节点(一般是master1)上执行如下指令直接进行安装

[root@k8s-master1 ~]# curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master1 ~]# curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master1 ~]# curl -s -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master1 ~]# chmod +x /usr/local/bin/cfssl*

如果环境无法联网,则到官网下载最新版本的cfssl_linux-amd64、cfssljson_linux-amd64、cfssl-certinfo_linux-amd64并上传到其中一台节点的/root目录下(一般是master1),并执行如下指令安装cfssl

mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl*

部署etcd数据库集群

etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现、共享配置以及并发控制(如 leader 选举、分布式锁等)。kubernetes 使用 etcd 存储所有运行数据。

Github地址:https://github.com/etcd-io/etcd
官网地址:https://etcd.io/

创建工作目录

[root@master ~]# mkdir /root/etcd-cert && cd /root/etcd-cert
  • 创建ca-csr.json文件
cat > ca-csr.json << EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "ShenZhen",
            "ST": "ShenZhen"
        }
    ]
}
EOF

创建ca-config.json文件
配置证书生成策略,让CA软件知道颁发什么样的证书
ca-config.json:定义多个profiles,分别指定不同的过期时间,使用场景等参数,这里我们只定义了etcd一个profile
signing:表示该证书可用于签名其它证书
server auth:表示client可以使用该CA对server提供的证书进行验证
client auth:表示server可以用该CA对client提供的证书进行验证

cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "876000h"
    },
    "profiles": {
      "etcd": {
         "expiry": "876000h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
  • 创建etcd-csr.json文件
    注:etcd-csr.json中的hosts字段需要所把有etcd集群节点的IP地址都添加进去
cat > etcd-csr.json << EOF
{
    "CN": "etcd",
    "hosts": [
        "192.168.31.216",
        "192.168.31.217",
        "192.168.31.218"
        ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "ShenZhen",
            "ST": "ShenZhen"
        }
    ]
}
EOF
  • 生成CA证书和私钥
[root@master etcd-cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  • 为etcd生成自签证书
[root@master etcd-cert]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd
  • 部署etcd3.4之前版本

访问https://github.com/etcd-io/etcd/releases下载etcd3.4之前版本的二进制包(本文以3.4.8为例),并上传到其中一台etcd节点的/root目录下,然后执行如下指令解压并创建etcd相关目录和配置文件

[root@master ~]# wget https://www.centoscn.vip/wp-content/uploads/2020/07/etcd-v3.4.8-linux-amd64.tar.gz
[root@master ~]#  tar zxf etcd-v3.4.8-linux-amd64.tar.gz -C /opt/
[root@master ~]# mv /opt/etcd-v3.4.8-linux-amd64/  /opt/etcd
  • 创建二进制文件存放目录、配置文件存放目录、证书存放目录
[root@master ~]# mkdir /opt/etcd/bin
[root@master ~]# mkdir /opt/etcd/cfg
[root@master ~]# mkdir /opt/etcd/ssl
  • 拷贝二进制文件到bin目录下
[root@master ~]# cp -a /opt/etcd/etcd* /opt/etcd/bin/
  • 拷贝上一步生成的自签证书到ssl目录下
[root@master ~]#  cp -a /root/etcd-cert/{ca,etcd,etcd-key}.pem /opt/etcd/ssl/
  • 创建etcd集群配置文件,标注部分按实际情况进行修改
cat > /opt/etcd/cfg/etcd.conf << EOF
[Member]
#自定义此etcd节点的名称,集群内唯一
ETCD_NAME="etcd-1"
#定义etcd数据存放目录
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#定义本机和成员之间通信的地址
ETCD_LISTEN_PEER_URLS="https://192.168.31.216:2380" 
#定义etcd对外提供服务的地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.216:2379"
 
[Clustering]
#定义该节点成员对等URL地址,且会通告集群的其余成员节点
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.216:2380"
#此成员的客户端URL列表,用于通告群集的其余部分
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.216:2379"
#集群中所有节点的信息
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.216:2380,etcd-2=https://192.168.31.217:2380,etcd-3=https://192.168.31.218:2380"
#创建集群的token,这个值每个集群保持唯一
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
  • 创建etcd的systemd unit文件
[root@master ~]# vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
--cert-file=/opt/etcd/ssl/etcd.pem \
--key-file=/opt/etcd/ssl/etcd-key.pem \
--peer-cert-file=/opt/etcd/ssl/etcd.pem \
--peer-key-file=/opt/etcd/ssl/etcd-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
--logger=zap
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
  • 将etcd目录和systemd unit文件拷贝到其余etcd集群节点上,并修改etcd配置文件中的名称IP地址
  • 拷贝etcd目录和etcd.service到其余etcd集群节点上
[root@master ~]# scp -r /opt/etcd/ k8s-node1:/opt/
[root@master ~]# scp -r /opt/etcd/ k8s-node2:/opt/
[root@master ~]# scp -r /usr/lib/systemd/system/etcd.service k8s-node1:/usr/lib/systemd/system/
etcd.service                                                                                                                                                      100%  528   992.0KB/s   00:00    
[root@master ~]# scp -r /usr/lib/systemd/system/etcd.service k8s-node2:/usr/lib/systemd/system/
etcd.service
  • 修改etcd集群配置文件,标注部分按实际情况进行修改
[root@node1 ~]# vim /opt/etcd/cfg/etcd.conf
[Member]
#自定义此etcd节点的名称,集群内唯一
ETCD_NAME="etcd-2"
#定义etcd数据存放目录
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#定义本机和成员之间通信的地址
ETCD_LISTEN_PEER_URLS="https://192.168.31.217:2380"
#定义etcd对外提供服务的地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.217:2379"

[Clustering]
#定义该节点成员对等URL地址,且会通告集群的其余成员节点
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.217:2380"
#此成员的客户端URL列表,用于通告群集的其余部分
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.217:2379"
#集群中所有节点的信息
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.216:2380,etcd-2=https://192.168.31.217:2380,etcd-3=https://192.168.31.218:2380"
#创建集群的token,这个值每个集群保持唯一
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集
ETCD_INITIAL_CLUSTER_STATE="new"
[root@node2 ~]# vim /opt/etcd/cfg/etcd.conf


[Member]
#自定义此etcd节点的名称,集群内唯一
ETCD_NAME="etcd-3"
#定义etcd数据存放目录
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#定义本机和成员之间通信的地址
ETCD_LISTEN_PEER_URLS="https://192.168.31.218:2380"
#定义etcd对外提供服务的地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.218:2379"

[Clustering]
#定义该节点成员对等URL地址,且会通告集群的其余成员节点
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.218:2380"
#此成员的客户端URL列表,用于通告群集的其余部分
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.218:2379"
#集群中所有节点的信息
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.216:2380,etcd-2=https://192.168.31.217:2380,etcd-3=https://192.168.31.218:2380"
#创建集群的token,这个值每个集群保持唯一
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集
ETCD_INITIAL_CLUSTER_STATE="new"
  • 在所有etcd集群节点上启动etcd并设置开机自启
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable etcd
[root@master ~]# systemctl start etcd
#注:在第一台节点上执行start后会一直卡着无法返回命令提示符,这是因为在等待其他节点准备就绪,继续启动其余节点即可
 [root@master ~]# systemctl status etcd
  • 检查etcd服务启动结果
[root@k8s-master1 ~]# systemctl status etcd|grep Active
   Active: active (running) since 五 2020-07-17 20:37:04 CST; 20h ago
[root@k8s-node1 ~]# systemctl status etcd|grep Active
   Active: active (running) since 五 2020-07-17 20:50:13 CST; 12h ago
[root@k8s-node2 ~]# systemctl status etcd|grep Active
   Active: inactive (dead) since 六 2020-07-18 17:37:37 CST; 8min ago
继续阅读
  • 我的QQ
  • QQ扫一扫
  • weinxin
  • 我的头条
  • 头条扫一扫
  • weinxin
IT
  • 本文由 发表于 2020年7月18日17:44:11
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Minikube-Kubernetes本地实验环境 Kubernetes

Minikube-Kubernetes本地实验环境

简述 Kubernetes 集群的搭建是有一定难度的,尤其是对于初学者来说,好多概念和原理不懂,即使有现成的教程也会出现很多不可预知的问题,很容易打击学习的积极性,就此弃坑。好在 Kubernetes...
深入理解pod Kubernetes

深入理解pod

YAML 基础 它的基本语法规则如下: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 # 表示注释,从这个字符一直...