当前位置: 代码网 > it编程>游戏开发>ar > DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)

DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)

2024年07月31日 ar 我要评论
DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)

devops入门及过程搭建

1 devops概念

1.1 基本概念

在这里插入图片描述

1.2 流程

devops的开发过程及常用工具:
在这里插入图片描述
整体的软件开发流程包括:

  • plan:开发团队根据客户的目标制定开发计划
  • code:根据plan开始编码过程,需要将不同版本的代码存储在一个库中。
  • build:编码完成后,需要将代码构建并且运行。
  • test:成功构建项目后,需要测试代码是否存在bug或错误。
  • deploy:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
  • operate:运维团队将代码部署到生产环境中。
  • monitor:项目部署上线后,需要持续的监控产品。
  • integrate:然后将监控阶段收到的反馈发送回plan阶段,整体反复的流程就是devops的核心,即持续集成、持续部署。

2 搭建devops环境

2.1 gitlab

git的安装:参考官网,无脑下一步即可
官网地址:https://git-scm.com/

gitlab安装:

  1. 查看docker上gitlab的镜像,并拉取
# 查看镜像
docker search gitlab

# 拉取镜像
docker pull gitlab/gitlab-ce
  1. 准备docker-compose.yml文件
version: '3.1'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    environment:
      gitlab_omnibus_config: |
        external_url 'http://192.168.11.11:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:2224'
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'
  1. 启动容器,并访问
# 启动容器
docker-compose up -d

访问:http://192.168.11.11:8929即可。
效果:
在这里插入图片描述
4. 查看初始的用户名和密码

docker exec -it gitlab cat /etc/gitlab/initial_root_password

在这里插入图片描述
5. 登录并修改密码

在这里插入图片描述
在这里插入图片描述

2.2 docker

部署过程,会采用docker进行部署,暂时只安装docker即可,后续还需安装kubenetes

2.2.1 docker安装

①准备测试环境&生产环境

②下载docker依赖组件

yum -y install yum-utils device-mapper-persistent-data lvm2

③设置下载docker的镜像源为阿里云

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

④安装docker服务

yum -y install docker-ce

⑤设置docker开机自启

# 启动docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker

⑥测试安装成功

docker version
2.2.2 docker-compose安装
# 设置文件权限
chmod a+x docker-compose-linux-x86_64
# 移动到/usr/bin目录下,并重命名为docker-compose
mv docker-compose-linux-x86_64 /usr/bin/docker-compose

2.3 jenkins

2.3.1 介绍

jenkins需要大量的插件保证工作,安装成本较高,下面会基于docker搭建jenkins。

在这里插入图片描述
jenkins主要工作:

  1. 拉取gitlab上的代码并进行构建
  2. 根据流程可以选择发布到测试环境或是生产环境

在这里插入图片描述
ci/cd概念:

  • ci过程:jenkins将代码拉取、构建、制作镜像交给测试人员
    • 持续集成:让软件代码可以持续的集成到主干上,并自动构建和测试
  • cd过程:通过jenkins将打好标签的发行版本代码进行拉取、构建、制作镜像后交给运维人员部署
    • 持续交付:让经过持续集成的代码可以进行手动部署
    • 持续部署:让可以持续交付的代码随时随地的自动化部署
2.3.2 jenkins安装
  1. 拉取镜像
docker pull jenkins/jenkins
  1. 编写对应的docker-compose.yml
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
  1. 设置数据卷data目录的权限,否则会包没有对应权限
chmod -r a+w data/
  1. 设置jenkins的下载地址
# 修改数据卷中的hudson.model.updatecenter.xml文件
<?xml version='1.1' encoding='utf-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://updates.jenkins.io/update-center.json</url>
  </site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='utf-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
  </site>
</sites>
# 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  1. 再次重启jenkins容器,访问jenkins
    在这里插入图片描述
  2. 查看jenkins登录密码,并登录jenkins然后安装对应插件
docker exec -it jenkins cat /var/jenkins_home/secrets/initialadminpassword

输入管理员密码 - 选择插件来安装 - 选择对应的插件进行安装

在这里插入图片描述
然后等待插件安装成功进入首页。(可能会出现下载失败的插件,重新下载即可)
7. 创建管理员用户,设置jenkins url
在这里插入图片描述

