运维知识体系

运维知识体系

运维知识体系总结,持续更新,欢迎转载。
缓存知识体系

缓存知识体系

运维知识体系之缓存,分层多级缓存体系。
K8S实践指南

K8S实践指南

Docker和Kubernetes实践指南(每周更新)
新运维课堂

新运维课堂

全新体系化课程,开启运维新征程!

只要一小时,零基础入门Docker

简介: Docker是什么? Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及...
继续阅读 »

简介: Docker是什么? Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。



原文链接

Docker的三个概念

1.镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含 Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。

2.容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。

3.仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。



Docker的安装和卸载

Docker可以安装在Windows、Linux、Mac等各个平台上。具体可以查看文档Install Docker。安装完成之后,可以查看Docker的版本信息:




[root@xxx ~]# docker version
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built:
OS/Arch: linux/amd64

Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built:
OS/Arch: linux/amd64


查看Docker的帮助信息:# docker --help。各种命令的用法也不再赘述,后边用到哪些命令时会作出一定的解释。




Docker中关于镜像的基本操作


安装完Docker引擎之后,就可以对镜像进行基本的操作了。



我们从官方注册服务器(https://hub.docker.com)的仓库中pull下CentOS的镜像,前边说过,每个仓库会有多个镜像,用tag标示,如果不加tag,默认使用latest镜像:




[root@xxx ~]# docker search centos # 查看centos镜像是否存在
[root@xxx ~]# docker pull centos # 利用pull命令获取镜像
Using default tag: latest
latest: Pulling from library/centos
08d48e6f1cff: Pull complete
Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Status: Downloaded newer image for centos:latest

[root@xxx ~]# docker images # 查看当前系统中的images信息
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0584b3d2cf6d 9 days ago 196.5 MB


以上是下载一个已有镜像,此外有两种方法可以帮助你新建自有镜像。



(1)利用镜像启动一个容器后进行修改 ==> 利用commit提交更新后的副本




[root@xxx ~]# docker run -it centos:latest /bin/bash # 启动一个容器
[root@72f1a8a0e394 /]# # 这里命令行形式变了,表示已经进入了一个新环境
[root@72f1a8a0e394 /]# git --version # 此时的容器中没有git
bash: git: command not found
[root@72f1a8a0e394 /]# yum install git # 利用yum安装git
......
[root@72f1a8a0e394 /]# git --version # 此时的容器中已经装有git了
git version 1.8.3.1


此时利用exit退出该容器,然后查看docker中运行的程序(容器):




[root@xxx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f1a8a0e394 centos:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago angry_hodgkin


这里将容器转化为一个镜像,即执行commit操作,完成后可使用docker images查看:




[root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 72f1a8a0e394 xianhu/centos:git

[root@xxx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xianhu/centos git 52166e4475ed 5 seconds ago 358.1 MB
centos latest 0584b3d2cf6d 9 days ago 196.5 MB


其中,-m指定说明信息;-a指定用户信息;72f1a8a0e394代表容器的id;xianhu/centos:git指定目标镜像的用户名、仓库名和 tag 信息。注意这里的用户名xianhu,后边会用到。



此时Docker引擎中就有了我们新建的镜像xianhu/centos:git,此镜像和原有的CentOS镜像区别在于多了个Git工具。此时我们利用新镜像创建的容器,本身就自带git了。




[root@xxx ~]# docker run -it xianhu/centos:git /bin/bash
[root@520afc596c51 /]# git --version
git version 1.8.3.1


利用exit退出容器。注意此时Docker引擎中就有了两个容器,可使用docker ps -a查看。



(2)利用Dockerfile创建镜像



Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作。一个简易的Dockerfile文件如下所示,官方说明:Dockerfile reference:




# 说明该镜像以哪个镜像为基础
FROM centos:latest

# 构建者的基本信息
MAINTAINER xianhu

# 在build这个镜像时执行的操作
RUN yum update
RUN yum install -y git

# 拷贝本地文件到镜像中
COPY ./* /usr/share/gitdir/


有了Dockerfile之后,就可以利用build命令构建镜像了:




[root@xxx ~]# docker build -t="xianhu/centos:gitdir" .


其中-t用来指定新镜像的用户信息、tag等。最后的点表示在当前目录寻找Dockerfile。



构建完成之后,同样可以使用docker images命令查看:




[root@xxx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xianhu/centos gitdir 0749ecbca587 34 minutes ago 359.7 MB
xianhu/centos git 52166e4475ed About an hour ago 358.1 MB
centos latest 0584b3d2cf6d 9 days ago 196.5 MB


以上就是构建自己镜像的两种方法。其中也涉及到了容器的一些操作。如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器。




[root@xxx ~]# docker rm container_name/container_id
[root@xxx ~]# docker rmi image_name/image_id


镜像其他操作指令:



点击了解更多,查看剩余部分



了解更多



关键字:Docker  云计算  开发运维  编码  程序


收起阅读 »

最为详细的Docker入门吐血总结

简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器...
继续阅读 »

简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker是什么?

在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。

image.png

这是我在某招聘网站上看到的招聘 Java开发工程师 的招聘要求,其中有一条熟悉 docker 成为了你快速入职的加分项,由此可见熟悉 docker 在互联网公司的地位之重要。



当然对于我们 CTF选手 而言,熟悉 docker 可以快速搭建 CTF环境 ,完美地还原比赛真实漏洞的场景,帮助我们快速提升自己。



市面上已经有很多优秀的教程,但是很多原理性的东西,笔者认为那些教程对初学者而言还是很难理解,感觉没有说清楚(笔者自己都觉得挺懵逼的),为了让初学者少走弯路,我将以我的学习经历以及作为一个 CTF选手 的角度,编写此套教程,来带大家去了解并熟练运用 docker ,祝愿各位读者朋友们学完此套教程后,在未来企业面试中能够多一项加分的筹码,能够帮助到大家,我觉得就很值了。



既然说了这么多, docker 到底是个什么东西呢?

我们在理解 docker 之前,首先我们得先区分清楚两个概念,容器和虚拟机。



可能很多读者朋友都用过虚拟机,而对容器这个概念比较的陌生。



我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。



而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。



容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。通过下面这幅图我们可以很直观的反映出这两者的区别所在。

image.png

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。



而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。



Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。



总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。



Docker的优势



了解更多



点击了解更多,查看剩余部分


收起阅读 »

kolla-ansible安装openstack高可用企业级集群

一.环境准备1.hosts设置 每台设备两块网卡: 第一块:NAT模式,用于下载软件包,设置好IP可以上网 第二块:桥接模式,用于External网络,用于虚拟机连接外部网络,不用设置IP   hosts:hosteth0eth1deploy9.110.187...
继续阅读 »
一.环境准备1.hosts设置
每台设备两块网卡:
第一块:NAT模式,用于下载软件包,设置好IP可以上网
第二块:桥接模式,用于External网络,用于虚拟机连接外部网络,不用设置IP
 
hosts:hosteth0eth1deploy9.110.187.130 controller019.110.187.131不需要IPcontroller029.110.187.132不需要IPcompute019.110.187.133不需要IPcompute029.110.187.134不需要IPstorage9.110.187.135不需要IP2.ssh免密登录
ssh-keygen
ssh-copy-id root@controller01
ssh-copy-id root@controller02
ssh-copy-id root@compute01
ssh-copy-id root@compute02
ssh-copy-id root@storage
3.存储节点配置
  1. 要启动cinder存储服务,需先添加一块新的硬盘,然后创建pv、vg

[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate cinder-volumes /dev/sdb //vg名取名为 cinder-volumes,这里主要跟 kolla配置文件里vg名一致

  1. 只允许vm实例访问块存储卷,对LVM可能出现异常做设置

vim /etc/lvm/lvm.conf
#修改 devices 下面的,有多少块硬盘就写多少块,如果不想使用系统盘,则不写a|sda
filter = [ "a|sda|", "a|sdb|", "r|.*|" ]

#重启lvm服务
systemctl restart lvm2-lvmetad.service
4.配置国内PIP源
所有节点都需要配置
mkdir ~/.pip

cat << EOF > ~/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
EOF
5.安装PIP
#安装依赖
yum install -y python-devel libffi-devel gcc openssl-devel libselinux-python

#安装PIP
yum install -y python-pip
pip install --upgrade pip
6.安装docker
  1. 所有节点都安装

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce

  1. 配置Docker共享挂载

mkdir /etc/systemd/system/docker.service.d 
tee /etc/systemd/system/docker.service.d/kolla.conf << 'EOF'
[Service]
MountFlags=shared
EOF

  1. 使用阿里加速地址

mkdir -p /etc/docker

systemctl daemon-reload && systemctl enable docker && systemctl restart docker
systemctl status docker
二.部署节点安装1.安装docker模块
pip install docker   //这个其它节点也需要安装,否则后面会报错
2.ansible安装
yum install -y ansible
pip install -U ansible
3.安装kolla和kolla-ansible
  • Kolla-Ansible 可以从pip安装,也可以从git安装,这里演示从pip安装
pip install kolla kolla-ansible

错误解决方案[list=1]

  • Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
  • 解决:强制更新
    pip install --ignore-installed PyYAML
    [list=1]
  • 如果出现
    requests 2.20.0 has requirement idna<2.8,>=2.5, but you'll have idna 2.4 which is incompatible.
    错误,则强制更新
    requets
  • pip install --ignore-installed requests

    • 配置kolla-ansible1)拷贝globals.yml 和passwords.yml 到 /etc/kolla 目录
      cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/
      2)拷贝kolla-ansible的主机清单文件(all-in-one和multinode)
      cp /usr/share/kolla-ansible/ansible/inventory/* /home/​

    注:如果是在虚拟机里再启动虚拟机,那么需要把virt_type=qemu,默认是kvm

    mkdir -p /etc/kolla/config/nova cat << EOF > /etc/kolla/config/nova/nova-compute.conf [libvirt] virt_type=qemu cpu_mode = none EOF

    4.生成密码文件
    kolla-genpwd
    修改下面字段,使用方便的密码
    vim /etc/kolla/passwords.yml    keystone_admin_password: devops
    5.修改配置文件[list=1]
  • grep -Ev "^$|^[#;]" /etc/kolla/globals.yml
  • kolla_base_distro: "centos"kolla_install_type: "source"openstack_release: "rocky"kolla_internal_vip_address: "9.110.187.180"network_interface: "eth0"api_interface: "{{ network_interface }}"neutron_external_interface: "eth1"neutron_plugin_agent: "openvswitch"enable_cinder: "yes"enable_cinder_backend_iscsi: "yes"enable_cinder_backend_lvm: "no"enable_haproxy: "yes"enable_heat: "yes"glance_enable_rolling_upgrade: "no"ironic_dnsmasq_dhcp_range:tempest_image_id:tempest_flavor_ref_id:tempest_public_network_id:tempest_floating_network_name:
    [list=1]
  • 编辑/home/multinode文件
  • [control]controller01controller02​[network]controller01controller02​[inner-compute]​[external-compute]compute01compute02​[compute:children]inner-computeexternal-compute​[monitoring]deploy​[storage]storage​[deployment]localhost       ansible_connection=local........
    6.网关配置这里physnet1是对外网络的名字,在dashboard里创建供应商网络的名字要和这里对应vim /usr/share/kolla-ansible/ansible/roles/neutron/templates/ml2_conf.ini.j2
    [ml2_type_vlan]{% if enable_ironic | bool %}network_vlan_ranges = physnet1{% else %}network_vlan_ranges = physnet1{% endif %}
     三.openstack集群安装1.提前拉取镜像
    kolla-ansible -i ./multinode pull -vvv
    2.确认inventory配置文件是否正确
    ansible -m ping all -i ./multinode
    3.Bootstrap服务的依赖安装
    kolla-ansible -i ./multinode bootstrap-servers
    4.检查
    kolla-ansible -i ./multinode prechecks
    5.部署
    kolla-ansible -i ./multinode deploy​注:可以加-vvv,显示更多
    6.使用openstack
    • 生成环境变量和脚本
    kolla-ansible -i ./multinode post-deploy此时会在/etc/kolla下面生成admin-openrc.sh脚本,执行一下
    至此multinodes部署完成,浏览器输入外网访问地址:http://9.110.187.180,即可访问Openstack的登陆页面,用户名和密码都是之前设置的 
    • 各节点上服务常用目录

    /etc/kolla 服务配置目录
    /var/lib/docker/volumes/kolla_logs/_data 服务日志目录
    /var/lib/docker/volumes 服务数据映射的目录销毁openstack
    kolla-ansible destroy -i ./multinode  --yes-i-really-really-mean-it

      收起阅读 »

    MongoDB集群搭建:副本+分片

    环境规划服务器规划 192.168.3.167                    192.168.3.168                    192.168.3.170 mongos                             mongo...
    继续阅读 »
    环境规划服务器规划
    192.168.3.167                    192.168.3.168                    192.168.3.170
    mongos                             mongos                              mongos
    config server                     config server                       config server
    shard server1 主节点         shard server1 副节点           shard server1 仲裁
    shard server2 仲裁            shard server2 主节点           shard server2 副节点
    shard server3 副节点         shard server3 仲裁              shard server3 主节点
    端口分配:
    mongos:20000 
    config:27017
    shard1:27001 
    shard2:27002 
    shard3:27003
     
    配置yum源并安装mongodb3.6
    cat > /etc/yum.repos.d/mongodb-org-3.6.repo << EOF
    [mongodb-org-3.6]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
    EOF

    yum install mongodb-org -y
    目录创建:
    分别在每台机器建立conf、mongos、config、shard1、shard2、shard3目录,因为mongos不存储数据,只需要建立日志文件目录即可
    配置服务:
    可以根据业务需求创建相应目录,此文档按yum安装所产生的/etc/mongo.ocnf文件默认配置,如果自行创建记得修改目录权限
    chown -R mongod:mongod /var/lib/mongo
    vim /etc/mongod.conf
    systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/mongod.log
    storage:
    dbPath: /var/lib/mongo
    journal:
    enabled: true
    processManagement:
    fork: true # fork and run in background
    pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
    timeZoneInfo: /usr/share/zoneinfo
    net:
    port: 27017
    bindIp: 0.0.0.0
    replication:
    replSetName: csReplSet
    sharding:
    clusterRole: configsvr
    启动所有的mongo config server服务
    mongod --config /etc/mongod.conf

     副本服务登录任意一台配置服务器,初始化配置副本集
    mongo --port 27017
    #创建配置
    config = {
    _id : "csReplSet",
    members : [
    {_id : 1, host : "192.168.3.167:27017" },
    {_id : 2, host : "192.168.3.168:27017" },
    {_id : 3, host : "192.168.3.170:27017" }
    ]
    }
    #初始化副本集
    rs.initiate(config)
    #查看状态
    rs.status()

    其中,"_id" : " csReplSet "应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port
     
    分片服务:
    配置分片副本集(三台机器)
    1.设置第一个分片副本集
    vim /etc/shard1.conf
    systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/shard1.log
    storage:
    dbPath: /var/lib/mongo/shard1/data
    journal:
    enabled: true
    processManagement:
    fork: true
    pidFilePath: /var/run/mongodb/shard1.pid
    timeZoneInfo: /usr/share/zoneinfo
    net:
    port: 27001
    bindIp: 0.0.0.0
    maxIncomingConnections: 20000
    replication:
    replSetName: shard1
    sharding:
    clusterRole: shardsvr

    #启动所有的shard1 server
    mongod --config /etc/shard1.conf

    #登陆任意一台shard1服务器,初始化副本集
    mongo --port 27001
    use admin
    #定义副本集配置
    config = {
    _id : "shard1",
    members : [
    {_id : 1, host : "192.168.3.167:27001",priority:2 },
    {_id : 2, host : "192.168.3.168:27001",priority:1 },
    {_id : 3, host : "192.168.3.170:27001",arbiterOnly: true }
    ]
    }
    #初始化副本集配置
    rs.initiate(config);

    #查看分区状态
    rs.status()

    ====================
    #配置第二个分片和副本集
    vim /etc/shard2.conf
    systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/shard2.log
    storage:
    dbPath: /var/lib/mongo/shard2/data
    journal:
    enabled: true
    processManagement:
    fork: true
    pidFilePath: /var/run/mongodb/shard2.pid
    timeZoneInfo: /usr/share/zoneinfo
    net:
    port: 27002
    bindIp: 0.0.0.0
    maxIncomingConnections: 20000
    replication:
    replSetName: shard2
    sharding:
    clusterRole: shardsvr

    #启动所有的shard2 server
    mongod --config /etc/shard2.conf

    #登陆任意一台非仲裁节点服务器,初始化副本集
    mongo --port 27002
    use admin

    #定义副本集配置
    config = {
    _id : "shard2",
    members : [
    {_id : 1, host : "192.168.3.167:27002",arbiterOnly: true },
    {_id : 2, host : "192.168.3.168:27002",priority:2 },
    {_id : 3, host : "192.168.3.170:27002",priority:1 }
    ]
    }
    #初始化副本集配置
    rs.initiate(config);

    #查看分区状态
    rs.status()

    #配置第三个分片和副本集
    vim /etc/shard3.conf
    systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/shard3.log
    storage:
    dbPath: /var/lib/mongo/shard3/data
    journal:
    enabled: true
    processManagement:
    fork: true
    pidFilePath: /var/run/mongodb/shard3.pid
    timeZoneInfo: /usr/share/zoneinfo
    net:
    port: 27003
    bindIp: 0.0.0.0
    maxIncomingConnections: 20000
    replication:
    replSetName: shard3
    sharding:
    clusterRole: shardsvr

    #启动所有的shard3 server
    mongod --config /etc/shard3.conf

    #初始化副本集配置
    rs.initiate(config)

    #查看分区状态
    rs.status()

    路由服务:
    配置路由服务器 mongos
    先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器)
    vim /etc/mongos.conf
    systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/mongos.log
    processManagement:
    fork: true
    pidFilePath: /var/run/mongodb/mongos.pid
    timeZoneInfo: /usr/share/zoneinfo
    net:
    port: 20000
    bindIp: 0.0.0.0
    maxIncomingConnections: 20000
    sharding:
    configDB: csReplSet/192.168.3.167:27017,192.168.3.168:27017,192.168.3.170:27017

    #注意监听的配置服务器,只能有1个或者3个 csReplSet为配置服务器的副本集名字
    configDB: csReplSet/192.168.3.167:21000, 192.168.3.168:21000, 192.168.3.170:21000

    #启动路由服务器
    mongos --config /etc/mongos.conf

    #检查状态
    netstat -tunlp | grep mongo
    tcp 0 0 0.0.0.0:27001 0.0.0.0:* LISTEN 8810/mongod
    tcp 0 0 0.0.0.0:27002 0.0.0.0:* LISTEN 6962/mongod
    tcp 0 0 0.0.0.0:27003 0.0.0.0:* LISTEN 12671/mongod tcp 0 0 0.0.0.0:20000 0.0.0.0:* LISTEN 13577/mongos tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 10328/mongod
    启用分片
    目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效
    #登录其中的一台路由节点,手动启用分片
    mongo --port 20000
    use admin
    #添加分片到mongos
    sh.addShard("shard1/192.168.3.167:27001,192.168.3.168:27001,192.168.3.170:27001")
    sh.addShard("shard2/192.168.3.167:27002,192.168.3.168:27002,192.168.3.170:27002")
    sh.addShard("shard3/192.168.3.167:27003,192.168.3.168:27003,192.168.3.170:27003")

    #查看集群状态
    sh.status()
    收起阅读 »

    使用kubeadm半自动安装kubernetes 1.13高可用集群(使用calico网络)

    kubeadm手动安装kubernetes 1.13高可用集群  初始化集群:配置hosts文件 vim /etc/hosts192.168.3.147test-master01 192.168.3.148test-master02 192.168.3.149...
    继续阅读 »
    kubeadm手动安装kubernetes 1.13高可用集群
     初始化集群:配置hosts文件
    vim /etc/hosts
    192.168.3.147test-master01
    192.168.3.148test-master02
    192.168.3.149test-master03
    192.168.3.150test-work01
    配置免密登录
    ssh-keygen
    ssh-copy-id test-master01
    ssh-copy-id test-master02
    ssh-copy-id test-master03
    ssh-copy-id test-work01
    设置参数
    • 关闭防火墙
    systemctl stop firewalldsystemctl disable firewalld
    • 关闭swap
    swapoff -ased -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,使用free -m确认swap已经关闭。
    • 关闭selinux
    sed-i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinuxsetenforce0
    • 配置转发相关参数,否则可能会出错
    cat < /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward=1net.ipv4.tcp_tw_recycle=0vm.swappiness=0vm.overcommit_memory=1vm.panic_on_oom=0fs.inotify.max_user_watches=89100fs.file-max=52706963fs.nr_open=52706963net.ipv6.conf.all.disable_ipv6=1net.netfilter.nf_conntrack_max=2310720EOFsysctl --system
    以上在所有的Kubernetes节点执行命令使修改生效
    • kube-proxy开启ipvs
    在所有work节点执行:
    cat > /etc/sysconfig/modules/ipvs.modules <上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块.接下来还需要确保各个节点上已经安装了ipset软件包yum install ipset。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm yum install ipvsadm
    yum install ipset -yyum install ipvsadm -y
    如果以上前提条件如果不满足,则即使kube-proxy的配置开启了ipvs模式,也会退回到iptables模式
    • 系统优化参数

    systemctl enable ntpdate.service
    echo '*/30 * * * * /usr/sbin/ntpdate time7.aliyun.com >/dev/null 2>&1'> /tmp/crontab2.tmp
    crontab /tmp/crontab2.tmp
    systemctl start ntpdate.service
    echo "* soft nofile 65536" >> /etc/security/limits.conf
    echo "* hard nofile 65536" >> /etc/security/limits.conf
    echo "* soft nproc 65536" >>/etc/security/limits.conf
    echo "* hard nproc 65536" >>/etc/security/limits.conf
    echo "* soft memlock unlimited" >> /etc/security/limits.conf
    echo "* hard memlock unlimited" >>/etc/security/limits.conf

     安装docker
    yum install -y epel-release
    yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-toolswget vim ntpdate libseccomp libtool-ltdltelnet rsync bind-utils
    yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm
    配置docker国内镜像:
    所有节点安装docker
    编辑/etc/docker/daemon.json,添加以下一行
    {
    "registry-mirrors":["https://registry.docker-cn.com"]
    }

    重启docker
    systemctl daemon-reload
    systemctl enable docker
    systemctl start docker

    注:如果使用overlay2的写法:
    daemon.json
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m",
    "max-file": "10"
    },
    "registry-mirrors": ["https://pqbap4ya.mirror.aliyuncs.com"],
    "storage-driver": "overlay2",
    "storage-opts":["overlay2.override_kernel_check=true"]
    }

    如果要使用overlay2,前提条件为使用ext4,如果使用xfs,需要格式化磁盘加上参数 mkfs.xfs -n ftype=1 /path/to/your/device ,ftype=1这个参数需要配置为1
     安装keepalived+haproxy
    三台master 节点

    VIP : 192.168.3.80
     安装 kubeadm, kubelet 和 kubectl
    所有节点都执行设置yum源
    cat < /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    安装组件
    yum install -y kubelet-1.13.1 kubeadm-1.13.1 kubectl-1.13.1
    开机启动
    systemctl enable kubelet.service

     初始化K8S集群编辑kubeadm配置文件:
    下面配置是kubeadm安装etcd写法:
    cat > kubeadm-config.yaml << EOF
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterConfiguration
    kubernetesVersion: v1.13.1
    apiServer:
    certSANs:
    - "192.168.3.80"
    controlPlaneEndpoint: "192.168.3.80:8443"
    networking:
    podSubnet: "10.50.0.0/16"
    imageRepository: "harbor.oneitfarm.com/k8s-cluster-images"
    EOF

    CNI使用Calico,设置podSubnet: “10.50.0.0/16”
    192.168.3.80是刚才安装haproxy+keepalived的VIP初始化第一个master
    kubeadm init --config kubeadm-config.yaml
    ...
    [root@master01 ~]# mkdir -p $HOME/.kube
    [root@master01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@master01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
    安装网络插件
    按官网方式:
    Installing with the Kubernetes API datastore—50 nodes or less:
    kubectl apply -f \
    https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml

    kubectl apply -f \
    https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

    以上建议先wget下来,需要根据自己网络修改配置 :
    - name: CALICO_IPV4POOL_CIDR
    value: "10.50.0.0/16"
    复制相关文件到其他master节点
    ssh root@master02 mkdir -p /etc/kubernetes/pki/etcd
    scp /etc/kubernetes/admin.conf root@master02:/etc/kubernetes
    scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@master02:/etc/kubernetes/pki
    scp /etc/kubernetes/pki/etcd/ca.* root@master02:/etc/kubernetes/pki/etcd
    部署master-other
    在其它slave节点上执行下面命令,加入集群
    kubeadm join 192.168.3.80:8443 --token pv2a9n.uh2yx1082ffpdf7n --discovery-token-ca-cert-hash sha256:872cac35b0bfec28fab8f626a727afa6529e2a63e3b7b75a3397e6412c06ebc5 --experimental-control-plane
    kube-proxy开启ipvs
    修改ConfigMap的kube-system/kube-proxy中的config.conf,mode: “ipvs”:
    kubectl edit configmap kube-proxy -n kube-system
    kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -- grace-period=0 --force -n kube-system")}'

     检查测试查看kubernetes集群状态
    kubectl get nodes -o wide
    kubectl get cs
    NAME STATUS MESSAGE ERROR
    controller-manager Healthy ok
    scheduler Healthy ok
    etcd-0 Healthy {"health": "true"}
    查看etcd集群状态
    本文通过kubeadm自动安装etcd,也就是docker方式安装的etcd,可以exec进去容器内检查:
    kubectl exec -ti -n kube-system etcd-an-master01 sh
    / # export ETCDCTL_API=3
    / # etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key member list
    安装失败清理集群
    集群初始化如果遇到问题,可以使用下面的命令进行清理:
    kubeadm reset
    systemctl stop kubelet
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1
    systemctl start docker

     设置资源调度
    使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载。这是因为当前的master节点被打上了node-role.kubernetes.io/master:NoSchedule的污点:
    kubectl describe node master01 | grep Taint
    Taints: node-role.kubernetes.io/master:NoSchedule

    检查join进集群的master和work节点,如果调度不对,可以通过如下方式设置:
    [root@an-master01 ~]# kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    an-master01 Ready master 4h39m v1.13.1
    an-master02 Ready 4h32m v1.13.1
    an-master03 Ready master 86m v1.13.1
    an-work01 Ready 85m v1.13.1

    查看当前状态:
    kubectl describe nodes/an-master02 |grep -E '(Roles|Taints)'
    Roles:
    Taints:

    设置为master节点且不调度:
    kubectl label node an-master02 node-role.kubernetes.io/master=
    kubectl taint nodes an-master02 node-role.kubernetes.io/master=:NoSchedule
    如果想去除限制的话:
    kubectl taint nodes an-master03 node-role.kubernetes.io/master-

    work节点设置:
    kubectl label node an-work01 node-role.kubernetes.io/work=
    kubectl describe nodes/an-work01 |grep -E '(Roles|Taints)'
    Roles: work
    Taints:

      收起阅读 »

      使用kubeadm部署Kubernetes v1.13.3

        学习Kubernetes没有什么特殊技巧,需要循序渐进,理论结合实践,不管目前生产中是否使用K8S,作为运维工程师,每个人都应该有自己的一个K8S集群,才能开启探索之路。拒绝夸夸其谈,前后不一致!!!       请查看下面的链接:       htt...
    继续阅读 »
        学习Kubernetes没有什么特殊技巧,需要循序渐进,理论结合实践,不管目前生产中是否使用K8S,作为运维工程师,每个人都应该有自己的一个K8S集群,才能开启探索之路。拒绝夸夸其谈,前后不一致!!!
     
        请查看下面的链接:
     
        https://mp.weixin.qq.com/s?__biz=MzI5MjA5Mjg5OA==&mid=2247484395&idx=1&sn=0767cc24ec99ce818e41f7c40dda5d23&chksm=ec07ed66db7064707b05a9dda9c23882b9106577fc5f1ef45a9d78e6a93a57a5f507210207ae&token=1791180619&lang=zh_CN#rd 收起阅读 »

    【Kubernetes实践指南】5.1-Kubernetes架构介绍

    【前言】       2019年是互联网寒冬几乎成为不争的事实,在寒冬下,往往会暴露出很多被掩盖的事实,就像下面这个案例,看完之后,深有感触。   作为运维工程师,坚持学习才是寒冬中的生存之道。Kubernetes的浪潮已经来了,不管我们是否...
    继续阅读 »
    【前言】
     
        2019年是互联网寒冬几乎成为不争的事实,在寒冬下,往往会暴露出很多被掩盖的事实,就像下面这个案例,看完之后,深有感触。

    微信图片_20190211183731.jpg

     
    作为运维工程师,坚持学习才是寒冬中的生存之道。Kubernetes的浪潮已经来了,不管我们是否愿意,生产中是否使用,Kubernetes已经不知不觉成为运维必备技能。本文介绍Kubernetes架构,作为入门的第一篇文章。    
     
    Kubernetes介绍
        Kubernetes源于希腊语,意为“舵手”或“飞行员”,是用于自动部署,扩展和管理容器化应用程序的开源系统,由于K和S之间有8个字母,被简称为K8S。Kubernetes构建在Google 15年生产环境经验基础之上,可以将Kubernetes看作为Google内部的容器管理平台Borg和Omega的开源版本,当然他们之间是有一些差异的。
     
    Kubernetes系统架构
        Kubernetes被设计为Master和Node两个角色,Master为控制节点,Node为计算节点或者叫工作节点,在Master节点上有一个API Server服务,对外提供标准的RestAPI,这也是Kubernetes集群的入口,意外着只要和集群进行交互必须连接到API Server上。

    1.png

     
    Master节点介绍
    Kubernetes Master节点主要有4个组件,API Server、Scheduler、Controller、etcd。如下图所示:

    2.png

    • API Server:提供Kubernetes API接口,主要处理Rest操作以及更新Etcd中的对象。是所有资源增删改查的唯一入口。
    • Scheduler:绑定Pod到Node上,主要做资源调度。
    • Controller Manager:所有其他群集级别的功能,目前由控制器Manager执行。资源对象的自动化控制中心,Kubernetes集群有很多控制器。
    • Etcd:所有持久化的状态信息存储在Etcd中,这个是Kubernetes集群的数据库。
     Node节点介绍Node节点是Kubernetes集群的工作节点,在Node节点上主要运行了Docker、Kubelet、kube-proxy三个服务(Fluentd请先忽略),如下图所示:
    3.png
    • Docker Engine:负责节点的容器的管理工作,最终创建出来的是一个Docker容器。
    • Kubelet:安装在Node上的代理服务,和API Server进行通信,用来管理Pods以及容器、镜像、Volume等,实现对集群对节点的管理。
    • Kube-proxy:安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
     Kubernetes逻辑架构在上面的介绍中提到像Pod、Service这些概念,在Kubernetes的系统架构图中并没有体现出来,这些可以理解为Kubernetes逻辑架构中的组件。也就是在Master和Node上并不具体存在的一个服务或者进程,但却是Kubernetes的组件,也是我们的管理对象。主要有Pod、Service和各种控制器等。 PodPod是Kubernetes的最小管理单元,一个Pod可以包含一组容器和卷。虽然一个Pod里面可以包含一个或者多个容器,但是Pod只有一个IP地址,而且Pod重启后,IP地址会发生变化。
    pod.png
     Controller一个应用如果可以有一个或者多个Pod,就像你给某一个应用做集群,集群中的所有Pod是一模一样的。Kubernetes中有很多控制器可以来管理Pod,例如下图的Replication Controller可以控制Pod的副本数量,从而实现横向扩展。
    rc.png
     Kubernetes中有很多控制器,后面的章节我们会逐步讲到,常用的控制器如下:
    • Replication Controller(新版本已经被ReplicaSet所替代)
    • ReplicaSet(新版本被封装在Deployment中)
    • Deployment:封装了Pod的副本管理、部署更新、回滚、扩容、缩容等功能。
    • DaemonSet:保证所有的Node上有且只有一个Pod在运行。
    • StatefulSet:有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序。
    • Job:使用Kubernetes运行单一任务。
    • CronJob:使用Kubernetes运行定时任务。

    Service
    由于Pod的生命周期是短暂的,而且每次重启Pod的IP地址都会发生变化,而且一个Pod有多个副本,也就是说一个集群中有了多个节点,就需要考虑负载均衡的问题。Kubernetes使用Service来实现Pod的访问,而且Service有一个Cluster IP,通常也称之为VIP,是固定不变的。

    service.png

     
    Kubernetes网络介绍
    在Kubernetes集群中存在着三种网络,分别是Node网络、Pod网络和Service网络,这几种网络之间的通信需要依靠网络插件,Kubernetes本身并没有提供,社区提供了像Flannel、Calico、Canal等,后面章节会详述。
    Node网络
    Node网络指的是Kubernetes Node节点本地的网络,在本实验环境中使用的是192.168.56.0/24这个网段,所有的Node和Master在该网段都可以正常通信。
    Pod网络
    后面创建的Pod,每一个Pod都会有一个IP地址,这个IP地址网络段被称之为Pod网络,如下图所示。
    [root@linux-node1 ~]# kubectl get pod -o wide
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    nginx-54458cd494-hpn68 1/1 Running 0 9m7s 10.2.1.2 linux-node2.linuxhot.com
    nginx-54458cd494-r4mfq 1/1 Running 0 7m46s 10.2.1.3 linux-node2.linuxhot.com



     
    Service网络
    Service是为Pod提供访问和负载均衡的网络地址段,如下图所示。
     [root@linux-node1 ~]# kubectl get service
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes ClusterIP 10.1.0.1 443/TCP 64m
    nginx NodePort 10.1.216.23 80:30893/TCP 8m3s





    Kubernetes的组件和知识绝非如此,快速入门可以先了解这么多,下一章节,我们先快速的部署一个Kubernetes集群。
     
    来新运维社区分享知识!
     
        欢迎来新运维社区分享你的原创文章、博文、理念或者是对运维工程师有帮助的任何知识,如要加入K8S中国交流群,请添加新运维-小助手,备注:姓名-K8S。
    (无备注不予处理,请理解!)

    小助手微信.jpg

    【小助手微信】
     
    END -
     
     
    加入新运维社区,开启新征程!       
     
    牛人并不可怕,可怕的是牛人比我们还努力!
     
    QQ截图20190211183631.png
    收起阅读 »

    浅谈字典跟列表优缺点

    字典跟列表优缺点: 和list比较,dict有以下几个特点: 1、查找和插入的速度极快,不会随着key的增加而变慢;  2、需要占用大量的内存,内存浪费多。 而list相反: 1、查找和插入的时间随着元素的增加而增加;  2、占用空间小,浪...
    继续阅读 »
    字典跟列表优缺点: 和list比较,dict有以下几个特点: 1、查找和插入的速度极快,不会随着key的增加而变慢;  2、需要占用大量的内存,内存浪费多。 而list相反: 1、查找和插入的时间随着元素的增加而增加;  2、占用空间小,浪费内存很少。 所以,dict(Redis)是用空间来换取时间的一种方式 收起阅读 »

    iTop自定义CI模型

    iTop自定义CI模型,需要Toolkit工具,附件中。   1.下载附件中的Toolkit。直接解压到对应的webroot下。   2.直接访问http://xxx/toolkit访问。    
    iTop自定义CI模型,需要Toolkit工具,附件中。
     
    1.下载附件中的Toolkit。直接解压到对应的webroot下。
     
    2.直接访问http://xxx/toolkit访问。
     
     

    LNMP(Linux+Nginx+PHP+MySQL)生产源码部署实战

           日常工作中,部署Nginx+PHP是非常普通的一个场景,如果有一个最佳实践,每次可以直接复制粘贴就好了。本文正是完全生产实践的方式。Nginx和PHP均推荐使用源码安装,MySQL推荐直接使用官方提供编译好的二进制文件,性能是最佳的,除非你可以非...
    继续阅读 »
     
         日常工作中,部署Nginx+PHP是非常普通的一个场景,如果有一个最佳实践,每次可以直接复制粘贴就好了。本文正是完全生产实践的方式。Nginx和PHP均推荐使用源码安装,MySQL推荐直接使用官方提供编译好的二进制文件,性能是最佳的,除非你可以非常专业的进行MySQL编译的定制。
     
    1.源码安装Nginx
    依赖软件包安装。
    [root@linux-node1 ~]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 
    [root@linux-node1 ~]# yum install -y gcc glibc gcc-c++ pcre-devel openssl-devel
    创建www用户,用于启动Nginx
    [root@linux-node1 src]# useradd -s /sbin/nologin -M www
    Nginx源码编译安装
    [root@linux-node1 ~]# cd /usr/local/src
    [root@linux-node1 src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
    [root@linux-node1 src]# tar zxf nginx-1.14.2.tar.gz
    [root@linux-node1 src]# cd nginx-1.14.2
    [root@linux-node1 nginx-1.14.2]#./configure --prefix=/usr/local/nginx-1.14.2 \
    --user=www --group=www \
    --with-http_ssl_module --with-stream \
    --with-http_stub_status_module --with-file-aio
    [root@linux-node1 nginx-1.14.2]# make && make install
    2.测试配置并启动Nginx
    [root@linux-node1 ~]# ln -s /usr/local/nginx-1.14.2/ /usr/local/nginx
    [root@linux-node1 ~]# /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx-1.14.2/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx-1.14.2/conf/nginx.conf test is successful
    [root@linux-node1 ~]# /usr/local/nginx/sbin/nginx
    查看Nginx启动状态
    [root@linux-node1 ~]# netstat –ntlp | grep 80
     
    3.源码安装PHP(FPM)
    首先,我们需要将PHP依赖的软件包都安装上。
    [root@linux-node1 ~]# yum install -y gcc gcc-c++ glibc make autoconf \
    libjpeg-turbo-devel libpng-devel mhash-devel \
    freetype-devel libxml2-devel zlib-devel \
    libcurl-devel openssl-devel swig libmcrypt-devel

    4.下载软件包
    [root@linux-node1 ~]# cd /usr/local/src
    [root@linux-node1 src]# wget http://120.52.51.16/cn2.php.net/distributions/php-5.6.39.tar.gz
    [root@linux-node1 src]# tar zxf php-5.6.39.tar.gz
    [root@linux-node1 src]# cd php-5.6.39

    5.编译软件包
    [root@linux-node1 php-5.6.39]#./configure --prefix=/usr/local/php-5.6.39 --with-mysql \
    --with-jpeg-dir --with-png-dir --with-curl --with-gd \
    --with-zlib --enable-xml --with-libxml-dir --enable-bcmath \
    --enable-sysvsem --enable-mbregex --with-openssl \
    --enable-mbstring --enable-gd-native-ttf --enable-sockets \
    --enable-shmop --enable-opcache --disable-debug \
    --with-xmlrpc --enable-zip --enable-soap --enable-zip --enable-fpm \
    --with-fpm-user=www --with-fpm-group=www --with-freetype-dir \
    --with-mcrypt --with-mhash --enable-inline-optimization
    [root@linux-node1 php-5.6.39]# make && make install

    6.设置php配置文件和启动脚本
    [root@linux-node1 php-5.6.39]# ln -s /usr/local/php-5.6.39/ /usr/local/php
    [root@linux-node1 php-5.6.39]# cp php.ini-production /usr/local/php/lib/php.ini
    [root@linux-node1 php-5.6.39]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    [root@linux-node1 php-5.6.39]# chmod +x /etc/init.d/php-fpm

    fpm配置文件
    [root@linux-node1 php-5.6.39]# cd /usr/local/php/etc/	
    [root@linux-node1 etc]# cp php-fpm.conf.default php-fpm.conf
    [root@linux-node1 etc]# /etc/init.d/php-fpm start
    Starting php-fpm done
    默认情况下php-fpm会监听在本地127.0.0.1的9000端口,你也可以调整php-fpm.conf设置为监听sock文件。
     
    7.配置Nginx和PHP的连接
    [root@linux-node1 ~]# cd /usr/local/nginx/conf/
    [root@linux-node1 conf]# vim nginx.conf
    #去掉以下内容注释并修改
    location ~ \.php$ {
    #root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi.conf; #注意修改
    }
    重载Nginx配置
    [root@linux-node1 conf]# /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx-1.14.2/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx-1.14.2/conf/nginx.conf test is successful
    [root@linux-node1 conf]# /usr/local/nginx/sbin/nginx -s reload

    测试PHP安装
    [root@linux-node1 conf]# cd /usr/local/nginx/html/
    [root@linux-node1 html]# vim info.php
    phpinfo();
    ?>

     

    QQ截图20190104152228.png

     MySQL 生产部署
        mysql的安装除了yum,还可以源码编译,其实如果你没有完全掌握源码编译的优化选项,选择官方编译好的二进制版本也是不错的选择。
    下载mysql二进制包
    [root@linux-node1 ~]# cd /usr/local/src
    # wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz
     
     
     
    创建mysql用户
    [root@linux-node1 ~]# groupadd mysql
    [root@linux-node1 ~]# useradd -r -g mysql -s /bin/false mysql

    解压mysql二进制包
    [root@linux-node1 ~]# cd /usr/local/src
    [root@linux-node1 src]# tar zxf mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz
    [root@linux-node1 src]# mv mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/
    [root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql-5.6.30-linux-glibc2.5-x86_64



    初始化mysql
    [root@linux-node1 ~]# ln -s /usr/local/mysql-5.6.30-linux-glibc2.5-x86_64/ /usr/local/mysql
    [root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql
    [root@linux-node1 ~]# /usr/local/mysql/scripts/mysql_install_db \
    --defaults-file=/usr/local/mysql/my.cnf \
    --user=mysql --basedir=/usr/local/mysql/ \
    --datadir=/usr/local/mysql/data

    启动mysql
    [root@linux-node1 src]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &



     
    PHP安装PDO MySQL扩展
        要让PHP连接到MySQL。可以使用PDO扩展,安装PDO扩展和安装其它PHP模块的方法都是类似的,分为三个步骤:
    第一步:安装PDO扩展:
    [root@linux-node1 ~]# cd /usr/local/src/php-5.6.21/ext/pdo_mysql/
    phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
    [root@linux-node1 pdo_mysql]# /usr/local/php/bin/phpize
    Configuring for:
    PHP Api Version: 20131106
    Zend Module Api No: 20131226
    Zend Extension Api No: 220131226
    [root@linux-node1 pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config
    [root@linux-node1 pdo_mysql]# make && make install
    执行完毕,最后会输出讲扩展安装到的位置,
    # ls /usr/local/php-5.6.21/lib/php/extensions/no-debug-non-zts-20131226/
    opcache.a opcache.so pdo_mysql.so

    第二步:修改配置文件
    [root@linux-node1 ~]# vim /usr/local/php/lib/php.ini
    #在文件末尾添加
    extension=pdo_mysql.so
    第三步:重新加载PHP(FPM)
    [root@linux-node1 ~]# /etc/init.d/php-fpm reload
    Reload service php-fpm done
     
     使用mysqli连接数据库,所以需要给PHP安装该模块。
    [root@linux-node1 pdo_mysql]# cd /usr/local/src/php-5.6.39/ext/mysqli/
    [root@linux-node1 mysqli]# /usr/local/php/bin/phpize
    [root@linux-node1 mysqli]# ./configure --with-php-config=/usr/local/php/bin/php-config
    [root@linux-node1 mysqli]# make && make install

    [root@linux-node1 mysqli]# vim /usr/local/php/lib/php.ini
    #在最下面新添加一行
    extension=mysqli.so
    [root@linux-node1 mysqli]# /etc/init.d/php-fpm reload

     
     安装其他PHP模块均使用类似的方法。例如安装Redis、Memcached模块等。
      收起阅读 »