Kubernetesジェンキンスは、動的に作成されたスレーブ

0はじめに

まず、なぜ我々はジェンキンスがスレーブ必要か、疑問を検討しますか?あなたは、単一のマシン構成している場合を除き、単一のマスターは、小型の特に高い数字で、ケースを構築する場合、実際には、本番環境では、我々は、kubernetes環境を実行している時の時間とジェンキンスマスターの何百もの建物の数が、しかし、奴隷の使用を考慮することはできません柔軟性kubernetesでは、強く、タスクが完了した後、マスターは自動的に、そのタスクがスレーブポッドにプッシュされますスレーブポッドを作成し、スレーブを使用することが推奨され、スレーブポッドは自動的に破棄/再利用されます。

スレーブフローチャートを作成します。

1、ジェンキンス展開

kubernetesに送達ジェンキンス

画像ファイルを準備1.

$ docker pull jenkins/jenkins:v2.204.1
$ docker tag 6097aa0af96e harbor.od.com/public/jenkins:v2.204.1
$ docker push harbor.od.com/public/jenkins:v2.204.1

2.リソース・プロファイル

  • RBAC
$ vi /data/k8s-yaml/jenkins_slave/rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: infra
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create","delete","get","list","patch","update","watch"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: infra
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: infra

権限ジェンキンスをバインドする必要があるので、ジェンキンスは自動的に、スレーブ・ポッドを作成します。

  • 配備
$ vi /data/k8s-yaml/jenkins_slave/dp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: jenkins
  namespace: infra
  labels: 
    name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: jenkins
  template:
    metadata:
      labels: 
        app: jenkins 
        name: jenkins
    spec:
      serviceAccount: jenkins
      volumes:
      - name: data
        nfs: 
          server: hdss7-200.host.com
          path: /data/nfs-volume/jenkins_home
      containers:
      - name: jenkins
        image: harbor.od.com/infra/jenkins:v2.204.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        - containerPort: 50000
          name: agent
          protocol: TCP
        env:
        - name: JAVA_OPTS
          value: "-Xms512G -Xmx512G -XX:PermSize=512m -XX:MaxPermSize=1024m -Duser.timezone=Asia/Shanghai"
        - name: TRY_UPGRADE_IF_NO_MARKER
          value: "true"
        volumeMounts:
        - name: data
          mountPath: /var/jenkins_home
      imagePullSecrets:
      - name: harbor
      securityContext: 
        runAsUser: 0
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600

Webポートを露出させ、また、エージェントのポートを保持し、ポート剤は主にジェンキンスのマスタとスレーブ間の通信に使用されます。

  • サービス
$ vi /data/k8s-yaml/jenkins_slave/svc.yaml
kind: Service
apiVersion: v1
metadata: 
  name: jenkins
  namespace: infra
spec:
  ports:
  - name: web
    port: 80
    targetPort: 8080
    protocol: TCP
  - name: agent
    port: 50000
    targetPort: 50000
    protocol: TCP
  selector:
    app: jenkins
  • イングレス
$ vi /data/k8s-yaml/jenkins_slave/ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata: 
  name: jenkins
  namespace: infra
spec:
  rules:
  - host: jenkins.od.com
    http:
      paths:
      - path: /
        backend: 
          serviceName: jenkins
          servicePort: 80

3.アプリケーションリソースの設定チェックリスト

$ kubectl apply -f http://k8s-yaml.od.com/jenkins_slave/rbac.yaml
$ kubectl apply -f http://k8s-yaml.od.com/jenkins_slave/dp.yaml
$ kubectl apply -f http://k8s-yaml.od.com/jenkins_slave/svc.yaml
$ kubectl apply -f http://k8s-yaml.od.com/jenkins_slave/ingress.yaml

2、動的スレーブ構成ジェンキンス

初期化ジェンキンス後、kubernetesは、プラグインをインストールする必要があります。

