githubixx.kubernetes_worker

ansible-role-kubernetes-worker

这个 Ansible 角色用于 Kubernetes the not so hard way with Ansible - Worker。这个 Ansible 角色用于设置 Kubernetes 工作节点。更多信息请参见 Kubernetes the not so hard way with Ansible - Worker

版本

我会对每个发布版本进行标记,并尽量遵循 语义版本控制。如果你想使用这个角色,建议查看最新的标记。主分支基本上是开发分支,标签则标记稳定的发布版本。但一般来说,我也会保证主分支的质量。标签 24.0.0+1.27.8 意味着这是该角色的 24.0.0 版本,适用于 Kubernetes 版本 1.27.8(当然也应该适用于任何 K8s 1.27.x 的发布版本)。如果角色本身有变更,X.Y.Z+ 前会增加。如果 Kubernetes 版本变更,X.Y.Z+ 后也会增加。这使得在针对特定 Kubernetes 版本开发时能够标记错误修复和新的主要版本。这对于具有破坏性变更的 Kubernetes 主要版本特别有用。

要求

该剧本期望你已经部署了 Kubernetes 控制器组件(请参见 kubernetes-controllerKubernetes the not so hard way with Ansible - Control plane)。

你还需要安装 containerdCNI 插件runc。为了让 Kubernetes 的 Pods 能够在不同主机间通信,建议在工作节点运行后安装 Cilium。当然,CalicoWeaveNetkube-routerflannel 以及其他 Kubernetes 网络解决方案也是有效的选择。

支持的操作系统

  • Ubuntu 20.04 (Focal Fossa)
  • Ubuntu 22.04 (Jammy Jellyfish)

更新日志

更改历史:

请查看完整的 CHANGELOG.md

重要 版本 24.0.0+1.27.8 有很多潜在的破坏性变更。因此如果你从版本 < 24.0.0+1.27.8 升级,请务必阅读该版本的 CHANGELOG!

最近更改:

26.0.0+1.29.4

  • 更新

    • 更新 k8s_release1.29.4
  • Molecule

    • 使用 alvistack 代替 generic Vagrant 镜像

25.0.1+1.28.8

  • 更新
    • 更新 k8s_release1.28.8

25.0.0+1.28.5

  • 更新

    • 更新 k8s_release1.28.5
  • 其他更改

    • 调整 Github action 以适应 Ansible Galaxy 的更改
    • .yamllint:将最大行长度从 200 扩展到 300
  • Molecule

    • 测试资产的虚拟机更改为 Ubuntu 22.04
    • 更改 IP 地址
    • 调整证书的通用名称 / 将算法更改为 ecdsa 和算法大小
    • 移除 collections.yml

安装

  • 从 Github 直接下载(在克隆之前切换到 Ansible roles 目录。您可以通过运行 ansible-config dump | grep DEFAULT_ROLES_PATH 命令来确定角色路径): git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker

  • 通过 ansible-galaxy 命令直接从 Ansible Galaxy 下载: ansible-galaxy install role githubixx.kubernetes_worker

  • 创建一个 requirements.yml 文件,内容如下(这将从 Github 下载该角色),并使用 ansible-galaxy role install -r requirements.yml 进行安装(如有需要请更改 version):

---
roles:
  - name: githubixx.kubernetes_worker
    src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
    version: 26.0.0+1.29.4

角色变量

# Kubernetes 配置和证书文件的基本目录
# 与所有工作节点相关。剧本完成后,该目录
# 包含各种子文件夹。
k8s_worker_conf_dir: "/etc/kubernetes/worker"

# 所有证书文件(与私钥基础设施相关)在
# "k8s_worker_certificates" 中指定(参见 "vars/main.yml")将存储在此处。
# 该新目录的所有者和组将是 "root"。文件权限
# 将是 "0640"。
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"

# 存储 Kubernetes 可执行文件的目录(参见 "vars/main.yml" 中的 "k8s_worker_binaries" 变量)。
# 该新目录的所有者和组在两种情况下都是 "root"。该目录的权限将是 "0755"。
#
# 注意:默认目录 "/usr/local/bin" 在每个
# Linux 安装中通常已经存在,其所有者、组和权限如上所述。
# 如果您的当前设置不同,请考虑其他目录。但请确保
# 新目录包含在您的 "$PATH" 变量值中。
k8s_worker_bin_dir: "/usr/local/bin"

# K8s 发布
k8s_worker_release: "1.29.4"

# Kubernetes 服务应监听的接口。由于所有集群
# 通信都应使用 VPN 接口,接口名称通常是
# "wg0"(WireGuard)、"peervpn0"(PeerVPN)或 "tap0"。
#
# Kubernetes 工作服务应监听的网络接口。即:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"

# 从哪里复制 K8s 证书的目录。默认情况下,这
# 将扩展到用户本地的 $HOME(即运行 "ansible-playbook ..."
# 的用户)及 "/k8s/certs"。这意味着如果用户的 $HOME 目录例如
# 是 "/home/da_user",则 "k8s_ca_conf_directory" 的值将为
# "/home/da_user/k8s/certs"。
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"