2.3.3 jenkins实现拉取-构建-发布
  1. 构建maven工程发布到gitllab、gitee、github均可

  2. 点击jenkins左侧新建任务(选择自由风格的项目)

  3. 配置源码拉取地址
    在这里插入图片描述

  4. 点击立即构建,查看构建日志
    在这里插入图片描述
    在这里插入图片描述

  5. 配置maven构建代码

  • 准备jdk、maven压缩包,通过数据卷映射到jenkins容器内部
    在这里插入图片描述
  • 解压压缩包,并配置maven的settings.xml
<!-- 阿里云镜像地址 -->
<mirror>  
    <id>alimaven</id>  
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorof>central</mirrorof>          
</mirror>
<!-- jdk1.8编译插件 -->
<profile>
    <id>jdk-1.8</id>
    <activation>
        <activebydefault>true</activebydefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerversion>1.8</maven.compiler.compilerversion>
    </properties>        
</profile>
  • jenkins配置jdk&maven并保存
    在这里插入图片描述
    maven配置同理
  • 配置jenkins任务构建代码
    在这里插入图片描述
  • 立即构建测试,查看target下的jar包
    在这里插入图片描述
  1. 配置publish发布&远程操作
  • 配置publish over ssh连接测试环境、生产环境
    在这里插入图片描述
  • 配置任务构建后的操作,发布jar包到目标服务
    在这里插入图片描述

在这里插入图片描述

  • 立即构建任务,并去目标服务查看
    在这里插入图片描述
2.3.4 ci/cd操作
  • 基于jenkins拉取gitlab的springboot代码进行构建发布到测试环境实现持续集成
  • 基于jenkins拉取gitlab指定发行版本的springboot进行构建发布到生产环境实现cd(持续部署)

①持续集成

  1. 添加dockerfile文件
    在这里插入图片描述

  2. 添加docker-compose.yml文件
    在这里插入图片描述

  3. 追加jenkins构建后操作脚本命令
    在这里插入图片描述

  4. 发布到gitlab后由jenkins立即构建并推送到目标服务器
    在这里插入图片描述

  5. 测试部署到目标服务器程序
    在这里插入图片描述
    ②持续交付、部署

  • 下载git parameter插件
    在这里插入图片描述

  • 设置项目参数化构建
    在这里插入图片描述
    在这里插入图片描述

  • 在gitlab上给项目添加tag版本
    在这里插入图片描述

  • 任务构建时,采用shell方式构建,拉取指定tag版本
    在这里插入图片描述

  • 基于parameter构建任务,任务发布到目标服务器
    在这里插入图片描述

2.4 sonar qube

2.4.1 sonar qube介绍与安装

在这里插入图片描述
安装过程:

①拉取postgresql镜像

docker pull postgres
docker pull sonarqube:8.9.3-community

②编写docker-compose.yml

version: "3.1"
services:
  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      postgres_user: sonar
      postgres_password: sonar
  sonarqube:
    image: sonarqube:8.9.3-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      sonar_jdbc_url: jdbc:postgresql://db:5432/sonar
      sonar_jdbc_username: sonar
      sonar_jdbc_password: sonar
networks:
  sonarnet:
    driver: bridge

③设置sysctl.conf文件信息,并启动容器
在这里插入图片描述

# 执行命令进行刷新
sysctl -p

# 启动容器
docker-compose up -d

在这里插入图片描述
④访问sonar qube首页
在这里插入图片描述

首页图片:
在这里插入图片描述

  • 安装中文插件
    在这里插入图片描述
2.4.2 sonar qube基本使用
①maven实现代码检测
  • 修改配置文件信息
<profile>
    <id>sonar</id>
    <activation>
        <activebydefault>true</activebydefault>
    </activation>
    <properties>
        <sonar.login>admin</sonar.login>
        <sonar.password>123456789</sonar.password>
        <sonar.host.url>http://192.168.11.11:9000</sonar.host.url>
    </properties>
</profile>
  • 在代码所在位置的cmd执行命令mvn sonar:sonar
    在这里插入图片描述
  • 检测结果:
    在这里插入图片描述
②sonar-scanner实现代码检测
  • 下载对应版本
  • 解压并配置sonar服务端信息
# 安装unzip解压插件
yum -y install unzip

# 解压压缩包
unzip sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip
  • 执行命令检测代码
# 在项目所在目录执行以下命令
~/sonar-scanner/bin/sonar-scanner -dsonar.sources=./ -dsonar.projectname=demo -dsonar.projectkey=java -dsonar.java.binaries=target/

