前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s的持续集成(jenkins+gitlab+k8s)

k8s的持续集成(jenkins+gitlab+k8s)

原创
作者头像
不凡
修改2021-12-29 16:06:08
2.8K1
修改2021-12-29 16:06:08
举报
文章被收录于专栏:运维小郭运维小郭运维小郭

实验环境

IP

主机名

192.168.3.101

k8s-master1

192.168.3.102

k8s-master2

192.168.3.103

k8s-master3

192.168.3.104

k8s-worker1

192.168.3.105

k8s-worker2

192.168.3.106

k8s-worker3

192.168.3.107

k8s-jenkins

192.168.3.108

k8s-registry

192.168.3.109

k8s-gitlab

192.168.3.220/192.168.3.109

gitlab

总体流程:

  • 在开发机开发代码后提交到gitlab
  • 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry
  • 之后将在k8s-master上执行rc、service的创建,进而创建Pod,从私服拉取镜像,根据该镜像启动容器

一.验证k8s群集是否搭建好!

root@k8s-master1 docker.yml# kubectl get node

二. 部署私有仓库(192.168.3.108)

1.基于docker部署

首先部署docker
yum install -y yum-utils device-mapper-persistent-data lvm2

wget -O /etc/yum.repos.d/aliyun.base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
yum -y install docker-ce-18.09.9-3.el7

