etcd3.5.0版本集群部署

本文章是 k8s二进制高可用集群部署 的分支。详细步骤请参考目录。

  参考地址:https://www.cnblogs.com/nf01/articles/15324715.html

       https://www.cnblogs.com/linuxws/p/11194403.html

Etcd是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署。使用3台组建集群,则可容忍1台机器故障,使用5台组件集群,则可容忍2台机器故障。

可以与K8S的节点机器复用,也可以独立于K8S集群之外部署,只要ApiServer能连接到就可以。

1.从Github中下载Etcd二进制文件

  下载地址:https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz

2.创建工作目录并解压二进制包

mkdir -p /opt/etcd/{cfg,ssl}
tar -zxvf etcd-v3.5.7-linux-amd64.tar.gz
mv etcd-v3.5.7-linux-amd64/{etcd,etcdctl,etcdutl} /usr/local/bin

3.生成相关证书【可略】

  1.下载证书工具cfssl

    cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。

    https://github.com/cloudflare/cfssl/releases

wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64

chmod +x cfssl_1.6.3_linux_amd64 cfssljson_1.6.3_linux_amd64 cfssl-certinfo_1.6.3_linux_amd64

mv cfssl_1.6.3_linux_amd64 /usr/local/bin/cfssl
mv cfssljson_1.6.3_linux_amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_1.6.3_linux_amd64 /usr/local/bin/cfssl-certinfo

  2.生成证书

    1.配置生成CA证书的请求文件

cat > ca-csr.json << EOF
{
  "CN": "etcd CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Tianjin",
      "ST": "Tianjin",
      "O": "k8s",
      "OU": "System"
    }
  ],  
  "ca": {
      "expiry": "87600h"
  }
}
EOF

    注:CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
      O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)

    2.生成CA证书和密钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca #生成CA证书和密钥

    3.使用自签CA签发Etcd证书

      1.生成证书配置文件(CA 进行签名时需要的配置)

# 生成证书配置文件(CA 进行签名时需要的配置)
cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "expiry": "87600h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ]
      }
    }
  }
}
EOF

# 这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。
# 默认策略,指定了证书的有效期是一年(8760h)
# etcd策略,指定了证书的用途
# signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
# server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证
# client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证

      2.创建生成服务端证书的请求文件