在这里插入图片描述

  • 查看sonarqube界面检测结果
    在这里插入图片描述
③jenkins集成sonar qube
  1. jenkins安装插件【系统管理-插件管理】
  2. 安装sonarqube scanner插件
    在这里插入图片描述
  3. jenkins配置sonar qube
  • 在jenkins中配置sonar qube信息

在这里插入图片描述
在这里插入图片描述

  • 在jenkins中配置sonar-scanner
  • 配置任务的sonar-scanner
    在这里插入图片描述
  1. 构建任务

jenkins界面:
在这里插入图片描述
sonarqube界面:
在这里插入图片描述

2.5 harbor(镜像仓库)

2.5.1 harbor介绍与安装

  • 介绍

harbor:私有的docker镜像仓库。我们可以让jenkins统一将项目打包并制作成docker镜像发布到harbor仓库中。然后我们只需要通知目标服务,让目标服务统一去harbor仓库上拉取镜像并在本地部署即可。

  • 安装(通过原生的方式安装)
  1. 下载harbor安装包
    https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
  2. 传送到linux上并解压
# 通过xftp或其他方式将压缩包传送到linux上
# 解压
tar -zxvf harbor-offline-installer-v2.3.4.tgz -c /usr/local/
  1. 修改harbor配置文件
# 备份原有配置
cp harbor.yml.tmpl harbor.yml

在这里插入图片描述
4. 启动harbor并登录harbor

# 启动harbor
./install.sh

在这里插入图片描述
首页信息:
在这里插入图片描述

2.5.2 harbor基础使用

①添加用户构建项目
  • 创建用户
  • 构建项目(设置为私有)
    在这里插入图片描述
  • 给项目追加用户
    在这里插入图片描述
②发布镜像到harbor
  • 修改镜像名称
  • 修改daemon.json,支持docker仓库,并重启docker
    在这里插入图片描述
  • 设置登录仓库信息
docker login -u 用户名 -p 密码 harbor地址
  • 推送镜像到harbor
    在这里插入图片描述
③从harbor中拉取镜像
{
        "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],
        "insecure-registries": ["192.168.11.11:80"]
}

拉取镜像:
在这里插入图片描述

拓展:jenkins容器使用宿主机docker并编写构建脚本

①设置jenkins容器使用宿主机docker

  1. 设置宿主机docker.sock权限
sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock
  1. 添加数据卷
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json

②添加构建操作
在这里插入图片描述
③编写构建脚本

  1. 编写脚本文件,添加到目标服务器

deploy.sh:

harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5

imagename=$harbor_url/$harbor_project_name/$project_name:$tag

containerid=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerid" != "" ] ; then
    docker stop $containerid
    docker rm $containerid
    echo "delete container success"
fi

imageid=`docker images | grep ${project_name} | awk '{print $3}'`

if [ "$imageid" != "" ] ; then
    docker rmi -f $imageid
    echo "delete image success"
fi

docker login -u devops -p p@ssw0rd $harbor_url

docker pull $imagename

docker run -d -p $port:$port --name $project_name $imagename

echo "start container success"
echo $project_name
  1. 设置文件权限为可执行:
chmod a+x deploy.sh

在这里插入图片描述
④配置构建后操作
在这里插入图片描述

2.6 jenkins流水线(pipeline)、自动化脚本

2.6.1 jenkins流水线任务介绍

jenkins的pipeline可以让项目的发布整体流程可视化,明确执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个jenkinsfile文件管理,而且jenkinsfile文件是可以放在项目中维护。

①构建jenkins流水线任务

  1. 构建任务
    在这里插入图片描述
  2. 生成groovy脚本
    在这里插入图片描述
  3. 构建后查看视图
    在这里插入图片描述
    ②groovy脚本
  • groovy脚本基本语法
// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(jenkins支持分布式)
    agent any
    
    // 配置全局环境,指定变量名=变量值信息
    environment{
    	host = '192.168.11.11'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
		// 单个任务
        stage('任务2') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
        // ……
    }
}
  • 配置pipeline
    在这里插入图片描述
  • 准备jenkinsfile
    在这里插入图片描述
  • 测试效果
    在这里插入图片描述
2.6.2 jenkins流水线任务实现
  1. 参数化构建

在这里插入图片描述
2. 拉取git代码

在这里插入图片描述

