#k8s安装#  #Ansible#

1、修改镜像

这里用了yun_repository模块,默认生成/etc/yum.repos.d/{{ name }}.repo,如果目标.repo文件已存在且内容完全一致,则不会重复写入,也不会触发changed状态。安装时启用GPG校验,防止安装被篡改的软件包。

- name: Add Kubernetes yum repository (Aliyun mirror)
  yum_repository:
    name: kubernetes
    description: Kubernetes
    baseurl: "https://mirrors.aliyun.com/kubernetes-new/core/stable/v{{ kubernetes_version }}/rpm/"
    enabled: yes
    gpgcheck: yes
    gpgkey: "https://mirrors.aliyun.com/kubernetes-new/core/stable/v{{ kubernetes_version }}/rpm/repodata/repomd.xml.key"
  when: ansible_os_family == "RedHat"

2、安装组件

kubelet:节点专属代理服务,与APIServer长轮询通信;

kubeadm:worker加入集群、升级、重置;

kubectl:集群运行本不依赖,但全节点安装以方便调试,也方便运维脚本调用kubectl与APIServer交互,当master节点临时故障时也可以从任意节点连接集群作为应急操作入口,但切忌不要把高权限kubeconfig文件放在各个节点上,要合理规划权限。

- name: Install kubelet, kubeadm, kubectl (latest in version series)
  yum:
    name:
      - "kubelet-{{ kubernetes_version }}*"
      - "kubeadm-{{ kubernetes_version }}*"
      - "kubectl-{{ kubernetes_version }}*"
    state: latest
    update_cache: yes
  when: ansible_os_family == "RedHat"

3、配置开机自启

这里可能有一个问题,但也没什么大的影响。由于kubelet还没有配置文件,那么必定会启动失败,为什么还要尝试启动一下?原因如下:

①在手动安装的过程中,提前启动一次可以发现一些潜在问题,比如二进制文件损坏、依赖确实、Systemd unit文件路径错误等,而不是等到后面初始化的时候才发现kubelet其实没有装好;

②让systemd进入“预管理”状态,当启动kubelet时,即使它立刻退出,Systemd也会把它纳入管理,每隔几秒自动尝试重启,那么后续执行kubeadm init或kubeadm jion生成配置文件后,kubelet会在下一次自动重试时立即成功启动,无需手动启动;

Ansible中的failed_when:false的作用:Ansible默认遇到Systemd启动失败会中断整个playbook,通过此参数忽略预期的启动失败,继续后续任务。

- name: Reload systemd daemon
  systemd:
    daemon_reload: yes

- name: Enable kubelet service
  systemd:
    name: kubelet
    enabled: yes

# 由于缺少 kubelet 配置文件,首次启动会失败,此行为符合预期
- name: Attempt to start kubelet (expected to fail before kubeadm init)
  systemd:
    name: kubelet
    state: started
  failed_when: false

更多推荐