# Edu_devops **Repository Path**: zhangshunping123/Edu_devops ## Basic Information - **Project Name**: Edu_devops - **Description**: 自动化部署Educoder本地版代码仓库 golang,python,shell - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-01-10 - **Last Updated**: 2021-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Edu_devops [TOC] ### 介绍 Ansible 自动化离线部署Educoder本地版 。 - 本地版离线安装目前默认支持 centos7.6的离线安装 - 本地版部署,提供的linux主机,需要将系统盘和数据盘分开,**其中数据盘为/data目录** - 如果需要部署vnc,jupter,ssh连入到容器内部的需求,则需要开放webssh端口和相对应的k8s master的40000-60000端口. ### 软件架构说明 #### 本地版部署说明 ##### 支持三种模式 - single模式,及单点服务 - Mutile模式,及高可用分布部署(多台应用) ![输入图片说明](r.assets/094526_15984969_5598946.png "屏幕截图.png") - OnlyWeb模式,及只部署web应用的高可用架构,不需要提供本地版实训环境 ##### 服务应用版本 ``` 中间层后端 1.tomcat 版本 8.5.11.0 2.webssh 3.kubenrnetes 集群 版本 v1.12.2 4.docker 版本 v18.06.0-ce ------------------------------------------- 存储: 4.nfs 版本 v4 5.redis 版本 v3.0.6 6.mysql 版本 v5.6.16-1 7.EleasticSearch 版本 v6.7.0 8.git服务器 版本 自研v2 ------------------------------------------- 应用: 9.web nginx+rails( nginx 版本 v1.14 ;rails 版本 v5.2.3) ------------------------------------------- 负载 10.haproxy 版本 v1.5.18 ``` ### 本地版自动化部署步骤(一定要在k8s-master01节点上操作) #### 一、安装之前数据准备 - 拉取本地版部署仓库代码,Localservice增量包(及本地版打包),Localservice模板包(不需要替换的总包)。 ```shell #1.拉取代码 cd /home/;git clone https://gitee.com/zhangshunping123/Edu_devops.git #2.下载 localservice增量包,$1为 Jenkins输出的路径 cd /home/;curl -o update.zip "$1" #3、下载localservice模板包,可以通过lftp下载 cd /home/; lftp /Local_EduCoder/Edu_local_devops/Data_edu_devops20200520.tar ``` - Data_edu_devops20200520.tar的解压后的结构 - `LocalService` ,本地版安装服务目录 - `local-yumPackge` ,本地版yum 离线安装目录 - `pkg` , bridge 重启脚本 - LocalService 结构说明: ```shell ├── local-bridge-webssh ## bridge和webssh │ ├── bridge.war │ ├── jdk1.8.0_191.tar.gz │ ├── localbridge.sql │ ├── shixun_image.tar ## 实训镜像 │ └── ww-latest.tar.gz ├── local-es ## es │ ├── dockerrun-es.sh │ ├── esImage.tar │ └── es.tar ├── local-git ## git │ ├── newgit.tar │ └── repositories.tar ├── local-k8s ## kubernetes │ └── k8s.gcr.io.basic.tar.gz ## kubeadm-1.12安装docker镜像 ├── local-redis-mysql │ ├── dockerrun-mysql.sh │ ├── dockerrun-redis.sh │ ├── mysql56-redis.tar ## redis和mysql的镜像 │ ├── mysql.tar ## mysql挂载文件 │ └── redis.tar ## redis挂载文件 └── local-web ├── dockerrun-web.sh ├── localweb.sql ├── webguazai.tar └── web.tar ``` - 执行数据替换,替换Localservice模板,localservice增量包 ``` cd /home/Edu_devops;bash data_ready.sh ``` #### 二、离线安装自动化操作步骤 1. **安装ansible** 并生成配置文件模板(默认centos7.6): ` cd /home/Edu_devops;bash init_ansible.sh` - 生成/etc/hosts 模板文件,之前的文件备份为/etc/hostsold - 生成/etc/ansible/hosts 模板文件 - 配置/etc/hosts和/etc/ansible/hosts模板,模板内有注释,具体细节参考doc目录下的说明。 2. **完成/etc/hosts 和/etc/ansible/hosts配置之后**,检查各个节点**时间是否一致**。 ```shell ansible -f 10 count -m shell -a "date" ## 修改时间 ansible -f 10 count -m shell -a "date -s '2020/08/11 16:18:30' " ## 同步硬件时间 ansible -f 20 count -m shell -a "hwclock -w $date " ## 开启启动date时间为硬件时间 ansible -f 20 count -m shell -a "sed -i '11a/hwclock -s' /etc/rc.d/rc.local " ### 目前时间不同步遇到得问题: ### 1.单点登陆没有问题,多个集群登陆会出现无法登陆得情况 ### 2.k8s 集群证书不一致3.bridge节点出现问题 ``` 3. **检查各个服务的ip配置是否正常** `ansible -f 10 all -m ping` 3.1 **检查各个节点的数据盘是否为/data目录** ``` #1.检查数据盘是否是/data/ ansible -f 10 count -m shell -a "df -h " #2.如果数据盘不是/data/ ##执行如下命令启用软连接 ansible -f 10 count -m shell -a "cd /home ;mkdir data;ln -sv /home/data /" #3.检查软连接是否生效 ansible -f 10 count -m shell -a "ls -l /data/" ``` 4. **拷贝本地版数据包到各个对应服务节点** ``` ##创建对应的目录 ansible -f 5 count -m shell -a "mkdir -p /data; mkdir -p /data/webguazai" ansible -f 10 k8s-slave -m shell -a "mkdir -p /data/workspace" ##执行拷贝 ## 1、全拷贝 cd /home/Edu_devops;bash copy.sh ## 2. 只安装web的服务拷贝,不需要实训任务 cd /home/Edu_devops;bash copy_only_web.sh ## 输入root密码 ``` 5. **拷贝本地版yum包到所有的节点** ` cd /home/Edu_devops;ansible -f 10 count -m copy -a "src=local-yumPackge/version7.6/ dest=/opt/local-install/" ` 6. **执行自动化安装Educoder本地版平台** - * single模式, 单台web节点部署* ```shell ## old brigde ansible-playbook -e "webnum=1 mysqluser=root mysqlpass=pre123123" offline-Single-main.yml ## new bridge ansible-playbook -e "webnum=1 mysqluser=root mysqlpass=pre123123" New-offline-Single-main.yml ``` - *Mutile模式,高可用部署多台web部署* ```shell ## old bridge ansible-playbook -e "webnum=1 mysqluser=root mysqlpass=pre123123" offline-Mutil-main.yml ## new bridge ansible-playbook -e "webnum=1 mysqluser=root mysqlpass=pre123123" New-offline-Mutil-main.yml ``` - *webOnly模式,高可用多台web部署,不安装bridge,webssh,k8s,git* ` ansible-playbook -e "webnum=1 mysqluser=root mysqlpass=pre123123" offline-Mutil-OnlyWeb-main.yml ` ``` 参数说明: webnum:代表一个节点上跑几个web ,考虑到有些情况下一个节点可能要跑两个web。 web总共部署的台数跟这个无关。 mysqluser:mysql的用户名 默认为root mysqlpass:mysql的密码 默认为pre123123 ``` 7. **拉取实训镜像** - 实训镜像拉取分为三种模式,互联网拉取,阿里云vpc拉取,自己上传到/data下,但注意实训镜像包的名字必须为**shixun_images.tar** 根据提示操作 ```shell [root@k8s-master01 after_dev]# cd /home/Edu_devops/after_dev; bash shixun_image_Mange.sh images_pull 阿里云拉取docker镜像,如果是aliyun内网拉取请输入y,如果是aliyun外网拉取请输入n,自己上传请输入z:: ``` ```shell 执行 cd /home/Edu_devops/after_dev; bash shixun_image_Mange.sh count_images 统计各个节点的镜像数量是否正确 ``` #### 三、部署完成之后,部署监控和定时任务 执行如下命令执行,监控部署,定时任务和mysql数据备份 ```shell ansible-playbook after_dev.yml --extra-vars "{'db':'localweb','mysqlip':'127.0.0.1'}" ##参数说明: 指定备份的数据库db 为(默认为localweb) mysqlip 为实际的mysql服务地址 ``` - 目前after_dev.yaml完成的功能有: - 设置日志清理,pod清理,tpi,tpm清理任务 - 设置bridge和webssh开机启动 - webssh,bridge探测 自测重启 - 设置mysql定时备份数据库备份(copy) (默认备份到本地,如果需要异地备份,则需要手动加入rsync 任务 #### 四、**需补充脚本补充(目前手动执行)** - k8s: - 修改证书日期,k8s证书更新到十年 执行update_cert.sh脚本 ```shell 在k8s master节点上执行 1 、备份/root/.kube/config 2、bash /home/Edu_devops/after_dev/upadte-kubeadm-cert.sh all 执行更新证书到10年 3、 cat /root/.kube/config 替换bridge的/root/.kube/config 查看证书是否更新 cd /etc/kubernetes/pki openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Validity -C 5 ``` - 性能调优 - 修改句柄数,和sysctl参数 ```shell vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 ## 执行如下命令 ansible count -m shell -a "echo '* soft nofile 65535 ' >> /etc/security/limits.conf " ansible count -m shell -a "echo '* hard nofile 65535 ' >> /etc/security/limits.conf " ansible count -m shell -a "tail -3 /etc/security/limits.conf " vim /etc/sysctl.conf vm.swappiness = 0 net.ipv4.neigh.default.gc_stale_time = 120 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.arp_announce = 2 kubnet.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 kernel.sysrq = 1 ##可以执行如下命令 ansible count -m copy -a "src=/home/Edu_devops/template/sysctl.conf backup=yes dest=/etc/" ansible count -m shell -a "sysctl -p" ## slave节点每天晚上两点定时重启 ansible k8s-slave -m shell -a "echo '0 2 * * * root reboot' >> /etc/crontab" ``` - mysql: - 修改mysql并发数 ,如果需要修改max_connections大小的同时也需要修改wait_timeout 和interactive_time,(too many connections报错) ``` max_connections=10000 wait_timeout = 600 interactive_timeout = 600 ``` - 多台tomcat-bridge使用时,需要查看mysql的是级别。设置成READ-COMMITTED ``` 查看事务级别 select @@global.tx_isolation; 修改事务 vim /etc/mysql.conf.d/my.cnf transaction-isolation = READ-COMMITTED ``` - nfs 重启失败 ```shell vim /etc/rc.d/rc.local #添加 systemctl daemon-reload systemctl restart rpcbind systemctl restart nfs ​ ``` #### 五、**本地版遇到的问题记录** - 1、机器迁移修改ip的时候,转发策略可能会丢失,docker服务无法正常运行,访问本地的ip+docker端口无法使用,可能是路由功能。 ``` echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables echo 1 > /proc/sys/net/ipv4/ip_forward ``` - 2. eleasticSerach问题,导致搜索为空 ```shell ##初始化eleasticSearch curl -XPUT -H "Content-Type: application/json" http://127.0.0.1:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}' ## ssh pdl@127.0.0.1 -p1120 通过ssh的方式登陆到容器 cd /home/pdl/educoderplus;RAILS_ENV=production bundle exec rake searchkick:reindex CLASS=Subject cd /home/pdl/educoderplus;RAILS_ENV=production bundle exec rake searchkick:reindex CLASS=Shixun ``` - 3. 创建pod中间层报错 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0910/113217_3e1bbd7a_5598946.png "屏幕截图.png"),一般情况下是由于k8smaster节点的apiserver出现问题,需要操作如下 ``` #1.在k8s-master节点上执行 systemctl stop kubelet kubectl delete pods $(kubectl get pods |grep k8s|awk '{print $1}' ) systemctl restart kubelet ``` - 4.web链接redis报错(RedisCommnaderr) ![输入图片说明](https://images.gitee.com/uploads/images/2020/0910/113458_6e727af0_5598946.png "屏幕截图.png") 大意为:(错误)misconf redis被配置以保存数据库快照,但misconf redis目前不能在硬盘上持久化。用来修改数据集合的命令不能用,请使用日志的错误详细信息。 ``` redis-cli -h 127.0.0.1 config set stop-writes-on-bgsave-error no ``` - 5. k8s初始化报错 W0821 18:56:28.314764 81758 common.go:168] WARNING: could not obtain a bind address for the API Server: no default routes found in "/proc/net/route" or "/proc/net/ipv6_route"; using: 0.0.0.0 原因: 节点没有配置默认网关