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

2021-12-29 16:06:08 浏览数 (1)

实验环境

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部署

代码语言:txt复制
首先部署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 
代码语言:txt复制
##下载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
代码语言:txt复制
##将集群中的所有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自己控制容器集群。

用来模拟我们部署的服务

代码语言:txt复制
[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 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口。

代码语言:txt复制
[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

代码语言:txt复制
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加入私有仓库

代码语言:txt复制
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做免密登录

代码语言:txt复制
[root@k8s-jenkins ~]# ssh-keygen  -t rsa
[root@k8s-jenkins ~]# ssh-copy-id 192.168.3.101

四.安装jenkins(192.168.3.107)

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

代码语言:txt复制
[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

代码语言:txt复制
[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的字符集
代码语言:txt复制
[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.安装依赖包

代码语言:txt复制
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

代码语言:txt复制
[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)

代码语言:txt复制
##然后不输入只回车会生成一对公私钥
[root@jenkins ~]# ssh-keygen -t rsa 
默认在/root/.ssh/目录里
代码语言:txt复制
##查看公钥并复制
[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)然后直接点击创建

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

输入文件内容并提交

验证拉去代码是否成功:

代码语言:txt复制
[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密钥

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

jenkins和git需要关联上

选择授权的用户

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

代码语言:txt复制
#!/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节点做免密登录。

代码语言:txt复制
[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上构建完成,等以小会就可以了。

构建成功

0 人点赞