资讯专栏INFORMATION COLUMN

Jenkins部署k8s应用

IT那活儿 / 1850人阅读
Jenkins部署k8s应用

Jenkins Pipeline 流水线部署 Kubernetes 应用

使用 kubeadm 来创建一个单 master 节点的 kubernets 集群

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.20.11

查看节点状态和 pod 都已经正常

kubectl get pod -A
NAMESPACE NAME                                          READY     STATUS     RESTARTS    AGE
kube-system   coredns-f9fd979d6-9t6qp             1/1            Running      0                  89s
kube-system   coredns-f9fd979d6-hntm8            1/1            Running      0                  89s
kube-system   etcd-jenkins                                 1/1            Running      0                 106s
kube-system   kube-apiserver-jenkins                 1/1            Running      0                 106s
kube-system   kube-controller-manager-jenkins  1/1            Running      0                 106s
kube-system   kube-proxy-8pzkz                         1/1            Running      0                 89s
kube-system   kube-scheduler-jenkins                 1/1            Running     0                  89s

去除 master 节点上的污点,允许其他的 pod 调度在 master 节点上,不然后面 Jenkins 所创建的 pod 将无法调度在该节点上。

kubectl taint nodes $(hostname) node-role.kubernetes.io/master:NoSchedule-


Jenkins master

建议使用docker-compose来部署。运行在kubernetes集群集群中也没什么毛病,但是将Jenkins master独立于kubernetes集群部署比较方便.

docker-compose.yaml:
version: 3.6
services:
  jenkins:
    image: jenkins/jenkins:2.263.4-lts-slim
    container_name: jenkins
    restart: always
    volumes:
      - ./jenkins_home:/var/jenkins_home
    network_mode: host
    user: root
    environment:
      - JAVA_OPTS=-Duser.timezone=Asia/Shanghai


使用docker-compose up来启动,成功启动后会提示,日志输出的密钥就是admin用户的默认密码,使用它来第一次登录 Jenkins。

登录上去之后,建议选择 “选择插件” 来安装,尽可能少地安装插件,按需安装即可。在Jenkins的插件管理那里安装上kubernetes插件。


接下来开始配置Jenkin与kubernetes 

配置 kubernets 的地方是在 系统管理 > 节点管理 > Configure Clouds。点击 Add a new cloud,来添加一个 kubernetes 集群。

在 Jenkins 的凭据那里添加上 kubeconfig 文件,凭据的类型选择为 Secret file,然后将上面使用 kubeadm 部署生成的 kubeconfig 上传到这里。

点击连接测试,如果提示 Connected to Kubernetes v1.19.8 就说明已经成功连接上了 kubernetes 集群。


Jenkinsfile

流水线 Jenkinsfile,下面是一个简单的任务,用于构建 webp-server-go 项目的 docker 镜像。

// Kubernetes pod template to run.
def JOB_NAME = "${env.JOB_NAME}"
def BUILD_NUMBER = "${env.BUILD_NUMBER}"
def POD_NAME = "jenkins-${JOB_NAME}-${BUILD_NUMBER}"
podTemplate(
# 这里定义 pod 模版
)
{ node(POD_NAME) {
    container(JOB_NAME) {
      stage("Build image") {
        sh """#!/bin/bash
          git clone https://github.com/webp-sh/webp_server_go /build
          cd /build
          docker build -t webps:0.3.2-rc.1 .
        """
      }
    }
  }
}

pod 模版如下,将模板的内容复制粘贴到上面的 Jenkinsfile 中。在容器中构建镜像,使用 dind 的方案:将 pod 所在宿主机的 docker sock 文件挂载到 pod 的容器内,pod 容器内只要安装好 docker-cli 工具就可以像宿主机那样直接使用 docker 了。

podTemplate(
  cloud: "kubernetes",
  namespace: "default",
  name: POD_NAME,
  label: POD_NAME,
  yaml: """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: ${JOB_NAME}
    image: "debian:buster-docker"
    imagePullPolicy: IfNotPresent
    tty: true
    volumeMounts:
    - name: dockersock
      mountPath: /var/run/docker.sock
  - name: jnlp
    args: ["$(JENKINS_SECRET)", "$(JENKINS_NAME)"]
    image: "jenkins/inbound-agent:4.3-4-alpine"
    imagePullPolicy: IfNotPresent
  volumes:
  - name: dockersock
    hostPath:
      path: /var/run/docker.sock
""",
)

构建 debian:buster-docker 镜像,使用它来在 pod 的容器内构建 docker 镜像,使用的 Dockerfile 如下:

