docker+k8s+jenkins+harbor持续集成自动化部署

一、安装docker

另外一篇文章有讲docker的安装与相关配置,暂时就不讲了

1、关闭防火墙并修改主机名

hostnamectl set-hostname k8s-master && bash #修改主机名
systemctl stop firewalld
systemctl disable firewalld

2、永久禁用swap

vi /etc/fstab
#验证是否关闭,swap必须为0
free -g 

用#注释掉swap一行(新版centos已经默认禁用)

在这里插入图片描述


3、配置镜像加速

到阿里云获取自己镜像加速地址

在这里插入图片描述

cat /etc/docker/daemon.json
        {
        "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"], ##修改为你的容器加速器地址   登录阿里云点击镜像工具-镜像加速器

4、安装 docker-compose

  • 官网找到下载地址

https://github.com/docker/compose/releases 版本地址

在这里插入图片描述


我的下载地址

wget https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-linux-x86_64
  • 下载后移动至/usr/local/bin/文件夹下 (如果移动不了 就手动移动,记住重命名“docker-compose”)
 mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
 chmod a+x /usr/local/bin/docker-compose
  • 启动
./install.sh  #记住到harbor目录中执行install.sh  

我的harbor下载安装的时候在home

在这里插入图片描述


进入到harbor命令 可以用 统一停止 和启动所有harbor插件
docker-compose down 关闭
docker-compose up -d 启动

  • 测试打包上传到镜像仓库

现在下载一个镜像nginx

docker pull nginx

给镜像打tag

docker tag nginx:latest ip:端口/项目/nginx

上传镜像

docker push ip:端口/项目/nginx

#在linux 拉取gitlab的代码 (尤其在jenkins一定要先通过ssh拉取一次代码)

git clone sshxxxxxxxxxx地址

5、项目配置

  • 项目结构

在这里插入图片描述


ums-app 为业务处理
ums-api 为api接口
因api包依赖到根项目的pom.xml 所以 打包时 需要将根项目打包,(但不打包ums-app)
排除ums-app 则在 ums-app的pom.xml

<maven.deploy.skip>true</maven.deploy.skip>
  • 创建Dockerfile
    创建的目录为 app>src>main 因为只构建uniapp
FROM primetoninc/jdk:1.8

LABEL maintainer="wj"

VOLUME /tmp
VOLUME /file
ARG JAR_FILE
RUN echo $JAR_FILE
ADD $JAR_FILE app.jar
RUN sh -c 'touch /app.jar'

EXPOSE 8080
ENV SPRING_PROFILES_ACTIVE=dev
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 父项目加载打包插件
<properties>
        <docker.repository.releases>192.168.1.8:1180</docker.repository.releases>
        <revision>1.0.1-SNAPSHOT</revision>
</properties>

<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>1.2.2</version>
                    <configuration>
                        <serverId>docker-releases</serverId>
                        <registryUrl>http://${docker.repository.releases}</registryUrl>
                        <pushImage>true</pushImage>
                        <imageName>${docker.repository.releases}/ums/${project.artifactId}:${revision}</imageName>
                        <!--<dockerHost>http://172.25.6.11:2375</dockerHost>-->
                        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                        <buildArgs>
                            <active>dev</active>
                            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                        </buildArgs>
                        <rm>true</rm>
                        <!-- 强制添加标签-->
                        <forceTags>true</forceTags>
                        <imageTags>
                            <imageTag>${revision}</imageTag>
                        </imageTags>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>

            </plugins>
        </pluginManagement>

    </build>
  • 子项目 ums-app引用
<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
</plugin>

二、安装jenkins

1、拉取jenkins镜像
docker pull docker.io/jenkins/jenkins
2、创建文件夹
mkdir -p /home/jenkins
3、权限
chmod 777 /home/jenkins
4、启动
docker run -d -uroot -p 8080:8080 -p 50000:50000 --name jenkins -v /home/jenkins:/var/jenkins -v /etc/localtime:/etc/localtime jenkins/jenkins
5、打开客户端
http://serverIp:port

在这里插入图片描述


6、由于在docker容器 安装的jenkins 所以需要进入容器查看密码
进入容器
docker exec -it jenkins bash
查看密码
cat /var/jenkins_home/secrets/initialAdminPassword
登录后 安装推荐插件

在这里插入图片描述


插件安装完成,创建管理员用户
至此,Jenkins安装完成!!!

7、因jenkins会拉取gitlab的代码进行构建,采用ssh的方式则需密钥,然后jenkins在docker容器中 所以需要进入docker容器生成密钥

docker exec -it jenkins bash   # 进入docker容器

生成密钥

#注意这里的-m PEM参数,如果没有的话,会生成较新版本的证书,jsch无法识别,后面无法用于ssh登录
ssh-keygen -m PEM -t rsa  # 输入后 一直按回车键即可
cd ~/.ssh  #进入到jenkins里面的.ssh目录  会看到2个文件 id_rsa  id_rsa.pub