1.あなたは、プラグインが完了しインストールした後、ジェンキンスの管理]をクリックします - > [設定システム - >(ほとんどのドラッグ下)新しいクラウドを追加します - >を選択Kubernetes、その後、Kubernetesジェンキンスおよび構成情報を記入

ます。https:塗りつぶしは、クラスタの内部アクセスアドレスkubernetes //kubernetes.default.svc.cluster.localを、クリックテスト接続をメッセージは、接続テストに成功証明ジェンキンスは正常とKubernetes通信システムとなって、下記その後、ジェンキンスURLアドレスしている表示された場合は、します。http://jenkins.infra.svc.cluster.local:8080

動的なテストを構築するパイプラインを作成します。2.

def label = "jenkins-slave-${UUID.randomUUID().toString()}"
podTemplate(label: label, cloud: 'kubernetes') {
    node(label) {
        stage('Run shell') {
            sh 'sleep 10s'
            sh 'echo hello world.'
        }
    }
}

ビルドパイプラインにクリック3.

ジェンキンスは、自動的に名前空間に見ることができる対応剤ポッドを作成するタスク実行ジェンキンスこのポッドを完了すると、ノードに相当し、自動的にポッドを引っ張るようにデフォルト設定されます終了しますjenkins/jnlp-slave:x.xx-xx-alpine鏡像

[root@hdss7-21 ~]# kubectl get pods -n infra
NAME                                                             READY   STATUS    RESTARTS   AGE
jenkins-77b9c47874-qjgfd                                         1/1     Running   1          13h
jenkins-slave-c07daa7b-31ef-41ea-825e-05c9c721edad-sb7h6-lpgwv   1/1     Running   0          18s

3、ダボサービス建物

私たちは、コンパイルダボミラーリングにダボサービス、必要性を構築し、港にプッシュすると、自分自身の基本イメージを構築した後、パイプラインで呼び出す必要があるので、今回我々は、Mavenとドッキングウィンドウのコマンドを使用する必要があります

注:これはK8Sにどのようにダボのサービス提供を実現していませんが、ダイナミック・ジェンキンスは、サービスダボビルドにスレーブを作成する実証します

3.1、ミラー基板パッケージの生産ダボ

すべてのダボのマイクロサービスは、下のパッケージを作るためにミラーリング時に下の封じ込めは、JMXモニタリング(jmx_javaagent)、およびダボマイクロサービスの起動スクリプトだけでなく、依存JDKなどの機能の一部を実現するために主にあるこの底なしの袋を指しますが、汎用性を必要とします環境

ミラー(JDK環境)を準備1.

$ docker pull stanleyws/jre8:8u112
$ docker tag stanleyws/jre8:8u112 harbor.od.com/public/jre:8u112
$ docker push harbor.od.com/public/jre:8u112

2.カスタムDockerfile

  • /データ/ dockerfile / jre8 / Dockerfile
FROM harbor.od.com/public/jre:8u112
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo 'Asia/Shanghai' >/etc/timezone
ADD config.yml /opt/prom/config.yml
ADD jmx_javaagent-0.3.1.jar /opt/prom/
WORKDIR /opt/project_dir
ADD entrypoint.sh /entrypoint.sh
CMD ["/entrypoint.sh"]
  • config.yml(これは、コンフィギュレーション・ファイルjmx_agentのリード)
---
rules:
  - pattern: '.*'
  • jmx_javaagent-0.3.1.jar
# 采集jvm监控数据的jar包
$ wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar
  • entrypoint.sh(ファイルのパーミッションを実行することを忘れないでください)
#!/bin/sh
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
C_OPTS=${C_OPTS}
JAR_BALL=${JAR_BALL}
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}

Javaの起動オプションの上記の説明によると、

-agentpath:<pathname>[=<options>]   // 加载java代理
-Duser.timezone:<timezone>          // 指定时区

C_OPTS=${C_OPTS}      // 额外的启动参数,默认为空,可在k8s资源配置清单中添加额外参数
JAR_BALL=${JAR_BALL}  // 启动的jar包名字,在k8s资源配置清单中指定

3.メイクダボサービスドッキングウィンドウの下部にパック

$ ls -l
total 372
-rw-r--r-- 1 root root    405 Jan 16 15:26 Dockerfile
-rw-r--r-- 1 root root     41 Jan 16 15:28 config.yaml
-rwxr-xr-x 1 root root    234 Jan 16 15:37 entrypoint.sh
-rw-r--r-- 1 root root 367417 May 10  2018 jmx_prometheus_javaagent-0.3.1.jar

