大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门博主专栏页面连接:专栏传送门–网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
目录
一、Docker
1.服务docker化
部署user-service
- 编写Dockfile文件
#源镜像
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", "&"]
- 编写build.sh脚本
#!/bin/bashrm -rf user-servicego build .docker build -t mic-user-service -f Dockerfile .
执行build.sh构建镜像
- 编写start.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
部署user-edge-service
- 编写Dockfile文件
#源镜像
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", "&"]
- 编写build.sh脚本
#!/bin/bash
rm -rf user-edge-service
go build .
docker build -t mic-user-edge-service:latest
执行build.sh构建镜像
- 编写start.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
- 访问user-edge-service服务测试
使用docker-compose编排容器
上面的方式需要一个一个单独启动容器服务,我们可以是用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
2.私有仓库管理
什么是 Harbor ?
- Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。
- Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
- Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。
Harbor的特性:
- 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
- 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
- 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
- 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
- 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
- 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
- Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
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个服务:
- UI (harbor-ui) :提供图形化界面,帮助用户管理Registry上的镜像 (image) ,并对用户进行授权。
- WebHook:为了及时获取Registry上image 状态变化的情况,在Registry上配置 Webhook, 把状态变化传递给 UI 模块。
- Token 服务:负责根据用户权限给每个Docker push/pull 命令签发Token。 Docker 客户端向Registry 服务发起的请求,如果不包含Token,会被重定向到 Token 服务,获得 Token 后再重新向Registry 进行请求。
4)Database (harbor -db) :为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
5)Job services:主要用于镜像复制,本地镜像可以被同步到远程Harbor实例上。
6)Log collector (harbor-log) :负责收集其他组件的日志到一个地方。
3.Docker下的服务通讯
1. 每台机器上都有一个网卡,有的甚至有两个网卡 , ETHD 10.1.1.10/8就表示一个网卡
2. docker启动以后, 会出现一个docker0,我们可以通过ifconfig来查看
交换机一旦创建以后, 就会创建一个叫namespace的东西,名字叫做network namespace. 全名叫做网络命名空间.也就是上图中蓝色方框VethX,不同的网络命名空间会形成相互隔离,一端固定在容器内容, 成为虚拟网卡, 另一端固定在本机。
只要多一个容器就会多一个veth。也就是说一端在容器里,另一端在本机里,作为连通的作用。 并且, 网络命名空间会将不同的网络隔离开来,各用个的。这样就实现了隔离,以及怎样与本机进行交互。这样,容器和容器之间就可以通讯了。 这解决的是容器和容器间进行通讯。 这是通过docker0网桥解决的。
二、服务编排
1.Kubernetes
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 <<EOF > /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
2.Mesos
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决定。
3.Swarm
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 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。
三、CICD
1.Gitlab触发构建
Jenkins使用配置
安装Gitlab和Blue Ocean插件
安装Role-based Authorization Strategy插件
Role-based Authorization Strategy插件用于角色的权限管理。
新建用户,系统管理–>管理用户
更改认证方式,系统管理 –> 全局安全配置,默认创建的用户登录后可以做任何操作,取决于默认的认证授权方式。
创建角色,系统管理 –> Manage and Assign Roles
对角色分配权限
将用户分配到角色
登录
2.Jenkins pipeline流水线
关于流水线(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 语法说明
- 流水线支持两种语法:声明式和脚本式流水线。两种语法都支持构建持续交付流水线。且均可用在web ui或者Jenkinsfile中定义流水线,通常认为创建一个Jenkinsfile并将其检入源代码控制仓库是最佳实践。
- 创建jenkinsfile jenkinsfile是一个文本文件,它包含了Jenkins流水线的定义并被检入源代码控制仓库。下面的流水线实现了基本的三阶段持续交付流水线。 jenkinsfile(declarative 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是灰色的。
3.Kubect操作k8s集群
kubectl是k8s的客户端程序,也是k8s的命令行工具,kubectl提供了大量的子命令可以让用户和集群进行交互。
kubectl 连接 Kubernetes 集群
- 从Kubernetes 版本页面下载最新的 kubectl 客户端。
- 安装和设置 kubectl 客户端。
有关详细信息,参见 安装和设置 kubectl。
- 配置集群凭据。
您可以在集群信息页面查看集群凭据。
- 登录容器服务管理控制台。
- 在 Kubernetes菜单下,单击集群进入 Kubernetes 集群列表页面。
- 选择所需的集群并单击右侧的管理。
- 您可以在连接信息处查看集群的连接地址。
- 拷贝集群凭据到本地文件中,您可创建并将集群凭据保存到 $HOME/.kube/config(kubectl 预期凭据所在的位置)。或者命名一个新的文件,如 /tmp/kubeconfig,并执行命令
export KUBECONFIG=/tmp/kubeconfig。
- 执行上述操作后,您可执行以下命令,确认集群连接情况。
# kubectl cluster-info
Kubernetes Master is running at https://xxxxxx.serverless-1.kubernetes.cn-shanghai.aliyuncs.com:6443
四、小结
后期将将微服务器相关知识
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207468.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...