cat > server-csr.json << EOF
{
  "CN": "server",
  "hosts": [
    "127.0.0.1",
    "192.168.64.130",
    "192.168.64.131",
    "192.168.64.132",
    "192.168.64.133",
    "192.168.64.134",
    "10.10.10.1",
    "*.etcd",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluste.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Tianjin",
      "ST": "Tianjin",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
#上述文件hosts字段中IP为所有etcd节点的集群内部通信ip,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

      3.基于之前生成的ca证书生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

      4.移动证书到etcd目录

cp ~/TLS/etcd/{ca,server}*pem /opt/etcd/ssl/

4.创建etcd配置文件

cat > /opt/etcd/cfg/etcd.conf.yml << EOF
# 这是etcd服务器的配置文件。

# 此成员的名称。
name: 'etcd-1'

# 数据目录的路径。
data-dir: /opt/etcd/data

# 专用 wal 目录的路径。
wal-dir:

# 触发快照到磁盘的已提交事务数。
snapshot-count: 10000

# 心跳间隔的时间(以毫秒为单位)。
heartbeat-interval: 100

# 选举超时的时间(以毫秒为单位)。
election-timeout: 1000

# 当后端大小超过给定配额时发出警报。 0 表示使用默认配额。
quota-backend-bytes: 0

# 用于侦听对等流量的逗号分隔 URL 列表。
listen-peer-urls: https://192.168.64.130:2380

# 用于侦听客户端流量的逗号分隔 URL 列表。
listen-client-urls: https://192.168.64.130:2379,https://127.0.0.1:2379

# 要保留的最大快照文件数(0 为无限制)。
max-snapshots: 5

# 要保留的 wal 文件的最大数量(0 是无限制的)。
max-wals: 5

# 逗号分隔的 CORS(跨源资源共享)来源白名单。
cors:

# 该成员的对等 URL 列表,用于向集群的其余部分通告。
# URL 需要是逗号分隔的列表。
initial-advertise-peer-urls: https://192.168.64.130:2380

# 要向公众公布的此成员的客户端 URL 列表。
# URL 需要是逗号分隔的列表。
advertise-client-urls: https://192.168.64.130:2379,https://127.0.0.1:2379

# 用于引导集群的发现 URL。
discovery:

# 有效值包括 'exit', 'proxy'
discovery-fallback: 'proxy'

# 用于发现服务流量的 HTTP 代理。
discovery-proxy:

# 用于引导初始集群的 DNS 域。
discovery-srv:

# 用于引导的初始集群配置。
initial-cluster: etcd-1=https://192.168.64.130:2380,etcd-2=https://192.168.64.131:2380,etcd-3=https://192.168.64.132:2380

# 引导期间 etcd 集群的初始集群令牌。
initial-cluster-token: 'etcd-cluster-token'

# 初始集群状态 ('new' or 'existing').
initial-cluster-state: 'new'

# 拒绝会导致仲裁丢失的重新配置请求。
strict-reconfig-check: false

# 通过 HTTP 服务器启用运行时分析数据
enable-pprof: true

# 有效值包括 'on', 'readonly', 'off'
proxy: 'off'

# 端点将保持在失败状态的时间(以毫秒为单位)。
proxy-failure-wait: 5000

# 端点刷新间隔的时间(以毫秒为单位)。
proxy-refresh-interval: 30000

# 拨号超时的时间(以毫秒为单位)。
proxy-dial-timeout: 1000

# 写入超时的时间(以毫秒为单位)。
proxy-write-timeout: 5000

# 读取超时的时间(以毫秒为单位)。
proxy-read-timeout: 0

client-transport-security:
  # 客户端服务器 TLS 证书文件的路径。
  cert-file: /opt/etcd/ssl/server.pem

  # 客户端服务器 TLS 密钥文件的路径。
  key-file: /opt/etcd/ssl/server-key.pem

  # 启用客户端证书身份验证。
  client-cert-auth: true

  # 客户端服务器 TLS 可信 CA 证书文件的路径。
  trusted-ca-file: /opt/etcd/ssl/ca.pem

  # 使用生成的证书的客户端 TLS
  auto-tls: false

peer-transport-security:
  # 对等服务器 TLS 证书文件的路径。
  cert-file: /opt/etcd/ssl/server.pem

  # 对等服务器 TLS 密钥文件的路径。
  key-file: /opt/etcd/ssl/server-key.pem

  # 启用对等客户端证书身份验证。
  client-cert-auth: true

  # 对等服务器 TLS 信任的 CA 证书文件的路径。
  trusted-ca-file: /opt/etcd/ssl/ca.pem

  # 使用生成的证书的对等 TLS。
  auto-tls: false

# 自签名证书的有效期,单位是年。
self-signed-cert-validity: 1

# 为 etcd 启用调试级别的日志记录。
log-level: debug

logger: zap

# 指定 'stdout''stderr' 以跳过 journald 日志记录,即使在 systemd 下运行也是如此。
log-outputs: [stderr]

# 强制创建一个新的单成员集群。
force-new-cluster: false

auto-compaction-mode: periodic
auto-compaction-retention: "1"
EOF

5.创建etcd.service服务配置文件,使用systemd进行管理

  https://github.com/etcd-io/etcd/blob/main/contrib/systemd/etcd.service

cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
Documentation=https://github.com/etcd-io/etcd
After=network-online.target local-fs.target remote-fs.target time-sync.target
Wants=network-online.target local-fs.target remote-fs.target time-sync.target

[Service]
Type=notify
ExecStart=etcd --config-file=/opt/etcd/cfg/etcd.conf.yml
Restart=on-failure
RestartSec=10s
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

6.设置开机自启

systemctl daemon-reload
systemctl start etcd.service
systemctl enable etcd.service
systemctl status etcd.service

 7.etcdctl安全配置

  当etcd开启SSL后,etcdctl访问etcd需要添加证书相关信息

  1.直接访问

etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem get /fanqi

  2.临时添加环境变量访问

export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/opt/etcd/ssl/ca.pem
export ETCDCTL_CERT=/opt/etcd/ssl/server.pem
export ETCDCTL_KEY=/opt/etcd/ssl/server-key.pem

  3.添加到环境变量[重启仍生效]

vi ~/.bashrc

行尾添加

export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/opt/etcd/ssl/ca.pem
export ETCDCTL_CERT=/opt/etcd/ssl/server.pem
export ETCDCTL_KEY=/opt/etcd/ssl/server-key.pem

然后保存退出

source ~/.bashrc

 

posted @ 2023-02-17 19:14  SpringCore  阅读(517)  评论(0编辑  收藏  举报