请启用 Javascript 以查看内容

kubernetes使用jenkins Pipeline 部署Nginx

 ·   ·  ☕ 5 分钟  ·  ✍ CNSRE

文章链接

环境需求

  • kubernetes 未安装参考使用kubeadm安装kubernetes 1.21
  • jenkins
  • github/gitee/gitlab 静态页面
  • 镜像仓库(我使用的 hub.docker)
    如果你未准备好的以上环境,点击链接参考文章进行安装。

安装 jenkins

我这边的jenkins是将jenkins 安装在了k8s的宿主机中,并没有用容器运行。

安装JDK

1
yum install -y java

安装jenkins

方法1 添加Jenkins库到yum库,Jenkins将从这里下载安装。

1
2
3
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins

方法2 如果不能安装就到官网下载jenkis的rmp包,官网地址(http://pkg.jenkins-ci.org/redhat-stable/)

1
2
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm
rpm -ivh jenkins-2.7.3-1.1.noarch.rpm

安装 Jenkins 插件

安装完jenkins,设置完密码,安装完默认插件以后,我们需要安装 Pipeline 需要的插件。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
修改下方地址 然后提交

1
2
3
# jenkins插件清华大学镜像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json

安装git和pipeline插件
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

创建 jenkins Pipeline

添加Pipeline job
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
创建job完成后,配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
如下图,我们Git方式,配置Git仓库地址,再添加认证相关。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
分别填写github/gitee的账号和密码然后点击添加
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
添加完成后,在凭据中,选中刚添加的,这样我们就可以生成Pipeline脚本了。点击下方生成流水线脚本,然后复制方框内的内容。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

编写 Pipeline 脚本

编写我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支master为${branch},其他模块内容自行编写。
文章链接

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
node {
   stage('拉取代码') { 
    //拉取代码
    git credentialsId: 'b34b0b78-e99f-4aa0-a616-xxxxxx', url: 'https://gitee.com/xxx/xxxxx.git'
    //将上次打包的代删除掉,并将拉取到的新代码代码打包
    sh 'rm -rf *.tar && cd waynex &&  tar -cvf waynex.tar ./*'
    script {
    //获取comment id
    env.imageTag = sh (script: 'git rev-parse --short HEAD ${GIT_COMMIT}', returnStdout: true).trim()
}
   }
   // 项目打包到镜像并推送到镜像仓库
   stage('构建推送镜像') {
sh '''
REPOSITORY=wenlongxue/waynex:${imageTag}
cat > Dockerfile << EOF
FROM wenlongxue/nginx

## 设置工作目录
WORKDIR /usr/local/nginx/html

RUN  rm -rf /usr/local/nginx/html/* 
ADD  waynex/waynex.tar  /usr/local/nginx/html/

## 启动nginx
CMD ["nginx","-g","daemon off;"]
EOF

docker build -t waynex:${imageTag} .
docker login
docker tag waynex:${imageTag} $REPOSITORY
docker push $REPOSITORY
'''
   }
   // 部署到k8s主机
   stage('部署到k8s') 
{
sh '''
REPOSITORY=wenlongxue/waynex:${imageTag}
cat > nginx.yaml << EOF
apiVersion: apps/v1           #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment              #该配置的类型,我们使用的是 Deployment
metadata:                     #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment      #Deployment 的名称
  labels:                     #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx                #为该Deployment设置key为app,value为nginx的标签
spec:                         #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1                 #使用该Deployment创建一个应用程序实例
  selector:                   #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels:              #选择包含标签app:nginx的资源
      app: nginx
  minReadySeconds: 1
  progressDeadlineSeconds: 60
  revisionHistoryLimit: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:                   #这是选择或创建的Pod的模板
    metadata:                 #Pod的元数据
      labels:                 #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:                     #期望Pod实现的功能(即在pod中部署)
      containers:             #生成container,与docker中的container是同一种
      - name: nginx           #container的名称
        image: \$REPOSITORY   #使用之前推送的镜像
        imagePullPolicy: Always #总是拉取最新的。默认为,本地有则使用本地镜像,不拉取
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "600Mi"
            cpu: "250m"
          limits: 
            memory: "600Mi" 
            cpu: "500m"
        livenessProbe:
           httpGet:
             path: /
             port: 80
           initialDelaySeconds: 10  #pod启动10秒执行第一次检查
           periodSeconds: 5         #第一次检查后每隔5秒检查一次
---
apiVersion: v1
kind: Service
metadata:                           #译名为元数据,即Deployment的一些基本属性和信息
  name: nginx-service               #Service 的名称
  labels:                           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组
    app: nginx                      #为该Deployment设置key为app,value为nginx的标签
spec:                               #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:                         #标签选择器
    app: nginx                      #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port                #端口的名字
    protocol: TCP                   #协议类型 TCP/UDP
    port: 80                        #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 30081                 #通过任意节点的 30080 端口访问 Service
    targetPort: 80                  #将请求转发到匹配 Pod 的 80 端口
  type: NodePort                    #Serive的类型,ClusterIP/NodePort/LoaderBalancer
EOF
sudo kubectl  apply -f  nginx.yaml
'''
   }
}

在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
然后保存配置。

发布测试

回到主界面,我们开始构建任务:
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
查看构建成功后的图形构建过程:
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控
通过浏览器来访问项目:http://你的IP:30080/
至此部署完成
文章链接

分享

CNSRE
作者
CNSRE
一个📚学习中的👨‍💻SRE运维工程师🚀🚀🚀


目录