ansible自动化部署k8s集群

author author     2022-12-14     378

关键词:

一、Ansible自动化部署K8S集群

1.1 Ansible介绍

Ansible 是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible 适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境。Ansible 也是一种简单的自动化语言,可以完美地描述IT应用程序基础结构。

具备以下三个特点:

  • 简单:减少学习成本
  • 强大:协调应用程序生命周期
  • 无代理:可预测,可靠和安全

使用文档:​​https://releases.ansible.com/ansible/​

安装 Ansible:

yum -y install ansible

Ansible自动化部署K8S集群_IT

  • Inventory:Ansible管理的主机信息,包括IP地址、SSH端口、账号、密码等
  • Modules:任务均有模块完成,也可以自定义模块,例如经常用的脚本。
  • Plugins:使用插件增加Ansible核心功能,自身提供了很多插件,也可以自定义插件。例如connection插件,用于连接目标主机。
  • Playbooks:“剧本”,模块化定义一系列任务,供外部统一调用。Ansible核心功能。

1.2 主机清单

[webservers]
192.168.20.232
192.168.20.233
192.168.20.234
192.168.20.235
192.168.20.236

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.232
10.25.1.233
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 20100 root@192.168.20.231
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 20100 root@192.168.20.232
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 20100 root@192.168.20.23
chown 0700 -R /root/.ssh/
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
chown root.root -R /root/.ssh/
cd /root/.ssh/

sed -i "s/#host_key_checking = .*/host_key_checking = False/g" /etc/ansible/ansible.cfg

1.3 命令行使用

1、连接远程主机认证

SSH密码认证:

[webservers]
192.168.20.232:20100 ansible_ssh_user=root ansible_ssh_pass=’200271200’
192.168.20.233:20100 ansible_ssh_user=root ansible_ssh_pass=’200271200’
192.168.20.234:20100 ansible_ssh_user=root ansible_ssh_port=’200271200’

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57

SSH密钥对认证:

[webservers]
10.206.240.111:22 ansible_ssh_user=root ansible_ssh_key=/root/.ssh/id_rsa
10.206.240.112:22 ansible_ssh_user=root

也可以在配置文件中指定:
[defaults]
private_key_file = /root/.ssh/id_rsa # 默认路径

2、常用选项

选项

描述

-C, --check

运行检查,不执行任何操作

-e EXTRA_VARS,--extra-vars=EXTRA_VARS

设置附加变量 key=value

-u REMOTE_USER, --user=REMOTE_USER

SSH连接用户,默认None

-k, --ask-pass

SSH连接用户密码

-b, --become

提权,默认root

-K, --ask-become-pass

提权密码

3、命令行使用

ansible all -m ping
ansible all -m shell -a "ls /root" -u root -k

1.4 常用模块

ansible-doc –l 查看所有模块

ansible-doc –s copy 查看模块文档

1、shell

在目标主机执行shell命令。

- name: 将命令结果输出到指定文件
shell: somescript.sh >> somelog.txt
- name: 切换目录执行命令
shell:
cmd: ls -l | grep log
chdir: somedir/
- name: 编写脚本
shell: |
if [ 0 -eq 0 ]; then
echo yes > /tmp/result
else
echo no > /tmp/result
fi
args:
executable: /bin/bash

2、copy

将文件复制到远程主机。

- name: 拷贝文件
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u=rw,g=r,o=r
# mode: u+rw,g-wx,o-rwx
# mode: 0644
backup: yes

3、file

管理文件和文件属性。

- name: 创建目录
file:
path: /etc/some_directory
state: directory
mode: 0755
- name: 删除文件
file:
path: /etc/foo.txt
state: absent
- name: 递归删除目录
file:
path: /etc/foo
state: absent

present,latest:表示安装

absent:表示卸载

4、yum

软件包管理。

ansible webservers -m yum -a "name=http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm state=present"


ansible webservers -m systemd -a "name=http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm state=restarted enabled=yes"






- name: 安装最新版apache
yum:
name: httpd
state: latest
- name: 安装列表中所有包
yum:
name:
- nginx
- postgresql
- postgresql-server
state: present
- name: 卸载apache包
yum:
name: httpd
state: absent
- name: 更新所有包
yum:
name: *
state: latest
- name: 安装nginx来自远程repo
yum:
name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
state: present

5、service/systemd

管理服务。

- name: 服务管理
service:
name: httpd
state: started
#state: stopped
#state: restarted
#state: reloaded
- name: 设置开机启动
service:
name: httpd
enabled: yes

6、unarchive

- name: 解压
unarchive:
src=test.tar.gz
dest=/tmp

7、debug

执行过程中打印语句。

