k8s集群自动化部署02——通过Ansible自动化部署containerd
#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则是当某个文件不存在时进行跳过。
更多推荐
所有评论(0)