119.ansible自动安装k8s集群、增加node节点、升级集群、备份和恢复

 

 

使用ansable(以二进制的方式)自动的去安装集群

 

kubernetes集群构建 - new

笔记本: 新课程笔记

创建时间: 2018/9/5 星期三 上午 9:58 更新时间: 2018/10/12 星期五 下午 6:35

作者: 306798658@qq.com

URL: https://github.com/gjmzj/kubeasz/blob/master/docs/00-%E9%9B%86%E7%BE%A4%E8%A7%84%E5%88%9…

 

本文档参考 https://github.com/gjmzj/kubeasz

扩展(官方kubeadm安装,也是自动化的): 使用kubeadm部署集群 https://blog.frognew.com/2018/08/kubeadm-install-kubernetes-1.11.html

软硬件限制:

1)cpu和内存 master:至少1c2g,推荐2c4g;node:至少1c2g

2)linux系统 内核版本至少3.10,推荐CentOS7/RHEL7

3)docker 至少1.9版本,推荐1.12+

4)etcd 至少2.0版本,推荐3.0+

kubernetes官方github地址 https://github.com/kubernetes/kubernetes/releases

高可用集群所需节点规划:

部署节点------x1 : 运行这份 ansible 脚本的节点

etcd节点------x3 : 注意etcd集群必须是1,3,5,7...奇数个节点(一个或3个或5个或7个)

master节点----x2 : 根据实际集群规模可以增加节点数,需要额外规划一个master VIP(虚地址)

lb节点--------x2 : 负载均衡节点两个,安装 haproxy+keepalived

node节点------x3 : 真正应用负载的节点,根据需要提升机器配置和增加节点数

机器规划:

ip 主机名 角色

192.168.208.133(134) aming-master deploy、master1、lb1、etcd

192.168.208.134(135) aming-node1 etcd、node

192.168.208.135(136) aming-node2 etcd、node

192.168.208.136(128) aming-master2 master2、lb2

172.7.15.118(150) vip

准备工作

四台机器,全部执行:

yum install -y epel-release #安装epel扩展源

yum update

yum install -y python #安装python

deploy节点安装和准备ansible

yum install -y python-pip git #这里使用的pip来安装ansible,也可以用之前学过的yum安装

pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #升级pip源

pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #安装ansible

deploy节点配置免密码登录

1)ssh-keygen 生产密钥 #因为使用ansible传文件或使用命令,要登录到机器上去。所以要做秘钥认证

2)for ip in 128 134 136; do ssh-copy-id 192.168.208.$ip; done #注意实际IP

deploy上编排k8s

git clone https://github.com/gjmzj/kubeasz.git #把k8s这个项目克隆下来

mkdir -p /etc/ansible