$ docker build . -t harbor.od.com/base/jre8:8u112
$ docker push harbor.od.com/base/jre8:8u112

3.2スレーブ基地画像を作ります

私たちは、今では二つのミラー、Mavenとドッカーイメージを使用する必要があり、その後、ダボプロジェクト、プロジェクトをビルドするためにMavenを使用する必要性、およびミラーにドッカーによりパッケージやハーバーにプッシュしています。

3.2.1、Mavenのミラー

この画像は、主にJavaアプリケーションを構築するために使用され、ここでの選択:MAVEN:v3.3.9-jdk8

(ローカルリポジトリにプッシュ)レディイメージファイル

$ docker pull maven:3.3.9-jdk-8-alpine
$ docker tag dd9d4e1cd9db harbor.od.com/public/maven:v3.3.9-jdk8
$ docker push harbor.od.com/public/maven:v3.3.9-jdk8

3.2.2、ドッカーの画像

画像鏡の中に包装ダボプロジェクトのために設計され、港にプッシュが、それはカスタムイメージを必要としている、あなたは港の倉庫生成されたコンフィギュレーションファイルにログオンするドッカログインを達成している必要があり、パスは次のとおりです/root/.docker/config.json、元の画像ドッカーと一緒にドッカーパッケージは、新たな画像を生成し、ローカルリポジトリにプッシュ。

画像ファイルを準備1.

$ docker pull docker:19.03
$ docker tag e036013d6d10 harbor.od.com/public/docker:v19.03
$ docker push harbor.od.com/public/docker:v19.03

2.Dockerfile

  • vimの/データ/ dockerfile /ドッキングウィンドウ/ Dockerfile
FROM harbor.od.com/public/docker:v19.03
USER root
ADD config.json /root/.docker/config.json

3. /root/.docker/config.jsonディレクトリDockerfileにファイルをコピーします

