CI/CD:
https://www.infoq.cn/article/wht0wfmdrrbu-dtkh1xp
docker:
https://blog.csdn.net/zhang__rong/article/details/88647197
harbor:
https://blog.csdn.net/qq_24095941/article/details/86063684
ssh:
https://www.cnblogs.com/architectforest/p/13707244.html
========== CI(Continuous Integration) ===========
1.拉取最新代码
2.用maven打包
3.前端打包,node.js
4.构建镜像(dockerfile)
5.上传仓库(Harbor)
============= CD(Continuous Delivery) ===========
6.拉取镜像(从Harbor)
7.启动容器
服务器地址:192.168.34.99
tips:
报错1:There are no enabled repos. Run “yum repolist all” to see the repos you have.报错解决办法:
http://mirrors.163.com/.help/centos.html 下载对应版本repo文件, 放入/etc/yum.repos.d/里
报错2:
通过 uname -r 命令查看你当前的内核版本(在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上)
uname -r
使用 root
权限登录 Centos。确保 yum 包更新到最新
yum update
卸载旧版本(如果安装过旧版本的话)
yum remove docker docker-common docker-selinux docker-engine
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
安装docker
yum install docker-ce
启动并加入开机启动
systemctl start docker
systemctl enable docker
验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
查看docker服务状态
systemctl status docker
安装Docker Compose
以前使用 Docker 的时候,需要定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。使用 Docker Compose 可以轻松、高效地管理容器,他是一个用于定义和运行多容器Docker的应用程序工具。
curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
给执行文件添加执行权限
chmod +x /usr/local/bin/docker-compose
检查是否安装成功
docker-compose --version
如果是返回:docker-compose version 1.23.2, build 1110ad01
则代表docker compose 安装成功
配置docker国内镜像
vi /etc/docker/daemon.json
添加以下代码
{
"registry-mirrors": ["[https://registry.docker-cn.com](https://registry.docker-cn.com)"]
}
修改保存后重启 Docker 以使配置生效。
systemctl restart docker
至此docker环境搭建完毕!
注:或者执行docker安装脚本后
给脚本 install-docker.sh 增加可执行权限
$ chmod +x install-docker.sh
执行 install-docker.sh 脚本文件
$ ./install-docker.sh
即可自动完成 docker 及、docker-compose 的安装及Mirrors的配置!
1.下载
2.解压
3.配置环境
vim /etc/profile
export JAVA_HOME=/home/jdk1.8.0_251
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
安装路径:/home/jdk1.8.0_251;
版本: 1.8.0_251
jdk1.8.0_181
1.下载
2.解压
3.配置环境
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
安装路径:/usr/local/apache-maven-3.6.3;
版本:Apache Maven 3.6.3
yum install git
命令地址:/usr/bin/git;
版本:1.8.3.1
检查是否安装node
node --version
若未安装
cd /home
wget https://nodejs.org/dist/v14.0.0/node-v14.0.0-linux-x64.tar.gz
解压
tar xvzf node-v14.0.0-linux-x64.tar.gz
修改环境变量
vim /etc/profile
export PATH=/home/node-v14.0.0-linux-x64/bin:$PATH
source /etc/profile
查看环境变量
java -version #没有的话dk1.8安装
mvn -v #没有的话maven安装
git --version # 没有的话git安装
node -v # 没有的话node安装
添加Jenkins源
wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
安装
yum install jenkins
启动
service jenkins start
访问
http://ip:8080/ #jenkenis默认是8080
第一次密码在
vim /var/lib/jenkins/secrets/initialAdminPassword
点击安装推荐的插件
另必备:maven itegration plugin,git,gitlab plugin,nodejs,docker plugin,docker-bulid-step;
配置全局(Global Tool Configuration)jdk maven git node.js
1.maven配置:配置settings.xml地址
并且:替换掉原来的setting.xml,将本地仓库地址改为如下地址,
/var/lib/jenkins为jenkins中的主目录地址
<localRepository>/var/lib/jenkins/.m2/repository</localRepository>
2.配置jdk环境地址 (可以用echo $JAVA_HOME
获取)
3.git配置环境地址 可以用(which -a git查看)
4.maven配置环境地址
需在maven安装文件所在目录输入,给jenkins添加权限
sudo chown -R jenkins:jenkins maven目录
5.node.js配置环境地址
安装nodojs插件
配置node环境
//键
JAVA_HOME
//值
/home/jdk1.8.0_251
//键
M2_HOME
//值
/usr/local/apache-maven-3.6.3
//键
PATH+EXTRA
//值
$M2_HOME/bin
vi /usr/lib/systemd/system/docker.service
将其中第11行的 ExecStart=/usr/bin/dockerd 替换为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
(此处默认2375为主管理端口,unix:///var/run/docker.sock用于本地管理,7654是备用的端口)
将管理地址写入 /etc/profile
echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
使profile生效
source /etc/profile
*docker login 报【Error response from daemon: Get https://172.17.8.201:8002/v2/: http: server gave HTTP response to HTTPS client】
原因:docker镜像仓库暂不支持https
在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入
{ "insecure-registries":["172.17.8.201:8003"] }
然后重启docker服务
*修改/var/run/docker.sock
的文件权限,普通用户是没有权限操作该文件的,执行之后,jenkins才有权限打包镜像
sudo chmod 666 /var/run/docker.sock
docker search jdk
docker search mysql
选择需要的版本或最新的,如:
docker pull mysql:latest
docker pull openjdk:8-jdk-alpine
docker images //查看是否存在mysql或jdk镜像
如下载镜像太慢,替换为阿里云镜像加速器:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}
{ “insecure-registries”:[“192.168.99.99:80”] }
(用以jenkins控制远程主机拉取镜像和自动发布应用)
1.安装Publish over SSH插件
2.jenkins主机生成ssh公钥复制到远程主机,实现免密登录
#切换到.ssh目录,没有就手动创建
cd /root/.ssh/
#生成密钥,默认一直回车即可(可设置Passphrase,用于访问ssh key时输入)
ssh-keygen -t rsa
#复制本地公钥到远程主机,输入yes,远程主机登录密码
ssh-copy-id 192.168.99.999
#测试能否连接远程主机
ssh 192.168.99.999
连接成功后记得返回本机进行以下步骤:
两种方式:
1.Path to key 中填写 /root/.ssh/id_rsa 路径
2.将id_rsa中的密钥复制到key中
测试时可能会报错:
jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@60373f7]
原因是jenkins无法识别该类型的密钥,我们生成密钥的openssh的版本过高的原因
查看所生成私钥的格式:
more /root/.ssh/id_rsa
可以看到密钥的首行是:
-----BEGIN OPENSSH PRIVATE KEY——
解决方案:
ssh-keygen -m PEM -t rsa -b 4096
# -m 参数指定密钥的格式,PEM是rsa之前使用的旧格式
# -b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。
查看所生成私钥的格式:
more /root/.ssh/id_rsa
可以看到密钥的首行是:
-----BEGIN RSA PRIVATE KEY-----
重新测试,显示success即可。
FROM Openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 7109
ENTRYPOINT ["java","-jar","-Dspring.cloud.nacos.discovery.server-addr=192.168.99.999:8848","-Dspring.cloud.nacos.discovery.namespace=cd","-Dspring.cloud.nacos.config.server-addr=192.168.99.999:8848","-Dspring.cloud.nacos.config.namespace=cd","-Dspring.profiles.active=test","-Dspring.cloud.nacos.config.group=DEFAULT_GROUP","/app.jar"]
每个微服务放一个dockerfile;并且在pom.xml中添加插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>/target/dvsc-cdsv-map-server-1.0.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
利用流水线语法生成流水线脚本,整理并编写在jenkinfile文件中,jenkinsfile放在项目代码中,编写完成后推送到gitlab,由Jenkins从gitlab中拉取Jenkinsfile并执行该脚本;( 每个微服务里理论上放一个固定的jenkinsfile,以下为测试dvsc-cdsv-map所涉及到的脚本代码)
def map_project_url="http://192.168.99.99:82/cdsv/map.git"
def gitlab_auth="998b09a8-9c67-4fb3-bb37"
//构建版本名称
def tag ="latest"
//harbor私服地址
def harbor_url="192.168.99.99:80"
//harbor的项目名称
def harbor_project_name="map"
project_name="map-server"
def habor_auth="1199675c-5981-4f47-b2e7"
def port="10001"
//定义镜像名称
def imageName="map-server:latest"
def username="admin"
def password="admin"
node {
def mvnHome
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitlab_auth}",
url: "${map_project_url}"]]])
}
stage('构建代码') {
//编译,构建本地镜像
sh "mvn clean package"
sh "mvn -f dvsc-cdsv-map-server dockerfile:build"
//给镜像打标签
sh "docker" tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}
}
stage('镜像上传') {
withCredentials([usernamePassword(credentialsId: '1199675c-5981-4f47-b2e7', passwordVariable: 'password', usernameVariable: 'username')]) {
// 登陆
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
}
}
stage('删除本地镜像') {
sh "docker rmi -f ${imageName}"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
}
//远程发布本质是镜像拉取
//流水线语法;ssh--生成脚本;修改后放在下面
stage('远程发布') {
sshPublisher(publishers: [sshPublisherDesc(
configName: 'docker_client',
transfers:
[sshTransfer(cleanRemote: false, excludes: '',
execCommand: "/opt/jenkins_shell/map_image.sh $harbor_url $harbor_project_name $project_name $tag $port",
exectTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false,
patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: ''
)],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)])
}
${harbor_url} ${harbor_project_name} ${project_name} ${tag} ${port}
}
1.构建项目
3.设置构建环境
4.配置项目自动化打包,选择 增加构建步骤 —Excute shell 这个是运行相关的sh命令
5.把打包好的项目文件发布到远程服务器
选择“构建后操作步骤”—“Send build artifacts over SSH” 。
Name:创建的远程服务器名称(需要推送远程的服务器名称)
Source files:本地需要传输过去的文件(默认执行路径为Jenkins的工作路径,直接跟要传输的文件名称和相对路径)
Remove prefix:过滤掉的目录名(指过滤掉的source files路径)
Remote directory:远程服务器的保存路径(配置的根目录的路径下生成的路径)
Exec command:传输完成后在远程服务器执行的sh命令(默认执行路径为root家目录)
如有不全可参考:
保存后点击“立即构建”查看任务是否构建完成,Console Output 菜单可以查看构建日志。
具体可看:
https://www.cnblogs.com/djlsunshine/p/11059690.html
服务器地址:192.168.34.32
见上文
见上文
mkdir -p /harbor
cd /harbor
在以下网址下载离线包,传到服务器 /harbor/
https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz
解压
tar -zxf harbor-online-installer-v2.0.1.tgz
进入解压后的harbor
cd /harbor/harbor
ls //查看
yml文件改名
cp harbor.yml.tmpl harbor.yml
用于存放harbor的持久化数据
mkdir -p /opt/application/harbor
修改harbor安装的配置文件
vi harbor.yml
harbor.yml配置文件主要修改参数如下:
hostname: 192.168.34.32 //需要写IP地址或者域名
#http配置
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80 //端口冲突可修改
#https配置(如不需要可不配置,但需加上注释)
# https related config
#https:
#https port for harbor, default is 443
#port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
harbor_admin_password: admin //admin密码
#数据库配置
database:
# The password for the root user of Harbor DB. Change this before any production use.
password: root123
# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
max_idle_conns: 50
# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
# Note: the default number of connections is 100 for postgres.
max_open_conns: 100
#持久化数据目录
data_volume: /opt/application/harbor
Harbor依赖的镜像及启动服务如下:
docker-compose ps
查看正在运行的docker容器:
docker ps
访问harbor WEB界面(账号、密码:admin)
192.168.99.99:80
1.登陆harbor
docker login 192.168.99.99
admin
admin
输完账户、密码后,此时会报错,解决办法:
查找docker.service所在的位置
find / -name docker.service -type f
修改docker-service
在ExecStart之后添加--insecure-registry=http://192.168.34.32
//重启并重新加载配置文件
systemctl restart docker
systemctl daemon-reload
//重启
systemctl restart docker
再次登陆即可
2.在Harbor界面上创建新项目供上传使用
点击新建项目即可
3.给构建好的镜像打标签并上传到harbor
4.下载镜像
(注:第3,4步在Jenkinsfile中执行)
# cd harbor/harbor //切换到harbor安装包目录
# docker-compose stop //停止Harbor
# docker-compose start //启动Harbor
修改配置文件后
docker-compose stop
./install.sh
docker-compose start
服务器地址:192.168.34.999
见上文
map_image.shhttp://192.168.99.99:82/cdsv
#! /bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=docker ps -a | grep -w ${project_name}:{tag} | awk '{print $1}'
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId= docker images | grep -w $project_name | awk '{print $3}'
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
#登录Harbor
docker login -u admin -p admin $harbor_url
#下载镜像
docker pull $imageName
#启动容器
docker run -di -p $port:$port --net=host $imageName
echo "容器启动成功"
3.报【Error response from daemon: Get https://172.17.8.201:8002/v2/: http: server gave HTTP response to HTTPS client】
原因:docker镜像仓库暂不支持https
在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入
{ "insecure-registries":["172.17.8.201:8003"] }
然后重启docker服务
k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。
Docker是应用最为广泛的容器技术,通过打包镜像,启动容器来创建一个服务。但是随着应用越来越复杂,容器的数量也越来越多,由此衍生了管理运维容器的重大问题,而且随着云计算的发展,云端最大的挑战,容器在漂移。在此业务驱动下,k8s问世,提出了一套全新的基于容器技术的分布式架构领先方案,在整个容器技术领域的发展是一个重大突破与创新。
那么,K8S实现了什么?
具体来说,主要包括以下几点:
k8s集群由Master节点和Node(Worker)节点组成。
Master节点
Master节点指的是集群控制节点,管理和控制整个集群,基本上k8s的所有控制命令都发给它,它负责具体的执行过程。在Master上主要运行着:
Node节点
除了master以外的节点被称为Node或者Worker节点,可以在master中使用命令 kubectl get nodes
查看集群中的node节点。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,该节点上的工作负载就会被Master自动转移到其它节点上。在Node上主要运行着: