【Kubernetesシリーズ】第7編CI/CDのコンポーネント配置


前言
敏捷な開発のニーズに対応して、CI(継続的な統合)/CD(継続的な交付)に対してより高い基準を提出し、今日はオープンソースコンポーネント(gitlab/jenkins/harbor/kubernetes)に基づいてCI/CDを使用し、チームの開発、運営をどのようにするかについて議論します.
コアコンポーネント
基本プロセス
  • GitLabで対応するアイテムを作成します.
  • 開発者はコードをGitLabに提出した.
  • Jenkinsは、プロジェクトのGitアドレスとKubernetesクラスタを統合する対応するタスク(Job)を作成します.
  • 構成フックがあれば、PushコードをプッシュするとJenkins構築が自動的にトリガーされ、フックが構成されていない場合は手動で構築する必要があります.
  • Jenkins制御Kubernetes(Kubernetesプラグインを使用)Jenkins Slaveを作成します.
  • Jenkins Slaveは、パイプライン(Pipeline)定義の手順に従って構築を実行する.
  • コードのチェックアウト、パッケージング、コンパイル.
  • は、Dockerfileによってミラーを生成する.
  • は、ミラーをプライベートHarborに送信する.
  • Jenkinsは、Kubernetesの最新のミラー配置を再制御します.


  • __注_:
  • は上述したように一般的なステップであり、途中で自動化テストなどのステップが含まれ、自分でビジネスシーンに基づいて追加することができる.
  • 上のパイプラインステップは、一般的にアプリケーションコードライブラリのルートディレクトリの下Jenkinsfileによって決定され、Jenkinsは自動的にファイルを読み出す.また、特定のアプリケーションラインを強力に管理する必要がある場合は、jenkinsfileテンプレートを独立して管理し、jenkins APIインタフェースに基づいてすぐにラインを生成することができます.
  • デフォルトで使用されるDockerfileは、コードウェアハウスのルートディレクトリの下に配置されます.

  • コンポーネントの配置
  • kubernetes第3編Kubernetesクラスタインストール配置
  • gitlab无忌过招:手を握って自分のGitLab库
  • を建てることを教えます
  • harborインストール構成ガイド
  • jenkins

  • _注意:本文は主にjenkinsの配置と配置を説明して、その他のコンポーネントはもしあなたが配置して問題があるならば、伝言を歓迎します.
    Jenkinsの導入と構成
    _説明_
  • 以下のyamlファイルはすべてk 8 s masterノードの/home/jenkins_deployディレクトリの下、
  • 導入例のdepployment.yamlの注記
  • nodeName ipaddress、ipaddress有効なipであることを確認してください.
  • 例におけるjenkinsのディレクトリ/var/jenkins_homeは、host_に直接マウントされるpath、条件があれば共有ストレージに置き換えることをお勧めします.
  • 使用しているjenkins-masterのベースミラーリングはパブリックネットワークから来ているため、k 8 s masteノードが外部ネットワークにアクセスできるか、jenkins/jenkins:lts-alpineを自分のイントラネットワークミラーウェアハウスにプッシュすることができます.

  • 配置例のingress.yamlの注記
  • は、オフィスネットワーク(クラスタ外)へのアクセスも必要です.jenkins.dev.hanker.netを有効なドメイン名アドレスに変更するか、NodePortの形式でサービスを宣言することで、ip:portの形式でjenkinsに直接アクセスすることができます.


  • 1.yamlの導入準備
  • deployment.yaml
  • apiVersion: v1
    kind: Namespace
    metadata:
      name: devops
      
    # Deployment 
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: jenkins
      namespace: devops
    spec:
      replicas: 1
      revisionHistoryLimit: 3
      template:
        metadata:
          labels:
            app: jenkins
        spec:
          nodeName: 1.1.1.1
          serviceAccountName: jenkins-admin
          containers:
          - image: jenkins/jenkins:lts-alpine
            imagePullPolicy: IfNotPresent
            name: jenkins
            volumeMounts:
            - name: jenkins-volume
              mountPath: /var/jenkins_home
            - name: jenkins-localtime
              mountPath: /etc/localtime
            env:
              - name: JAVA_OPTS
                value: '-Xms256m -Xmx1024m -Duser.timezone=Asia/Shanghai'
              - name: TRY_UPGRADE_IF_NO_MARKER
                value: 'true'
            ports:
            - name: http
              containerPort: 8080
            - name: agent
              containerPort: 50000
            resources:
              requests:
                cpu: 1000m
                memory: 1Gi
              limits:
                cpu: 1200m
                memory: 2Gi
          volumes:
            - name: jenkins-localtime
              hostPath:
                path: /etc/localtime
            - name: jenkins-volume
              hostPath:
                path: /home/jenkins/jenkins_home
  • service,servicesを構成する.yaml
  • ---
    apiVersion: v1
    kind: Service
    metadata:
      name: jenkins-service
      namespace: devops
    spec:
      ports:
      - name: http
        protocol: TCP
        port: 8080
        targetPort: 8080
      - port: 50000
        targetPort: 50000
        name: agent
      selector:
        app: jenkins
  • jenkinsのk 8 sへのアクセスrbacを許可する.yaml
  • apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: jenkins
      name: jenkins-admin
      namespace: devops
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: jenkins-rbac
      namespace: devops
    rules:
      - apiGroups: ["","extensions","app"]
        resources: ["pods","pods/exec","deployments","replicasets"]
        verbs: ["get","list","watch","create","update","patch","delete"]
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: jenkins-admin
      namespace: devops
      labels:
        k8s-app: jenkins
    subjects:
      - kind: ServiceAccount
        name: jenkins-admin
        namespace: devops
    roleRef:
      kind: ClusterRole
      name: jenkins-rbac
      apiGroup: rbac.authorization.k8s.io
  • オフィスネットワーク(クラスタ外)へのアクセスを容易にするために、ingress.yaml
  • apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: jenkins-ingress
      namespace: devops
    spec:
      rules:
      - host: jenkins.dev.hanker.net
        http:
          paths:
          - backend:
              serviceName: jenkins-service
              servicePort: 8080
            path: /

    2.yamlを適用しjenkinsを配置する
    $ pwd
    $ /home/jenkins_deploy
    $ kubectl apply -f *.yaml

    3.jenkinsサービスステータスの確認
    [root@node0 jenkins_deploy]# kubectl -n devops get deployment jenkins
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    jenkins   1/1     1            1           51d
    [root@node0 jenkins_deploy]# 

    4.jenkinsインストールプラグイン、設定へのアクセス
    注意:ステップ1で宣言されたドメイン名jenkins.dev.hanker.netはingressに解析されているため、直接アクセスできます.カスタムドメイン名でjenkinsにアクセスしたい場合は、正しいingressサービスノードに解析してください.
    1.kubernetes/kubernetes cliプラグインもインストールされていることを確認
    _操作ガイド_:【Manage Jenkins】 -> 【Manage Plugins】
    似たような命令でjenkins-masterのパスワードを取得できるはずです
    $ kubectl -n devops exec jenkins-pod-name cat /var/jenkins_home/secrets/initialAdminPassword

    2.Kubernetesプラグインの構成
    _操作ガイド_:【Manage Jenkins】->【Configure System】
    図の寸法:
  • あなたの環境に対応するk 8 s master
  • に変更してください.
  • 宣言jenkins-agentのコマンド空間は、必要に応じて調整することもできる.
  • jenkins-masterのアクセスアドレスです.この例ではservice-nameの形式でアクセスします.
  • は、k 8 s共有群との接続状況をテストする.『Connection test successful』を手に入れたら、おめでとうございます.
  • Kubernetes Pod Template
  • の構成
    図の寸法:
  • ベースのjenkins-agentミラーを設定します.
  • 作業ディレクトリを指定します.
  • ダウンロード、エクスポート、キャッシュ構築が必要な場合は、共有ストレージのディレクトリを指定すると意味があります.

  • ディレクトリマウントの設定
  • ステップ2のように、ホストのディレクトリまたはネットワークストレージをjenkins-agentにマウントできます.