k8s的持续集成(jenkins+gitlab+k8s)
实验环境
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!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 baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 repo_gpgcheck=0 gpgcheck=0 enabled=1 gpgkey=https://packages.gitlab.com/gpg.key 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上构建完成,等以小会就可以了。
构建成功
目录 返回
首页