介绍

使用Kali Linux需要做一些初始化配置才能用的更顺手

修改apt-get的源为阿里云

修改时区

输入法fcitx拼音

虚拟专用网络客户端

安装vncserver远程桌面

kali linux安装docker

Istio能用于生产了么

截止2018年5月6日目前Istio版本号还未达到V1.0,官方也未宣布生产就绪,所以不能用于生产
目前Istio除了不还不完全成熟以外,还有性能问题

当前Feature Status(Road map)

Istio成熟状态 可以在这里查看目前Istio各个组件模块的完善程度

前言

组织的容器支持docker-compose部署
组织的容器支持kubernets部署
以php框架thinkphp为示例,演示php项目的kubernets部署
多容器方式(3容器)分别为:appphp(php代码)、openresty(nginx webserver),php-fpm(php的运行环境)
dockerfile 和 yaml文件
docker iamges仓库

PHP项目在Docker中如何部署运行?

PHP应用的运行方式

PHP应用的运行方式一般有
Apache mod_php 模式、Nginx(FastCgi)+PHP-FPM模式、Swoole常驻内存Daemon模式

Docker单容器

Apache mod_php 模式和Swoole常驻内存Daemon模式本身就是单程序,那么在Docker中入口运行程序直接为应用程序即可

Nginx(FastCgi)+PHP-FPM模式需要nginx和php-fpm 2个程序
这样Docker中就需要运行多个程序,需要有进程守护类软件来运行多个程序,那么可以参考如何在一个Docker中运行多个程序进程
推荐使用s6-overlay

Docker Hub中PHP官方镜像包已经包括Apache mod_php 模式的镜像包,Kubernets官方PHP项目实例GuestBook中就是采用这种模式的镜像包

Docker多容器配合

Docker官方倡导容器单一职责,也就是一个容器只运行一个程序
那么Nginx(FastCgi)+PHP-FPM模式就需要2个容器配合编排工作,再加上如果把PHP代码再独立成一个Docker镜像,那么就是3容器配合编排工作
所以下面就是以PHP项目采用多个Docker镜像的方式再Kubernets平台部署的范例

kubernets(k8s)部署运行

思路说明
容器共有3个,① appphp(wwek/k8s-php-thinkphp-hello:app-v1)php代码容器、② php-fpm(wwek/k8s-php-thinkphp-hello:php-fpm-7.2) 、③ openresty(wwek/k8s-php-thinkphp-hello:openresty)
apphp、php-fpm、openresty三个容器都在一个Pod(8s-php-thinkphp-hello)中
appphp容器作为initContainers初始化容器使用
挂载了一个叫做wwwroot的volume,类型为emptyDir,临时卷
initContainers初始化容器的时候会把php代码复制到wwwroot(volume)中
php-fpm和openresty都挂载wwwroot(volume)
openresty的upstream php 使用域名php-fpm
使用hostAliases把域名php-fpm解析为127.0.0.1(在同一个Pod中网络是共享的,所以用127.0.0.1)

具体的yaml文件

把 k8sphpthinkphp.com hosts解析到Ingress 的ip
然后浏览器

访问 http://k8sphpthinkphp.com/ 可以看到thinkphp的欢迎页面

访问 http://k8sphpthinkphp.com/phpinfo.php 可以看到phpinfo信息

如果没有ingress请自行修改service的type为 NodePort 使用节点的ip和端口访问

docker-compose部署运行

一套打包好的业务PHP Docker业务镜像也可以用docker-compose部署,这样方便了本地的开发调试使用

直接up方式,直接pull已经build好的docker images

本地build方式

浏览器 访问 http://127.0.0.1 访问 http://127.0.0.1/phpinfo.php

代码

所有配置范例代码已经托管到github
k8s-php-thinkphp-hello

PHP在服务化微服务中遇到的问题

项目大了后服务化是必然的!
想象下几十个PHP项目,里面有大多数项目有同样的功能需求,我们可以用复制代码解决
但是对代码维护来说简直是噩梦,一次调整,调整多个项目,简直爽歪歪
先谈服务化拆分,再谈用微服务落地。 做好服务化是目的,用微服务落地是实现方式
那么微服务落地需要一大堆的服务治理能力来支撑,服务注册发现,断路器,网关,RPC等等
微服务中服务注册发现,总不可能手动管理各种服务,那么得有服务注册发现这个东西
由于apache php ,PHP-FPM php不是常驻内存的方式运行,导致了在服务注册发现等方便不能做,服务注册发现又是基础
正因为这个特性让PHP在虚拟主机年代大放异彩,也是因为本身特性导致PHP在服务化,微服务领域落地困难,不过就没解决办法了? 办法是有,但是小公司玩不起来。下面看看市面上的解决方案。

目前用PHP做微服务的解决方案

要用PHP做微服务必须要搞定微服务的服务注册发现问题

Agent模式

微博采用了这样的方式,在跑PHP-FPM的机器上跑了一个Agent(这个和后面会讲到的Service Mesh的 Sidecar模式很像)
通过Agent去完成服务注册发现,调用方通过Agent去调用。Agent作为一个包裹层。
Agent其实是后面在Service Mesh节提到的Sidecar的雏形。

以Swoole为基础的常驻内存damon模式

Swoole是PHP的一个扩展
使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。
基于Swoole开发的php程序是直接常驻内存damon的方式运行的
所以这样就可以方便的做服务注册和发现了
基于Swoole体系的开源PHP微服务框架有
Swoft
PHP-MSF
GroupCo
SwooleDistributed
Tencent/Tars