- debug:
msg: System inventory_hostname has uuid ansible_product_uuid

- name: 显示主机已知的所有变量
debug:
var: hostvars[inventory_hostname]
verbosity: 4

1.5 变量

变量是应用于多个主机的便捷方式; 实际在主机执行之前,变量会对每个主机添加,然后在执行中引用。

1、主机变量与组变量

[webservers]
192.168.1.100 ansible_ssh_user=root hostname=web1
192.168.1.100 ansible_ssh_user=root hostname=web2

[webservers:vars]
ansible_ssh_user=root hostname=web1

2、Register变量

- shell: /usr/bin/uptime
register: result
- debug:
var: result
verbosity: 2

1.6 Playbook

Playbooks是Ansible的配置,部署和编排语言。他们可以描述您希望在远程机器做哪些事或者描述IT流程中一系列步骤。使用易读的YAML格式组织Playbook文件。

如果Ansible模块是您工作中的工具,那么Playbook就是您的使用说明书,而您的主机资产文件就是您的原材料。

与adhoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。

​https://docs.ansible.com/ansible/latest/user_guide/playbooks.html​

---
- hosts: webservers
vars:
http_port: 80
server_name: www.ctnrs.com
remote_user: root
gather_facts: false
tasks:
- name: 安装nginx最新版
yum: pkg=nginx state=latest
- name: 写入nginx配置文件
template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: 确保nginx正在运行
service: name=httpd state=started
handlers:
- name: restart nginx
service: name=nginx state=reloaded

1、主机和用户

- hosts: webservers
remote_user: root
become: yes
become_user: lizhenliang

2、定义变量

Ansible中的首选做法是不将变量存储在Inventory中。

除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。

- hosts: webservers
vars:
http_port: 80
server_name: www.ctnrs.com

3、任务列表

每个play包含一系列任务。这些任务按照顺序执行,在play中,所有主机都会执行相同的任务指令。play目的是将选择的主机映射到任务。

tasks:
- name: 安装nginx最新版
yum: pkg=nginx state=latest

4、语法检查与调试

语法检查:ansible-playbook --check /path/to/playbook.yaml

测试运行,不实际操作:ansible-playbook -C /path/to/playbook.yaml

debug模块在执行期间打印语句,对于调试变量或表达式,而不必停止play。与when:指令一起调试更佳。

- hosts: webserver
tasks:
- debug:
msg: group_names
- debug:
msg: inventory_hostname
- debug:
msg: ansible_hostname

5、任务控制

如果你有一个大的剧本,那么能够在不运行整个剧本的情况下运行特定部分可能会很有用。

tasks:
- name: 安装nginx最新版
yum: pkg=nginx state=latest
tags: install
- name: 写入nginx配置文件
template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
tags: config

使用:

ansible-playbook example.yml --tags "install"
ansible-playbook example.yml --tags "install,config"
ansible-playbook example.yml --skip-tags "install"

6、流程控制

条件:

tasks:
- name: 只在192.168.1.100运行任务
debug: msg="ansible_default_ipv4.address"
when: ansible_default_ipv4.address == 192.168.1.100

循环:

tasks:
- name: 批量创建用户
user: name= item state=present groups=wheel
with_items:
- testuser1
- testuser2
- name: 解压
copy: src= item dest=/tmp
with_fileglob:
- "*.txt"

常用循环语句:

语句

描述

with_items

标准循环

with_fileglob

遍历目录文件

with_dict

遍历字典

7、模板

tasks:
- name: 写入nginx配置文件
template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf

定义变量

% set local_ip = inventory_hostname %

条件和循环

% set list=[one, two, three] %
% for i in list %
% if i == two %
-> two
% elif loop.index == 3 %
-> 3
% else %
i
% endif %
% endfor %

例如:生成连接etcd字符串

% for host in groups[etcd] %
https:// hostvars[host].inventory_hostname :2379
% if not loop.last %,% endif %
% endfor %

里面也可以用ansible的变量。

1.7 Roles

Roles是基于已知文件结构自动加载某些变量文件,任务和处理程序的方法。按角色对内容进行分组,适合构建复杂的部署环境。

1、定义Roles

Roles目录结构:

site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
  • ​tasks​​ -包含角色要执行的任务的主要列表。
  • ​handlers​​ -包含处理程序,此角色甚至在此角色之外的任何地方都可以使用这些处理程序。
  • ​defaults​​-角色的默认变量
  • ​vars​​-角色的其他变量
  • ​files​​ -包含可以通过此角色部署的文件。
  • ​templates​​ -包含可以通过此角色部署的模板。
  • ​meta​​-为此角色定义一些元数据。请参阅下面的更多细节。