# 启动docker,并设置docker开机自启 
systemctl start docker && systemctl enable docker 
# 配置加速,并设置驱动     
cat << EOF > /etc/docker/daemon.json 
{
    "registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
javascript:;
# 加载daemon并重启docker
systemctl daemon-reload && systemctl restart docker 
##下载registry镜像  
docker pull registry  
##基于registry镜像,启动一台容器     
docker run -itd --name registry -p 5000:5000 --restart=always registry:latest 

##修改仓库地址
vim /usr/lib/systemd/system/docker.service #13行修改 
  ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000   

##重启docker 
systemctl daemon-reload && systemctl restart docker.service  


##验证registry是否安装成功
##把容器重命名一个标签
docker pull httpd
docker tag httpd:latest 192.168.3.108:5000/web:v1  
docker tag httpd:latest 192.168.3.108:5000/web:v2
docker ps

##上传容器到私有仓库
docker push 192.168.3.108:5000/web:v1
docker push 192.168.3.108:5000/web:v2
##将集群中的所有docker都加入私有仓库(k8s-master2 k8s-master3  k8s-worker1  k8s-worker2  k8s-worker3 k8s-jenkins)
vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000  

##重启docker
systemctl daemon-reload && systemctl restart docker.service

##测试下载
docker pull 192.168.3.108:5000/web:v1

然后重要的地方到了,建立 yaml配置文件让kubernetes自己控制容器集群。

用来模拟我们部署的服务

[root@localhost master]# vim deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
        name: web
  template:
    metadata:
      labels:
        name: web
    spec:
      containers:
      - name: web
        image: 192.168.3.108:5000/web:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 80

[root@localhost master]# kubectl apply -f deploy.yaml

可是容器的ip只能在容器本机上访问,集群内的其他主机和集群外的主机都没办法访问,这个时候就需要将容器的端口映射到服务器上的端口了,所以需要做一个service的模板。service 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口。

[root@localhost master]# vim  deploy-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    name: web
  name: web
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31234
  selector:
    name: web

[root@localhost master]# kubectl apply -f deploy-svc.yaml

访问一下http://192.168.1.21:31234/

三. gitlab和jenkins加入私有仓库(192.168.3.107)

1.安装docker

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

wget -O /etc/yum.repos.d/aliyun.base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
yum -y install docker-ce-18.09.9-3.el7

# 启动docker,并设置docker开机自启 
systemctl start docker && systemctl enable docker 
# 配置加速,并设置驱动     
cat << EOF > /etc/docker/daemon.json 
{
    "registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
javascript:;
# 加载daemon并重启docker
systemctl daemon-reload && systemctl restart docker 

2.git和jenkins加入私有仓库

vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000  

##重启docker
systemctl daemon-reload && systemctl restart docker.service

##测试下载
docker pull 192.168.3.108:5000/web:v1

3.jenkins服务器向k8smaster做免密登录

[root@k8s-jenkins ~]# ssh-keygen  -t rsa
[root@k8s-jenkins ~]# ssh-copy-id 192.168.3.101

四.安装jenkins(192.168.3.107)

1.创建Jenkins挂载目录并授权权限

[root@jenkins ~]# tar -zxf jdk-8u231-linux-x64.tar.gz

[root@jenkins ~]# mv jdk1.8.0_131 /usr/java
#注意 这里有位置敏感,不要多一个“/”
[root@jenkins ~]# vim /etc/profile #在最下面写

export JAVA_HOME=/usr/java
export JRE_HOME=/usr/java/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

[root@jenkins ~]#  source /etc/profile
//环境变量生效
[root@jenkins ~]#  java -version
//验证环境变量

2. 安装tomcat

[root@jenkins ~]# tar -zxf apache-tomcat-7.0.54.tar.gz 
[root@jenkins ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat7
[root@jenkins ~]# cd /usr/local/tomcat7/webapps/
[root@jenkins webapps]# rm -rf *
[root@jenkins webapps]# cp /root/jenkins.war .  #这几步是jenkins的包放进了tomcat里
[root@jenkins webapps]# vim /usr/local/tomcat7/conf/server.xml 
//修改tomcat的字符集
[root@jenkins webapps]# cd /usr/local/tomcat7/bin/  

[root@jenkins bin]# vim catalina.sh  
export CATALINA_OPTS="-DJENKINS_HOME=/data/jenkins" 
export JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true" 

//这两行添加的是jenkins的家目录位置,这个很重要  

[root@jenkins bin]# ./catalina.sh start  //启动tomcat

浏览器访问: 192.168.3.107:8080/jenkins

等待插件的安装
等待插件的安装
junran123!
junran123!

jenkins搭建完成

搜索:GitLab

五.安装gitlab(192.168.3.109)

1.安装依赖包

yum -y install curl policycoreutils openssh-server openssh-clients postfix git
systemctl enable sshd 
systemctl start sshd 
systemctl enable postfix 
systemctl start postfix

2.安装gitlab-ce

[root@git ~]# cat> /etc/yum.repos.d/gitlab-ce.repo<< EOF
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/  
gpgcheck=0
enabled=1
EOF

[root@git ~]# yum makecache    
[root@git ~]# yum -y install gitlab-ce
[root@git ~]# vim /etc/gitlab/gitlab.rb   
external_url 'http://192.168.3.109:90'  ##修改端口是为了防止端口冲突,因为80默认是http服务的  
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 3000                  ##端口, unicorn默认是8080 也是tomcat的端口 

[root@git ~]# gitlab-ctl reconfigure  ##启动gitlab,这个过程可能会有点慢   

3.验证

打开浏览器访问:192.168.3.109:90

在网页配置用户密码后则安装完毕。用户默认root,这里让设置一个密码再登录,这里设置12345.com(相对较短的密码不让设置)

如果忘记密码就看这个网址:https://www.jianshu.com/p/9ae417bdb969

六.jenkins和gitlab相互关联

jenkins:持续集成平台

gitlab: 代码管理平台

部署这两个服务的联动,需要经过ssh验证。

1、首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的

(1)jenkins(192.168.3.107)

##然后不输入只回车会生成一对公私钥
[root@jenkins ~]# ssh-keygen -t rsa 
默认在/root/.ssh/目录里
##查看公钥并复制
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpbdFCMKM7i5jEd2nP222pvr+Bts7NbUjHS/r5Um7QV1RYaFjE0dqVNgRlhajXs6SUva07dEhpaqIbAKs+zfWU4wgWkclVheWNxsUfTP5Wd1al3l8D2t7+r9FJ3ulIqlsXcbR+i4r2NjE+8X2KlSbippsJki9ZmgbDXo6dXHc3pA9TA6U8Wy603V3yQOJ6PbGC0x/eDuAx1QkF30U5m9B5fmYWSI3jPCOtifWHWWCOHVK3A1m5UaEFOSeCO6XHAJVTzkfhB0QkK0NsNBaa9b0U2sK11C9MjKAfq4JucLT/5YFWyqu0PFKfUGAlIdicG1mewnScL9ikb02nssfysmhT root@k8s-jenkins

(2)gitlab(192.168.3.109)

创建一个仓库

输入一个仓库的名字,权限选择公共的(public)然后直接点击创建

新建一个文件
新建一个文件

输入文件内容并提交

验证拉去代码是否成功:

[root@git ~]# mkdir /k8s 
[root@git ~]# cd /k8s
[root@git xgp]# git clone git@192.168.3.109:root/k8s       ##克隆xgp-demo仓库到本地  
[root@git xgp]#cd  k8s
[root@git xgp]#cat README.md
   print: "hello word!!!"

(3).安装插件

先进入到之前查看插件的地方

系统设置----插件管理--- 安装一下插件:gitlab-oauth、gitlab-plugin、 windows-slaves、ruby-runt ime、gitlab-hook,

注意:我这边是安装成功的,所以没有了,所有的都安装完成,就可以构建任务了

(4)构建项目

添加git仓库地址

jenkins主机生成ssh密钥

##然后不输入只回车会生成一对公私钥
[root@jenkins ~]# ssh-keygen -t rsa 
##查看密钥并复制
[root@jenkins ~]# cat /root/.ssh/id_rsa   

jenkins和git需要关联上

选择授权的用户

这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作。

#!/bin/bash
backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER"  
mkdir -p $backupcode     #jenkins创建上述目录
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP   "$JENKINS_HOME"/workspace/"$JOB_NAME"/*  $backupcode #$JENKINS_HOME和$JOB_NAME同步最新消息
#ssh root@192.168.3.101 sed -i 's/v1/v2/g' /root/app/deploy.yaml #更改镜像版本
echo From  192.168.3.108:5000/web:v1 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache2/htdocs/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.3.108:5000/web:v1
docker build -t 192.168.3.108:5000/web:v1 /"$JENKINS_HOME"/workspace/.
docker push 192.168.3.108:5000/web:v1
ssh root@192.168.3.101 kubectl delete deployment web
ssh root@192.168.3.101 kubectl apply -f /root/app/deploy.yaml


$JOB_NAME:项目名称
$BUILD_NUMBER:第几次构建
$JENKINS_HOME:jenkins的家目录

完事以后先别保存,首先复制一下上面的jenkins地址,然后去gitlab上绑定webhook

保存,登陆gitlab,点击下图这个设置

因为不可以本地使用的webhook

下面是解决方法

再次添加webhook

回到Jenkins开启匿名访问权限

好了,jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins

注意,这里是从gitlab和jenkins向master节点做免密登录。

///注意,这里是从git和jenkins向master节点做免密登录。

[root@k8s-jenkins ~]# ssh-keygen -t rsa
[root@gitlab ~]# ssh-copy-id root@192.168.3.101
[root@k8s-jenkins ~]# ssh-keygen -t rsa
[root@jenkins ~]# ssh-copy-id root@192.168.3.101

好了,环境全部部署完毕!!!。开始测试

五、测试

测试的方法很简单,就是在gitlab上新建代码,删除代码,修改代码,都会触发webhook进行自动部署。最终会作用在所有的nginx容器中,也就是我们的web服务器。

这里我修改了之前建立的 index.html文件 保存以后,就打开浏览器 一直访问kubernetes-node 里面的容器了

访问一下http://192.168.3.101:31234/

如果没有变,应该注意查看是否在jenkins上构建完成,等以小会就可以了。

构建成功

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验环境
    • 一.验证k8s群集是否搭建好!
      • 二. 部署私有仓库(192.168.3.108)
        • 1.基于docker部署
          • 可是容器的ip只能在容器本机上访问,集群内的其他主机和集群外的主机都没办法访问,这个时候就需要将容器的端口映射到服务器上的端口了,所以需要做一个service的模板。service 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口。
        • 三. gitlab和jenkins加入私有仓库(192.168.3.107)
          • 1.安装docker
          • 3.jenkins服务器向k8smaster做免密登录
        • 四.安装jenkins(192.168.3.107)
          • 1.创建Jenkins挂载目录并授权权限
            • 2. 安装tomcat
              • 五.安装gitlab(192.168.3.109)
                • 1.安装依赖包
                • 3.验证
              • 六.jenkins和gitlab相互关联
                • 1、首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的
                  • (1)jenkins(192.168.3.107)
                  • (2)gitlab(192.168.3.109)
                  • (4)构建项目
              • 五、测试
                • 访问一下http://192.168.3.101:31234/
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档