githubixx.etcd

ansible-role-etcd

这个 Ansible 角色用于 Kubernetes 轻松上手使用 Ansible - etcd 集群。当然,它也可以在没有 Kubernetes 集群的情况下使用。

安装一个 etcd 集群。提示:这个剧本在 systemd 服务文件更改后不会重新加载或重启 etcd 集群进程!这是故意的!同时重启所有 etcd 进程是一个非常糟糕的主意。因此,如果 etcd.service 文件已更改,请逐个节点手动重启/重新加载 etcd,并检查日志输出以确认该节点是否重新加入集群!当然,这个过程也可以自动化,但目前不在这个角色的范围内。附注:在 etcd 服务文件更改后,脚本将执行 systemctl daemon-reload,以便 systemd 至少能意识到文件的更改,您无需处理。因此,重启 etcd 节点也会激活新配置。

通过此角色安装的 etcd 集群的升级过程在 这里 描述。

版本

我会给每个发布版本打标签,并尽量遵循 语义化版本控制。如果您想使用这个角色,我建议查看最新标签。主分支基本上是开发,标签则标记了稳定版本。但我通常也会保持主分支的良好状态。一个标签 13.1.1+3.5.13 表示这是该角色的版本 13.1.1,并且是与 etcd 版本 3.5.13 一起使用的(但也应该能与更新的版本兼容)。如果角色本身的版本在 + 前有所更改,则 X.Y.Z 将增加;如果 etcd 版本在 + 后有所更改,则 X.Y.Z 将增加。这使得可以在角色仍为特定 etcd 版本开发时标记缺陷修复和新的主要版本。

更新日志

请参阅 CHANGELOG.md

要求

