基于k8s的CICD实现

基于k8s的CICD实现


基于k8s的CICD实现_第1张图片
环境准备

主机名 master node1 node2
内存最低要求 2G 2G 4G
主机IP 192.168.229.187 192.168.229.209 192.168.229.210
服务 k8s、registry k8s k8s、jenkins、gitlab

在master上模拟一个web服务
环境准备好后,在master节点部署registry服务,将自定义镜像的v1版本上传到私有仓库中。其它2台node也需要加入registry服务。
要求:创建一个Deployment资源,replicas:2,镜像使用自定义镜像V1版本,然后创建一个SVC(type:NodePort,nodePort:30034)资源对象和此Deployment资源关联。
(1)在master上用docker容器运行registry私有仓库服务
下载需要的镜像

[root@master ~]# docker pull registry:2

(2)运行私有仓库服务

[root@master ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2

(3)编辑docker的配置文件,指定私有仓库地址。

[root@master ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.187:5000
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker

(4)把制作好的私有镜像传到master主机上

scp Desktop/私有镜像/httpd\:v1.tar [email protected]:/root

(5)上传私有仓库

[root@master ~]# docker load -i httpd\:v1.tar
[root@master ~]# docker push 192.168.229.187:5000/httpd:v1

(6)创建deployment资源和service资源

[root@master ~]# mkdir /opt/autoweb
[root@master ~]# cd /opt/autoweb/
[root@master autoweb]# vim myapp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: myapp
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: myapp
        image: 192.168.229.187:5000/httpd:v1
[root@master autoweb]# kubectl apply -f myapp.yaml
[root@master autoweb]# vim mysvc.yaml
kind: Service
apiVersion: v1
metadata:
  name: mysvc
spec:
  selector:
    app: httpd
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30034
[root@master autoweb]# kubectl apply -f mysvc.yaml

(7)验证各资源的部署情况

[root@master autoweb]# kubectl get deployments.
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   2/2     2            2           52s
[root@master autoweb]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        49d
mysvc        NodePort    10.97.208.122   <none>        80:30034/TCP   38s
[root@master autoweb]# kubectl describe svc mysvc
...
Selector:                 app=httpd
Type:                     NodePort
IP:                       10.97.208.122
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30034/TCP
Endpoints:                10.244.1.2:80,10.244.2.2:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[root@master autoweb]# curl 127.0.0.1:30034
111111

node2上部署JDK
关闭防火墙、selinux。
部署jenkins需要JDK(java环境)。提前准备好压缩包。

[root@node2 ~]# mkdir /opt/autoweb
[root@node2 ~]# cd /opt/autoweb
scp Desktop/AutoWeb.zip [email protected]:/opt/autoweb/
[root@node2 autoweb]# ls
AutoWeb.zip
[root@node2 autoweb]# unzip AutoWeb.zip
[root@node2 autoweb]# ls
AutoWeb  AutoWeb.zip
[root@node2 autoweb]# cd AutoWeb/
[root@node2 AutoWeb]# ls
apache-tomcat-7.0.54.tar.gz           jenkins-2.172-1.1.noarch.rpm
autoweb.docx                          jenkins-2.179-1.1.noarch.rpm
deployment-nginx.yaml                 jenkins.war
gitlab-ce-11.9.8-ce.0.el6.x86_64.rpm  nginx-rc.yaml
gitlab-hook.hpi                       nginx-svc.yaml
gitlab-oauth.hpi                      plugins.tar.gz
gitlab-plugin.hpi                     ruby-runtime.hpi
jdk-8u131-linux-x64.tar.gz            service-nginx.yaml
jdk-8u231-linux-x64.tar.gz            自动触发脚本.txt
[root@node2 AutoWeb]# tar zxf jdk-8u231-linux-x64.tar.gz
[root@node2 AutoWeb]# mv jdk1.8.0_231 /usr/java
[root@node2 AutoWeb]# 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@master AutoWeb]# source /etc/profile
[root@master AutoWeb]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

node2上部署Jenkins
这里使用rpm包安装部署jenkins,当然也有其他的部署方式。

[root@node2 AutoWeb]# rpm -ivh jenkins-2.222-1.1.noarch.rpm
[root@node2 AutoWeb]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
[root@node2 AutoWeb]# rpm -qc jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins

添加jenkins启动依赖的JDK路径

[root@node2 AutoWeb]# vim /etc/init.d/jenkins
...
 83 /usr/bin/java
 84 /usr/java/bin/java
 85 "
...

重新加载配置文件,启动jenkins或者用:service jenkins start

[root@node2 AutoWeb]# systemctl daemon-reload
[root@node2 AutoWeb]# systemctl start jenkins
[root@node2 AutoWeb]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since 日 2020-11-15 03:29:26 EST; 6s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 33281 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
...

验证开启端口,然后去浏览器确认服务的运行

[root@node2 AutoWeb]# ss -lnt | grep 8080
LISTEN     0      50        [::]:8080                  [::]:*

查看对应的管理员密码

[root@node2 AutoWeb]# cat /var/lib/jenkins/secrets/initialAdminPassword
daee7a8b9ae14edf835f11d71dd5cd2a

基于k8s的CICD实现_第2张图片
选择插件安装,考虑到安装速度的原因,选择全部不安装。
基于k8s的CICD实现_第3张图片
创建用户后选择保存并完成
基于k8s的CICD实现_第4张图片
基于k8s的CICD实现_第5张图片
基于k8s的CICD实现_第6张图片
可以设置一下jenkins用户和国内插件源,这里选择清华大学的。

[root@node2 AutoWeb]# cd /var/lib/jenkins/
[root@node2 jenkins]# vim /etc/sysconfig/jenkins
...
JENKINS_USER="root"
...
[root@node2 jenkins]# vim hudson.model.UpdateCenter.xml
[root@node2 AutoWeb]#
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>

jenkins启动完成之后,就本实验来说,除了支持中文的语言包之外,还需要和gitlab联动。需要支持Gitlab的三个包。
基于k8s的CICD实现_第7张图片
基于k8s的CICD实现_第8张图片
在这里插入图片描述
这里插件已经准备好了,直接解压即可

[root@node2 jenkins]# pwd
/var/lib/jenkins
[root@node2 jenkins]# mv plugins plugins.bak
[root@node2 jenkins]# mv /opt/autoweb/AutoWeb/plugins.tar.gz .
[root@node2 jenkins]# tar zxf plugins.tar.gz

重启服务,浏览器验证

[root@node2 jenkins]# service jenkins restart
Restarting jenkins (via systemctl):                        [  OK  ]

基于k8s的CICD实现_第9张图片
部署gitlab
rpm包已经准备好,安装完依赖直接导入安装即可。

[root@node2 jenkins]# cd /opt/autoweb/AutoWeb
[root@node2 AutoWeb]# yum -y install curl policycoreutils openssh-server openssh-clients postfix git
[root@node2 AutoWeb]# systemctl start postfix
[root@node2 AutoWeb]# systemctl enable postfix
[root@node2 AutoWeb]# rpm -ivh gitlab-ce-11.9.8-ce.0.el6.x86_64.rpm

安装完成之后,需要将gitlab的默认端口进行更改,因为它的默认端口也是8080,和jenkins冲突。

[root@node2 AutoWeb]# vim /etc/gitlab/gitlab.rb
...
13  external_url 'http://192.168.229.210:90'
678 unicorn['listen'] = '127.0.0.1'
679 unicorn['port'] = 8088
 ...

启动gitlab服务,浏览器验证服务。

[root@node2 AutoWeb]# gitlab-ctl reconfigure
[root@node2 AutoWeb]# ss -lnt
...
LISTEN     0      511          *:90                       *:*
...

基于k8s的CICD实现_第10张图片
配置jenkins和gitlab平台的联动
部署这两个服务的联动,需要经过ssh验证。
首先需要在gitlab上绑定jenkins服务器的ssh公钥,因为在同一台服务器上,所以自己给自己绑定,这里使用的是root用户的公私钥,切记生产环境是不允许随便用root的。

[root@node2 ~]# ssh-keygen -t rsa
[root@node2 ~]# cat ~/.ssh/id_rsa.pub

基于k8s的CICD实现_第11张图片
基于k8s的CICD实现_第12张图片
基于k8s的CICD实现_第13张图片
添加公钥后,在gitlab中创建一个项目。
基于k8s的CICD实现_第14张图片
基于k8s的CICD实现_第15张图片
基于k8s的CICD实现_第16张图片
可以使用git命令,在本地将项目clone下来验证查看

[root@node2 ~]# git clone http://192.168.229.210:90/root/test.git
[root@node2 ~]# ls
anaconda-ks.cfg  images  test
[root@node2 ~]# cat test/index.html
print "hello k8s!"[root@node2 ~]#

服务验证没有问题,在jenkins上操作。
基于k8s的CICD实现_第17张图片
基于k8s的CICD实现_第18张图片
基于k8s的CICD实现_第19张图片
基于k8s的CICD实现_第20张图片
基于k8s的CICD实现_第21张图片
基于k8s的CICD实现_第22张图片
基于k8s的CICD实现_第23张图片
此时如果直接添加会报错。添加完成后提示本地连接不了,因为gitlab默认设置不允许向自己发送web hook。
基于k8s的CICD实现_第24张图片
往下要修改gitlab&jenkins的设置。
基于k8s的CICD实现_第25张图片
基于k8s的CICD实现_第26张图片
开启jenkins的匿名访问功能,否则会报403。
基于k8s的CICD实现_第27张图片
基于k8s的CICD实现_第28张图片
现在再重新添加和jenkins的联动
基于k8s的CICD实现_第29张图片
测试和jenkins的连通性
基于k8s的CICD实现_第30张图片
基于k8s的CICD实现_第31张图片
报200正常。
当执行测试,其实就是手动触发了一下部署的shell脚本,这时shell脚本是不正确的,但这次测试可以帮助我们看到脚本运行结果。
基于k8s的CICD实现_第32张图片
可以根据输出结果优化脚本。
这里最后需要做的一个ssh是关于jenkins,注意,这里是从node2向master节点做免密登录。

[root@node2 ~]# ssh-copy-id [email protected]

最终脚本

#!/bin/bash
backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER"
mkdir -p $backupcode
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode
echo From 192.168.229.187:5000/httpd:v1 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache2/htdocs/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.229.187:5000/httpd:v1
docker build -t 192.168.229.187:5000/httpd:v1 /"$JENKINS_HOME"/workspace/.
docker push 192.168.229.187:5000/httpd:v1
ssh [email protected] kubectl delete deployment myapp
ssh [email protected] kubectl apply -f /root/autoweb/myapp.yaml

根据镜像的默认下载策略判断,刚开始部署的Deployment资源,它使用的镜像标签为v1,所以他的默认下载策略为:IfNotPresent,所以要想使镜像实时更新,需要将myapp.yaml这个文件内的镜像下载策略改为:Always。

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: myapp
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: myapp
        image: 192.168.229.187:5000/httpd:v1
        imagePullPolicy: Always

在gitlab上执行push测试。

你可能感兴趣的:(k8s,docker,kubernetes,jenkins,gitlab,ci/cd)