综述PHP微服务落地

综上述
方式1 以微博为代表的Agent代理模式(php-fpm模式运行的php程序因为运行机制问题,导致只有Agent的模式才能做服务注册发现,极少公司有这个技术支撑)
方式2 以Swoole为基石的常驻内存damon模式
生产可用问题,没有广泛的使用经验,目前有部分有强力技术支持的公司在运用,如果要用于自己的环境需要有技术团队去完成这个落地,需要开发一些配套的管控基础设施
毕竟没有服务治理能力贸然上微服务就是自己搞死自己的事

未来PHP做微服务的解决方案

Java体系以 Spring Cloud、Dubbo为代表的微服务框架得到广泛应用的时候无疑是对java编程语言的助推加持
现有的微服务框架不是就完美了,任何事物都是具备两面性的,现有的框架面临SDK更新,业务代码侵入,编程语言绑定(要做非常多的SDK)等诸多问题

Linkerd横空出世,提出了一个叫做Service Mesh的东西中文翻译叫做服务网格
随后以Google Ibm联合起来紧跟着发起了Istio项目
Service Mesh是一个非常新的概念,在2017年才提出,被誉为下一代微服务框架
试图解决现在的微服务框架的诸多问题,最终实现包含现有框架的所有功能,而且还能实现业务代码零侵入

Service Mesh使用了Sidecar模式接管了网络,所以才能实现业务代码零侵入
正因为Service Mesh的这样的架构设计,所以可以真正的实现编程语言无关性,不同服务可以使用不同的编程语言,不需要为不同的语言每个都去维护SDK

那么用PHP做的服务,不论是apache php ,PHP-FPM php, 还是Swoole damon都可以,可以做到真正的语言无关,应用程序本身是不关心微服务那一堆事情的

目前Service Mesh还存在的问题
体系还是非常早期的阶段,以Istio为例,目前大部分特性都是处在Alpha阶段(https://istio.io/about/feature-stages.html)
性能损失问题,据网上看到的测试Istio目前的版本有40%的性能损失(我觉得这个不是重点,只看字面40%,想象下实际业务场景呢? 解决的问题的收益远大于问题,况且后期肯定有优化的空间)
可能需要K8s才能更好的落地,以Istio为例虽然不强制依赖k8s,但是在k8s运行Istio才是最佳选择,使用k8s也是需要学习成本的(我觉得用k8s不是问题,中小公司可以用云平台直接提供的k8s能力,大公司也不用担心没人运维k8s的问题)
Service Mesh到规模落地时间可能还有2年左右的时间

业务代码开发为什么要关注服务治理的东西,微服务的东西? 这就是抽象成一层框架干的事情

作为phper未来还有机会么

诚然PHP在微服务时代被沦为了“前端”语言,写PHP的在大公司沦为“套模板”的。
在Java Spring Cloud 全家桶面前,phper是看着人家的工具库牛逼。
phper是否没机会了呢,php是否没机会了呢
仅仅是从语言角度讲,首先phper当然有机会,php也当然有机会,phper不要局限在php语言本身,js框架vue,Golang都是可以学习的目标
再次市面上还有大量的web站点只需要php就可以快速简单的达成,根本不需要服务化,什么微服务,老夫拿起php连上redis、mysql就是干,单体应用分分钟出活
phper不用担心没出路,php在web领域的优势、市场需求都会验证这一点

需要2年时间,Service Mesh在中大型公司一定会落地,小公司也会在云平台上找到落地的可能,php一样可以干微服务“后端”干的事!

Teleport

Gravitational Teleport官网

Gravitational Teleport开源代码

Gravitational Teleport 是一个现代化的ssh系统,用于管理Linux服务器集群中的私有访问。
特点在完善的授权管理。
通过在各个独立的防火墙内部署群集,然后再配置这些群集的可信任,可以跨防火墙(NAT)控制Linux终端
免费,开源
可用于多台Linux服务器管理

Teleconsole

Teleconsole官网

Teleconsole开源代码

Teleconsole可以把SSH终端会话分享成一个URL网址,打开这个网址就可以操作SSH终端会话了,SSH终端能上网就能分享
免费,开源,和朋友分享协助比较实用

Teleconsole is a free service to share your terminal session with people you trust. Your friends can join via a command line via SSH or via their browser over HTTPS. Use this to ask for help or to connect to your own devices sitting behind NAT.
You can also forward local TCP ports to your friends. Use this feature to allow them access the web applications running on your localhost when you are behind NAT.

rtty

rtty
根据您的终端的macaddr,通过Web访问您的处在NAT或防火墙里面的终端。
rtty非常适合远程维护你的或者你公司的部署在全球各地的成千上万的Linux设备。

GoTTY

GoTTY官网

GoTTY 分享你的终端成WEB 应用
GoTTY – Share your terminal as a web application

TeamView

TeamView官网
老牌可内网穿透的的远程协助,面向桌面,免费可用

AnyDesk

AnyDesk官网
Windows可用,面向桌面,免费可用

向日葵

向日葵官网
国产知名远程控制软件,面向桌面,收费

RDP 3389

直连模式,微软自带

VNC

直连模式,VNC

guacamole

https://guacamole.apache.org/

webvirtmgr

https://github.com/retspen/webvirtmgr