此角色要求您已为 etcd 创建了一些证书(请参阅 Kubernetes 轻松上手使用 Ansible - 证书授权 (CA) 和 Ansible 角色 kubernetes_ca。剧本会在运行该剧本的主机上搜索 etcd_ca_conf_directory 目录中的证书。当然,您可以自行创建证书(见 生成自签名证书 - 此 Git 仓库已存档,但信息仍然有效)。

角色变量

# 复制 etcd 证书的目录。默认情况下,这将扩展到用户的 LOCAL $HOME(运行 "ansible-playbook ..." 的用户)
# 加上 "/etcd-certificates"。这意味着如果用户的 $HOME 目录是 e.g.
# "/home/da_user",那么 "etcd_ca_conf_directory" 的值将是
# "/home/da_user/etcd-certificates"。
etcd_ca_conf_directory: "{{ '~/etcd-certificates' | expanduser }}"

# etcd Ansible 组
etcd_ansible_group: "k8s_etcd"

# etcd 版本
etcd_version: "3.5.13"

# etcd 监听客户端的端口
etcd_client_port: "2379"

# etcd 监听其对等体的端口
etcd_peer_port: "2380"

# 绑定 etcd 端口的接口
etcd_interface: "tap0"

# 以此用户身份运行 etcd 守护进程。
#
# 注意 1:如果您想使用 "etcd_peer_port" < 1024,您必须
# 以 "root" 用户身份运行 "etcd"。
# 注意 2:如果在 "etcd_user" 中指定的用户不存在,则角色
# 将创建它。只有当用户已存在时,角色才不会创建它,
# 但会根据需要调整其 UID/GID 和 shell(见下面的设置)。
# 此外,如果 "etcd_user" 是 "root",则此角色不会处理该用户。
etcd_user: "etcd"

# 在 "etcd_user" 中指定用户的 UID。如果未指定,将使用来自
# "/etc/login.defs" 的下一个可用 UID(见 "SYS_UID_MAX" 设置)。
# etcd_user_uid: "999"

# 在 "etcd_user" 中指定用户的 shell。为了提高安全性,保持
# 默认设置。
etcd_user_shell: "/bin/false"

# 指定 "etcd_user" 中的用户是否为系统用户(默认)
# 或者不是。如果为 "true",则将忽略 "etcd_user_home" 设置。一般来说
# 保持默认设置是有意义的,因为运行 "etcd" 的用户不应登录。
etcd_user_system: true

# 在 "etcd_user" 中指定用户的主目录。如果
# "etcd_user_system" 设置为 "true",则将被忽略。在这种情况下,不会创建主目录。通常不需要。
# etcd_user_home: "/home/etcd"

# 以此组身份运行 etcd 守护进程
#
# 注意:如果在 "etcd_group" 中指定的组不存在,则角色
# 将创建它。只有当组已存在时,角色才不会创建它,
# 但会根据需要调整 GID(见下面的 "etcd_group_gid" 设置)。
etcd_group: "etcd"

# 在 "etcd_group" 中指定组的 GID。如果未指定,将使用来自
# "/etc/login.defs" 的下一个可用 GID(见 "SYS_GID_MAX" 设置)。
# etcd_group_gid: "999"

# 指定 "etcd_group" 中的组是否为系统组(默认)
# 或者不是。
etcd_group_system: true

# etcd 配置的目录
etcd_conf_dir: "/etc/etcd"

# etcd 配置目录的权限
etcd_conf_dir_mode: "0750"

# 指定的 etcd 配置目录的所有者用户
etcd_conf_dir_user: "root"

# 指定的 etcd 配置目录的组所有者
etcd_conf_dir_group: "{{ etcd_group }}"

# 存储下载的 etcd 压缩包的目录
# 应该不要删除,以避免重复下载
etcd_download_dir: "/opt/etcd"

# 存储下载的 etcd 压缩包的目录权限
etcd_download_dir_mode: "0755"

# 指定的 etcd 下载目录的所有者用户
etcd_download_dir_user: "{{ etcd_user }}"

# 指定的 etcd 下载目录的组所有者
etcd_download_dir_group: "{{ etcd_group }}"

# 存储 etcd 可执行文件的目录
#
# 重要提示:如果您使用 "etcd_bin_dir" 的默认值
# "/usr/local/bin",则在 "etcd_bin_dir_mode"、"etcd_bin_dir_user"
# 和 "etcd_bin_dir_group" 中指定的设置将被忽略。这是
# 为了防止更改 "/usr/local/bin" 的权限。
# 该目录通常在每个 Linux 安装中都是存在的
# 并且不应更改。
# 因此,如果您将目录指定为 "/usr/bin" 或
# "/bin",请谨慎使用 "etcd_bin_dir",因为这将更改这些目录的权限,
# 这通常不是您想要的。
etcd_bin_dir: "/usr/local/bin"

# 存储 etcd 可执行文件的目录权限
etcd_bin_dir_mode: "0755"

# 指定的 etcd 可执行文件目录的所有者用户
etcd_bin_dir_user: "{{ etcd_user }}"

# 指定的 etcd 可执行文件目录的组所有者
etcd_bin_dir_group: "{{ etcd_group }}"

# etcd 数据目录(也就是 etcd 数据库文件)
etcd_data_dir: "/var/lib/etcd"

# 存储 etcd 数据的目录权限
etcd_data_dir_mode: "0700"

# 指定的 etcd 数据目录的所有者用户
etcd_data_dir_user: "{{ etcd_user }}"

# 指定的 etcd 数据目录的组所有者
etcd_data_dir_group: "{{ etcd_group }}"

# 要下载和安装的架构
etcd_architecture: "amd64"

# 只有在您使用的架构不受支持时才更改此项
# 有关更多信息,请参见:
# https://github.com/etcd-io/website/blob/main/content/en/docs/v3.5/op-guide/supported-platform.md
etcd_allow_unsupported_archs: false

# 默认情况下,etcd tar 包从官方
# etcd 仓库下载。如果需要,可以将其更改为一些自定义的
# URL。有关可以使用的协议的更多信息,请参见:
# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
# 只需确保保留文件名命名方案:
# "etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"
etcd_download_url: "https://github.com/etcd-io/etcd/releases/download/v{{ etcd_version }}/etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"

# 默认使用 SHA256SUMS 文件来验证
# 压缩包的校验和。这也可以根据需要调整。
etcd_download_url_checksum: "sha256:https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}/SHA256SUMS"

# [服务] 部分的选项。有关更多信息,请参见:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
# 在 "Type=notify" 下的选项主要是与安全/沙盒相关的设置
# 限制系统对单元进程的接触。
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
etcd_service_options:
  - User={{ etcd_user }}
  - Group={{ etcd_group }}
  - Restart=on-failure
  - RestartSec=5
  - Type=notify
  - ProtectHome=true
  - PrivateTmp=true
  - ProtectSystem=full
  - ProtectKernelModules=true
  - ProtectKernelTunables=true
  - ProtectControlGroups=true
  - CapabilityBoundingSet=~CAP_SYS_PTRACE

etcd_settings:
  "name": "{{ ansible_hostname }}"
  "cert-file": "{{ etcd_conf_dir }}/cert-etcd-server.pem"
  "key-file": "{{ etcd_conf_dir }}/cert-etcd-server-key.pem"
  "trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
  "peer-cert-file": "{{ etcd_conf_dir }}/cert-etcd-peer.pem"
  "peer-key-file": "{{ etcd_conf_dir }}/cert-etcd-peer-key.pem"
  "peer-trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
  "advertise-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port }}"
  "initial-advertise-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
  "listen-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
  "listen-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port + ',https://127.0.0.1:' + etcd_client_port }}"
  "peer-client-cert-auth": "true"            # 启用对等体客户端证书认证
  "client-cert-auth": "true"                 # 启用客户端证书认证
  "initial-cluster-token": "etcd-cluster-0"  # etcd 集群引导时的初始集群令牌。
  "initial-cluster-state": "new"             # 初始集群状态('new' 或 'existing')
  "data-dir": "{{ etcd_data_dir }}"          # etcd 数据目录(也就是 etcd 数据库文件)
  "wal-dir": ""                              # 专用 wal 目录("" 意味着不使用单独的 WAL 目录)
  "auto-compaction-retention": "0"           # 自动压缩保留时间(小时)。0 表示禁用自动压缩。
  "snapshot-count": "100000"                 # 触发快照到磁盘的已提交事务数量
  "heartbeat-interval": "100"                # 心跳间隔时间(以毫秒为单位)
  "election-timeout": "1000"                 # 选举超时时间(以毫秒为单位)。有关调优文档的详细信息请查看
  "max-snapshots": "5"                       # 保留的快照文件最大数量(0 表示无限制)
  "max-wals": "5"                            # 保留的 wal 文件最大数量(0 表示无限制)
  "quota-backend-bytes": "0"                 # 当后端大小超过给定配额时发出警报(0 表示默认的低空间配额)
  "logger": "zap"                            # 指定 'zap' 用于结构化日志记录或者 'capnslog'。
  "log-outputs": "systemd/journal"           # 指定 'stdout' 或 'stderr' 即使在 systemd 下运行也跳过 journald 记录
  "enable-v2": "true"                        # 启用 v2 API 以保持与先前 etcd 3.3.x 的兼容性(例如,flannel 需要)
  "discovery-srv": ""                        # 启用 DNS SRV 发现的发现域名,留空以禁用。如果设置,它将覆盖 initial-cluster。

# etcd 的证书授权和证书文件
etcd_certificates:
  - ca-etcd.pem               # 证书授权文件
  - ca-etcd-key.pem           # 证书授权密钥文件
  - cert-etcd-peer.pem        # 对等体 TLS 证书文件
  - cert-etcd-peer-key.pem    # 对等体 TLS 密钥文件
  - cert-etcd-server.pem      # 服务器 TLS 证书文件
  - cert-etcd-server-key.pem  # 服务器 TLS 密钥文件

etcd 的默认设置在 etcd_settings 中定义,可以通过定义一个名为 etcd_settings_user 的变量来覆盖。您也可以使用此变量添加其他设置。例如,要覆盖 log-output 设置的默认值并添加一个新设置 grpc-keepalive-min-time,请将以下设置添加到 group_vars/k8s.yml

etcd_settings_user:
  "log-output": "stdout"
  "grpc-keepalive-min-time": "10s"

示例剧本

- hosts: k8s_etcd
  roles:
    - githubixx.etcd

测试

此角色有一个简小的测试设置,使用 Molecule、libvirt (vagrant-libvirt) 和 QEMU/KVM 创建。有关如何设置的详细信息,请参阅我的博客文章 使用 Molecule、libvirt (vagrant-libvirt) 和 QEMU/KVM 测试 Ansible 角色。测试配置在 这里

之后可以执行 Molecule:

molecule converge

这将设置三台具有 Ubuntu 20.04/22.04 的虚拟机(VM),并安装一个 etcd 集群。还包含一个小的验证步骤:

molecule verify

要清理,请运行

molecule destroy

许可证

GNU 通用公共许可证 第 3 版

作者信息

http://www.tauceti.blog

关于项目

Installs etcd cluster.

安装
ansible-galaxy install githubixx.etcd
许可证
gpl-3.0
下载
3k
拥有者
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)