FROM debian:buster
RUN apt update 
    && apt install -y --no-install-recommends
        vim 
        curl
        git
        make 
        ca-certificates
        gnupg
    && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -qq - >/dev/null
    && echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" > /etc/apt/sources.list.d/docker.list 
    && apt update -qq
    && apt-get install -y -qq --no-install-recommends docker-ce-cli
    && rm -rf /var/lib/apt/lists/*

定义好 jenkinsfile 文件并且构建好 pod 模板中的镜像后,接下来开始使用它来创建流水线任务。


流水线

在 Jenkins 上新建一个任务,选择任务的类型为 流水线

将定义好的 Jenkinsfile 内容复制粘贴到流水线定义 Pipeline script 中并点击保存。在新建好的 Job 页面点击 立即构建 来运行流水线任务。

在 kubernetes 集群的机器上使用 kubectl 命令查看 pod 是否正常 Running

kubectl get pod
NAME                                       READY    STATUS      RESTARTS   AGE
jenkins-webps-9-bs78x-5x204    2/2           Running      0                   66s


END



更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129801.html

相关文章

  • 构建与定制:唯品会 PaaS 基于 Kubernetes 的实践

    摘要:基于年底或年初没有推广的现状,唯品会部门目前已经做了两年的时间。唯品会现状唯品会目前线上有一千多个域,每个域之间相互的依赖比较复杂,每次的部署发布困难。这是唯品会的架构,主要包含持续集成和持续部署。 数人云上海&深圳两地容器之Mesos/K8S/Swarm三国演义的嘉宾精彩实录第三更来啦。唯品会是数人云Meetup的老朋友,去年曾做过RPC服务框架和Mesos容器化的分享。本次分享中,...

    JackJiang 评论0 收藏0
  • 【容器云 UK8S】最佳实践:基于Jenkins的CI/CD实践

    摘要:扩展性好当集群的资源严重不足而导致排队等待时,可以很容易的添加一个到集群中,从而实现扩展。用法,选择尽可能使用这个节点镜像,填写,这个容器镜像是我们的运行环境。更新文件,这里我们只是将中的镜像更换成最新构建出的镜像。基于Jenkins的CI/CD实践[TOC]一、概要提到K8S环境下的CI/CD,可以使用的工具有很多,比如Jenkins、Gitlab CI、新兴的drone等,考虑到大多公司...

    Tecode 评论0 收藏0
  • 基于kubernetes+docker+jenkins的DevOps实践

    摘要:一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把拆出来,用上了公共的云服务容器镜像服务。使用对集群外暴露服务这里使用的是在中部署有官方部署手册,基本按着走一遍就能部署上去了。 基于kubernetes+docker+jenkins的DevOps实践 之前自己的项目开发就搭了个cicd的环境,那时候是在本就小的可怜的服务器上搭了一套 jenkins + docker...

    zhichangterry 评论0 收藏0
  • 基于kubernetes+docker+jenkins的DevOps实践

    摘要:一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把拆出来,用上了公共的云服务容器镜像服务。使用对集群外暴露服务这里使用的是在中部署有官方部署手册,基本按着走一遍就能部署上去了。 基于kubernetes+docker+jenkins的DevOps实践 之前自己的项目开发就搭了个cicd的环境,那时候是在本就小的可怜的服务器上搭了一套 jenkins + docker...

    paulli3 评论0 收藏0
  • Kubernetes持续集成:Jenkins关于java.nio.file.NoSuchFileEx

    摘要:尝试运行脚本发生了的错误。错误信息接下来就是,天的调查,关于这个错误的能查到的资料几乎没有,也尝试了很多方法,无果非常煎熬。问题解决了参考文档初试使用完成持续构建与发布集群安全配置 背景 为了使用Kubernetes管理并自动化部署应用程序,领导纠结了几个同事搭了一个Kubernetes集群环境。不过,为了减少复杂度,采用了非官方推荐的方式: API Server使用http方式 不...

    tomener 评论0 收藏0
  • k8s中imagePullSecrets

    摘要:在集群的使用过程中,初学者可能会碰到这样的怪异问题在一个集群里,部署服务用的私有镜像仓库,如的时候,只有个别的服务是部署成功的,其他都是部署失败的,错误的原因就是镜像拉取失败,如下 在k8s集群的使用过程中,初学者可能会碰到这样的(怪异)问题: 在一个k8s集群里,部署服务(用的私有镜像仓库,如harbor)的时候,只有个...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<