{
    "auths": {
        "harbor.od.com": {
            "auth": "YWRtaW46SGFyYm9yMTIzNDU="
        }
    },
    "HttpHeaders": {
        "User-Agent": "Docker-Client/19.03.6 (linux)"
    }

あなたは、港の倉庫を通じてファイルにアクセスする必要があります

(ローカルリポジトリにプッシュ)を作成し、ミラーをプッシュ4.

$ docker build ./ -t harbor.od.com/public/docker:v19.03-1
$ docker push  harbor.od.com/public/docker:v19.03-1

3.3、gitのキーを追加します

私たちは、ジェンキンスGitのプラグインを使用すると、鍵の束を作成する必要があるので、コードを引っ張って、その後のgitリポジトリに公開鍵を追加し、次のように、ジェンキンス資格に秘密鍵を追加するには、ここで使用さ:

3.4、ダボパイプラインを作成します

パラメトリック建設を追加1

  • 文字列パラメータ:APP_NAME

    説明:プロジェクト名を、例えばダボサービスのために

  • 文字列パラメータ:イメージ名

    説明:ドッカー画像名、フォーマット:<リポジトリ名> / <画像>例:APP /ダボ-デモサービスを

  • 文字列パラメータ:git_repo

    説明:住所はどこプロジェクト中央倉庫をGitリポジトリ閲覧:https://gitee.com/jasonminghao/dubbo-demo-service.gitとして

  • 文字列パラメータ:git_ver

    説明:プロジェクトのgitブランチ中央リポジトリに対応する項目番号またはバージョンのために、例えば、マスターブランチ:* /マスターは、IDをコミット:903b4e6

  • 文字列パラメータ:image_ver

    イメージのバージョンとgit_verが同意、しかし、特別なシンボルを持っていない:説明

  • 文字列パラメータ:add_tag

    DESCRIBE:一部のドッキングウィンドウの日付スタンプ画像タグを、例えば:20200121_1734

  • 文字列パラメータ:mvn_dir

    デフォルト:。/

    プロジェクトディレクトリをコンパイルし、プロジェクトのデフォルトのルートディレクトリ:説明

  • 文字列パラメータ:mvn_cmd

    デフォルト:-Dmaven.test.skip = trueのMVNきれいなパッケージ

    説明:MVNコンパイルコマンドを使用

  • 選択肢パラメータ:BASE_IMAGE

    選択値:ベース/ jre8:8u112

    説明:使用してドッキングウィンドウ下部ミラーパッケージアイテムを

2.pipeline

podTemplate(containers: [
    containerTemplate(
    name: 'maven', 
    image: 'harbor.od.com/public/maven:v3.3.9-jdk8', 
    ttyEnabled: true,
    command: 'cat'),
    
    containerTemplate(
    name: 'docker',
    ttyEnabled: true,
    image: 'harbor.od.com/public/docker:v19.03-1')
    ],
    volumes: [
        nfsVolume(mountPath: '/root/.m2', readOnly: false, serverAddress: 'hdss7-200.host.com', serverPath: '/data/nfs-volume/maven_repo/'),
        hostPathVolume(hostPath: '/run/docker.sock', mountPath: '/run/docker.sock')
            ])
{
    node(POD_LABEL) {
        stage('Get a Maven project') {
          checkout([
          $class: 'GitSCM',
          branches: [[name: "${params.git_ver}"]], 
          doGenerateSubmoduleConfigurations: false, 
          extensions: [
          [$class: 'AuthorInChangelog'],
          [$class: 'CloneOption',depth: 0,honorRefspec: true, noTags: true, reference: '', shallow: false]
          ], 
          submoduleCfg: [], 
          userRemoteConfigs: [[
          credentialsId: 'git', 
          url: "${params.git_repo}"]
          ]])
            container('maven') {
                stage('Build a Maven project') {
                    sh "ls -lha"
                    sh "${params.mvn_cmd}"
                }
            }
        }
        stage('Docker build') {
            container('docker') {
                stage('create dir') {
                    // /tmp目录创建一个临时用于构建镜像的工作目录,将jar包移动到该目录
                    sh "mkdir /tmp/${params.app_name}"
                    sh "cd ${params.target_dir} && mkdir /tmp/${params.app_name}/project_dir && mv *.jar /tmp/${params.app_name}/project_dir"
                    sh "ls -lha /tmp/${params.app_name}"
                }
                stage('docker build image') {
                        // 动态生成Dockerfile,构建镜像并推送到harbor
                        sh "cd /tmp/${params.app_name}/ && ls -lha"
                        sh """
                        echo "FROM harbor.od.com/${params.base_image}" >/tmp/${params.app_name}/Dockerfile
                        echo "ADD ./project_dir /opt/project_dir" >>/tmp/${params.app_name}/Dockerfile
                        """
                        // writeFile 在当前pipeline脚本中不生效(抛弃使用)
                        // writeFile file: "/tmp/${params.app_name}/Dockerfile", text: """FROM harbor.od.com/${params.base_image} ADD ./project_dir /opt/project_dir"""
                        sh "ls -lha /tmp/${params.app_name}"
                        sh "cat /tmp/${params.app_name}/Dockerfile"
                        sh "cd /tmp/${params.app_name}/ && pwd && docker build ./ -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} "                              
                    }
            }
        }
    }
}

podTemplateはパイプラインに適用されます

3.4、実行パイプラインの構築

対応するパラメータ1.塗りつぶし

チェック2. infra名前空間にポッドを

[root@hdss7-200 harbor]# kubectl get pods -n infra
NAME                                    READY   STATUS    RESTARTS   AGE
apollo-portal-57bc86966d-4tr6w          1/1     Running   8          37h
dubbo-demo-slave-16-trktm-8x2d7-bw5dr   3/3     Running   0          53s
dubbo-monitor-555c94f4b7-85plg          1/1     Running   32         7d14h
jenkins-75fbb46546-f5ltc                1/1     Running   6          18h

あなたはジェンキンススレーブがポッドを作成するために、ジェンキンスさんと呼ばれるプロジェクト名を作成します見ることができます

3.ビルド結果

おすすめ

転載: www.cnblogs.com/jasonminghao/p/12468407.html