pipeline {
    agent any
    stages {

        stage('拉取git代码') {
            steps {
                checkout([$class: 'gitscm', branches: [[name: '${tag}']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
            }
        }
    }
}
  1. 构建代码
pipeline {
    agent any

    stages {

        stage('拉取git代码') {
            steps {
                checkout([$class: 'gitscm', branches: [[name: '${tag}']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
            }
        }

        stage('构建代码') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
            }
        }
}
  1. 代码质量检测
pipeline {
    agent any

    stages {

        stage('拉取git代码') {
            steps {
                checkout([$class: 'gitscm', branches: [[name: '${tag}']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
            }
        }

        stage('构建代码') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
            }
        }

        stage('检测代码质量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -dsonar.sources=./ -dsonar.projectname=${job_name} -dsonar.projectkey=${job_name} -dsonar.java.binaries=target/ -dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
            }
        }
    }
}

  1. 制作自定义镜像并发布
  • 生成自定义镜像脚本
pipeline {
    agent any
    environment{
        harborhost = '192.168.11.11:80'
        harborrepo = 'repository'
        harboruser = 'devops'
        harborpasswd = 'p@ssw0rd'
    }

    // 存放所有任务的合集
    stages {

        stage('拉取git代码') {
            steps {
                checkout([$class: 'gitscm', branches: [[name: '${tag}']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
            }
        }

        stage('构建代码') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
            }
        }

        stage('检测代码质量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -dsonar.sources=./ -dsonar.projectname=${job_name} -dsonar.projectkey=${job_name} -dsonar.java.binaries=target/ -dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
            }
        }

        stage('制作自定义镜像并发布harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${job_name}:${tag} ./'''

                sh '''docker login -u ${harboruser} -p ${harborpasswd} ${harborhost}
                docker tag ${job_name}:${tag} ${harborhost}/${harborrepo}/${job_name}:${tag}
                docker push ${harborhost}/${harborrepo}/${job_name}:${tag}'''
            }
        }
    }
}
  • 生成publish over ssh脚本
pipeline {
    agent any
    environment{
        harborhost = '192.168.11.11:80'
        harborrepo = 'repository'
        harboruser = 'devops'
        harborpasswd = 'p@ssw0rd'
    }

    // 存放所有任务的合集
    stages {

        stage('拉取git代码') {
            steps {
                checkout([$class: 'gitscm', branches: [[name: '${tag}']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
            }
        }

        stage('构建代码') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
            }
        }docker

        stage('检测代码质量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -dsonar.sources=./ -dsonar.projectname=${job_name} -dsonar.projectkey=${job_name} -dsonar.java.binaries=target/ -dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098' 
            }
        }

        stage('制作自定义镜像并发布harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${job_name}:${tag} ./'''

                sh '''docker login -u ${harboruser} -p ${harborpasswd} ${harborhost}
                docker tag ${job_name}:${tag} ${harborhost}/${harborrepo}/${job_name}:${tag}
                docker push ${harborhost}/${harborrepo}/${job_name}:${tag}'''
            }
        }
        
        stage('目标服务器拉取镜像并运行') {
            steps {
                sshpublisher(publishers: [sshpublisherdesc(configname: 'testenvironment', transfers: [sshtransfer(cleanremote: false, excludes: '', execcommand: "/usr/bin/deploy.sh $harborhost $harborrepo $job_name $tag $port ", exectimeout: 120000, flatten: false, makeemptydirs: false, nodefaultexcludes: false, patternseparator: '[, ]+', remotedirectory: '', remotedirectorysdf: false, removeprefix: '', sourcefiles: '')], usepromotiontimestamp: false, useworkspaceinpromotion: false, verbose: false)])
            }
        }
    }
}
2.6.3 jenkins流水线整合钉钉

步骤:jenkins安装插件 - 钉钉创建群组并构建机器人 - jenkins配置系统添加钉钉通知 - 任务中追加钉钉流水线配置

  1. 安装插件
    在这里插入图片描述
  2. 钉钉内部创建群组并构建机器人
    在这里插入图片描述
    在这里插入图片描述
    最终获取到webhook信息:
  1. jenkins系统配置添加钉钉通知
    在这里插入图片描述
  2. 任务线中追加流水线配置
pipeline {
    agent any

    environment {
        sonarlogin = '2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8'
        harboruser = 'admin'
        harborpassword = 'harbor12345'
        harborhost = '192.168.11.12:8888'
        harborrepo = 'repository'
    }

    stages {
        stage('拉取git代码'){
            steps {
                checkout([$class: 'gitscm', branches: [[name: '$tag']], extensions: [], userremoteconfigs: [[url: 'http://49.233.115.171:8929/root/lsx.git']]])
            }
        }
        stage('maven构建代码'){
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
            }
        }
        stage('sonarqube检测代码'){
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -dsonar.sources=./ -dsonar.projectname=${job_name} -dsonar.projectkey=${job_name} -dsonar.java.binaries=target/ -dsonar.login=${sonarlogin}'
            }
        }
        stage('制作自定义镜像'){
            steps {
                sh '''cd docker
                mv ../target/*.jar ./
                docker build -t ${job_name}:$tag .
                '''
            }
        }

        stage('推送自定义镜像'){
            steps {
                sh '''docker login -u ${harboruser} -p ${harborpassword} ${harborhost}
                docker tag ${job_name}:$tag ${harborhost}/${harborrepo}/${job_name}:$tag
                docker push ${harborhost}/${harborrepo}/${job_name}:$tag'''
            }
        }

        stage('通知目标服务器'){
            steps {
                sshpublisher(publishers: [sshpublisherdesc(configname: 'centos-docker', transfers: [sshtransfer(cleanremote: false, excludes: '', execcommand: "/usr/bin/deploy.sh $harborhost $harborrepo $job_name $tag $port", exectimeout: 120000, flatten: false, makeemptydirs: false, nodefaultexcludes: false, patternseparator: '[, ]+', remotedirectory: '', remotedirectorysdf: false, removeprefix: '', sourcefiles: '')], usepromotiontimestamp: false, useworkspaceinpromotion: false, verbose: false)])
            }  
        }
    }
    post {
        success {
            dingtalk (
                robot: 'jenkins-dingding',
                type:'markdown',
                title: "success: ${job_name}",
                text: ["- 成功构建:${job_name}项目!\n- 版本:${tag}\n- 持续时间:${currentbuild.durationstring}\n- 任务:#${job_name}"]
            )
        }
        failure {
            dingtalk (
                robot: 'jenkins-dingding',
                type:'markdown',
                title: "fail: ${job_name}",
                text: ["- 失败构建:${job_name}项目!\n- 版本:${tag}\n- 持续时间:${currentbuild.durationstring}\n- 任务:#${job_name}"]
            )
        }
    }
}
  1. 查看效果
    在这里插入图片描述

2.7 kubernetes

2.7.1 介绍及安装
①k8s主要作用:
  1. 服务发现和负载均衡(dns名称或自己ip地址公开容器)
  2. 存储编排(类似docker的数据卷)
  3. 自动部署和回滚(可以按照你的需求调整容器状态)
  4. 自动完成装箱计算(允许你设置每个容器的资源,cpu、内存等)
  5. 自我修复(可以重启失败的容器、替换容器、检查容器状况等)
  6. 密钥与配置管理(允许存储和管理敏感信息,可以在不重建容器的情况下完成部署和更新密钥)
②k8s的架构

在这里插入图片描述

③k8s安装

在这里插入图片描述
准备好服务器之后开始安装:

1. 重新设置hostname,不允许为localhost
# 修改 hostname,名字不允许使用下划线、小数点、大写字母,不能叫master
hostnamectl set-hostname your-new-host-name
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts
2. 安装kuboard软件
# 阿里云 docker hub 镜像
export registry_mirror=https://registry.cn-hangzhou.aliyuncs.com
curl -ssl https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5
3. 初始化master节点
  • apiserver_name 不能是 master 的 hostname

  • apiserver_name 必须全为小写字母、数字、小数点,不能包含减号

  • pod_subnet 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 cidr 值,如果您对 cidr 这个概念还不熟悉,请仍然执行 export pod_subnet=10.100.0.0/16 命令,不做修改

  • 设置ip,域名,网段并执行初始化操作

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 ip(请使用内网 ip)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export master_ip=192.168.11.32
# 替换 apiserver.demo 为 您想要的 dnsname
export apiserver_name=apiserver.demo
# kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export pod_subnet=10.100.0.1/16
echo "${master_ip}    ${apiserver_name}" >> /etc/hosts
curl -ssl https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
  • 检查master启动状态
# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化结果
kubectl get nodes -o wide

ps:如果出现notready的情况执行(最新版本的bug,1.19一般没有)

docker pull quay.io/coreos/flannel:v0.10.0-amd64 
mkdir -p /etc/cni/net.d/
cat <<eof> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isdefaultgateway": true}}
eof
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<eof> /run/flannel/subnet.env
flannel_network=172.100.0.0/16
flannel_subnet=172.100.1.0/24
flannel_mtu=1450
flannel_ipmasq=true
eof
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/documentation/kube-flannel.yml
  • 安装网络服务插件
export pod_subnet=10.100.0.0/16
kubectl apply -f https://kuboard.cn/install-script/v1.22.x/calico-operator.yaml
wget https://kuboard.cn/install-script/v1.22.x/calico-custom-resources.yaml
sed -i "s#192.168.0.0/16#${pod_subnet}#" calico-custom-resources.yaml
kubectl apply -f calico-custom-resources.yaml
4. 初始化worker节点
  • 获取join命令参数,在master节点执行
# 只在 master 节点执行
kubeadm token create --print-join-command

在这里插入图片描述

  • 在worker节点初始化
# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 ip
export master_ip=192.168.11.32
# 替换 apiserver.demo 为初始化 master 节点时所使用的 apiserver_name
export apiserver_name=apiserver.demo
echo "${master_ip}    ${apiserver_name}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token vwfilu.3nhndohc5gn1jv9k     --discovery-token-ca-cert-hash sha256:22ff15cabfe87ab48a7db39b3bbf986fee92ec92eb8efc7fe9b0abe2175ff0c2
5. 检查最终运行结果
  • 在master节点运行
# 只在 master 节点执行
kubectl get nodes -o wide

ps:如果出现notready的情况执行(最新版本的bug,1.19一般没有)

docker pull quay.io/coreos/flannel:v0.10.0-amd64 
mkdir -p /etc/cni/net.d/
cat <<eof> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isdefaultgateway": true}}
eof
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<eof> /run/flannel/subnet.env
flannel_network=172.100.0.0/16
flannel_subnet=172.100.1.0/24
flannel_mtu=1450
flannel_ipmasq=true
eof
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/documentation/kube-flannel.yml
  • 获取节点信息
kubectl get nodes

在这里插入图片描述

6. 安装kuboard管理k8s集群
  • 安装kuboard
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
  • 查看启动情况
watch kubectl get pods -n kuboard

在这里插入图片描述

在这里插入图片描述

2.7.2 k8s操作
①namespace

命令方式:

# 查看现有的全部命名空间
kubectl get ns

# 构建命名空间
kubectl create ns 命名空间名称

# 删除现有命名空间, 并且会删除空间下的全部资源
kubectl delete ns 命名空间名称

yaml文件方式(构建源时,设置命名空间)

apiversion: v1
kind: namespace
metadata:
  name: test
②pod
  • 命令方式
# 查看所有运行的pod
kubectl get pods -a

# 查看指定namespace下的pod
kubectl get pod [-n 命名空间]  #(默认default)

# 创建pod
kubectl run pod名称 --image=镜像名称

# 查看pod详细信息
kubectl describe pod pod名称

# 删除pod
kubectl delete pod pod名称 [-n 命名空间]  #(默认default)

# 查看pod输出的日志
kubectl logs -f pod名称

# 进去pod容器内部
kubectl exec -it pod名称 -- bash

# 查看kubernetes给pod分配的ip信息,并且通过ip和容器的端口,可以直接访问
kubectl get pod -owide
  • yaml方式(推荐)
apiversion: v1
kind: pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称

# 启动pod:kubectl apply -f yaml文件名称
# 删除pod:kubectl delete -f yaml文件名称
  • pod中运行多个容器
apiversion: v1
kind: pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称
  - image: 镜像名称
    name: 容器名称
…………    

kuboard效果:
在这里插入图片描述

③deployment
  • 命令方式
# 基于deployment启动容器
kubectl create deployment deployment名称 --image=镜像名称
# 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果
# 需要使用deploy的方式删除deploy
# 查看现在的deployment
kubectl get deployment

# 删除deployment
kubectl delete deployment deployment名称

# 基于deployment启动容器并设置pod集群数
kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数
  • 配置文件方式
apiversion: apps/v1
kind: deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchlabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
       image: nginx
       ports:
       - containerport: 80

弹性伸缩功能:

# 基于scale实现弹性伸缩
kubectl scale deploy/deployment名称 --replicas 集群个数
# 或者修改yaml文件
kubectl edit deploy deployment名称

在这里插入图片描述
灰度发布:
deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本pod

kubectl set image deployment/deployment名称 容器名=镜像:版本
④service
  • clusterip方式:

命令实现效果

# 通过生成service映射一个deployment下的所有pod中的某一个端口的容器
kubectl expose deployment deployment名称 --port=service端口号 --target-port=pod内容器端口

之后通过kubectl get service查看service提供的ip,即可访问
在这里插入图片描述
也可以通过deployment名称.namespace名称.svc作为域名访问
在这里插入图片描述

  • nodeport方式

命令实现方式:

# 通过生成service映射一个deployment下的所有pod中的某一个端口的容器
kubectl expose deployment deployment名称 --port=service端口号 --target-port=pod内容器端口 --type=nodeport

在这里插入图片描述
service通过yaml方式实现:

apiversion: v1
kind: service
metadata:
  labels
    app: nginx
  name: nginx
  spec:
    selector:
      app: nginx
    ports:
    - port: 8888
     protocol: tcp
     targetport: 80

通过apply启动就可以创建service

apiversion: apps/v1
kind: deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  replicas: 2
  selector:
    matchlabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
        image: nginx
        ports:
        - containerport: 80
---
apiversion: v1
kind: service
metadata:
  labels:
    app: nginx-service
  name: nginx-service
spec:
  selector:
    app: nginx-deployment
  ports:
  - port: 8888
    protocol: tcp
    targetport: 80
  type: nodeport

可以查看到暴露信息:
在这里插入图片描述

⑤ingress(入口)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

推荐使用yaml文件方式

apiversion: networking.k8s.io/v1
kind: ingress
metadata:
  name: nginx-ingress
spec:
  ingressclassname: ingress
  rules:
  - host: nginx.mashibing.com
    http:
      paths:
      - path: /
        pathtype: prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 8888

在这里插入图片描述
kuboard安装的ingress有admission的校验配置,需要先删除配置再启动

在这里插入图片描述

# 查看校验webhook的配置
kubectl get -a validatingwebhookconfiguration

# 删除指定的校验
kubectl delete validatingwebhookconfiguration ingress-nginx-admission-my-ingress-controller

配置本地hosts文件:
在这里插入图片描述
下面就可以访问在service中暴露的nginx信息:
在这里插入图片描述

2.8 jenkins集成k8s

2.8.1 准备部署的yaml文件
apiversion: apps/v1
kind: deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchlabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline    
    spec:
      containers:
      - name: pipeline
        image: 192.168.11.102:80/repo/pipeline:v4.0.0
        imagepullpolicy: always
        ports:
        - containerport: 8080
---
apiversion: v1
kind: service
metadata:
  namespace: test
  labels:
    app: pipeline
  name: pipeline  
spec:
  selector:
    app: pipeline
  ports:
  - port: 8081
    targetport: 8080
  type: nodeport
---
apiversion: networking.k8s.io/v1
kind: ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressclassname: ingress
  rules:
  - host: mashibing.pipeline.com
    http:
      paths:
      - path: /
        pathtype: prefix
        backend:
          service:
            name: pipeline
            port:
              number: 8081
2.8.2 harbor私服配置
  1. 设置master和worker的私服地址信息
    在这里插入图片描述
  2. 在kuboard上设置私服密文信息
    在这里插入图片描述

在这里插入图片描述

2.8.3 测试使用效果

在这里插入图片描述

2.8.4 jenkins远程调用
  1. 将pipeline.yml配置到gitlab中
    在这里插入图片描述
  2. 配置jenkins目标服务器,可以将yml文件传输到k8s的master上

在这里插入图片描述

  1. 修改jenkinsfile,重新设置流水线任务脚本,并测试效果
    在这里插入图片描述
    在这里插入图片描述
  2. 设置jenkins无密码登录k8s-master

在这里插入图片描述
5. 设置执行kubectl的脚本到jenkinsfile
在这里插入图片描述
查看效果:
在这里插入图片描述

在这里插入图片描述
ps:这种方式更适应与cd操作,将项目将基于某个版本部署到指定的目标服务器

2.9 基于gitlab的webhooks

2.9.1 webhooks通知
  1. 开启jenkins自动构建
    在这里插入图片描述

  2. 设置gitlab的webhooks
    在这里插入图片描述

  3. 关闭jenkins的gitlab认证
    在这里插入图片描述

  4. 再次测试
    在这里插入图片描述

拓展:实现滚动更新

在这里插入图片描述

(0)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com