通常的做法是从​​tasks/main.yml​​文件中包含特定于平台的任务:

# roles/webservers/tasks/main.yml
- name: added in 2.4, previously you used include
import_tasks: redhat.yml
when: ansible_facts[os_family]|lower == redhat
- import_tasks: debian.yml
when: ansible_facts[os_family]|lower == debian

# roles/webservers/tasks/redhat.yml
- yum:
name: "httpd"
state: present

# roles/webservers/tasks/debian.yml
- apt:
name: "apache2"
state: present

2、使用角色

# site.yml
- hosts: webservers
roles:
- common
- webservers


定义多个:
- name: 0
gather_facts: false
hosts: all
roles:
- common

- name: 1
gather_facts: false
hosts: all
roles:
- webservers

3、角色控制

- name: 0.系统初始化
gather_facts: false
hosts: all
roles:
- common
tags: common

4、定义变量

组变量:

group_vars 存放的是组变量

group_vars/all.yml 表示所有主机有效,等同于[all:vars]

grous_vars/etcd.yml 表示etcd组主机有效,等同于[etcd:vars]

1.8 自动化部署K8S(离线版)

1、 熟悉二进制部署K8S步骤

  1. 服务器规划

角色

IP

组件

k8s-master1

192.168.31.61

kube-apiserver kube-controller-manager kube-scheduler etcd

k8s-master2

192.168.31.62

kube-apiserver kube-controller-manager kube-scheduler

k8s-node1

192.168.31.63

kubelet kube-proxy docker etcd

k8s-node2

192.168.31.66

kubelet kube-proxy docker etcd

Load Balancer(Master)

192.168.31.61 192.168.31.60 (VIP)

nginx keepalived

Load Balancer(Backup)

192.168.31.62

nginx keepalived

  1. 系统初始化
  2. Etcd集群部署
  1. 生成etcd证书
  2. 部署三个Etc集群
  3. 查看集群状态
  1. 部署Master
  1. 生成apiserver证书
  2. 部署apiserver、controller-manager和scheduler组件
  3. 启动TLS Bootstrapping
  1. 部署Node
  1. 安装Docker
  2. 部署kubelet和kube-proxy
  3. 在Master上允许为新Node颁发证书
  4. 授权apiserver访问kubelet
  1. 部署插件(准备好镜像)
  1. Flannel
  2. Web UI
  3. CoreDNS
  4. Ingress Controller
  1. Master高可用
  1. 增加Master节点(与Master1一致)
  2. 部署Nginx负载均衡器
  3. Nginx+Keepalived高可用
  4. 修改Node连接VIP

2、Roles组织K8S各组件部署解析

编写建议:

  1. 梳理流程和Roles结构
  2. 如果配置文件有不固定内容,使用jinja渲染
  3. 人工干预改动的内容应统一写到一个文件中

3、下载所需文件

确保所有节点系统时间一致

下载Ansible部署文件:

git clone https://github.com/lizhenliang/ansible-install-k8s
cd ansible-install-k8s


4、修改Ansible文件

修改hosts文件,根据规划修改对应IP和名称。

vi hosts

修改group_vars/all.yml文件,修改软件包目录和证书可信任IP。

vim group_vars/all.yml
software_dir: /root/binary_pkg
...
cert_hosts:
k8s:
etcd:

5、一键部署

架构图

Ansible自动化部署K8S集群_Ansible_02

单Master架构

Ansible自动化部署K8S集群_IT_03

多Master架构

部署命令 单Master版:

ansible-playbook -i hosts single-master-deploy.yml -uroot -k

多Master版:

ansible-playbook -i hosts multi-master-deploy.yml -uroot -k

6、部署控制

如果安装某个阶段失败,可针对性测试.

例如:只运行部署插件

ansible-playbook -i hosts single-master-deploy.yml -uroot -k --tags addons

示例参考:​​https://github.com/ansible/ansible-examples​


ansible+kubeasz二进制部署k8s高可用集群方案

K8S架构图基础环境配置类型服务器IP地址备注Ansible(2台)192.168.15.101/102K8S集群部署服务器,可以和Master节点在共用K8sMaster(2台)192.168.15.101/102K8S控制端,通过一个VIP做主备高可用Harbor(2台)192.168.15.103/104高可用镜像服务器Etcd(最少3台)19... 查看详情

ansible搭建k8s说明

...一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。之前部署K8S集群都是参照文档逐步执行完成的,需要大量时间且部署过程中会出现各种各样的问题,本篇文章以kubernetes1.14.... 查看详情

ansible+kubeasz二进制部署k8s高可用集群方案