# Kubernetes API 端点的 IP 地址或主机名。此变量
# 被 "kube-proxy" 和 "kubelet" 用于连接 "kube-apiserver"
# (Kubernetes API 服务器)。
#
# 默认情况下,第一个主机在 Ansible 组 "k8s_controller" 中
# 在这里指定。注意:此设置不具备容错能力!这意味着
# 如果 Ansible 组 "k8s_controller" 中的第一个主机宕机,
# 工作节点及其负载将继续工作,但工作
# 节点不会从 Kubernetes API 服务器接收任何更新。
#
# 如果你有一个负载均衡器在所有
# Kubernetes API 服务器之间分配流量,它应该在这里指定(可以是其 IP
# 地址或 DNS 名称)。但你需要确保你要在此处使用的 IP
# 地址或 DNS 名称包含在
# Kubernetes API 服务器的 TLS 证书中(请参见 https://github.com/githubixx/ansible-role-kubernetes-ca
# 角色的 "k8s_apiserver_cert_hosts" 变量)。如果未指定,你将在上述提到的服务的日志中看到证书错误。
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"

# 与上述类似,但针对端口。它指定Kubernetes API 服务器监听的端口。
# 同样,如果负载均衡器在位并将请求分发到 Kubernetes API 服务器
#,请将负载均衡器的端口放在这里。
k8s_worker_api_endpoint_port: "6443"

# Kubernetes 工作节点所需的操作系统包。你可以随时添加更多
# 包。但请注意,如果从默认列表中删除一个或多个,工作节点可能
# 不会按预期工作或根本无法工作。
k8s_worker_os_packages:
  - ebtables
  - ethtool
  - ipset
  - conntrack
  - iptables
  - iptstate
  - netstat-nat
  - socat
  - netbase

# 存储 kubelet 配置的目录
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"

# kubelet 设置
#
# 如果你想启用 "RuntimeDefault" 作为所有工作负载的默认 seccomp
# 配置文件,请将这些设置添加到 "k8s_worker_kubelet_settings" 中:
#
# "seccomp-default": ""
#
# 另请参见:
# https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads
k8s_worker_kubelet_settings:
  "config": "{{ k8s_worker_kubelet_conf_dir }}/kubelet-config.yaml"
  "node-ip": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
  "kubeconfig": "{{ k8s_worker_kubelet_conf_dir }}/kubeconfig"

# kubelet kubeconfig
k8s_worker_kubelet_conf_yaml: |
  kind: KubeletConfiguration
  apiVersion: kubelet.config.k8s.io/v1beta1
  address: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
  authentication:
    anonymous:
      enabled: false
    webhook:
      enabled: true
    x509:
      clientCAFile: "{{ k8s_worker_pki_dir }}/ca-k8s-apiserver.pem"
  authorization:
    mode: Webhook
  clusterDomain: "cluster.local"
  clusterDNS:
    - "10.32.0.254"
  failSwapOn: true
  healthzBindAddress: "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
  healthzPort: 10248
  runtimeRequestTimeout: "15m"
  serializeImagePulls: false
  tlsCertFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}.pem"
  tlsPrivateKeyFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}-key.pem"
  cgroupDriver: "systemd"
  registerNode: true
  containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"

# 存储 kube-proxy 配置的目录
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"

# kube-proxy 设置
k8s_worker_kubeproxy_settings:
  "config": "{{ k8s_worker_kubeproxy_conf_dir }}/kubeproxy-config.yaml"

k8s_worker_kubeproxy_conf_yaml: |
  kind: KubeProxyConfiguration
  apiVersion: kubeproxy.config.k8s.io/v1alpha1
  bindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
  clientConnection:
    kubeconfig: "{{ k8s_worker_kubeproxy_conf_dir }}/kubeconfig"
  healthzBindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}:10256
  mode: "ipvs"
  ipvs:
    minSyncPeriod: 0s
    scheduler: ""
    syncPeriod: 2s
  iptables:
    masqueradeAll: true
  clusterCIDR: "10.200.0.0/16"

依赖关系

示例剧本

- hosts: k8s_worker
  roles:
    - githubixx.kubernetes_worker

测试

这个角色有一个小的测试设置,使用 Molecule、libvirt(vagrant-libvirt)和 QEMU/KVM 创建。请查看我博客中的文章 Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM 了解如何设置。测试配置在 这里

之后可以执行 Molecule。这将设置一些支持的 Ubuntu 操作系统的虚拟机(VM)并安装一个 Kubernetes 集群:

molecule converge

此时集群并不完全功能齐全,因为缺少网络插件。例如,两个不同节点间的 Pod 通信尚不可用。为了解决这个问题,可以使用以下命令为所有 Kubernetes 网络需求安装 CiliumCoreDNS 以满足 Kubernetes DNS 需求:

molecule converge -- --extra-vars k8s_worker_setup_networking=install

在此之后,你基本上就拥有了一个完全功能的 Kubernetes 集群。

也包括一个小的验证步骤:

molecule verify

要清理运行:

molecule destroy

许可

GNU 通用公共许可第 3 版

作者信息

http://www.tauceti.blog

关于项目

Installs Kubernetes worker.

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