博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
目录
一、Docker
1.服务docker化
2.私有仓库管理
3.Docker下的服务通讯
二、服务编排
1.Kubernetes
2.Mesos
3.Swarm
三、CICD
1.Gitlab触发构建
2.Jenkins pipeline流水线
3.Kubect操作k8s集群
四、微服务入门
1.微服务入门
2.优势劣势
3.如何通讯
4.如何发现、更新和部署
五、微服务周边
1.SpringBoot
2.SpringCloud
3.Dubbo
六、微服务开发
1.服务划分
2.rpc通讯
3.跨语言调用
#源镜像
FROM golang:1.13
#设置工作目录
WORKDIR $GOPATH/src
RUN mkdir user-service
COPY user-service $GOPATH/src/user-service
#切换工作目录
WORKDIR $GOPATH/src/user-service
RUN mkdir log
#暴露端口
EXPOSE 9090
#最终运行docker的命令
ENTRYPOINT ["nohup","./user-service",">log/log.log", "&"]
#!/bin/bash
rm -rf user-service
go build .
docker build -t mic-user-service -f Dockerfile .
执行build.sh构建镜像
#!/bin/bash
docker stop mic_user_service
docker rm mic_user_service
docker run -p 9090:9090 --name mic_user_service -v /usr/local/docker/micservice/user-service/log:/go/src/user-service/log -d mic-user-service
启动容器 ./start.sh
user-server服务依赖mysql服务,请访问 docker搭建mysql
#源镜像
FROM golang:1.13
#设置工作目录
WORKDIR $GOPATH/src
RUN mkdir user-edge-service
COPY user-edge-service $GOPATH/src/user-edge-service
COPY config.ini $GOPATH/src/user-edge-service
#切换工作目录
WORKDIR $GOPATH/src/user-edge-service
RUN mkdir log
#暴露端口
EXPOSE 9091
#最终运行docker的命令
ENTRYPOINT ["nohup","./user-edge-service",">/dev/null", "&"]
#!/bin/bash
rm -rf user-edge-service
go build .
docker build -t mic-user-edge-service:latest
执行build.sh构建镜像
#!/bin/bash
docker stop mic_user_edge_service
docker rm mic_user_edge_service
docker run -p 9091:9091 --name mic_user_edge_service -v /usr/local/docker/micservice/user-edge-service/log:/go/src/user-edge-service/log -d mic-user-edge-service
启动容器 ./start.sh
http://172.16.57.110:9091/adapi/login
上面的方式需要一个一个单独启动容器服务,我们可以是用docker-compose来管理容器
安装docker-compose
yum install docker-conpose
编写docker-compose.yml
version: '3'
networks:
default:
external:
name: micservice-network
services:
mysql:
image: mysql:5.7
ports:
- 3306:3306
volumes:
- /usr/local/docker/mysql/conf:/etc/mysql
- /usr/local/docker/mysql/logs:/var/log/mysql
- /usr/local/docker/mysql/data:/var/lib/mysql
environment:
- TZ="Asia/Shanghai"
redis:
image: redis:5.0.4
ports:
- 6379:6379
volumes:
- /usr/local/docker/redis/logs:/usr/local/redis/logs
- /usr/local/docker/redis/redis.conf:/etc/redis_default.conf
- /usr/local/docker/redis/data:/data
environment:
- TZ="Asia/Shanghai"
mongo:
image: mongo:latest
ports:
- 27017:27017
volumes:
- /usr/local/docker/mongo/data:/data/db
- /usr/local/docker/mongo/conf/mongodb.cnf:/etc/mongo.conf
environment:
- TZ="Asia/Shanghai"
user-service:
image: mic-user-service:latest
ports:
- 9090:9090
volumes:
- /usr/local/docker/micservice/user-service/log:/go/src/user-service/log
environment:
- TZ="Asia/Shanghai"
user-edge-service:
image: mic-user-edge-service:latest
ports:
- 9091:9091
links:
- user-service
volumes:
- /usr/local/docker/micservice/user-edge-service/log:/go/src/user-edge-service/log
environment:
- TZ="Asia/Shanghai"
#启动所有服务
docker-compose up -d
#启动某个
docker-compose up user-service -d
# 停止所有容器服务
docker-compose stop
资料来源
Harbor的特性:
Harbor的构成:
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。
1)Proxy: Harbor 的 Registry、 UI、Token 服务等组件,都处在nginx反向代理后边。该代理将来自浏览器、docker clients
的请求转发到后端不同的服务上。
2)Registry:负责储存Docker 镜像,并处理Docker push/pull命令。由于要对用户进行访问控制,即不同用户对Docker 镜像
有不同的读写权限,Registry 会指向一个Token 服务,强制用户的每次Docker pull/push 请求都要携带一个合法的Token,
Registry会通过公钥对Token进行解密验证。
3)Core services:Harbor的核心功能,主要提供以下3个服务:
4)Database (harbor -db) :为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
5)Job services:主要用于镜像复制,本地镜像可以被同步到远程Harbor实例上。
6)Log collector (harbor-log) :负责收集其他组件的日志到一个地方。
1. 每台机器上都有一个网卡,有的甚至有两个网卡 , ETHD 10.1.1.10/8就表示一个网卡
2. docker启动以后, 会出现一个docker0,我们可以通过ifconfig来查看
交换机一旦创建以后, 就会创建一个叫namespace的东西,名字叫做network namespace. 全名叫做网络命名空间.也就是上图中蓝色方框VethX,不同的网络命名空间会形成相互隔离,一端固定在容器内容, 成为虚拟网卡, 另一端固定在本机。
只要多一个容器就会多一个veth。也就是说一端在容器里,另一端在本机里,作为连通的作用。 并且, 网络命名空间会将不同的网络隔离开来,各用个的。这样就实现了隔离,以及怎样与本机进行交互。这样,容器和容器之间就可以通讯了。 这解决的是容器和容器间进行通讯。 这是通过docker0网桥解决的。
kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
安装
国内安装k8s途径
- 使用kubeadmin离线安装
- 使用阿里公有云平台k8s
- 通过yum官方仓库
- 二进制包形式安装,kubeasz
安装kubeadmin加载k8s镜像
# 以下命令在三台虚拟机执行 yz10 yz20 yz21
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
k8s离线部署
10.211.55.10 yz10 Master节点
10.211.55.20 yz20 Node节点
10.211.55.21 yz21 Node节点
# 1. 调整时区
timedatectl set-timezone Asia/Shanghai
# 2. 关闭selinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
# 3. k8sadmin镜像下载附带对应的docker
# 4. 镜像上传到每个节点
mkdir -p /usr/local/k8s-install
scp -r kubernetes-1.14 root@yz10:/usr/local/k8s-install
# 5. 安装docker,记得配置加速器
tar -xf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
# 6. 确认cgroup为 cgroupfs
docker info|grep cgroup
# 7. 安装kubeadm
tar -xf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
# 8. 关闭交换区
swapoff -a #关闭
vi /etc/fstab
# 注释这行 永久关闭
#/dev/mapper/centos-swap swap swap defaults 0 0
# 9. 配置网桥
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 10. 通过镜像安装k8s
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。Mesos最初由加州大学伯克利分校的是AMPLab开发的,后在Twitter得到广泛使用。
Mesos是一个分布式的架构,具有主从关系,master和slave。Zookeeper能做到首领选举(选mesos的master)等功能。要注意的是zookeeper也需要选举master。应用程序跑在frameworks上,它也是分布式的软件,包括scheduler和executor。图中蓝色部分是mesos本身,白色部分是需要自己开发的framework。这些需要自己开发的framework也需要考虑高可用性的问题,这算是mesos的缺点之一。Mesos使用protocol buffer和libprocess来进行通信。
1)zookeeper做为leader election。每个master起来的时候都要向zookeeper的quorum注册znode。
2)master主要用于管理slave node的状态,知道slave在哪儿,有哪些资源,同时知道各个框架的信息。比如Hadoop和MPI框架的基本信息。master还可以发resource offer。如果master down了,zookeeper可以马上从standby master里面选一个。因为几个master里面共享的东西很少,不需要数据的同步。
3)slave负责运行任务,同时不断的向master发消息,报告可用资源和在运行的任务的状态。这两种消息并不相同,报告任务状态的消息保证一定delivery,而其他消息并不保证。
4)framwork是一个分布式的应用,包括scheduler和executor。其中scheduler部分要和master紧密通信,接受master发送的offer,scheduler收到offer后决定是不是要跑某个task。executor真正的去执行任务。Offer的发送由master决定。
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。
集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。
Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点。
编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。
以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。
从集群角度来说,一个 Swarm 由一个或多个 Docker 节点组成。这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例。唯一的前提就是要求所有节点通过可靠的网络相连。
节点会被配置为管理节点(Manager)或工作节点(Worker)。管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。工作节点接收来自管理节点的任务并执行。
Swarm 的配置和状态信息保存在一套位于所有管理节点上的分布式 etcd 数据库中。该数据库运行于内存中,并保持数据的最新状态。关于该数据库最棒的是,它几乎不需要任何配置,作为 Swarm 的一部分被安装,无须管理。
关于集群管理,最大的挑战在于保证其安全性。搭建 Swarm 集群时将不可避免地使用 TLS,因为它被 Swarm 紧密集成。
在安全意识日盛的今天,这样的工具值得大力推广。Swarm 使用 TLS 进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic Key Rotation)更是锦上添花!其在后台默默进行,用户甚至感知不到这一功能的存在。
关于应用编排,Swarm 中的最小调度单元是服务。它是随 Swarm 引入的,在 API 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。
Jenkins使用配置
安装Gitlab和Blue Ocean插件
安装Role-based Authorization Strategy插件
Role-based Authorization Strategy插件用于角色的权限管理。
新建用户,系统管理-->管理用户
更改认证方式,系统管理 --> 全局安全配置,默认创建的用户登录后可以做任何操作,取决于默认的认证授权方式。
创建角色,系统管理 --> Manage and Assign Roles
对角色分配权限
将用户分配到角色
登录
关于流水线(Pipline)
Jenkins 从 2.0 开始逐渐从一个 CI 工具转变成为 CD 工具,Pipeline 在其中扮演着至关重要的角色。配置由界面选择逐渐脚本化(采用 Groovy 脚本),我们可以将配置连同代码一起存放在代码仓库,实现版本控制。一次编写,到处运行。
在 Pipeline 中有两个主要关键字需要先简单的了解,可能有些地方还能见到 Step 关键字:
1. Stage:阶段,这其实就是我们将任务细分为多个过程。
2. Node:节点,前面提到过,Jenkins 是可以分布式的,Node 标记着具体在 Master 还是 Slave 运行这个构建。
修改之前的流水线配置
建议写好粘贴进去:
node {
stage("拉取代码"){
echo 'STEP 1:clone code'
}
stage("打包代码"){
echo 'STEP 2:code package'
}
stage("上线发布"){
echo 'STEP 3:deploy package'
}
}
Pipeline 语法说明
pipeline{
agent any
stages{
stage("Build"){
steps{
echo "building..."
}
}
stage("Test"){
steps{
echo "Test..."
}
}
stage("Deploy"){
steps{
echo "Deploy..."
}
}
}
}
- always: 无论流水线或阶段的完成状态如何,都允许在post部分运行该步骤。
- changed: 只有当前流水线或阶段的完成状态与它之前的运行不同时,才允许在post部分运行该步骤。
- failure:只有当前流水线或阶段的完成状态为failure,才允许post部分运行该步骤,通常web ui是红色。
- success: 只有当前流水线或阶段的完成状态为success,才允许post部分运行该步骤,通常web ui是蓝色或绿色。
- unstable: 只有当前流水线或阶段的完成状态是unstable,才允许在post部分运行该步骤,通常由于测试失败,代码违规等造成的,通常web ui是黄色的。
- aborted只有当前流水线或阶段的完成状态是aborted,才允许在post部分运行该步骤,通常流水线被手动的aborted,通常web ui是灰色的。
kubectl是k8s的客户端程序,也是k8s的命令行工具,kubectl提供了大量的子命令可以让用户和集群进行交互。
kubectl 连接 Kubernetes 集群
有关详细信息,参见 安装和设置 kubectl。
您可以在集群信息页面查看集群凭据。
export KUBECONFIG=/tmp/kubeconfig。
# kubectl cluster-info
Kubernetes Master is running at https://xxxxxx.serverless-1.kubernetes.cn-shanghai.aliyuncs.com:6443
后期将将微服务器相关知识