K8S架构图基础环境配置类型服务器IP地址备注Ansible(2台)192.168.15.101/102K8S集群部署服务器,可以和Master节点在共用K8sMaster(2台)192.168.15.101/102K8S控制端,通过一个VIP做主备高可用Harbor(2台)192.168.15.103/104高可用镜像服务器Etcd(最少3台)19... 查看详情

ansible部署kbuernetes

K8S集群架构:一个K8S集群是由两大部分组成:Master节点和Node节点一.Master节点主要包括APIServer、Scheduler、Controllermanager、etcd几大组件1.APIServer(提供其他模块之间的数据交互和通信的枢纽(其他模块通过APIServer查询或修改数据,... 查看详情

02.使用ansible自动化部署redis集群

参考技术Aansible作为一款自动化软件工具,不需要修改配置文件就可以直接启动ansible的目录结构:官方地址:官方的目录定义:根据官方的目录规划,依次创建目录: 查看详情

k8s(v1.25.1)高可用集群(3master+5node)ansible剧本部署(cri使用docker,cri-docker)(代码片段)

写在前面分享一个k8s高可用集群部署的Ansible剧本以及涉及到的一些工具的安装博文内容涉及:从零开始一个k8s高可用集群部署Ansible剧本编写,编写后搭建k8s高可用集群一些集群常用的监控,备份工具安装,包括&#... 查看详情

部署k8s集群

1.Kubernetes1.1.概念 kubernetes(通常称为k8s)用于自动部署、扩展和管理容器化应用程序的开源系统。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。支持一系列容器工具 ,包括Docker等。1.2.特点... 查看详情

k8s

...称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案。在Docker技术的基础上,为容器化的应用提供部署运行... 查看详情

ansible自动化部署50-100台规模企业级架构

1、项目规划:搭建50-100台规模的集群实战设计方案2、利用多台服务器进行cobbler无人值守装机3、管理机(yum,rpm,ntp,pptp,jumpserver,sshkey,ansible,saltstack)4、搭建backup(rsync这个集群定时备份)5、共享存储nfs01(nfs服务、实时同步(sersync+rs... 查看详情

k8s的基础概念

...,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。K8S用于容器化应用程序的部署,扩展和管理。K8S提供了... 查看详情

kubernetes系列03—kubeadm安装部署k8s集群

...法) 优点:你只要安装kubeadm即可;kubeadm会帮你自动部署安装K8S集群;如:初始化K8S集群、配置各个插件的证书认证、部署集群网络等。安装简易。 缺点: 查看详情

kubernetes概述和kubeadm方式集群搭建(代码片段)

...络插件(CNI)6.测试kubernetes集群kubernetes概述K8S是自动化运维管理容器化程序K8S是谷歌在2014年用go语言开发的容器化集群管理系统使用K8S进行容器化应用部署使用K8S有利于应用扩展K8S目标实施让部署容器化应用简洁和高效k... 查看详情

jenkins+ansible+gitlab自动化部署三剑客--ansible

Ansible简介Ansible是一个开源部署工具开发语言:python特点:SSH协议通讯,全平台,无需编译,模块化部署管理作用:推送Playbook进行远程节点快速部署Ansible与Chef,Saltstack的区别Chef  Ruby语言编写,C/S架构,配置需要Git依赖,Recipe... 查看详情

期中集群架构-第六章-ansible批量管理服务介绍

...====01.批量管理服务知识介绍aansible是一个基于Python开发的自动化运维工具bansible是一个基于SSH协议实现远程管理的工具cansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)02.特... 查看详情

k8s安装部署(代码片段)

...系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。快速部署应用快速扩展应用无缝对接新的应用功能节省资源,优化硬件资源的使用Kubernetes特点可移植:支持公有云,私有云&#... 查看详情

ansible三节点部署k8s(代码片段)

一、部署环境VMwareWorkstation10centos7二、主机配置主机名ipcpurammaster192.168.137.1012Gnode1192.168.137.1112Gnode2192.168.137.1212G     1、每台主机在/etc/hosts添加以下内容:2、对三台主机进行免密设置:1)、CentOS7默认没有启动 查看详情

《linux运维实战:centos7.6基于ansible一键离线部署elasticsearch7.6.2容器版分布式集群》(代码片段)

...,针对业务系统的特性,我这边编写了基于ansible自动化工具,一键远程离线部署elasticsearch容器版集群,当然也会编写二进制版本,敬请期待吧!说明:如果有兴趣,可以从工具下载中获取下载链接... 查看详情

ansible部署elk集群

一、安装ansible1)配置自己的yum源[root@node-4~]#cat/etc/yum.repos.d/local.repo[centos]name=centosbaseurl=http://192.168.100.20/openstack/centosgpgcheck=0enabeld=1[ansible]name=ansi 查看详情