#k8s#  #Asible#

1、为什么安装containerd之后还要手动创建创建其配置目录、导出配置文件?

在使用yum安装containerd的过程中,发现一个细节:这个过程主要把一些二进制文件、systemd service文件等放到了系统路径下(如/usr/bin/containerd、/usr/lib/systemd/system/containerd.service)。containerd的默认配置内嵌在二进制文件中,启动时如果不指定配置文件,它会直接用内置默认值运行;

而在k8s场景下,必须显示导出并修改配置,要做的事情有两个:①确保/etc/containerd目录存在;②containerd config default > /etc/containerd/config.toml,把内置默认配置落盘,以便后续修改。为什么要这样做?

原因主要是k8s的部署需求与containerd的通用默认值之间存在不匹配,必须通过配置文件进行桥接。主要体现在:①k8s默认使用SystemdCgroup驱动,containerd默认使用cgroupfs,如果两者不一致,会导致kubelet和containerd使用不同的Cgroup管理同一个容器,导致资源限制不生效、容器启动失败等;②Pause镜像,创建Pod时,containerd需要拉取Pause容器,所有需要改为国内可访问的镜像;③containerd的二进制文件里的默认配置存在一个问题,containerd进程启动时若不指定--config,它就会用内存里的默认值运行,但这些默认值是编译时固化的,只有导出文件、落盘后,才能手动编辑去覆盖这些默认值,然后让containerd加载这个外部配置文件。

2、两个关键模块

overlay:提供OverlayFS文件系统支持。containerd使用OverlayFS作为镜像蹭和容器可写层的存储驱动,没有它容器无法启动。

br_netfilter:允许iptables/ip6tables对网桥上的流量进行过滤。k8s的kube-proxy和CNI插件依赖它来实现service负载均衡、网络策略和bridge-nf-call-iptables功能。

3、配置文件

# roles/containerd/tasks/main.yml

- name: Add Docker CE yum repository
  command: yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  args:
    creates: /etc/yum.repos.d/docker-ce.repo

- name: Install or update docker-ce and containerd
  yum:
    name:
      - docker-ce
      - containerd
    state: latest
    update_cache: yes

- name: Configure containerd kernel modules
  copy:
    dest: /etc/modules-load.d/containerd.conf
    content: |
      overlay
      br_netfilter
    mode: '0644'

- name: Load overlay kernel module
  command: modprobe overlay

- name: Load br_netfilter kernel module
  command: modprobe br_netfilter

- name: Configure sysctl for Kubernetes CRI
  sysctl:
    name: "{{ item.name }}"
    value: "{{ item.value }}"
    state: present
    sysctl_file: /etc/sysctl.d/99-kubernetes-cri.conf
    reload: yes
  loop:
    - { name: "net.bridge.bridge-nf-call-iptables", value: "1" }
    - { name: "net.ipv4.ip_forward", value: "1" }
    - { name: "net.bridge.bridge-nf-call-ip6tables", value: "1" }

- name: Create containerd config directory
  file:
    path: /etc/containerd
    state: directory
    mode: '0755'

- name: Generate default containerd config
  shell: containerd config default > /etc/containerd/config.toml
  args:
    creates: /etc/containerd/config.toml

- name: Configure systemd cgroup driver for containerd
  replace:
    path: /etc/containerd/config.toml
    regexp: 'SystemdCgroup = false'
    replace: 'SystemdCgroup = true'

- name: Configure pause image mirror (k8s.gcr.io)
  replace:
    path: /etc/containerd/config.toml
    regexp: 'k8s.gcr.io/pause'
    replace: 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause'

- name: Configure pause image mirror (registry.gcr.io)
  replace:
    path: /etc/containerd/config.toml
    regexp: 'registry.gcr.io/pause'
    replace: 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause'

- name: Configure pause image mirror (registry.k8s.io)
  replace:
    path: /etc/containerd/config.toml
    regexp: 'registry.k8s.io/pause'
    replace: 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause'

- name: Start and enable containerd
  systemd:
    name: containerd
    state: started
    enabled: yes
    daemon_reload: yes

- name: Configure crictl
  copy:
    dest: /etc/crictl.yaml
    content: |
      runtime-endpoint: unix:///run/containerd/containerd.sock
      image-endpoint: unix:///run/containerd/containerd.sock
      timeout: 10
      debug: false
    mode: '0644'

补充:在使用Ansible的command和shell模块时,可以配合args.creates或args.removes,如果某个文件存在(creates参数),则跳过要执行的命令,相反,removes则是当某个文件不存在时进行跳过。

更多推荐