id_rsa.pub 为公钥(放到gitlab中的SSH 密钥) id_rsa 为私钥(放到Jenkins凭证)

在这里插入图片描述


8、安装插件

所需的插件:
• Maven插件 Maven Integration plugin
• 发布插件 Deploy to container Plugin
• SSH连接 Publish Over SSH

安装过程:
系统管理—>插件管理---->可选插件—>过滤Deploy to container---->勾选—>直接安装

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

已安装好的插件

在这里插入图片描述


9、jenkins配置

  • Dashboard>系统管理>Configure System (如果没有这个配置则需要添加 插件)
    同一页面
    Jenkins Location 这列需要配置 公网地址

    在这里插入图片描述


    全局属性 这列配置环境变量

    在这里插入图片描述


    配置变量的地址
    vi /usr/lib/systemd/system/docker.service

    在这里插入图片描述


    配置hosts地址
    vi /etc/hosts

    在这里插入图片描述

  • Dashboard>系统管理>全局工具配置 (如果没有这个配置则需要添加 插件)
    拉到最下面 我已经装了 所以是应用,没有装的情况是 需要新增一个
    选择
    maven的版本
    名字

    在这里插入图片描述


    进入jenkins 容器配置settings.xml
    如执行出现 没有vi命令

#安装命令
apt-get update
apt-get install vim 

cd /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.8.6/conf
修改settings.xml

在这里插入图片描述


在这里插入图片描述

  • 配置jenkins的密钥
    密钥为之前在jenkins生成的,id_rsa 为密钥

    在这里插入图片描述

    在这里插入图片描述

  • 创建maven项目

    在这里插入图片描述

  • BRANCH_ENV 为变量

  • dev、master 对应的分支名,必须一致

在这里插入图片描述

在这里插入图片描述

三、安装Harbor私有镜像仓库

1、下载harbor

wget https://github.com/goharbor/harbor/releases/download/v2.0.6/harbor-offline-installer-v2.0.6.tgz

2、解压下载的harbor

tar -zxvf harbor-offline-installer-v2.0.6.tgz

3、配置harbor
修改harbor.yml文件,如果该文件不存在,则从harbor.yml.tmpl复制一下

hostname: 10.1.1.132    ###修改成自己的主机ip,如果在公网,则添加能访问到该主机的域名
http:
port: 1180                ###默认是80端口,可以修改成自己想设置的端口
harbor_admin_password: 123456		###修改为你要设置的密码
###并把https注释掉,不然在安装的时候会报错:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
#port: 443
#certificate: /your/certificate/path
#private_key: /your/private/key/path

4、配置harbor地址 用于上传镜像

[root@master~]# cat /etc/docker/daemon.json
        {
        "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"], ##修改为你的容器加速器地址   登录阿里云点击镜像工具-镜像加速器
        "insecure-registries":["10.1.1.132:1180"]   ##修改为你的harbor服务器地址和端口
        }

5、此时 可以将代码打包成镜像 推送到harbor中了
启动镜像的命令
docker run -d -p 实际访问端口:项目端口 192.168.1.8:1180/project/ums-app

-------------------------------------- 到此 整个构建、上传已经完成 -----------------------------------------

四、K8S搭建

  1. 如果之前有装过k8s 建议先清理一次
yum remove -y kubelet kubeadm kubectl
kubeadm reset -f
rm -rvf $HOME/.kube
rm -rvf ~/.kube/
rm -rvf /etc/kubernetes/
rm -rvf /etc/systemd/system/kubelet.service.d
rm -rvf /etc/systemd/system/kubelet.service
rm -rvf /usr/bin/kube*
rm -rvf /etc/cni
rm -rvf /opt/cni
rm -rvf /var/lib/etcd
rm -rvf /var/etcd
#杀死运行的容器:
docker kill
#删除所有容器:
docker rm 
#强制删除所有镜像:
docker rmi -f 
#如果发现还是清除不掉
ps -ef|grep kubelet
#然后再kill -9 id
  1. 修改主机名称 (之前有处理过 可不用管)
hostnamectl set-hostname k8s-master && bash
  1. 添加主机的ip (之前有处理过 可不用管)
[root@k8s-master /]# cat /etc/hosts
192.168.1.8 k8s-master

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

185.199.108.133 raw.githubusercontent.com
  1. 关闭防火墙 (之前有处理过 可不用管)
systemctl stop firewalld
systemctl disable firewalld
  1. 关闭selinux(之前有处理过 可不用管)
setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
  1. 关闭swap交换区间(之前有处理过 可不用管)
swapoff -a # 临时
sed -i 's/.*swap.*/#&/' /etc/fstab # 永久
free -g #验证,swap必须为0
  1. 配置 iptables链路(之前有处理过 可不用管)
$ cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
EOF
# 即时生效
$ sysctl --system 

#同步时间
yum install ntpdate -y
ntpdate time.windows.com
  1. 添加k8s yum源(之前有处理过 可不用管)
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  1. 安装kubeadm、kubelet、kubectl
# 安装版本是v1.21.5
yum -y install kubelet-1.21.5-0 kubectl-1.21.5-0 kubeadm-1.21.5-0
systemctl enable kubelet
  1. 初始化k8s
kubeadm init \
--apiserver-advertise-address 192.168.1.8 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.5 \
--service-cidr 10.96.0.0/12 \
--pod-network-cidr 10.244.0.0/16 \
--ignore-preflight-errors all \
--token-ttl 0

kubernetes-version :kubernetes 程序组件的版本号,尽量与安装的 kubelet 版本号相同
image-repository :指定要使用的镜像仓库 默认: gar.io apiserver-advertise-address
:一般为 Master 节点用于集群内通信的IP地址,填主机的网卡IP地址 10.0.4.16,也可以填 0.0.0.0
(这里我自己填的这个) service-cidr :Service 网络的地址范围,其值为 CIDR 格式的网络地址。默认为
10.96.0.0/12 pod-network-cidr :Pod 网络的地址范围,其值为 CIDR 格式的网络地址。通常 Flannel 的网络插件默认值为 10.244.0.0/16 ;Calico 插件的默认值为 192.168.0.0/16

执行kebeadm时 超时异常
error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: timed out waiting for the condition

执行以下语句 然后再执行 kubeadm init

swapoff -a && kubeadm reset  && systemctl daemon-reload && systemctl restart kubelet  && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

执行完成后保存以下信息 便于后续加入节点

在这里插入图片描述

  1. 配置kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u):(id−u):(id -g) $HOME/.kube/config
  1. 配置k8s网络插件
#安装calico网络插件
yum install -y ca-certificates
# 获取 calico.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml 

sed -i "s#192\.168\.0\.0/16#10\.244\.0\.0/16#" calico.yaml

kubectl apply -f calico.yaml

#查看结果
kubectl get node
  1. k8s单机特殊处理
  • master节点污点处理

单集版的k8s安装后, 无法部署服务。因为默认master不能部署pod,有污点, 需要去掉污点或者新增一个node,我这里是去除污点。

#执行后看到有输出说明有污点
kubectl get node -o yaml | grep taint -A 5 
#执行这句就行,就是取消污点
kubectl taint nodes --all node-role.kubernetes.io/master-  
  • 安装补全命令包
yum -y install bash-completion
kubectl completion bash
source /usr/share/bash-completion/bash_completion
kubectl completion bash >/etc/profile.d/kubectl.sh
source /etc/profile.d/kubectl.sh

cat  >>  /root/.bashrc <<EOF
source /etc/profile.d/kubectl.sh
EOF
  • 基于k8s单机部署中间服务
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc

在这里插入图片描述

访问192.168.1.8:32662 nginx是否可以访问 可访问 代表正常

五、K8S可视化

1、k8s-dashboard 下载
官网地址
https://github.com/kubernetes/dashboard/releases
注意要下载对应的版本
目前我的k8s版本为v1.21.5

在这里插入图片描述

所以需要找到官网地址 支持1.21.5的版本

在这里插入图片描述

2、下载并应用文件

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

如果下载yaml时 出现
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
配置/etc/hosts 解析地址

在这里插入图片描述

#编辑并应用这个配置
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

# 搜索/type 修改为type: NodePort

在这里插入图片描述


修改完成之后 就有端口了

在这里插入图片描述


可以开始访问 k8s 可视化界面了
https://ip:30029

3、创建dashboard-svc-account.yaml 认证文件
我的认证文件存放在 home/k8s 目录下

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dashboard-admin
subjects:
  - kind: ServiceAccount
    name: dashboard-admin
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

3、执行认证文件

kubectl apply -f dashboard-svc-account.yaml
#获取令牌
[root@i-wgt9mh3x ~]# kubectl get secret -n kube-system |grep admin|awk '{print $1}'
dashboard-admin-token-qt2n5

# 上一部的结果输入到下面
[root@i-wgt9mh3x ~]# kubectl describe secret dashboard-admin-token-qt2n5 -n kube-system|grep '^token'|awk '{print $2}'

# 得到的token值
eyJhbGciOiJSUzI1NiIsImtpZCI6InVsemhnZWtOVFBy ?????????????????

通过token 去登录

4、登录进来后,创建命令空间

在这里插入图片描述


在这里插入图片描述


注意创建的时候选择创建的命名空间,这样就会在命名空间里面了。

在这里插入图片描述

在这里插入图片描述

生产环境运营的时候 拉取镜像后 运行docker镜像 指定环境变量即可
docker -e “SPRING_PROFILES_ACTIVE=pro”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340