mv kubeasz/* /etc/ansible/ #把项目放在新建的文件夹里

从百度云网盘下载二进制文件 https://pan.baidu.com/s/1c4RFaA#list/path=%2F #到这里下载二进制文件的tar包

可以根据自己所需版本,下载对应的tar包,这里我下载1.11

经过一番折腾,最终把k8s.1-11-2.tar.gz的tar包放到了depoly上

tar zxvf k8s.1-11-2.tar.gz #解压后就是一个bin目录

mv bin/* /etc/ansible/bin/ #里面都是可执行的文件(直接拿来用的)

配置集群参数

cd /etc/ansible/

cp example/hosts.m-masters.example hosts //根据实际情况修改IP地址

[deploy]

172.7.15.113 NTP_ENABLED=no

[etcd]

172.7.15.113 NODE_NAME=etcd1

172.7.15.114 NODE_NAME=etcd2

172.7.15.115 NODE_NAME=etcd3

[kube-master]

172.7.15.113

172.7.15.116

[lb]

172.7.15.113 LB_IF="eno16777736" LB_ROLE=backup # 注意根据实际使用网卡设置 LB_IF变量

172.7.15.116 LB_IF="ens33" LB_ROLE=master

[kube-node]

172.7.15.114

172.7.15.115

 

修改完hosts,测试

ansible all -m ping

分步骤安装:

1)创建证书和安装准备

ansible-playbook 01.prepare.yml #这一步就是创建证书,因为他的通信走的是https

2)安装etcd集群

ansible-playbook 02.etcd.yml

检查etcd节点健康状况:

for ip in 128 129 130 ; do ETCDCTL_API=3 etcdctl --endpoints=https://192.168.111.$ip:2379 --

cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint healt; done #如果显示etcdctl命令未找到,要执行一下bash,因为在拷贝的时候虽然已经过去了,但还没生效。只有出现如下图,才证明你的etcd集群正常:

3)安装docker

ansible-playbook 03.docker.yml

4)安装master节点

ansible-playbook 04.kube-master.yml

kubectl get componentstatus //查看集群状态 #显示一下结果为没问题

NAME STATUS MESSAGE ERROR

scheduler Healthy ok

controller-manager Healthy ok

etcd-1 Healthy {"health":"true"}

etcd-2 Healthy {"health":"true"}

etcd-0 Healthy {"health":"true"}

5)安装node节点

ansible-playbook 05.kube-node.yml

查看node节点

kubectl get nodes

6)部署集群网络

ansible-playbook 06.network.yml

kubectl get pod -n kube-system //查看kube-system namespace上的pod,从中可以看到flannel相关的pod

7)安装集群插件(dns, dashboard)

ansible-playbook 07.cluster-addon.yml

查看kube-system namespace下的服务

kubectl get svc -n kube-system

# 一步安装 #可把上面7个步骤一次性安装执行

ansible-playbook 90.setup.yml

查看集群信息:

kubectl cluster-info

查看node/pod使用资源情况:

kubectl top node

kubectl top pod --all-namespaces

测试DNS

a)创建nginx service

kubectl run nginx --image=nginx --expose --port=80 #用这个命令快速的跑一个nginx的service

b)创建busybox 测试pod

kubectl run busybox --rm -it --image=busybox /bin/sh //进入到busybox内部 #加rm的目的是当我们退出他的时候,直接把这个容器销毁

nslookup nginx.default.svc.cluster.local //结果如下

Server: 10.68.0.2

Address: 10.68.0.2:53

Name: nginx.default.svc.cluster.local

Address: 10.68.9.156

增加node节点

1)deploy节点免密码登录node

ssh-copy-id 新node ip

2)修改/etc/ansible/hosts

[new-node]

172.7.15.117

3)执行安装脚本

ansible-playbook /etc/ansible/20.addnode.yml

4)验证

kubectl get node

kubectl get pod -n kube-system -o wide

5)后续工作

修改/etc/ansible/hosts,将new-node里面的所有ip全部移动到kube-node组里去

增加master节点(略)

https://github.com/gjmzj/kubeasz/blob/master/docs/op/AddMaster.md

升级集群

1)备份etcd

ETCDCTL_API=3 etcdctl snapshot save backup.db

查看备份文件信息

ETCDCTL_API=3 etcdctl --write-out=table snapshot status backup.db

2)到本项目的根目录kubeasz

cd /dir/to/kubeasz

拉取最新的代码

git pull origin master

3)下载升级目标版本的kubernetes二进制包(百度网盘https://pan.baidu.com/s/1c4RFaA#list/path=%2F)

解压,并替换/etc/ansible/bin/下的二进制文件

4)docker升级(略),除非特别需要,否则不建议频繁升级docker

5)如果接受业务中断,执行:

ansible-playbook -t upgrade_k8s,restart_dockerd 22.upgrade.yml

6)不能接受短暂中断,需要这样做:

a)ansible-playbook -t upgrade_k8s 22.upgrade.yml

b)到所有node上逐一:

kubectl cordon和kubectl drain //迁移业务pod

systemctl restart docker

kubectl uncordon //恢复pod

备份和恢复

备份的思路最主要的是备份他的配置,比如有哪些service,有哪些deployment,有哪些pod

恢复就是把相关的各种资源给他恢复回去,当然前提是要搭建一个这样的集群,恢复的也是配置,会重新去下载相应的镜像

1)备份恢复原理:

备份,从运行的etcd集群中备份数据到磁盘文件

恢复,把etcd的备份文件恢复到etcd集群中,然后据此重建整个集群

2)如果使用kubeasz项目创建的集群,除了备份etcd数据外,还需要备份CA证书文件,以及ansible的hosts文件

3)手动操作步骤:

mkdir -p /backup/k8s //创建备份目录

ETCDCTL_API=3 etcdctl snapshot save /backup/k8s/snapshot.db //备份etcd数据

cp /etc/kubernetes/ssl/ca* /backup/k8s/ //备份ca证书

deploy节点执行 ansible-playbook /etc/ansible/99.clean.yml //模拟集群崩溃 #此处注意,模拟崩溃的时候会将备份的backup目录一并删除,需要另外在备份(cp)一份

恢复步骤如下(在deploy节点):

a)恢复ca证书

mkdir -p /etc/kubernetes/ssl

cp /backup/k8s/ca* /etc/kubernetes/ssl/

b)重建集群

cd /etc/ansible

ansible-playbook 01.prepare.yml

ansible-playbook 02.etcd.yml

ansible-playbook 03.docker.yml

ansible-playbook 04.kube-master.yml

ansible-playbook 05.kube-node.yml

c)恢复etcd数据

停止服务

ansible etcd -m service -a 'name=etcd state=stopped'

清空文件

ansible etcd -m file -a 'name=/var/lib/etcd/member/ state=absent'

登录所有的etcd节点,参照本etcd节点/etc/systemd/system/etcd.service的服务文件,替换如下{{}}中变量后执行 #每个节点都要去执行

cd /backup/k8s/

ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \

--name etcd1 \

--initialcluster etcd1=https://192.168.111.128:2380,etcd2=https://192.168.111.129:2380,etcd3=https://192.168.111.130:2380

\ #后面的这些https是从/etc/systemd/system/etcd.service这个文件里拷贝的

--initial-cluster-token etcd-cluster-0 \

--initial-advertise-peer-urls https://192.168.111.128:2380

执行上面的步骤后,会生成{{ NODE_NAME }}.etcd目录

cp -r etcd1.etcd/member /var/lib/etcd/

systemctl restart etcd

d)在deploy节点重建网络

ansible-playbook /etc/ansible/tools/change_k8s_network.yml

4)不想手动恢复,可以用ansible自动恢复

需要一键备份:

ansible-playbook /etc/ansible/23.backup.yml

检查/etc/ansible/roles/cluster-backup/files目录下是否有文件

tree /etc/ansible/roles/cluster-backup/files/ //如下

├── ca # 集群CA 相关备份

│ ├── ca-config.json

│ ├── ca.csr

│ ├── ca-csr.json

│ ├── ca-key.pem

│ └── ca.pem

├── hosts # ansible hosts备份

│ ├── hosts # 最近的备份

│ └── hosts-201807231642

├── readme.md

└── snapshot # etcd 数据备份

├── snapshot-201807231642.db

└── snapshot.db # 最近的备份

模拟故障:

ansible-playbook /etc/ansible/99.clean.yml

修改文件/etc/ansible/roles/cluster-restore/defaults/main.yml,指定要恢复的etcd快照备份,如果不修改就是最新的一次

恢复操作:

ansible-playbook /etc/ansible/24.restore.yml

ansible-playbook /etc/ansible/tools/change_k8s_network.yml

转载于:https://my.oschina.net/u/3866149/blog/3056433

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Ansible 的 time 模块来计算集群节点之间的时间差。 首先,在 Ansible 控制节点上创建一个 playbook 文件,比如叫做 `time_diff.yml`,内容如下: ```yaml - hosts: k8s_nodes gather_facts: false tasks: - name: Get current time set_fact: current_time: "{{ ansible_date_time.epoch }}" - name: Get remote time shell: date +%s register: remote_time - name: Calculate time difference set_fact: time_diff: "{{ current_time - remote_time.stdout|int }}" - name: Print time difference debug: msg: "Time difference with {{ inventory_hostname }} is {{ time_diff }} seconds." ``` 在这个 playbook 中,我们首先使用 `set_fact` 模块获取当前时间,并将其保存在 `current_time` 变量中。然后,使用 `shell` 模块在远程节点上执行 `date +%s` 命令,获取远程节点的当前时间,并将其保存在 `remote_time` 变量中。接着,使用 `set_fact` 模块计算时间差,并将其保存在 `time_diff` 变量中。最后,使用 `debug` 模块打印时间差。 注意,这个 playbook 需要在 k8s_nodes 组内的所有节点上执行,因此需要在 inventory 文件中定义这个组,比如: ``` [k8s_nodes] node1 ansible_host=192.168.1.101 node2 ansible_host=192.168.1.102 node3 ansible_host=192.168.1.103 ``` 然后执行 playbook: ```bash ansible-playbook -i inventory.txt time_diff.yml ``` 执行完后,你应该可以看到类似于这样的输出: ``` ok: [node1] => { "msg": "Time difference with node1 is 0 seconds." } ok: [node2] => { "msg": "Time difference with node2 is 2 seconds." } ok: [node3] => { "msg": "Time difference with node3 is -1 seconds." } ``` 这表示在 node1 上执行 playbook 时,node1 的时间与当前时间相同,因此时间差为 0。在 node2 上执行 playbook 时,node2 的时间比当前时间慢了 2 秒,因此时间差为 2。在 node3 上执行 playbook 时,node3 的时间比当前时间快了 1 秒,因此时间差为 -1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值